Check your results
Get a job
/v1/jobs/{job_id}See a job's status and, once it's complete, its results. Use it after any analysis, or skip polling by adding a webhook_url to the analysis request.
Poll async jobs for status, progress, result, and errors. Same resource supports cancelling a job while it is still queued. Auth: X-API-Key on both methods.
- Returns
- Job statusand result when complete
- Status values
- complete or failedonce finished; queued, processing or cancelled before
- Shortcut
- poll_urlfrom the 202 response
- Auth
- API keyX-API-Key header
GET — Poll job
You can also build this URL from the poll_url in any 202 response by adding the base URL in front.
Returns a single JSON object for the job. input_s3_key and input_s3_bucket are not exposed; the API includes a presigned pdf_url for the source PDF (default expiry 3600s in _make_presigned_url). The shape varies by lifecycle stage; see the queued and complete examples.
door-detector: result.doors / result.doors_found are filtered. TOC and content-extractor results are returned as stored.| Field | Description |
|---|---|
idstring | Job UUID. |
statusstring | queued, processing, complete, failed, cancelled, … |
modelstring | toc-parser, content-extractor, door-detector, … |
model_versionstring | Model version string. |
tierstring | When applicable. |
cachedboolean | When applicable. |
cached_from_job_idstring | When applicable. |
queued_attimestamp | When the job was queued. |
processing_started_attimestamp | When processing began. |
completed_attimestamp | When the job finished. |
processing_time_msinteger | Recorded processing duration. |
input_page_countinteger | Input metadata. |
input_file_size_bytesinteger | Input metadata. |
input_sourcestring | Input metadata. |
progressstring | Human-readable status string. |
resultobject | null | null until complete (or absent); shape depends on model. |
error_codestring | null | On failure, the same value as error.code. |
errorobject | null | On failure, { code, message }: a stable code and a message you can show. null otherwise. |
webhook_urlstring | If set on submit. |
webhook_delivered_attimestamp | If delivered. |
expires_attimestamp | Job row expiry; GET requires expires_at > now(). |
pdf_urlstring | Presigned GET for the job PDF. |
Worker failures (e.g. URL_UNREACHABLE, PDF_CORRUPT, TIMEOUT, INTERNAL_ERROR) appear as status: failed with an error object, for example {"code": "PDF_CORRUPT", "message": "The submitted PDF could not be processed."}.
DELETE — Cancel job
Cancels a job only while status is queued. Same auth and ownership rules as GET.
| Field | Description |
|---|---|
job_idstring · UUID | The cancelled job. |
statusstring | cancelled |
Errors
| Status | What it means |
|---|---|
| 404 | Unknown id, another account’s job, or expires_at ≤ now() — same response in all cases (anti-enumeration). |
| Status | What it means |
|---|---|
| 404 | Same as GET — missing job or not your account. |
| 409JOB_NOT_CANCELLABLE | Already processing, complete, failed, etc. |
Usage
Submitting jobs (for example spec parse or content-extract) counts toward your plan's allowance; polling GET /v1/jobs and DELETE /v1/jobs do not.
Typical spec workflow
POST /v1/documents→document_id- POST /v1/specs/parse/document → TOC
job_id GET /v1/jobs/{toc_job_id}until complete →result.divisions/ section codes- POST /v1/specs/content-extract with
job_id: TOC job id andsection_codesand/ordivision_codes GET /v1/jobs/{content_job_id}until complete →result.sections