Values respect your types
Strings stay strings, numbers stay numbers, and dates land in the format you asked for. Enums normalize, so downstream code never has to reconcile "Invoice" against "INVOICE".
A general-purpose LLM hands back JSON that looks right, with no way to tell what's wrong. Extract returns fields that match your schema, each one cited, verified, and scored.
A real 48-page scanned contract — the NASA–SpaceX Space Act Agreement. Extract pulls each value and cites the exact block it came from.
Strings stay strings, numbers stay numbers, and dates land in the format you asked for. Enums normalize, so downstream code never has to reconcile "Invoice" against "INVOICE".
Each field comes back with the block it was read from and a pass/fail verification against that block. Auto-accept what passes and route the rest to review, instead of re-reading every document.
Balanced is the default — highest accuracy, with reasoning and a verification pass on every field. Fast trades that for lower latency and cost on high-volume work.
Every field comes back scored 1 (very low) to 5 (high), with the reasoning behind it. Auto-accept the high-confidence values and send the low ones to review, instead of checking them all.
Send a JSON Schema and the output comes back shaped to match it, the same way on every document. Hand the result straight to the code that depends on it — no reshaping, no per-vendor special cases.
import json
from datalab_sdk import DatalabClient, ExtractOptions
client = DatalabClient()
schema = {
"type": "object",
"properties": {
"company_party": {"type": "string"},
"company_signatory_name": {"type": "string"},
"company_signatory_title": {"type": "string"},
"company_signature_date": {"type": "string", "description": "as written"},
"government_party": {"type": "string"},
},
"required": ["company_party", "company_signatory_name"],
}
# extraction_mode="balanced" is the default — highest accuracy, with reasoning
# and a verification pass on every field. Use "fast" for lower latency and cost.
options = ExtractOptions(page_schema=json.dumps(schema), extraction_mode="balanced")
result = client.extract("space-act-agreement.pdf", options=options)
extracted = json.loads(result.extraction_schema_json)
# Each field arrives with the source block(s) it was read from and a meta
# object holding the reasoning and a pass/fail verification against them:
# {
# "company_signatory_name": "Elon Musk",
# "company_signatory_name_citations": ["/page/25/Text/7"],
# "company_signatory_name_meta": {
# "reasoning": "Found in the signature block on page 26.",
# "verification": {"status": "PASS", "feedback": "..."}
# },
# ...
# } When your schema asks for something the document doesn't contain, Extract returns null and says why, instead of inventing a plausible answer. A confident wrong value is worse than no value.
Extract can find exactly what you need and reconcile information across pages.
Extraction is only as good as the parse underneath it. Ours runs on our own open models — Marker, Surya, and Chandra — which top the public olmOCR-bench table leaderboard among open OCR.
Pull insured names, dates of loss, claim numbers, and coverage limits out of ACORD forms, FNOL packets, and certificates — each value cited back to the page it came from.
See the deep-dive →FINANCIAL SERVICESPull totals, holdings, and transactions from brokerage statements and SEC filings, including tables that run for pages.
See the deep-dive →PHARMAPull endpoints, inclusion criteria, and dosing schedules into the same structured shape on every protocol you process.
See the deep-dive →Start with an API key — nothing to host or operate.
Sign up →Run in-region, with no egress to US infrastructure.
Sign up →Runs inside your own AWS, GCP, or Azure account.
Talk to sales →Fully offline, the same model weights, dedicated support.
Talk to sales →Free tier, no credit card required.