- Presigned URL upload — the server generates a temporary S3 URL; the client uploads directly to S3, bypassing the API gateway entirely
- Multipart upload — the file is split into chunks (parts), each uploaded independently via presigned URLs, then assembled server-side
Enabling Large Uploads
In Kodexa Studio, open the intake settings and check Enable large uploads. This exposes the presigned and multipart upload endpoints for that intake. When disabled (the default), these endpoints return403 Forbidden.
Large uploads use the same intake API tokens as direct uploads — no additional credentials are needed.
Presigned URL Upload
Best for: files between 256 MB and 5 GB over reliable connections.Request a presigned URL
Call the presigned upload request endpoint with the file details:Response:The presigned URL expires after 15 minutes.
Upload to S3
PUT the file directly to the presigned URL. This bypasses the Kodexa API — the file goes straight to S3:You can track upload progress using standard HTTP upload progress mechanisms.
Complete Request Body
The presigned complete endpoint accepts an optional JSON body with the same parameters as a direct upload:| Field | Type | Description |
|---|---|---|
metadata | object | Per-upload metadata (highest priority in merge) |
extraFields | object | Additional metadata fields (lowest priority in merge) |
externalData | object | External data injected into the KDDB document |
labels | string | Comma-separated labels |
statusId | string | Document status ID |
knowledgeFeatures | string | Knowledge feature IDs JSON |
documentVersion | string | Document version |
filename | string | Original filename (used by intake scripts; defaults to path basename) |
Multipart Upload
Best for: files over 5 GB, unreliable connections, or when you need resumability. Multipart uploads split the file into chunks (minimum 5 MB each, except the last chunk) and upload each independently. If the connection drops, you only re-upload the failed chunks.Get part URLs (batched)
Request presigned URLs for multiple parts in one call. Each part should be at least 5 MB (except the last). You can request up to 500 part URLs per call.Response:Each part URL expires after 15 minutes. Request part URLs just-in-time rather than all at once for large uploads.
Upload each part
PUT each chunk to its presigned URL. Record the The
ETag from each response header:ETag header in the response identifies the uploaded part.Resuming an Interrupted Upload
If the upload is interrupted, you don’t need to start over:- Keep the
uploadIdands3Keyfrom step 1 - Request new part URLs for any parts that weren’t uploaded
- Upload only the missing parts
- Complete with all parts (already-uploaded parts remain in S3)
Aborting a Multipart Upload
To cancel an in-progress multipart upload and free S3 resources:204 No Content.
S3 Constraints
| Constraint | Limit |
|---|---|
| Minimum part size | 5 MB (except last part) |
| Maximum parts | 10,000 |
| Maximum file size | 5 TB |
| Part URL expiry | 15 minutes |
| Part URLs per request | 500 |
Python Example
TypeScript Example
Endpoint Reference
| Endpoint | Method | Description |
|---|---|---|
/api/intake/{org}/{slug}/presigned-upload-request | POST | Get a presigned S3 PUT URL |
/api/intake/{org}/{slug}/presigned-upload-complete | POST | Finalize a presigned upload |
/api/intake/{org}/{slug}/multipart-upload-request | POST | Initiate a multipart upload |
/api/intake/{org}/{slug}/multipart-upload-part-urls | POST | Get presigned URLs for parts (batched) |
/api/intake/{org}/{slug}/multipart-upload-complete | POST | Finalize a multipart upload |
/api/intake/{org}/{slug}/multipart-upload-abort | POST | Cancel a multipart upload |
kit_*) or a platform API key with appropriate permissions.