Submit one document for asynchronous extraction
const url = 'https://example.com/v1/extracts';const options = { method: 'POST', headers: { 'X-Document-Name': 'citrus_fl_2025014130.pdf', Authorization: 'Bearer <token>', 'Content-Type': 'application/pdf' }, body: 'binary'};
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/extracts \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/pdf' \ --header 'X-Document-Name: citrus_fl_2025014130.pdf' \ --data binaryTake the document, answer immediately, extract it elsewhere.
Use this for anything that might run long, which in practice is any multi-tract instrument. A small deed works here too and costs a couple of seconds of polling over the synchronous path.
The quota check happens now rather than when the worker finishes, so a job never settles into a bill the customer never agreed to. Jobs already in flight count against the allowance, batch items included.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Request Body
Section titled “Request Body”The document, exactly as /v1/extract takes it: raw bytes with an optional X-Document-Name, a multipart file part, or nothing at all when X-Upload-Id names a staged document.
object
Responses
Section titled “Responses”Successful Response
What POST /v1/extracts answers, in milliseconds.
The extraction has not started yet. Poll poll_url until status is
succeeded (the whole /v1/extract body arrives in result) or failed
(the reason arrives in error).
object
Poll here every few seconds until the status is terminal.
Example
{ "document": "citrus_fl_2025014130.pdf", "job": "job_9dK2mQxLp7Zv", "poll_url": "https://api.easting.ai/v1/extracts/job_9dK2mQxLp7Zv", "status": "queued", "submitted_at": "2026-08-09T21:14:02Z"}The request was understood and refused
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" }}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" }}Monthly document cap or overage ceiling reached
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 job under this 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" }}The request conflicts with current state
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" }}Result past its retention window
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 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" }}Body was empty, or was not a PDF, TIFF, PNG, or JPEG
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" }}Rate limited; read Retry-After
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" }}Extraction failed upstream
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" }}Extraction temporarily unavailable
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" }}