Skip to main content
Start a run by submitting a document. Use the UI, or call 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 below writes the envelope out in full.

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
Line 6 is what the document says. Line 8 is what you asked for. The rest are sections this workflow did not use. It had a Parse node and an Extract node, so classifications, splits and edits are empty. extraction is the deprecated flat copy of a linear workflow’s fields. Read extractions[] instead.
Trimmed only where a value is long: markdown runs to the length of the document, and blocks carries one entry per block on every page.
Two fields are shown, from a workflow that used Smart lookup. 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 printed label, its kind of text or checkbox, the page and bbox it occupies, and the value written into it. A field the document already carried a value for comes back as state: "prefilled". anyformat never overwrites it, so it always reads back with value: 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.
The download link is short-lived. download_url is valid for 15 minutes from the moment the response was built. A fresh one is minted every time you read the run. Fetch the PDF when you receive it, or re-read the run for a new link. A stored URL will be dead.

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 of blocks[]. parse_confidence runs 0 to 100 and grades the text anyformat read. layout_confidence runs 0 to 1 and grades the page layout it detected. parse_confidence comes from the language model’s token log-probabilities. layout_confidence comes 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
Evidence is the right signal to surface in a human-review UI. It lets reviewers jump straight to the source. Metadata-sourced values carry a marker. When a field comes from a top-level key of the packet’s 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