Skip to main content

August 25, 2026

[New] Documentation reorganised around nodes The docs are now organised around the workflow nodes. Parse, Extract, Classify, Split, If/Else, Validate, Edit and Knowledge each have their own page, with API and SDK examples side by side, and every example is written against API v3. The v2 version switcher is gone; v2 stays documented in the migration guide until its sunset. Start at the node overview. [New + API] Drive anyformat from any agent host over MCP anyformat now serves a remote MCP server, so Claude Code, Claude Desktop, Cursor, ChatGPT or your own agent can work with your workflows through typed tools, with one connection and no SDK code to write. The first release covers the workflow lifecycle: list, get, create, update and delete.
The server is mounted at https://api.anyformat.ai/mcp (Streamable HTTP, stateless) and authenticates with your existing af_* API key as a bearer token. Tools: list_workflows, get_workflow, create_workflow, update_workflow, delete_workflow. Every tool calls the matching /v3/workflows/ route, so rate limits, ids and the error envelope are the ones you already know; a failed call returns the standard {error, error_code, retryable, request_id} envelope as the tool error. A missing or invalid key answers 401 with MISSING_API_KEY / INVALID_API_KEY.
[Improved] The Fast tier is now priced as the cheapest model tier Parse and extract in Fast mode now bill 12 and 17 credits per page, half the standard rate. They previously billed at the standard rate (25 and 35). See How credits work.
mode: "lite" on a parse or extract node bills under the new lite_parse and lite_extract operators. mode: "max" keeps billing as extract.

August 24, 2026

[Improved] Fast parse always runs the strongest OCR The Fast parse tier is now one recipe: the strongest deployed OCR with native layout detection, every time. The effort selector is gone from Studio and from the SDK builders.
ocr_effort is still accepted on a parse node and ignored. Losing the knob re-keys the parse cache, so the first Fast parse of a document after this change is a cache miss.
[New] Preview DOCX, CSV and XLSX files before processing The document viewer now renders Word documents natively before a run has processed them, and CSV and Excel files open in a table viewer instead of a raw preview. [Fixed] Downloading a DOCX or PPTX returns the original file Clicking a file name to download a Word or PowerPoint document handed back its PDF conversion. Download now returns the original bytes; the viewer keeps using the converted PDF for preview.
GET /api/v3/files/{file_id}/download/ serves the original file. A new GET /api/v3/files/{file_id}/processed/ serves the PDF-converted variant and answers 404 when the file has none (native PDFs).
[Fixed] The Documents grid no longer lists dataset copies A document copied into a workflow’s dataset appeared in the Documents grid as if it were an ordinary upload. Dataset copies are excluded now. Single-file documents also show their file name in the collection column. [Fixed] Studio refuses to save a graph that breaks the topology rules An invalid connection could be saved from Studio and only fail when a document ran. The topology rules the API enforces now run on Studio’s save path too, and a node that must have a single upstream is checked as such.

August 21, 2026

[New] Evals 2.0 is generally available The Health tab, with Datasets, Evaluations and the Optimizer, now shows for every organisation. The 1.0 / 2.0 toggle is gone. See Evaluations. [Fixed] The Run button counted 0 documents after an upload After uploading documents, the Run button’s count stayed at 0 until the page was reloaded. [Fixed] If/Else workflows show the upstream extraction results When an If/Else run did not branch into a further step, the results view showed nothing. It now shows the upstream Extract results. [Improved] Smart-table extraction reports a clear refusal on multi-file documents A smart-table field cannot run over a document packet with more than one file. The refusal now appears in the results view with a message that says so. [Fixed] One node order and one node name in the run’s progress trail The progress trail could list a run’s nodes in a different order, or under a different name, from the workflow page. Both now come from one source.

August 20, 2026

