Skip to main content
Files are uploaded inputs. Artifacts are job outputs. Their IDs and endpoints are separate and scoped to your API account.

Upload a file

Send exactly one multipart field named file with a filename. The filename extension determines format; Content-Type is advisory. An optional lifetime field accepts ephemeral (default) or persistent.
Uploads must be nonempty and at most 18 MiB. Accounts can retain up to 100 undeleted uploads totaling 256 MiB. Delete unused persistent files to free capacity. Filenames must be at most 255 bytes and contain no path separators or control characters. DOCX and ODT archive contents are also checked for excessive expanded size. Use persistent uploads for templates shared across jobs. GET /v1/files/{id} returns metadata, including SHA-256, size, status, and lifetime. There is no endpoint to list uploads or download their original bytes; store file IDs and keep your originals. Upload support is broader than prompt support. See prompt inputs and conversion formats.

Download an artifact

Get metadata from a completed receipt or GET /v1/artifacts/{id}. It includes filename, content_type, bytes, sha256, variant, input_eligible, and expiry/deletion information. Fetch GET /v1/artifacts/{id}/content with bearer authentication. The API returns bytes or redirects to a signed storage URL valid for five minutes. Follow redirects without forwarding Authorization to another origin. With cURL, use --location, never --location-trusted. Request a fresh download URL through the API if the signed URL expires. Compare the downloaded length and SHA-256 with metadata before using the file. For encrypted output, these describe ciphertext; the download has MIME application/jose and a .jwe filename. Artifact metadata still describes the original plaintext format.
artifacts.content(id) returns a raw Response for streaming; your code owns consuming/closing it and checking integrity. Source.stream() buffers and verifies before returning a fresh stream.

Retention

An ephemeral file remains claimed even when its job fails. To create a different job from that input, upload the original again. Use persistent files for deliberate reuse. Replaying the original job’s idempotency key retrieves that job; it does not rerun it or restore deleted content. Delete a file with DELETE /v1/files/{id}. Delete a job’s content with DELETE /v1/prompt/{id}/content or DELETE /v1/convert/{id}/content. These calls send no body and return 204; repeated deletion succeeds. Active jobs or pinned content can return 409. Content deletion removes retained prompt/result content, customer metadata, document state, artifacts, and claimed ephemeral source data. Persistent templates are excluded. Billing receipts, IDs, status, and operational records remain. Expired/deleted downloads return 410; a retained metadata record does not guarantee available bytes.
With retention.delete_after_webhook_id, acknowledging the designated completion webhook with 2xx can delete the job’s content. Download and durably store results before acknowledging it. See webhooks.
Revise and the selected inference provider process plaintext document content. Output encryption protects exported artifact bytes; it does not encrypt receipt text or make input processing end-to-end encrypted. See the Privacy Policy for service data handling.