extractRun.output is typed, no more castingconfig instead of creating an extractor firstThe old /processor_runs endpoint is still supported in this API version for backward compatibility. You can migrate incrementally.
Define your extraction schema using Zod for fully typed output values. Pass a z.object() schema directly as config.schema — the SDK automatically converts it to the API’s JSON Schema format and infers the output type:
You can also use Zod schemas with an existing extractor by passing them via extractor.overrideConfig:
Available custom type helpers:
extendDate() — Date fields (output is ISO format yyyy-mm-dd)extendCurrency() — Currency fields (output has amount and iso_4217_currency_code)extendSignature() — Signature detection fields (output has printed_name, signature_date, is_signed, title_or_role)The legacy fields array format for defining extraction schemas is no longer supported in this API version. You must use the JSON Schema schema format instead.
See the JSON Schema guide for the full schema reference and examples.
In previous API versions, passing a non-nullable primitive type (e.g. "type": "string") would be silently converted to its nullable form ("type": ["string", "null"]). Similarly, enum arrays without null would have null automatically appended.
In 2026-02-09, this is now a validation error. You must explicitly declare nullable types in your schema. This prevents a mismatch between your schema definition and the actual API response — particularly important if you’re using SDK features like Zod schema validation in the TypeScript SDK, where a null return for a non-nullable field would cause a runtime error.
Breaking change: Schemas that previously worked due to silent conversion will now return a 400 Bad Request. Update your schemas before migrating.
Primitive types must use the nullable array form:
Enum arrays must include null:
This applies to all endpoints that accept an extraction schema: POST /extract, POST /extract_runs, POST /extractors, POST /extractors/{id}, and POST /extractors/{extractorId}/versions.
Breaking change: If you previously passed config alongside a processorId to override extractor settings, you must now pass it as extractor.overrideConfig inside the extractor object. The top-level config property is reserved for inline extraction (without an extractor).
Additionally, config.parser has been renamed to parseConfig everywhere — use config.parseConfig for inline config or extractor.overrideConfig.parseConfig when overriding an extractor.
If you previously passed config alongside processorId to override the extractor’s settings, this now moves inside the extractor object as overrideConfig:
Response shape changes: Single object responses are now returned directly (no wrapper key), and list responses use { "object": "list", "data": [...] } format. See Simplified Response Shapes for details.
If you’re using citations (bounding boxes), the page field structure has changed:
If you encounter any issues while migrating, please contact our support team at support@extend.app.