Uploads
A presigned PUT for task and job inputs only. The gateway never receives the bytes: the client declares the file, PUTs it to the returned address with the given headers, then names the upl_ id in a task input. A customer model is never uploaded: it is imported from a model hub in the Console, as Import and run your model describes.
/v1/uploadspreviewA presigned PUT for a task or job input. The gateway never receives the bytes.
/v1/uploads/{id}previewThe upload's status.
Request
{"purpose": "input", "filename": "call.wav", "content_type": "audio/wav", "size_bytes": 10485760, "sha256": "<hex>"}answers 201:
Response
{ "object": "upload", "id": "upl_...", "purpose": "input", "status": "pending", "upload_url": "<presigned PUT>", "upload_headers": {"Content-Type": "audio/wav"}, "upload_expires_at": "...", "expires_at": "..."}The client PUTs the bytes to upload_url with the given headers, then names upl_... in inputs[].upload_id.
Parts list: Rules
purposeinput(a task or job input), the only purpose. Themodelpurpose is withdrawn: a customer model is imported from a model hub, never uploaded.purpose: "model"answers 400invalid_valuewithparam: "purpose"and a message naming the Console's import. The field stays required.statuspending(no bytes yet),ready(bytes received, size and type match),consumed(aninputupload used by a job on a workspace whose policy deletes inputs after use),expired.GET /v1/uploads/{id}returns it.MismatchBytes whose size, type or
sha256differ from the declaration make the uploadfailedand its use a 400upload_mismatch.LimitsSize per upload and uploads per day by plan Not decided yet; multipart for large inputs (long audio and video) Not decided yet.
RetentionAn upload is deleted at
expires_atNot decided yet or when consumed; where a region requirement applies, it is stored in that region Not decided yet.Customer modelsNot an upload. A customer model version comes from an import from a model hub, a Console action; this contract addresses only its deployment (
dep_). A public import route is open Not decided yet.
| Status | Type | Code | Situation | Retry |
|---|---|---|---|---|
| 400 | invalid_request_error | request_too_large, input_too_large, too_many_inputs, upload_too_large | A limit of the Limits page | No |
| 400 | invalid_request_error | upload_not_found, upload_expired, upload_incomplete, upload_mismatch, upload_consumed | An upload_id that is unknown or another workspace's, past expires_at, without bytes, with bytes that differ from the declaration, or already consumed | No (upload_incomplete: after the PUT) |
| 400 | invalid_request_error | invalid_idempotency_key, idempotency_key_reused, idempotency_in_progress | The idempotency rules | The last one, later |
| 404 | not_found_error | job_not_found, upload_not_found | An id in the path that is unknown or another workspace's | No |
- Status
- 400
- Type
invalid_request_error- Code
request_too_large,input_too_large,too_many_inputs,upload_too_large- Situation
- A limit of the Limits page
- Retry
- No
- Status
- 400
- Type
invalid_request_error- Code
upload_not_found,upload_expired,upload_incomplete,upload_mismatch,upload_consumed- Situation
- An
upload_idthat is unknown or another workspace's, pastexpires_at, without bytes, with bytes that differ from the declaration, or already consumed - Retry
- No (
upload_incomplete: after the PUT)
- Status
- 400
- Type
invalid_request_error- Code
invalid_idempotency_key,idempotency_key_reused,idempotency_in_progress- Situation
- The idempotency rules
- Retry
- The last one, later
- Status
- 404
- Type
not_found_error- Code
job_not_found,upload_not_found- Situation
- An id in the path that is unknown or another workspace's
- Retry
- No
Related sheets
- Sheet
- 11 of 13
- Detail
- G
- Updated
- 2026-10-21
- Status
- Preview