Skip to main content
Test Income & Employment (VOIE) and Employment History (VOE) flows in sandbox using the credentials below. VOIE and VOE share the same payroll credentials — only the product_type value on the bridge token or order differs (income for VOIE, employment for VOE). In Truv Bridge, search for the Truv Payroll Provider to use any of these credentials.
For additional login fields, use Phone: (111)111-1111 and Email: goodlogin@domain.com.

Quick start

Use goodlogin / goodpassword for the happy path. A successful login returns a complete VOIE report with bi-weekly paystubs, an annual income summary, W-2s, and bank account allocations. For the underlying JSON shape, see the User Income and Employment Report object. Sample response — captured from a live sandbox order. Expand a credential to see the response it returns.
The complete report a successful payroll connection returns: employment metadata, an annual income summary, per-pay-period statements (one shown; the rest follow the same shape), W-2s, and bank account allocations. Captured from a live sandbox order. Pay-period, earnings, and deduction arrays are truncated here for length.

Credential scenarios

Every credential here connects through the Truv Payroll Provider and returns the same report shape as Quick start — the Sample responses panels show only the fields that differ. The VOIE-* scenario ID is a stable test-case identifier you can cite in tickets.
Every scenario below uses the password goodpassword — only the username changes. The error scenarios are the exception: there the password field carries the trigger.

Pay frequency

VOIE-PF1 through VOIE-PF4 return SSN 991-91-9991. VOIE-PF5 returns SSN 999-01-0004. Otherwise only the pay cadence differs. Use these to validate your handling of pay_frequency (W, BW, SM, M, SA) and to confirm your annualization logic across cadences.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.
Same profile as the quick-start response with pay_frequency: "W" — the full response carries 108 weekly statements and 3 W-2s.

Earnings composition

These credentials connect through the Truv Payroll Provider. They return paychecks where pay includes more than base wages. Use them to check how your decisioning reads the bonus and commission statement fields, their *_ytd totals, and the earnings[].category on each line.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.
Bonus pays out on some periods and not others: regular holds at 2,800.00 while gross_pay steps up on bonus periods. bonus_ytd accumulates across the year, and the bonus arrives as an earnings[] line with category: "bonus".

Employment type

Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.
Salaried full-time employee (job_type: "F") with regular semi-monthly paystubs — 50 statements and 3 W-2s in the full response.

Tenure

Use these credentials when your decisioning depends on the borrower’s tenure with their current employer — for example, PLL eligibility rules that require a minimum employment length, or income-stability decisioning that looks at months at current employer. Both credentials return a start_date inside the last 12 months. goodlogin.tn1 is an active employment with statements accruing since the start date; goodlogin.tn2 returns an employment that ended shortly after it began (is_active: false, no statements) — use it for short-tenure-plus-separation edge cases.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.
start_date falls inside the last 12 months (2026-02-02 at capture time, with 9 statements since). Use it to confirm tenure-based eligibility logic.

Benefits and special cases

Both scenarios return SSN 9988. Retirement, disability, and Veterans benefits: Search for the benefit type in Truv Bridge (for example, “SSA” for Social Security or “VA Benefits”), pick a login method, and use goodlogin / goodpassword. Retirement and disability return a Social Security Administration Benefits Verification Letter. Veterans Benefits return a VA Benefit Summary Letter via the Veterans Affairs provider, or a retirement paystub via the DFAS myPay provider.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.
Military pay record via the DFAS myPay provider: monthly statements, employer United States Air Force.

Gig and shift workers

Gig provider connections return different field coverage than W-2 payroll connections. DoorDash returns gross pay and hours but no net pay or deductions; Uber returns gross pay but no net pay, hours, or deductions. Validate your decisioning logic against partial-coverage responses, not against the assumption that every field will be populated.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count.DoorDash gig worker with weekly payouts: gross_pay and hours vary per statement, while income, income_unit, pay_rate, net_pay, and the YTD fields come back null — gig providers return partial field coverage.

Income changes and outliers

These credentials connect through the Truv Payroll Provider. Each returns a statement history with a clear value pattern. One trends up, one trends down, one holds high values, and one carries a single spike. Use them to check how your trend, averaging, and outlier logic reads movement across statements instead of a single period.
pay.raise and pay.reduction only show their pattern across the full statement set. Read the whole statements[] array (it is ordered newest-first), not just the most recent statement. outlier.paystub returns normal statements with one spike. Check each statement value, not the average alone.
Excerpts from live sandbox responses — real values, unchanged. Employment-level fields that do not differ from the quick-start response are omitted for length; each statement shown is the complete statement object (presigned file URLs excepted), and long arrays are truncated with a marker showing the real count. statements[] is ordered newest-first; three statements are shown per sample so the pattern is visible.
gross_pay steps up across the history — 2,000.00 on the oldest statement to 3,500.00 on the newest.

Error scenarios

VOIE shares the universal authentication-error credentials. Use these to test your error handling and retry UX. See Task lifecycle for the full status reference and the meaning of each error state.

Fraud and suspicious documents

Document-uploaded VOIE uses filename-driven triggers in sandbox to simulate fraud detection. The full filename → task status + error_message map lives on the Test Documents page. For interpreting is_suspicious on the report, fraud-tier behavior, and recommended manual-review workflows, see Fraud Detection & Manual Review.

Webhook events

When testing VOIE end to end, your webhook endpoint receives one task-status-updated event per status transition plus one order-status-updated event per connection when the user finishes the order.
Per-task event (one per employer connection):
Order event (one per connection — fires for each unique link_id when the user closes Bridge via Finish and Share, so an order with more than one connection emits multiple order-status-updated events):
For the difference between these two events and why tracking_info is the reliable mapping key, see the Orders object reference.

Mortgage VOIE (GSE testing)

For Fannie Mae Day 1 Certainty and Freddie Mac AIM testing — with borrower test accounts that map to specific GSE submission outcomes — see GSE Testing and the credential tables on the Fannie Mae D1C and Freddie Mac AIM pages.

Next steps

Bridge Widget Guide

Mint a bridge token and embed the widget

Embedded Orders

Order-driven VOIE with auto-generated reports

GSE Testing

Fannie Mae D1C and Freddie Mac AIM workflows

Report Object

JSON schema for the VOIE report