Export
Category: Processing
The Export activity produces output files from the finished transaction: searchable PDFs, JSON data, and other formats. Output is organized into export profiles, each defining a scope, format, and any preprocessing.
Configuration
| Setting | Description | Default |
|---|---|---|
| Profiles | The export profiles to run. Each defines scope, format, and preprocessing. | (none) |
| Run in parallel | Execute independent profiles concurrently. Turn it off to run them one after another. | On |
Scope
A profile's scope says what one output unit is.
| Scope | Output |
|---|---|
| Transaction | One unit for the whole transaction. |
| Transaction (Filtered) | One unit for the whole transaction, only when it passes the filters. |
| Per Document | One unit per document. |
| Per Document (Filtered) | One unit per document that passes the filters. |
Pages and documents are exported in the order the Transaction Viewer shows: the documents in their order, and each document's pages in its order. A reviewer who reorders documents or pages, or a Data Transform step that moves them, changes the order of the export too. A page that belongs to no document comes last. In a JSON or XML export with schema version 2, a page's page_number is its position in the transaction in this same order, and each document's page list also gives the page's position in the document; where a page came from is its source file and its page number in that file. JPG file names number pages the same way (see JPG output).
The filtered scopes have two filters, applied in this order:
- Document types: include or exclude documents by class, picked from the project's list of document types. For Transaction (Filtered), the transaction passes when at least one of its documents does. The filter remembers each type itself, not its name, so renaming a document type keeps the filter working. A type that has been deleted is flagged in the list, and the workflow shows a warning until you remove it.
- Condition (optional): the same condition an If step uses, with the same presets, the same Custom JavaScript editor, the same Write the condition box and the same runtime interface.
- For Transaction (Filtered) it is checked once for the whole transaction, exactly like an If condition, and the transaction is exported only when it returns
true. - For Per Document (Filtered) it is checked once for each document the type filter lets through. The code reads the document being decided as
document, whiledocumentsstill holds the whole transaction. Only the presets that make sense for one document are offered (document class, field value, transaction metadata), worded for it.
- For Transaction (Filtered) it is checked once for the whole transaction, exactly like an If condition, and the transaction is exported only when it returns
// Per Document (Filtered): export only invoices above 10,000
return document.document_type === 'Invoice' &&
parse_number(get_field_value(document, 'Total')) > 10000;
A condition that throws fails the Export step, as an If condition does, rather than silently exporting nothing; for a per-document condition the error names the document. Anything other than a literal true skips the transaction or the document.
File names
Each profile names its files with a filename template, set under Filename Template in the profile. The template is built from parts, shown in a row:
- Field… adds the value of an extracted field. Pick the document type, then the field. Fields inside a group and columns of a repeating group are listed as paths (
Supplier / Name,Line Items[] / Code). Any document type lists the general fields, the ones every document type has. - Metadata… adds the value of a transaction metadata key, for example a key your import connector or API client sets.
- Variable adds a value the platform knows: the transaction id, the profile name, the document type, the document number, the uploaded file name, the date or the time. A JPG profile also offers the page's number in the transaction, in its document, and in the file it was uploaded in (see JPG output).
- Text adds fixed text, and Folder adds a
/, which puts the files in a subfolder.
Drag a part by its handle to move it. Click a field, document type, document number or file name part to change how it picks its value, or a metadata part to change its key. The Preview under the row shows the file name the template gives, with field names standing in for their values: INV_‹Invoice Number›.json. The file extension comes from the format.
A field part remembers the document type and the field themselves, not their names, so renaming either keeps the file names working.
When there are several values
A field can have more than one value in a transaction: several invoices, several rows of a table, a field that holds a list. In a file for the whole transaction, the document type and the document number have one value per document, and the uploaded file name one per file. For these parts, choose which values go into the name. A per-document file has just one of each, so the choice makes no difference there, but it is offered the same way. A metadata key holds one value, so it has no such choice.
| Choice | File name gets | Example |
|---|---|---|
| First | The first value found, in the order of the Transaction Viewer. The default. | INV-001 |
| All | Every value in that order, repeats included, joined with the separator. | INV-001;INV-002;INV-001 |
| All, without repeats | Every value once, joined with the separator. | INV-001;INV-002 |
The separator is ; unless you change it. Empty values are skipped.
Which documents a field part reads
It depends on the profile's scope:
- Transaction and Transaction (Filtered) read every document of the chosen type in the transaction.
- Per Document and Per Document (Filtered) read only the document the file is for. A field of another document type is empty in that file, so a per-document file never takes its name from a different document. Transaction metadata is still available.
How values are made safe for a file name
- A
/or\inside a value becomes_, soINV/2026/01givesINV_2026_01rather than a folder. Only a Folder part (a/in the template) makes a folder. Line breaks in a value become spaces. - Characters that file systems do not allow (
\ : * ? " < > |) become_. - Each folder or file name is cut to 200 bytes, so All over many documents cannot produce a name the file system rejects.
- When two files would get the same name, the later ones get
_2,_3and so on. - When the whole template comes out empty (for example, the field is empty in every document, or you removed every part), the file is named
<transaction id>_<profile name>instead, and the step logs a warning. With no parts at all, the preview already shows that default name.
When a document type or field is deleted
A part that names a deleted document type or field shows in red, and the workflow shows a warning naming the Export step and profile. The part is empty in every file until you pick the field again. The document-type filter and the field filter warn the same way.
Profiles saved before the pickers existed may name a field by its name. Such a part shows in amber, because renaming the field breaks it: click it and choose Pin to field to switch it to the field itself.
Template text
Edit as text shows the template as text, which is also how the API and the assistant set it. Parts are written in double braces:
| Part | Text |
|---|---|
| A field | {{ field:<document type id>/<field id> }}, with * in place of the document type id for a general field. A field in a group is <group id>/<field id>; a column of a repeating group is <group id>[]/<column id>, or [2] for the third row only. |
| A metadata value | {{ meta:<key> }} |
| A variable | {{ transaction_id }}, {{ profile_name }}, {{ document_type }}, {{ document_index }}, {{ source_filename }}, {{ date }}, {{ timestamp }} |
| A field by name (older form) | {{ field.Invoice Number }} |
After the name, | adds a step. first, all("sep") and all_unique("sep") pick among several values, on a field, document_type, document_index or source_filename. lower, upper, replace('a', 'b'), pad(3) and truncate(20) format the result. For example, {{ field:c1a2b3c4/bda68d0a | all_unique | upper }}.
JSON output options
A JSON profile exports the transaction's extracted data as structured JSON. By default it includes field values with their confidence, reasoning, and confirmation state, per-field bounding boxes, a per-page block, and the transaction's metadata. Optional settings add the page OCR text and word-level OCR layout, and several settings let you trim the output.
Two things are always included and have no toggle: the per-page block (how each page maps to its source file, plus the image-transform frame that maps coordinates back onto the original page) and the transaction metadata (the key-value pairs supplied when the transaction was created, plus created-at, source, and review summary).
| Option | Description | Default |
|---|---|---|
| Field Filter | Which fields to export. All fields, Include only the fields you pick, or Exclude them. Pick fields and groups from the project's list, which shows nested fields as paths (Supplier / Name, Line Items / Description); picking a group includes or excludes all of its children. The filter remembers each field itself, so renaming a field or group keeps it working. Edit as text takes display paths instead, using / for nested fields (Supplier/Name). This same Field Filter works identically in every format (JSON, XML, CSV, Excel). | All fields |
| Include Field Details | When on, keeps each field's confidence, reasoning, confirmation state, and bounding boxes alongside its value. When off, keeps just the extracted value, the smallest output. | On |
| Include Page Full Text | The full OCR text of each page. | Off |
| Include Page OCR Data | Word-level OCR layout per page (every word with its bounding box, in rasterized page-image pixel coordinates). Can be large. | Off |
| Pretty Print | Format the JSON with indentation and line breaks. Turn off for a compact, single-line file. | On |
| Exclude JSON Paths (advanced) | Remove specific branches from the finished file by path, one per line, with * as a wildcard, to reduce size. For example documents.*.fields.*.reasoning drops every field's reasoning. Unmatched paths are ignored. | (none) |
For the full JSON structure, the coordinate system, and how to map OCR content back onto the original page, see Export to JSON.
XML output options
An XML profile exports the same structured document as a JSON profile, serialized as XML. It carries identical content and offers every JSON option (field filter, field details, page text/OCR, pretty print, exclude paths), plus one XML-only setting:
| Option | Description | Default |
|---|---|---|
| Root Element | The name of the XML document's root element. | document |
All the other options behave exactly as they do for JSON (see the JSON output options above). For the XML structure and the rules that map the JSON shape onto elements, see Export to XML.
JPG output (page images)
A JPG profile exports one JPEG image per page: the exact page image the platform ran OCR on.
This is the supported way to obtain the page images for a custom review interface. Pair a JPG profile with a JSON or XML profile: the data profile carries the values and coordinates, the JPG carries the matching page image. Give both the same Image orientation and every bounding box drops directly onto the page image with no conversion.
With Image orientation set to Corrected, a page that OCR found sideways (or a reviewer rotated) is exported the way the viewer shows it. Pages that needed no rotation are exported verbatim, byte for byte. With Original, every page is exported exactly as stored.
Each file is one page, named by the profile's filename template. Three variables name the page:
| Variable | Value |
|---|---|
page_number | The page's position in the transaction, from 1, in the order the documents and their pages have when the export runs. The same number as page_number in a JSON export with schema version 2. |
document_page_number | The page's position in its document, from 1. The same number as a bounding box's page_index in that document (document_page_number in schema version 2). |
source_file_page_number | The page's number in the file it was uploaded in. |
In a page's file name, the document type, the document number, the uploaded file name and field values are those of the page's own document and file, whatever the scope. For example, {{ document_index | pad(2) }}/{{ document_page_number | pad(3) }} puts each document's pages in a folder of their own: 01/001.jpg, 01/002.jpg, 02/001.jpg.
A template that uses none of the three page variables gets a page suffix, so that the pages keep distinct names: in a per-document profile, the page's position in its document ("invoice_page_1.jpg", "invoice_page_2.jpg"), and in a transaction profile, its position in the transaction. A page that belongs to no document has no document values, and its suffix is its position in the transaction.
Options
| Option | What it does | Default |
|---|---|---|
| Image orientation | Corrected applies the rotation detected during OCR (or set by a reviewer) so a sideways scan is exported the way the viewer shows it; a rotated page is re-encoded. Original exports the page exactly as it was stored. Use the same setting as the paired JSON or XML profile. | Corrected for new profiles; Original for profiles created before the option existed |
| Resolution | Downscales each page image toward a chosen resolution (300 / 200 / 150 / 100 / 72 DPI) to shrink file size. Pages already at or below the target keep their resolution, and pages are never upscaled. | Original |
| Compression | Re-compresses each page as a new JPEG at a quality you set (1 to 100). Leave it off to keep the stored image unchanged. | Off |
Compression does not change pixel dimensions, so bounding-box coordinates still line up.
Changing the resolution rescales the exported page images. Bounding-box coordinates in a JSON export, both field boxes and OCR word boxes, are recorded in the original pixel space and will no longer line up with these images. Keep the resolution at Original if you overlay a JSON export on the page images.
See Accessing OCR & Field Data for how to combine the two exports in your own client.
CSV output options
A CSV profile flattens the extracted field values into one comma-separated table, one row per document. Standalone and group fields each become a column (Supplier/Name); a repeating group's columns are flattened too, with the instance values for a column joined into a single cell (Widget | Gadget). Only field values are exported (no confidence, boxes, or reasoning). When a transaction mixes document types, the table holds the union of their columns.
| Option | Description | Default |
|---|---|---|
| Delimiter | Column separator: comma, semicolon, tab, or pipe. | Comma |
| Include Header Row | Write a header row of column labels. | On |
| Original text columns | All fields follows each field's column with <Field> (original): the text on the page the value came from, before normalization (03/04/26 beside 2026-04-03). | None |
| Field Filter | Same as JSON: All fields, Include only, or Exclude the fields you pick. | All fields |
Excel (XLSX) output options
An Excel profile writes the extracted field values into a workbook. Only field values are exported. Field order and labels follow the Data Panel (Group/Child).
| Option | Description | Default |
|---|---|---|
| Layout | Table (multi-document; standalone/group fields as columns on a main sheet, each repeating group on its own sheet) or Form (key/value, one document per sheet). | Table |
| Sheet Grouping | Table: one sheet set per document type, or per document. Form: one sheet per document, or all on a single sheet. | Per type / per document |
| Metadata | Which document-metadata columns (transaction id, document id, type, source filename, page count, created-at) to include: all, only a listed set, or all except a listed set. | All |
| Original text columns | Same as CSV: All fields follows each field's column with <Field> (original), in the main sheet and in each table's sheet. | None |
| Field Filter | Same as JSON: All fields, Include only, or Exclude the fields you pick. | All fields |
| Auto-size Columns | Fit column widths to their content. | On |
| Freeze Header Row | Keep the header row visible when scrolling. | Off |
PDF output options
| Option | Description | Default |
|---|---|---|
| Searchable PDF (OCR layer) | Overlays invisible OCR text so the PDF can be searched and copied from. | Off |
| Page Size | Original, Letter, or A4. | Original |
| Orientation | Auto, portrait, or landscape. | Auto |
| Archival profile (PDF/A) | Produces an ISO 19005-3 archival PDF: PDF/A-3b (basic conformance), PDF/A-3u (adds guaranteed Unicode text mapping), or PDF/A-3a (adds an accessible tagged structure built from the OCR text, in reading order). PDF/A-3a always includes the OCR layer. | None |
| Document language | PDF/A-3a only: the document language recorded in the archive file, as a BCP-47 tag (for example "en", "de", "pt-BR"). When left empty, the OCR-detected language is used where available, otherwise English. | Auto |
| Embed extracted data | Embeds the extracted data as a file attachment inside the PDF, so one self-contained file carries both the page images and the machine-readable data. Cannot be combined with redaction. | Off |
| Embedded data format | Serialization of the embedded data file, JSON or XML. Both carry the identical content. Shown only when Embed extracted data is on. | JSON |
Notes
- Pair Export with a Notification step to tell an external system where to download the results.
- Re-running a transaction from a step before Export removes the files the last run exported; re-running After Export keeps them.