Skip to main content
Moneyline
All guides
Intermediate7 minEnrichment

Verify income across pay stubs, W-2s, and deposits

Combine three disagreeing sources into one income record with a confidence score you can threshold on.

Income is the number most underwriting decisions turn on, and no single document establishes it. A pay stub shows gross for one period, a W-2 shows last year, and bank deposits show what actually landed. They will disagree. The job is to reconcile them and say how confident the result is.

Submit every source

Parse the documents first, then pass their ids to the income enricher together. Sent separately they cannot be cross-checked, which is the entire value.

bashbash
curl -X POST "$MONEYLINE_BASE_URL/v1/enrich/income" \
  -H "Authorization: Bearer $MONEYLINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "documents": ["doc_paystub_1", "doc_w2_2025", "doc_stmt_dec"],
    "period": "monthly"
  }'

Read the result

jsonjson
{
  "monthlyMinor": 762000,
  "confidence": 0.94,
  "sources": [
    { "documentId": "doc_paystub_1", "monthlyMinor": 764000, "weight": 0.4 },
    { "documentId": "doc_w2_2025",   "monthlyMinor": 758333, "weight": 0.35 },
    { "documentId": "doc_stmt_dec",  "monthlyMinor": 761200, "weight": 0.25 }
  ],
  "stability": { "consecutiveMonths": 14, "variance": 0.03 },
  "employer": { "name": "Northwind Payroll", "matchedAcross": 3 }
}

The sources are returned individually on purpose. When a reviewer disputes the number, the answer is in the breakdown, not in an explanation generated after the fact.

What confidence means

Confidence falls when sources disagree, when there are few of them, or when deposits are irregular. It is not a measure of extraction quality: a perfectly parsed pay stub for someone with volatile self-employment income is still low-confidence income.

ConfidenceTypical handling
0.90 and aboveAccept automatically
0.75 to 0.90Accept with a second source, or route to review
Below 0.75Review, or request another document
Thresholds most teams start from, then tune against their own outcomes.

Self-employment

Pass a 1040 with its schedules and any K-1s, and the enricher uses Schedule C net profit and K-1 distributions rather than treating gross deposits as income. Passing only bank statements for a self-employed applicant reliably overstates income, because transfers between the applicant's own accounts look exactly like revenue.

Keep going

Run it yourself

Everything in this guide works against the open-source stack. Clone it, or start on the hosted API.