Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Identifies which kind of back-office document a scan is — invoice, receipt, bank statement, remittance advice, packing slip, or W-9 — from the fields printed on it, so the right extractor runs. Resolves the confusable near-misses a surface guess routes wrong — a receipt that shows a subtotal read as an invoice, a packing slip read as an invoice, a remittance advice read as a statement, a paid invoice read as a receipt. Use when you have a mixed pile of documents and must label each one's type before parsing. Do NOT use to extract fields from a document whose type is already known, to classify free-text tickets/emails into intent labels, or to split a multi-document PDF into pages.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 2613% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 532% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 544% | 0% |
| case-01 | ✗→✗ | = Same ✗ | 1067% | 0% |
| case-03 | ✗→✗ | = Same ✗ | 631% | 0% |
Given one document (usually an OCR'd scan), decide which of a fixed set of types it is, so the calling system can run the matching extractor. The output is a single label read by code — get it wrong and the whole document goes to the wrong parser and every downstream field is garbage.
The label set is closed:
invoice | receipt | bank_statement | remittance_advice | packing_slip | w9 | unknownunknown is a real answer — return it when no type's fingerprint is present, instead of forcing a guess.
The easy cases (a clearly-titled bank statement) route fine without help. The lift is in the near-misses, where the base model latches onto the dominant surface feature and routes to the wrong extractor:
Each of these has a decisive fingerprint that overrides the surface. Route on the fingerprint, not the vibe.
Check these discriminators first — the first one that fires decides the type. This order matters because the diagnostic feature beats the shared one.
w9.bank_statement.packing_slip.remittance_advice.receipt.invoice.unknown.Each type: what fires it, what it must NOT have, and the specific confusable it gets mistaken for.
a Due Date; line items with unit prices; a Subtotal + Tax + Total / Amount Due / Balance Due.
signature is amount owed forward + due date + Bill To, and no tender line.
A PAID stamp does not turn an invoice into a receipt — if it still has an Invoice No., Bill To, and Due Date, it is an invoice.
payment method line ("VISA \\\\1234", "CASH", "Amount Tendered") plus Change Due, an auth/approval code, transaction/terminal ID, "Thank you".
it records how it was paid and the change given; it never states an amount still owed.
(date range); a running list of debits/credits with a running balance; a (masked) account number.
opening+closing balance pair is unique to a statement — a remittance advice never carries a running account balance.
amounts; Amount Paid (not "amount due"); a Payment / Check reference; often deductions or an early-pay discount taken.
payee → payer and describes money to collect.
not new charges; vs statement — it settles specific invoices and has no running account balance.
backordered); SKUs and descriptions; "Ship To"; sometimes carrier/tracking.
fingerprint — if there are prices and a total, it is not a packing slip.
federal tax-classification checkboxes (individual/sole proprietor, C corp, S corp, partnership, LLC); a TIN box (SSN or EIN); a certification signature line; "Give Form to the requester".
no line items, no transaction. TIN + certification language is unmistakable.
Return the label plus the single fingerprint that decided it — so the routing is auditable:
json{"type": "receipt", "deciding_fingerprint": "card tender line + change due, no due date"}
If a document carries no type's fingerprint — a letter, a memo, a page of prose with no invoice number, no balance pair, no tender, no line items, no TIN — return "type": "unknown". A wrong forced label sends the document to a parser that will fabricate fields from it; unknown routes it to human review instead.
Other measured skills in the registry, with their headline benchmark lift.