/v1/specs/content-extractQueue extraction of section text (and optional LLM-structured requirement fields) for CSI-style sections from the same PDF as a completed TOC parse job. Job model: content-extractor. X-API-Key and Content-Type: application/json; response is 202 with a new job id, then poll GET /v1/jobs/{job_id}.
Prerequisite
Requires a toc-parser job for your account with status === "complete". Create it with POST /v1/specs/parse/document. The canonical path is /v1/specs/parse/document — not /v1/specs/parse.
Request
Headers: X-API-Key, Content-Type: application/json. Body: ContentExtractRequest.
Section codes: non-digits stripped; first 6 digits must form a full code (e.g. "10 29 00" → 102900). Invalid input → 422 INVALID_SECTION_CODE.
Division codes: non-digits stripped; last 2 digits padded to match division (e.g. 01, 1). Sections are taken only from divisions present in the stored TOC result. After expansion, codes are deduplicated (order preserved). If nothing resolves → 422 NO_SECTIONS_RESOLVED.
Code examples
Response — 202 Accepted
The response job_id is a new content-extractor job. The request body job_id is the source TOC job; when complete, result.source_job_id points back to that TOC job. Poll GET /v1/jobs/{job_id} — see GET /v1/jobs/{job_id}.
Result shape
When status === "complete" and model === "content-extractor", result comes from content_extractor/task.py per section.
Structured arrays are filled when SpecNormalizer succeeds on non-empty content; on failure they default to empty arrays (logged server-side). GET /v1/jobs does not post-process content-extractor results (only door-detector is filtered on read).
Credits & rate limits
Same quota behavior as parse/document: free 402, paid monthly 429 when exhausted; RPM 429 from middleware.
Errors (synchronous, before queueing)
Codes appear in handler detail; Intelligence may still genericize JSON bodies.
See Errors for HTTP exception mapping.
Typical flow
POST /v1/documents→document_idPOST /v1/specs/parse/document→ TOCjob_idGET /v1/jobs/{toc_job_id}until complete → readresult.divisions/ section codesPOST /v1/specs/content-extractwith bodyjob_id(TOC job) andsection_codesand/ordivision_codesGET /v1/jobs/{content_job_id}until complete → readresult.sections
Response Preview
{ "job_id": "9faf778a-9636-52f0-b66d-e29fe3b12cf8", "status": "queued", "poll_url": "/v1/jobs/9faf778a-9636-52f0-b66d-e29fe3b12cf8" }