Financial Services
A voided check is how a customer proves they own the bank account you are about to pay into. It carries the account holder, the bank, and the routing and account numbers in the MICR line at the bottom. The catch is how they arrive: phone photos, screenshots of online-banking screens, and scans degraded enough that a misread digit looks like a real one. Sensible converts voided checks into structured JSON for ACH and direct-deposit enrollment.
Validated JSON
Schema-enforced output; every field matches your contract
Source coordinates
Every value links back to page + bounding box for audit
Per-document pricing
Predictable cost. No token-volatility surprises
Trusted by teams turning documents into production data






A check looks like a simple document until you process thousands of them from different banks. The numbers that matter live in the MICR line, the image quality is rarely clean, and routing and account numbers sit side by side with no labels. Hybrid extraction reads the MICR line and parses the bank layout; the config keeps the routing number separate from the account number on every format.
01
The routing and account numbers live in the MICR line printed in magnetic E-13B characters along the bottom edge. Sensible reads the MICR symbols (the transit, on-us, and dash glyphs) to segment the line, so the routing number, account number, and check number come out as separate fields instead of one run-on string.
02
A cleanly scanned check is the exception. Most arrive as photos of a phone screen, screenshots of a monitor, or faxed copies where a misread digit produces a plausible wrong answer rather than obvious garbage. The engine parses the degraded inputs and scores each field for confidence, so low-quality reads get flagged for review instead of flowing straight into a payment.
03
Different banks print the MICR fields in a different order, and a stray digit can turn one number into the other. Sensible distinguishes the routing number from the account number by the MICR symbols that bracket each block, not by position alone, so the right nine digits land in the routing field across every bank layout.
Managed services
Solutions engineers handle plan, build, deploy, and adjust on your behalf. You see clean JSON in your API response. Same engine as self-serve, just with the configuration work outsourced.
What's included
01Plan.Engineers review your samples and pick the right method
02Build.SenseML configs written from your samples
03Deploy.Same engine as self-serve, ready for production
04Adjust.We update configs when formats shift or new edge cases appear
05Integrate.Help with custom integration into your downstream systems
Every enrollment pipeline maps the check to its own schema, so we build the config around your fields rather than a fixed list. These are the values payments teams pull most often; we map whatever else your ACH or payroll setup needs.
01
Account holder
Name on the check, account holder address, payee line (if filled), check number, check date
02
Bank & MICR
Bank or institution name, routing/transit number, account number, MICR raw string, check number from the MICR line
03
Check metadata
VOID indicator, written and numeric amount (if present), memo line, image quality and per-field confidence score
config.json
SenseML
{ /* SenseML: voided check extraction */
"fields": [
{
"method": {
"id": "queryGroup",
"queries": [
{ "id": "account_holder", "description": "account holder name, name on check, payor name" },
{ "id": "routing_number", "description": "routing number, ABA, transit number, the 9 digits in the leading MICR symbol pair" },
{ "id": "account_number", "description": "account number, the MICR digits between the routing block and the trailing on-us symbol" },
{ "id": "bank_name", "description": "bank name, institution name printed on the check" }
// + check number and address, mapped to your schema
]
}
}
]
}Sensible processes voided checks from any bank and any submission channel. Fingerprinting identifies major-bank layouts so the right config runs, and new formats can be configured in hours. The extraction logic is explicit in SenseML, not buried in prompt tuning.
Chase, Bank of America, Wells Fargo, Citi, Capital One, US Bank, PNC, regional banks, and credit unions, plus US and Canadian MICR layouts
Printed personal and business checks, online-banking voided-check images, phone photos, screenshots, and faxed or scanned copies
Answers about MICR line parsing, handling phone photos and low-quality scans, and keeping the routing number separate from the account number.
Yes. Most checks arrive as photos of a phone screen, screenshots of a monitor, or faxed copies where a misread digit produces a plausible wrong answer rather than obvious garbage. The engine parses the degraded inputs and scores each field for confidence, so low-quality reads get flagged for review instead of flowing straight into a payment.
The routing and account numbers live in the MICR line printed in magnetic E-13B characters along the bottom edge. Sensible reads the MICR symbols, the transit, on-us, and dash glyphs, to segment the line so the routing number, account number, and check number come out as separate fields instead of one run-on string.
Account holder name and address, bank name, routing and account numbers, check number, the raw MICR string, and a per-field confidence score are all extracted. Custom fields can be added in SenseML to match your ACH or payroll-setup schema.
Sensible processes voided checks from Chase, Bank of America, Wells Fargo, Citi, Capital One, US Bank, PNC, regional banks, and credit unions, across US and Canadian MICR layouts. Printed checks, online-banking voided-check images, phone photos, screenshots, and faxed or scanned copies all work, and new formats can be configured in SenseML.
Start free
Free 14-day trial. No credit card required. Start extracting in minutes.