Check your results

Get a job

GETDELETE/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.

Post-processing on read applies only to door-detector: result.doors / result.doors_found are filtered. TOC and content-extractor results are returned as stored.
FieldDescription
idstringJob UUID.
statusstringqueued, processing, complete, failed, cancelled, …
modelstringtoc-parser, content-extractor, door-detector, …
model_versionstringModel version string.
tierstringWhen applicable.
cachedbooleanWhen applicable.
cached_from_job_idstringWhen applicable.
queued_attimestampWhen the job was queued.
processing_started_attimestampWhen processing began.
completed_attimestampWhen the job finished.
processing_time_msintegerRecorded processing duration.
input_page_countintegerInput metadata.
input_file_size_bytesintegerInput metadata.
input_sourcestringInput metadata.
progressstringHuman-readable status string.
resultobject | nullnull until complete (or absent); shape depends on model.
error_codestring | nullOn failure, the same value as error.code.
errorobject | nullOn failure, { code, message }: a stable code and a message you can show. null otherwise.
webhook_urlstringIf set on submit.
webhook_delivered_attimestampIf delivered.
expires_attimestampJob row expiry; GET requires expires_at > now().
pdf_urlstringPresigned 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.

FieldDescription
job_idstring · UUIDThe cancelled job.
statusstringcancelled

Errors

StatusWhat it means
404Unknown id, another account’s job, or expires_at ≤ now() — same response in all cases (anti-enumeration).

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

  1. POST /v1/documents → document_id
  2. POST /v1/specs/parse/document → TOC job_id
  3. GET /v1/jobs/{toc_job_id} until complete → result.divisions / section codes
  4. POST /v1/specs/content-extract with job_id: TOC job id and section_codes and/or division_codes
  5. GET /v1/jobs/{content_job_id} until complete → result.sections

Searches these docs: guides, the basics and every endpoint.

Make your first requestPlayground walkthrough: upload, choose an analysis, run it
Connect your softwareYour application calls the REST API. Requires an API key
Connect your AI agentGive an agent a tool that calls the REST API
AuthenticationX-API-Key header, 401 errors, keeping keys safe
Detect doorsPOST /v1/drawings/detection/doorsDoor detection — Find the doors on the pages of an architectural drawing set.
Check your resultsGET /v1/jobs/{job_id}Get a job — See a job’s status and, once it’s complete, its results.