The problem
Underwriters and loan processors spend hours reading and re-keying figures from stacks of borrower-submitted pay stubs and bank statements. It slows time-to-close, and it's exactly the kind of manual transcription where a single mis-keyed digit compounds into a bad income calculation.
How Dokyumi solves it
Pay stubs, bank statements, and tax returns don't look anything alike, so the right move is one schema per document type — each with its own endpoint. A pay-stub schema pulls gross/net pay and YTD figures; a bank-statement schema pulls balances and transactions; a tax-return schema pulls AGI and withholding.
Borrowers or loan officers submit documents — directly through the API, or through a white-label upload portal you brand for applicants — and Dokyumi returns structured income/asset data with confidence scores you can drop straight into your LOS or underwriting checklist.
Example schema and result
A real schema shape for lending & underwriting documents, and the JSON you get back from one extraction.
Schema — GET /api/v1/schemas
{
"slug": "pay-stub-parser",
"name": "Pay Stub Parser",
"description": "Extracts income figures from employee pay stubs for income verification",
"ocr_mode": "standard",
"fields": [
{
"key": "employer_name",
"type": "string",
"required": true
},
{
"key": "employee_name",
"type": "string",
"required": true
},
{
"key": "pay_period_start",
"type": "date",
"required": false
},
{
"key": "pay_period_end",
"type": "date",
"required": false
},
{
"key": "gross_pay",
"type": "currency",
"required": true
},
{
"key": "net_pay",
"type": "currency",
"required": true
},
{
"key": "ytd_gross",
"type": "currency",
"required": false
},
{
"key": "federal_tax_withheld",
"type": "currency",
"required": false
}
]
}Result — POST /api/v1/extract
{
"id": "ext_ln4p9x",
"status": "completed",
"schema": "pay-stub-parser",
"data": {
"employer_name": "Meridian Logistics LLC",
"employee_name": "J. Alvarez",
"pay_period_start": "2026-05-16",
"pay_period_end": "2026-05-31",
"gross_pay": 3120,
"net_pay": 2384.11,
"ytd_gross": 15600,
"federal_tax_withheld": 412
},
"confidence": {
"gross_pay": 0.99,
"net_pay": 0.98,
"ytd_gross": 0.95
},
"meta": {
"processing_time_ms": 990,
"page_count": 1,
"ocr_cached": false
}
}How it works
Create one schema per document type
Pay stubs, bank statements, and tax returns each get their own schema and endpoint.
Collect documents from borrowers
Upload directly via your loan portal, or hand borrowers a white-label Dokyumi upload page.
Extract structured income/asset data
Each document returns validated JSON with a per-field confidence score.
Feed your underwriting workflow
Use the API response or a webhook to populate your LOS, spreadsheet, or decision engine.
Lending & Underwriting FAQ
Does Dokyumi make the underwriting decision or verify income automatically?+
Can Dokyumi detect altered or fraudulent documents?+
Should pay stubs and bank statements share one schema?+
Can borrowers upload documents themselves?+
Is this suitable for handling tax returns and other sensitive documents?+
Related use cases
Accounts Payable
Extract vendor, line-item, and total data from invoices and receipts — no template building, no AWS Textract setup.
Tax Prep
Turn client-submitted W-2s, 1099s, and 1040s into structured data — or hand clients a branded upload portal for intake season.
Real Estate & Leasing
Pull lease terms, applicant income, and insurance details out of leases, applications, and dec pages — no per-property template work.