Get a slot to upload a large document into
const url = 'https://example.com/v1/uploads';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"bytes":12400000}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/v1/uploads \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "bytes": 12400000 }'Stage a document too big to send in one request.
PUT the PDF to the returned URL, then call /v1/extract with
X-Upload-Id. The object is deleted as it is read, on every tier, so
staging is transport rather than storage: nothing survives the
extraction that consumed it, and an upload nobody extracts expires on
its own.
Available on every plan. The documents that need this are the large scanned as-builts that government and compliance-sensitive buyers work with, which is the last group that should be locked out of it.
Authorizations
Section titled “Authorizations”Request Body
Section titled “Request Body”Responses
Section titled “Responses”Successful Response
A one-shot slot to PUT a document into.
The document goes straight to storage rather than through this API, which
is what lifts the size ceiling: a Lambda Function URL base64-encodes request
bodies and caps them near 4.5 MB. Extraction then takes the upload_id and
the object is deleted as it is read.
object
Pass this to /v1/extract as X-Upload-Id.
PUT the PDF here. Single use, and it expires.
Seconds the URL stays valid.
Example
{ "expires_in": 900, "max_bytes": 33554432, "put_url": "https://easting-staging.s3.amazonaws.com/staging/...", "upload_id": "upl_9dK2mQxLp7ZvR4tYbN6w"}Missing, unknown, or revoked API key
object
object
Example
{ "error": { "documents_used": 200, "message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.", "monthly_cap": 200, "resets_on": "2026-08-01", "type": "quota_exceeded" }}That upload id is not the caller’s
object
object
Example
{ "error": { "documents_used": 200, "message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.", "monthly_cap": 200, "resets_on": "2026-08-01", "type": "quota_exceeded" }}No such upload; ids work exactly once
object
object
Example
{ "error": { "documents_used": 200, "message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.", "monthly_cap": 200, "resets_on": "2026-08-01", "type": "quota_exceeded" }}Document over the staged size limit
object
object
Example
{ "error": { "documents_used": 200, "message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.", "monthly_cap": 200, "resets_on": "2026-08-01", "type": "quota_exceeded" }}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}Staging is not configured on this server
object
object
Example
{ "error": { "documents_used": 200, "message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.", "monthly_cap": 200, "resets_on": "2026-08-01", "type": "quota_exceeded" }}