[Breaking + API] The Fast parse tier is OCR-only; its review settings are removedFast-mode parse (mode: "lite") now runs a single OCR pass with no model review behind it. A workflow that wants model understanding on top of OCR should use standard or agentic. Four parse-node fields that configured the retired review stage are removed from the API: skip_routing_review, figures, text_formatting and routing_effort. The region field is removed too: Fast OCR always runs in the EU. Stored workflows were migrated automatically.Action required: remove those fields from any parse node your integration sends. A request that still carries one of the four review fields is rejected with 400 naming the field. Update to the latest SDK, which no longer offers them.
[Improved] Flash OCRs scanned and rotated pages Flash’s scanned_pages option gains an "ocr" policy, and it is the new default: a page with no text layer, or a rotated page, is OCR’d and then flows through the same layout and reading-order steps as the rest of the document. "skip" and "fail" keep their behaviour. Because the default moved, a Flash workflow that never set the option now OCRs pages that used to come back blank. [Improved] Flash parses multi-page documents faster Flash now runs its layout-detection batches concurrently, so a long document no longer waits on one page at a time. [Fixed] Flash markdown follows the rendered reading order Flash served its markdown as a join of the element list instead of the rendered reading order, so columns and captions could come out in the wrong sequence. [Improved] Validate leaves beta The Validate node no longer carries a beta label in Studio. [Improved] Long-running extractions get 90 minutes The time limit on a single extraction is raised to 90 minutes, so a very large document no longer times out before it finishes. [Fixed] Error-page counts on the Usage page The Usage page’s error-pages figure was read from a source that could disagree with the Results view. It now counts from the run records. [Improved] Results-page node tabs match the workflow page The node tabs on a file’s results page now use the same labels as the workflow page.

August 19, 2026

[New + API] Flash: a CPU-only parse tier for born-digital documents Flash is the rung below Fast. It reads the PDF’s own text layer, detects regions and reading order with a layout model, and serves markdown with no model call and no paid OCR, at 7 credits per page. Born-digital text and ruled tables report confidence 100; a heuristic structure reports no confidence rather than a fabricated one. Available in Studio’s parse menu, on the API and in both SDKs. See Parse.
Set "mode": "flash" on a parse node. scanned_pages decides what happens to a page without a text layer. Flash bills 7 credits per page under its own operator.
[New] If/Else branch results as tabs The results a document produced depend on the branch it took. The file results view and monitoring now show one tab per branch. Tabs are keyed by node id, so renaming a node keeps its history. [Improved] Parsed markdown comes from one structured renderer The structured markdown renderer is now the only renderer, so parsed markdown is formatted consistently across documents and tiers. [Fixed] A rejected model credential no longer fails extractions silently A workflow using your own model credential now reports a rejected credential as the reason for the failure instead of failing with no explanation. [Fixed] Field references survive import, duplicate and new-field authoring If/Else, Validate and Slack Alert nodes that referenced a field broke when the workflow was imported or duplicated, or when the referenced field had just been authored. [Fixed] If/Else condition chips render for Studio-authored filters A condition written in Studio could render as an empty chip on the node card. [Fixed] Unexpected model response shapes no longer fail the run An extraction reply in an unexpected shape is repaired instead of failing the run, and a missing evidence key is defaulted rather than aborting the result.

August 18, 2026

[API] Filled forms from the Edit node on the results envelope A run with an Edit node now returns its filled forms with the results: one entry per filled file, with the detected fields, each field’s link confidence, and a presigned URL for the filled PDF.
The results envelope gains edits[]. It reaches both the v2 results endpoint and GET /v3/runs/{run_id}/, and the Python SDK surfaces it on Result. confidence is int | None: a raw linker match score, not a calibrated probability. The presigned URL is minted fresh on every read.
[New] Global search with ⌘K Press ⌘K (Ctrl+K) anywhere in the app to open a command palette and jump across the app. [Improved] Standard parse runs the layout-aware pipeline Standard parse now runs the planner-routed, layout-aware pipeline for every document, and renders a page’s table blocks concurrently. Figures always render, so the Figures toggle is gone from the standard parse menu.
figure_enhancement is still accepted on a parse node and ignored. ParseMode and the SDKs are unchanged.
[Improved] Annie builds and reads Edit workflows Ask Annie to add a form-filling step and she wires an Edit node with its instructions.

August 17, 2026

