> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ingestly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Parse best practices

> Pick the right OCR engine, control cost, and avoid common parse pitfalls.

The [parse](/nodes/parse) node converts document pages into raw text. The principles below help you choose an engine, manage cost on long documents, and feed clean text to downstream extract, filter, or split nodes.

## 1. Choose the engine that matches the document

Each engine has a clear sweet spot. Default to **Standard**; switch up only when you can name the reason.

When to use each engine:

* **Standard:** typed PDFs, born-digital invoices, text-layer PDFs from accounting systems. Cheapest at 1 credit per page.
* **Vision:** handwriting, low-quality scans, photos of paper, complex multi-column layouts, unusual fonts. 2 credits per page.
* **KeyValuePair:** forms with explicit label/value pairs (W-9s, ACORD forms, intake forms) where you want layout-aware key extraction. 1 credit per page plus LLM cost.
* **Layout:** structured documents (tables, multi-column reports, statements) where preserving the reading order and table structure in the parsed text matters. See [credits](/admin/credits) for its cost.

<Note>If a Standard parse already produces accurate text, switching to Vision adds cost without improving downstream results. Test cheap first.</Note>

## 2. Don't reach for parse before extract by default

The extract node already runs OCR internally. Adding a parse step in front of it is only useful when:

* You want to **filter or split** documents based on raw text content before deciding whether to extract them.
* You need the parsed text as a separate output for search, archiving, or audit.
* You are running the same document through several extract schemas and want to OCR once.

If none of those apply, skip parse and let extract handle the OCR. You'll save credits and keep the pipeline simpler.

## 3. Tier up only when results justify the cost

Document quality is usually skewed: 90% of incoming documents are clean, 10% are messy. Running every document on the most expensive engine wastes money on the easy cases.

A more economical pattern:

* Default to **Standard** parse for everything.
* Add a [validation](/nodes/validation) step downstream that checks for missing required fields or malformed values.
* On validation failure, route the document through a [review](/nodes/review) node where a human can re-run with **Vision** or correct the data.

This keeps the average per-document cost at 1 credit/page while still recovering the hard cases.

<Note>The **Precision** dial (`Small`, `Medium`, `High`) only affects the **KeyValuePair** engine, where it trades cost for the LLM tier used to read fields. Standard and Vision are flat-priced.</Note>

## 4. Use parse to enable content-based routing

Parse becomes a clear win when the next step is a [filter](/nodes/filter), [split](/nodes/split), or [classify](/nodes/classify) node deciding what to do with the document. Examples:

* Drop the pages that don't contain a vendor name, so extract only sees the ones that do.
* Split mailroom batches: cut the upload into one run per document, then classify each sub-document and send invoices to the AP pipeline, contracts to legal, everything else to a generic intake.
* Skip extract entirely for documents that classify as cover pages or duplicates.

Filter and classify both read the page text parse produces, so neither can connect straight to a trigger. Split is the exception: it sources page text itself, so it can follow a trigger directly and a parse step in front of it is optional. To branch on metadata alone (file name, sender, size), use an edge condition instead.

## 5. Keep an eye on whitespace and layout artifacts downstream

OCR preserves visual layout, including page headers, footers, and watermarks. If a downstream node uses that text for matching, those artifacts can throw off:

* Keyword matches in filter or split rules (a header copyright line catching every page).
* Embedding similarity in AI classify (boilerplate dominating the signal).
* Field descriptions that try to "find a value near the heading X".

When you see noisy results, inspect the parsed text in the run detail and tighten downstream rules accordingly. There is no built-in header/footer stripper; rely on specific filters or anchor your descriptions to less-repetitive cues.

## Common pitfalls

<AccordionGroup>
  <Accordion title="Parse + extract on the same document = double OCR">
    Adding parse upstream of extract runs OCR twice and bills both. Only chain them when you need parse's text output for a separate purpose (routing, archiving, multiple schemas off one OCR pass). For a single-shot extract, drop parse.
  </Accordion>

  <Accordion title="Vision engine on clean digital PDFs wastes credits">
    Vision is for handwriting, photos, and ambiguous layouts. Born-digital PDFs with a real text layer parse correctly on Standard at half the cost. Run a small batch on Standard before committing to Vision globally.
  </Accordion>

  <Accordion title="KeyValuePair on free-form prose returns empty pairs">
    KeyValuePair expects label/value structure (forms, intake sheets). Letters, contracts, and reports have no consistent labels and produce a sparse or empty result. Use Standard or Vision and let extract pull the fields you need.
  </Accordion>

  <Accordion title="Expensive parse engine paired with a sloppy schema">
    Switching from Standard to Vision improves OCR accuracy but cannot fix a schema with vague descriptions or generic field names. If extract results are wrong on clean documents, the schema is the bottleneck, not parse. See [schema design](/guides/schema-design).
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Parse action" icon="file-lines" href="/nodes/parse">
    Configuration reference for the parse node
  </Card>

  <Card title="Extract best practices" icon="sparkles" href="/nodes/extract-best-practices">
    How to design schemas that produce reliable results
  </Card>

  <Card title="Filter action" icon="filter" href="/nodes/filter">
    Use parsed text to keep or drop pages
  </Card>

  <Card title="Credits" icon="coin" href="/admin/credits">
    Per-engine credit costs
  </Card>
</CardGroup>
