Integration pattern: Bridge Widget | Products: Income Insights | Demo: BankIncome
Get started
Run the demo
Clone and run the BankIncome demo to see the full bank income verification flow working locally.Open
http://localhost:5173, select Consumer Credit > Bank Income, and walk through a verification using sandbox credentials (goodlogin / goodpassword).See full setup instructions for ngrok and environment configuration.Understand the API flow
The demo follows this sequence:
- Search for financial institution — Your server calls GET /v1/providers/ with
data_source=financial_accountsto find the applicant’s bank. The response returns aprovider_id. - Create a user — Your server calls POST /v1/users/ to create a Truv user.
- Create a bridge token — Your server calls POST /v1/users//tokens/ with
product_type: "income",data_sources: ["financial_accounts"], and optionallyprovider_idto deeplink Bridge to the bank. - Initialize Bridge — Your frontend opens Truv Bridge with the
bridge_token. The applicant connects their bank account. - Receive webhooks — Truv sends a
task-status-updatedwebhook when verification completes. Verify the signature using theX-Webhook-Signheader with HMAC-SHA256. - Retrieve the income insights report — Fetch the report with POST /v1/users//income_insights/reports/. The report contains income derived from bank transaction analysis.
Review the code
Each step maps to a specific file in the demo. Use these as reference when building your integration.
| Step | Demo file | API reference |
|---|---|---|
| Institution search | src/components/CompanySearch.jsx | Providers List |
| User creation | server/routes/bridge.js | POST /v1/users/ |
| Bridge token | server/routes/bridge.js | POST /v1/users//tokens/ |
| Bridge initialization | src/demos/BankIncome.jsx | Bridge SDK |
| Webhook verification | server/webhooks.js | Webhook events |
| Report retrieval | server/routes/user-reports.js | Income Insights Report |
Consumer Credit-specific configuration
Bridge token for bank income
Setdata_sources to ["financial_accounts"] to restrict Bridge to bank connections only:
provider_id from the providers search to deeplink Bridge directly to the bank. Without it, Bridge shows its own institution search.
Bank income uses
provider_id (not company_mapping_id). The company_mapping_id field is for payroll employers. Passing the wrong identifier type causes Bridge to show a generic search screen.Income insights report
Bank income verification returns an income insights report instead of a standard VOIE report. Income insights are derived from transaction patterns rather than payroll data. The report includes:- Estimated annual income
- Income streams and frequency
- Transaction-level detail
How bank income differs from payroll VOIE
Bank income analyzes deposit transactions in the applicant’s bank account to derive income. It does not connect to payroll systems. This means the data shape and coverage differ significantly from a standard payroll income verification.Data comparison
| Data point | Payroll VOIE | Bank income |
|---|---|---|
| Income amount | Exact gross/net from paystubs | Estimated from deposit patterns |
| Employer name | From payroll provider | Not available (inferred from transaction descriptions) |
| Pay frequency | Exact (BW, SM, M, etc.) | Estimated from deposit cadence |
| Deductions breakdown | Federal/state taxes, benefits, 401k | Not available |
| W-2 forms | Available when employer provides them | Not available (w2s is always null) |
| Employment dates | From payroll records | Not available |
| Bank account details | Not included under employments | Included in the income insights report |
| Self-employment income | Not captured | Captured from deposit patterns |
| Gig / on-demand income | Not captured | Captured from deposit patterns |
| Government benefits | Requires SSA connection | Detected from deposit patterns |
Report structure notes
- The
bank_income_summaryarrays are structured to support multiple currencies, but in practice contain only USD entries. - Fields standard to payroll VOIE that are always null in bank income responses:
w2s,bank_accountsunder employments, and standard payroll deduction line items. - Income amounts are derived estimates, not exact figures from pay stubs.
When to use bank income vs payroll
| Scenario | Recommended approach |
|---|---|
| W-2 employee at a large employer | Payroll VOIE — higher data quality and exact figures |
| Self-employed or freelance | Bank income — payroll VOIE has no coverage |
| Gig worker (Uber, DoorDash, etc.) | Bank income — deposits appear in bank transactions |
| Government benefit recipient | Bank income or direct SSA connection |
| Multiple income streams | Both — payroll VOIE for the primary job, bank income for supplemental sources |
| Employer not covered by payroll providers | Bank income as fallback |
Next steps
Smart Routing
Automatically recommend the best method based on employer coverage
Payroll Income
Verify income directly from payroll for higher data quality
Bridge Widget Guide
Full implementation guide for user creation, bridge tokens, and Bridge initialization
Income Insights API
Full API reference for income insights reports