[Breaking + API] A confidence the platform did not measure is now nullWherever results carry a confidence, a value that was never measured now reads null instead of a fabricated number. Classification confidence served 0.0 where nothing was measured; extraction and parse confidence served 100. Split ranges, smart-table cells and layout confidence follow the same rule. The Results view’s confidence filter surfaces these values instead of hiding them as perfect.Action required: treat every confidence field as nullable. A client that parsed the field as a required number will fail on null.
[New + API] Ask questions over a workflow’s knowledge base With a Knowledge node in a workflow, every completed run’s parsed documents are indexed into a per-workflow knowledge base. You can now ask that base a question over the API and get an answer with citations. See Knowledge.
POST /v3/workflows/{workflow_id}/knowledge/ask with { "question": ... }; client.ask(...) in the Python SDK (sync and async), and the JS SDK from the regenerated spec. An ask bills 3 credits per 10,000 input tokens. An organisation with no credit is refused with 402 PAYMENT_REQUIRED before the question runs. 409 KNOWLEDGE_NOT_ENABLED means the workflow has no Knowledge node; 409 KNOWLEDGE_NOT_READY (retryable) means the index is still building.
[Improved] If/Else says where missing data goes When a condition cannot be evaluated, because a referenced field is missing or a confidence check has no score, the document takes the False branch. That rule is unchanged, but it was invisible: the condition builder now says so, with a link to If/Else. [Improved] Expression conditions on If/Else An If/Else condition can now use the Expression subject, the same one Validate rules use, so a condition can test an arithmetic relation across fields. [Improved] Triggering a run responds about half a second faster The run trigger endpoint does less work before it answers. [Improved] Sidebar: remembered collapse, New workflow, favourite from the menu The sidebar remembers whether you collapsed it, offers New workflow directly, and lets you favourite a workflow from its menu. [Fixed] If/Else save, dirty and close-guard behaviour matches Validate Closing the If/Else editor with unsaved changes behaved differently from the Validate editor. Both now warn the same way.

August 14, 2026

[New + API] Edit and Knowledge nodes on the public API A workflow definition sent to the API can now carry an edit node and a knowledge node. The Edit node fills a form PDF; the Knowledge node opts the workflow into the knowledge base. Both are accepted on create, update and the read response, on v2 and v3, and in both SDKs. See Edit and Knowledge.
{"type": "edit", ...} accepts reference_document_ids; the resolved storage locations stay server-side and a caller-supplied reference_uris is rejected. {"type": "knowledge"} carries nothing but id and type.
[New + API] Validate with an expression over the whole extraction A deterministic Validate rule can now carry an expression that reads the entire extraction, which reaches the shapes a structural check cannot: “the line items add up to the gross amount, within one cent”. Studio offers it as Expression (advanced). A rule whose expression does not parse is rejected when you save the workflow, not when a document runs. See Validation rules.
{"kind": "deterministic", "check": {"type": "expression", "expression": "abs(sum(data.lines.map(l, l.amount)) - num(data.total)) <= 1.0"}}. Expressions are CEL with the root variable data and the helpers num(), sum() and abs(). Anything that is not a boolean answer (a missing field, a division by zero) is inconclusive. An unparsable expression answers 400 on every write path, naming the rule and node.
[New] Fill a form from an uploaded reference document An Edit node can take a reference document, uploaded once into the node, whose text feeds the field linker, so you no longer retype the same data into every workflow. Text references (.csv, .txt, .md, .rst) are free; a PDF reference is parsed once at upload for 25 credits per page. Manual instructions override the reference when both address a field. Uploads go straight to storage, so the size cap is your tier’s cap: 25 MB on Free, 100 MB on paid plans. [Improved] Edit node: font, output mode, and an Original / Filled viewer Choose the font and the output mode for a filled form, and compare the original and the filled PDF in the Edit results tab. [New] Billing for the Edit node and the knowledge index The Edit node bills 35 credits per page. The knowledge index bills 2 credits per page indexed, and only for pages whose content is new or changed since the last run, so re-running a workflow over a stable corpus costs nothing. See How credits work. [Fixed] An If/Else after a splitter routes each split independently Each split of a document is now routed on its own condition result rather than on the first split’s. [Fixed] Numeric and boolean fields can answer “not present” A number or boolean field could not report that the document does not contain the value; it now can. [Improved] Standard parse layout accuracy Over the past week the standard parse tier stopped merging text across columns and absorbing figures into neighbouring text, resolves partially overlapping blocks, never lets a figure or chart be absorbed into a non-figure container, and keeps the document when the layout refiner fails instead of failing the parse. [Improved] Studio polish: check cards, field picker, Knowledge node, New workflow button Validate and If/Else check cards use one grammar and wording. The field picker hides the children of object fields. The Knowledge node renders as a scope band around the graph rather than a wired-in step. A New workflow button sits on the home page.

