Parse a document synchronously
Admit a parse job, wait up to the sync wait limit, and return the selected terminal parse
representation when ready. output_format defaults to the versioned provider-neutral
openparser@1; raw returns a stable provider envelope around the selected provider's
untouched successful result. Terminal failed within the wait window returns 422
ErrorResponse; terminal indeterminate returns 504 ErrorResponse. Returns 202
with a durable job reference and Location if the wait limit expires first.
Example (multipart/form-data):
curl -X POST 'https://api.openparser.dev/parse' \ -H 'Authorization: Bearer YOUR_API_KEY' \ -H "Idempotency-Key: $(uuidgen 2>/dev/null || openssl rand -hex 16)" \ -F 'request={"ocr_model":"paddleocr-vl-1.6","output_format":"openparser@1"};type=application/json' \ -F 'file=@./document.pdf'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
application/json
application/json
curl -X POST "https://example.com/parse" \ -H "Idempotency-Key: 7f9f2f3d-0f8a-4f0a-9a2b-2f6f0a7d2c11" \ -H "Authorization: Bearer $OPENPARSER_API_KEY" \ -F request="{ \"ocr_model\": \"string\" }"{ "output_format": "openparser@1", "document_id": "doc_01h2example", "provenance": { "provider": "paddle", "model": "paddleocr-vl-1.6" }, "text": "# Invoice\\n\\nTotal due: $1,234.56", "markdown": "# Invoice\n\nTotal due: $1,234.56\n", "pages": [ { "number": 1, "width": 1700, "height": 2200, "unit": "pixel", "element_ids": [ "e0", "e1" ], "reading_order": [ "e0", "e1" ] } ], "elements": [ { "id": "e0", "kind": "text", "role": "heading", "text": "# Invoice", "spans": [], "languages": [], "locations": [ { "page_number": 1, "bbox": { "left": 72, "top": 48, "right": 220, "bottom": 92 } } ], "confidence": { "score": 0.98, "scope": "recognition", "calibrated": false } }, { "id": "e1", "kind": "text", "role": "paragraph", "text": "Total due: $1,234.56", "spans": [], "languages": [], "locations": [ { "page_number": 1, "bbox": { "left": 72, "top": 180, "right": 420, "bottom": 220 } } ], "confidence": { "score": 0.95, "scope": "recognition", "calibrated": false } } ], "text_annotations": [], "relations": [], "assets": []}{ "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 }}{ "error": { "code": "provider_indeterminate", "message": "job outcome indeterminate", "request_id": "req_01h2example", "retryable": true }}List compatible LLM models GET
Returns a cached, normalized OpenRouter catalog filtered to models that advertise strict structured output (`structured_outputs` + `response_format`), have valid finite provider-list cost (internally) that is converted to customer retail rates, produce text, and are not expired. Default `mode=suggested` returns a short recommended subset. `mode=search` discovers the full compatible catalog with optional `q` / pagination. Field grounding and schema suggestion remain restricted to certified models.
Parse a document asynchronously POST
Admit a durable parse job and return immediately. Example (`multipart/form-data`): ```bash curl -X POST 'https://api.openparser.dev/parse/async' \ -H 'Authorization: Bearer YOUR_API_KEY' \ -H "Idempotency-Key: $(uuidgen 2>/dev/null || openssl rand -hex 16)" \ -F 'request={"ocr_model":"paddleocr-vl-1.6","output_format":"openparser@1"};type=application/json' \ -F 'file=@./document.pdf' ```