Extract structured data asynchronously
Admit a durable single extract job from file bytes, file_id, or parse_job_id and
return immediately. Parse reuse does not run OCR or add a page charge; OpenRouter usage
remains billable.
Authorization
bearerAuth Existing Eigenpal API key presented as a bearer token.
In: header
Header Parameters
Client-supplied idempotency key. Required on every parse or extract POST. Must be unique per distinct
request body for a given tenant and operation.
1 <= length <= 256Request Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/extract/async" \ -H "Idempotency-Key: 7f9f2f3d-0f8a-4f0a-9a2b-2f6f0a7d2c11" \ -H "Authorization: Bearer $OPENPARSER_API_KEY" \ -F request="{}"{ "id": "opj_7f9f2f3d0f8a4f0a9a2b2f6f0a7d2c11", "operation": "parse", "status": "queued", "output_format": "openparser@1", "created_at": "2026-07-17T12:00:00Z", "updated_at": "2026-07-17T12:00:00Z"}{ "error": { "code": "malformed_request", "message": "multipart field `request` is not valid JSON", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "unauthorized", "message": "invalid API key", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "insufficient_credits", "message": "tenant has insufficient credits for admission", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "forbidden", "message": "API key lacks required scope", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "idempotency_conflict", "message": "Idempotency-Key was already used with a different request body", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "limit_exceeded", "message": "source exceeds 50 MiB admission limit", "request_id": "req_01h2example", "retryable": false, "details": { "limit": "max_input_bytes", "max_value": 52428800 } }}{ "error": { "code": "unsupported_media_type", "message": "only PDF, PNG, and JPEG uploads are accepted", "request_id": "req_01h2example", "retryable": false }}{ "error": { "code": "unsupported_ocr_model", "message": "unknown OCR model registry name", "request_id": "req_01h2example", "retryable": false, "details": { "ocr_model": "paddleocr-vl-9.9" } }}{ "error": { "code": "rate_limited", "message": "request rate limit exceeded", "request_id": "req_01h2example", "retryable": true }}{ "error": { "code": "source_upload_failed", "message": "source upload failed", "request_id": "req_01h2example", "retryable": true }}Extract structured data synchronously POST
Admit a single extract job from file bytes, `file_id`, or a tenant-owned succeeded `parse_job_id`, then run schema-constrained OpenRouter extraction via `llm_model`. A `parse_job_id` source reuses the canonical ParsedDocument (from dual artifacts or legacy `result_json`) without OCR or another page charge; historical raw-only parses return `422 canonical_result_unavailable`. Wait up to the sync wait limit and return `ExtractionTerminalResult` when ready. Terminal `failed` within the wait window returns `422`; terminal `indeterminate` returns `504`. Returns `202` with a durable job reference and `Location` if the wait expires.
Extract structured data from multiple documents POST
Admit up to 100 file-backed extract child jobs in one durable batch. Every item uses `file_index` or `file_id`; `parse_job_id` reuse is single-extract-only and is not accepted in batch. Partial child failures are preserved. Parent status derivation follows `JobStatus`; billing is evaluated per child.