Invoice Data Extraction API and SDK changelog
Versioning. The API is versioned by URL path (/v1). Backward-compatible additions ship without a version change and are announced here. Breaking changes, if ever needed, ship as a new version path with at least 6 months of dual operation.
2026-09-12: The docs under one address, and an entry page for the API and for agents
- /api is the entry page for the API and for agents: why to run extraction through your own agent rather than have it read the documents, the skill to give it, and one block per path with its docs.
- The docs live under
/docs: the REST API reference, the Node.js and Python SDK docs, the agent guide and this changelog, each with its Markdown twin at the same address plus.md. The previous page addresses redirect, and the previous Markdown addresses (/api.md,/sdk/node.md,/sdk/python.md,/agents.md,/changelog.md) keep serving the same documents.
2026-09-12: Machine-readable docs, the agent guide and the skill
- The API contract as an OpenAPI 3.1 specification at /openapi.yaml and /openapi.json.
- The docs as Markdown: /api.md, /sdk/node.md and /sdk/python.md, each the whole reference for its path; /llms.txt indexes them.
- The agent guide at
/agentsand/agents.md: when to hand documents to this service, the whole loop including answering questions, and the limits in one place. - A skill for coding agents and assistants, discoverable from
/.well-known/agent-skills/index.json:npx skills add https://invoicedataextraction.com. - /pricing.md: the offer and the price table as plain text.
- This changelog, at
/changelogand/changelog.md.
2026-09-12: Every question says its scope; SDKs 0.6.1
- Every question on an
input_requiredstatus carriesscope:level(extractiontoday) andapplies_toin words. An answer governs every document in the extraction, not only the one in the question's example; where the right answer differs by document type, say so intext. - The reference describes what a refused answer is: one given in bad faith, screened out and asked again with
previous_answer_rejected. A vague or undecided answer is applied, and the matter may be asked again as a new question. - SDKs 0.6.1: the Node.js type declarations carry
scopeon every question. The Python package is at 0.6.1 too, with no change in behaviour.
2026-09-11: The extraction can ask you questions; SDKs 0.6.0
options.ask_questionson submit lets the extraction stop and ask when the documents leave something unsettled. The status is theninput_required, from the moment the questions exist, with every open question and theanswer_bydeadline.POST /v1/extractions/{extraction_id}/answerstakes a choice, a choice with words beside it, words alone, oraccept_recommended, and answers with the extraction's status. A repeated post after the extraction has moved on is not an error.input_requiredin the list filter and on the details record, which also carries the questions.- Two new cancellation reasons:
unanswered(nobody answered byanswer_by) andanswers_rejected(three refused answers). - SDKs 0.6.0:
extract(...)takesask_questionsand anon_questionshandler that answers in your code; without the handler it returns the waiting status for you to answer withanswerQuestions(...)/answer_questions(...). - An SDK at 0.5.0 or earlier that polls an extraction submitted from the web app with questions on now meets
input_required, a status its wait loop does not know, and stops with an error after about five minutes where it used to keep polling. Update to 0.6.0 or later.
2026-09-10: Held status requests, rows as JSON, cancel, output options, typed values; SDKs 0.5.0
waitonGET /v1/extractions/{extraction_id}(1 to 45 seconds) holds the request until the extraction leavesprocessing, so a handful of calls replaces a polling loop.GET /v1/extractions/{extraction_id}/results: the extracted rows as JSON, in pages of up to 1,000, with the Review Needed items for each page alongside.credits_balanceandcredits_reservedon the completed and cancelled status responses.POST /v1/extractions/{extraction_id}/cancelstops an extraction that is queued or processing; cancelled responses carrycancellation_reason, andcancelledjoins the list filter.- Per-extraction output options on submit:
output_language,review_needed_fill_color,affected_field_fill_colorandsend_completion_email, each defaulting to the account's preferences. options.json_typed_values: native JSON types in the JSON output file and the results endpoint. Recommended for a new integration that reads the rows; the default stays strings.- Every error message says what happened and what to do next.
RATE_LIMITEDcarriesdetails.retry_after_secondsbeside theRetry-Afterheader, andVALIDATION_FAILEDis a failure code of its own. - SDKs 0.5.0: the held status check,
getResults(...)/get_results(...)and the row iterators,cancelExtraction(...)/cancel_extraction(...), the output options onextract(...)andsubmitExtraction(...)/submit_extraction(...), and retries hardened for non-JSON gateway responses.
2026-07-06: API host hardening and docs links
- Requests to paths outside
/v1/onapi.invoicedataextraction.comreturn the standard JSON error envelope instead of plain text. invoicedataextraction.com/docsredirects to the API reference.
2026-07-03: SDKs 0.4.0
- The Node.js and Python SDKs send
X-SDK-NameandX-SDK-Versionheaders naming the client. Any client may send them.
2026-06-21: SDKs 0.3.0
- Review Needed warnings, the
cancelledstatus and page failure reasons in the SDKs' responses, matching the API.