POST /v3/workflows/{workflow_id}/upload/run/, which uploads and runs in one call. Or upload a packet first and run it separately. anyformat creates a document packet to hold the document, walks the workflow graph, and writes structured results.
Run lifecycle
Every run moves through a sequence of statuses:
A run only exists once it is triggered, so runs start at
queued. Before that, the document packet carries status: not_started.
Read a run with GET /v3/runs/{run_id}/. It always returns 200 OK with the status above. results is null until the run reaches processed, then the results envelope arrives inline on the same read. Poll until the status is terminal, then stop.
A run reads the same way at every status. Only two keys change:
A run being polled
What the results contain
This page is the one place the whole envelope is written out. Every other page shows the few lines its own topic needs and links back here. A run produces one output section per node type that ran. The envelope has a fixed shape. A section for a node you did not include comes back empty,null or [], so your code reads
every key without checking first.
The shape
classifications,
splits and edits are empty. extraction is the deprecated flat copy of a linear workflow’s
fields. Read extractions[] instead.
The whole envelope, from a real run
The whole envelope, from a real run
Trimmed only where a value is long: Two fields are shown, from a workflow that used Smart lookup.
markdown runs to the length of the document, and blocks
carries one entry per block on every page.vendor_name was read off the page, so it carries a confidence and the phrase it came from.
supplier_id was resolved from a reference file, so its confidence is null and its
evidence is empty. There is no page it was read from.
Each extracted field carries a
value, an optional human-supplied value_override, a confidence score from 0 to 100, a verification_status, and an evidence array of source-text snippets with page numbers. Get run documents the full envelope. Read value_override when it is set, and value otherwise.
What the SDKs give you back. The TypeScript and Python SDKs both return a Result from Run.wait(). For a linear parse → extract workflow the scalar values sit right there. In Python, read result.fields["name"].value. In TypeScript, read result.field("name")?.value. The full envelope lives at result.raw in both languages: parse markdown, classifications, splits, and multi-extraction entries. Python also exposes a typed result.parse view.
Filled forms
An Edit node produces a document rather than data, so its output lands in its own section:edits[], one entry per file the node processed. A packet of five blank forms comes back as five entries.
Each entry records which fields the node found and what it wrote into them:
fields: every form field detected, filled or not, in document order. A field carries its printedlabel, itskindoftextorcheckbox, thepageandbboxit occupies, and thevaluewritten into it. A field the document already carried a value for comes back asstate: "prefilled". anyformat never overwrites it, so it always reads back withvalue: null.unmatched_instructions: the instruction fragments, quoted verbatim, that the linker matched to no field in this document. It covers instructions that found no field, not every reason a value can be missing from the rendered PDF, so treat the filled document itself as the final word.download_url: a temporary link to the filled PDF.
Confidence and evidence
Two signals that travel with most outputs.Confidence
A 0–100 score indicating how certain anyformat is about a value.- For
parse: two document-level scores, plus the same pair on every entry ofblocks[].parse_confidenceruns 0 to 100 and grades the text anyformat read.layout_confidenceruns 0 to 1 and grades the page layout it detected.parse_confidencecomes from the language model’s token log-probabilities.layout_confidencecomes from the YOLO layout-segmentation model. - For
extractions: a per-field score on each extracted value. - For
classifications: a per-verdict score. - For
edits: a per-field score with a different meaning from the rest. It grades how surely a filling instruction addressed that field, not whether the value written in is correct. It is raw and uncalibrated, and it is not a probability. Treat it as a ranking signal for review, not as a quality score for the filled document.
Evidence
An array of metadata objects showing where a value came from. It is an array because some values are inferred across several spans rather than copied from one place. Each evidence object has:- The snippet of text the value came from
- The page number in the document
metadata rather than from the document, evidence[0].text is metadata.<key>, such as metadata.customer_reference. Key on that prefix client-side to render metadata provenance differently, or to route the value to a “verified upstream” path. There is no page number to plot.
What’s next?
Outputs
Export formats for results: CSV, Excel, JSON, Markdown
Upload and run
Upload a document and start a run in one call
Get a run
The flat read that returns a run with its results inline
Document packets
The unit a workflow runs on