August 13, 2026

[New + API] Datasets and evaluations over the v3 API You can now build a workflow’s dataset and grade the workflow against it without opening the app: upload a document with optional ground truth into the dataset, launch an evaluation over the whole dataset, and poll it to completion to read its accuracy. Both SDKs gain matching methods, and a workflow-evaluation recipe walks through the loop.
POST /v3/workflows/{workflow_id}/dataset/upload/ (multipart, optional ground truth; GT_INVALID and EXTRACT_NODE_UNRESOLVED error codes). POST /v3/workflows/{workflow_id}/evals/ answers 202 with {eval_id, run_number, enqueued_count, failed_count}; version_id is optional and defaults to the current version; an Idempotency-Key replays the original eval instead of launching a second. GET /v3/workflows/{workflow_id}/evals/{eval_id}/ and the keyset-paginated GET /v3/workflows/{workflow_id}/evals/ return status, accuracy, matched, mismatched, ungraded (null while in_progress), file_count and failed_count. Python SDK: upload_to_dataset, launch_eval, get_eval, list_evals, iter_evals.
[New] Edit: a form-filling workflow node The Edit node completes a blank form instead of extracting from a filled one. It detects the form’s fillable fields, links values from your instructions onto them, and renders a filled PDF you can download from the Edit results panel. It never invents a field and never writes over a value the form already had. A non-PDF file is skipped with a visible event on the run. [Improved] The check builder starts from the subject Studio’s deterministic check builder, shared by Validate and If/Else, is redesigned as a subject-first flow: pick what to check, then how. The Slack Alert node menu is tidied alongside. [Improved] Annie wires a real Slack alert Annie now resolves your connected Slack channels, so a Slack Alert node she builds points at a real channel. [Fixed] Studio: node ids, Slack Alert save errors, narrow viewports A new node’s id is keyed off node ids rather than labels, so two nodes with the same label no longer collide. An incomplete or unconnected Slack Alert node no longer leaves a stale save error behind. The node editor now asks for a desktop-width viewport instead of rendering broken on a narrow one. [Fixed] Deleting a workflow that has runs Hard-deleting a workflow with runs failed part way through. Runs are deleted first now. [Fixed] A v2 run status could show an internal value
The v2 status enum briefly exposed the backend’s run acknowledgement as a status. Only the documented values are served now.

August 12, 2026

[Improved] Annie is available to every organisation Annie, the workflow assistant, is out of preview. Her replies render markdown fences as formatted prose, and a markdown reply can be copied as raw markdown or as rendered HTML. [Improved] Document packet metadata is bounded before it reaches the model The metadata you attach to a document packet is inlined into the extraction prompt. That block is now hardened: control characters collapse to spaces, each value is capped at 512 characters, and the whole block at 8,192 characters, keeping as many top-level keys as fit in alphabetical order. A value sourced from metadata is also kept out of the confidence judge, so it cannot inflate a score. The packet still echoes your original JSON back verbatim. See Attaching metadata. [Fixed] Assistant-created graphs are laid out by topology A workflow Annie created could open in Studio with its nodes stacked on top of each other. Nodes are now placed by their position in the graph. [Improved] Honest empty states and accessible names Empty states across the app say what is actually empty, and interactive controls carry accessible names for screen readers. [Fixed] Studio: one If/Else check-editor action, no redundant Config tabs The If/Else check editor had two calls to action that did the same thing and a Config tab that duplicated the card. Both are gone.

August 11, 2026

[New] Confidence threshold as editable presets The confidence threshold slider on the results view is replaced by a combobox of presets you can also type into. [API] Dataset registration honours Idempotency-Key
Registering a dataset document with the same Idempotency-Key, or the same file_id, replays the original response instead of creating a duplicate member.
[Fixed] The dataset grid refreshes on every upload attempt An upload that failed part way left the grid stale until a reload. [Improved] The knowledge base handles large documents Long documents are read in pages, search covers the full text of the corpus, and a per-document size cap keeps one huge file from crowding out the rest. [Improved] Fast-tier parses report per-block confidence Every block a Fast parse serves declares who produced its text, and where the OCR engine reports word confidences, the block’s confidence is read from them. [Fixed] A list-shaped model reply no longer aborts the extraction

August 10, 2026

[New] If/Else and Slack Alert are available to every organisation Both nodes leave preview in Studio: every organisation sees them in the sidebar without a “soon” badge. An Extract step placed after an If/Else branch stays in preview. [New] Results controls in the document view The document view gains an unverified switch that persists between visits, and a verified badge on sub-tables. [New] Upload a consolidated ground-truth manifest Datasets accept a single manifest file carrying the ground truth for many documents, instead of one ground-truth upload per document. [Improved] Validate tabs and mode selector The Validate node’s tabs and its AI / Deterministic selector are polished. [Fixed] The data viewer resets row selection when the sort changes [Fixed] A run fails clearly when no model served the extraction A run whose extraction no model answered used to sit in an ambiguous state. It now fails with that reason.

August 7, 2026

[Fixed] Unmeasured confidence is shown, not hidden as perfect The results view’s confidence filter treated a value with no measured confidence as 100 and hid it under any threshold. It now surfaces the value as unmeasured. [Fixed] Extraction robustness with enum fields A multi-select enum field accepts a bare list of selections, enum option names are quoted in the prompt so a value containing spaces or punctuation is matched exactly, and the extractor is asked for the field shape the schema enforces. [Fixed] The Optimizer survives a malformed proposal A malformed, truncated or stringified proposal no longer fails the optimization run, and a round that crashed keeps its candidate inspectable. [Improved] Studio node header The node card header is redesigned; tooltip, PDF viewer and calendar fixes ride along.

August 6, 2026

[Fixed] The v3 collections list reports status for the requested workflow version GET /v3/workflows/{workflow_id}/document-packets/ reported the status of the latest version’s run even when another version was requested. [Fixed] The performance dashboard counts a run’s pages once

August 5, 2026

[Improved] Default models refreshed The default parse and extract models moved to the current generation across providers, with a failover attempt on every operator. [Fixed] Markdown, CSV and spreadsheet uploads carry evidence anchors Values extracted from a markdown, CSV or spreadsheet upload now link back to the block they came from, like values from a PDF. [Fixed] Annie builds parse-only workflows [Fixed] Studio design-review polish Eight fixes reconcile Studio with its design: spacing, alignment and state colours across the node cards and menus.

August 4, 2026

[Improved] The Optimizer explains itself The Optimizer page is redesigned: an explainer banner, an accuracy chart across rounds, a timeline, and a per-iteration detail view with baseline descriptions and an accuracy-delta badge. A crashed round is masked rather than plotted. The Optimizer guide replaces the “Coming soon” card. [Improved] Usage page polish The tier badge is capitalised and the billing button is secondary, so the primary action stands out. [Fixed] The Slack empty state points at the Connectors menu

August 3, 2026

[New + API] Route and alert on validation outcomes An If/Else node can now branch on the outcome of a Validate rule upstream, and a Slack Alert template can interpolate that outcome. Studio draws the Validate node’s output handle, so edges from Validate to If/Else and Slack Alert are drawable, and the condition picker offers the validation check.
The Check union gains a validation variant keyed on rule_id and status. Slack templates accept ${validation.<rule_id>.<attr>} tokens. Outcomes are evaluated per split, so one partition’s result never leaks into another’s message.
[Fixed] The mobile sidebar trigger overlapped the Home header [Improved] A Slack connector whose token was revoked says so When Slack revokes the integration’s token, the connector shows as revoked instead of failing silently on the next delivery.

July 31, 2026

[Improved] Check types follow the field’s data type Studio’s check-type picker offers only the checks that apply to the selected field’s data type, and the field-picker popover scrolls when the list overflows. [Fixed] The Slack “Open document” button opens the right file

July 30, 2026

[Fixed] Bulk download counts select-all minus its exclusions Selecting all rows and then unticking some downloaded, and counted, the full set. [Fixed] Studio: If/Else add-condition, Slack connector state Adding a condition to an If/Else node no longer discards a condition you were still editing. The Slack connector’s disconnect colour and its state refresh lag are fixed.

July 29, 2026

[New] An “Open document” button on Slack alerts Every Slack alert delivery now carries an Open document button that opens the document in the app. The Slack alerts guide documents the integration end to end.