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
Usegoodlogin / 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.
| Credential | Provider | Sample report |
|---|---|---|
goodlogin / goodpassword | Truv Payroll Provider | Bi-weekly VOIE PDF |
goodlogin / goodpassword — full VOIE report shape
goodlogin / goodpassword — full VOIE report shape
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.
{
"report_id": "c219d26c1fc7412fb1d0df36a9652600",
"created_at": "2026-06-18T01:43:32.553366Z",
"completed_at": "2026-06-18T01:43:32.132883Z",
"last_task_at": "2026-06-18T01:43:21.714235Z",
"links": [
{
"id": "ac978e05483e48379a5ec82b556d20a0",
"link_id": "f5ef8b9e1eda4640b38069c9e851bc3a",
"tracking_info": "8f50b58e35644bb5bff989341eafcdb5",
"data_source": "payroll",
"provider": "truv",
"provider_name": "Truv payroll provider",
"employments": [
{
"id": "e803dc34b8184c4a8ada449b42fccc65",
"job_title": "PR associate",
"job_type": "F",
"start_date": "2023-01-01",
"end_date": null,
"external_last_updated": "2026-06-08",
"is_active": true,
"manager_name": "Jenny McDouglas",
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"profile": {
"id": "e776ba2b32bf4e32aece51c5878d3cdd",
"created_at": "2026-06-18T01:43:24.784615Z",
"updated_at": "2026-06-18T01:43:24.784625Z",
"first_name": "John",
"last_name": "Doe",
"full_name": "John Doe",
"middle_initials": null,
"email": "john.doe@gmail.com",
"ssn": "991919991",
"date_of_birth": "1992-03-03",
"home_address": {
"zip": "94062",
"city": "Redwood City",
"state": "CA",
"street": "35 Dry Ridge Rd",
"country": "US"
}
},
"original_hire_date": "2012-02-01",
"derived_fields": [],
"missing_data_fields": [],
"income": "56269.25",
"income_unit": "YEARLY",
"pay_rate": "2153.60",
"pay_frequency": "BW",
"statements": [
{
"id": "3a5d6a193fc7491689bc62317f4b046f",
"pay_date": "2026-06-08",
"net_pay": "1629.98",
"net_pay_ytd": "19559.76",
"gross_pay": "2157.89",
"gross_pay_ytd": "25894.68",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "S",
"period_start": "2026-05-26",
"period_end": "2026-06-08",
"regular": "1935.77",
"regular_ytd": "23229.24",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "222.12",
"overtime_ytd": "2665.44",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "1935.77",
"rate": "26.92",
"units": "71.90"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "161.54",
"rate": "53.84",
"units": "3.00"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "23229.24",
"rate": "26.92",
"units": "862.80"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "1938.48",
"rate": "53.84",
"units": "36.00"
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "153.63",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "133.89",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1843.56",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1606.68",
"category": "socialsec"
},
{
"name": "401K Dollars",
"amount": "1553.64",
"category": "retirement"
},
{
"name": "CA State Income Tax",
"amount": "631.44",
"category": "state"
},
{
"name": "Medicare Tax",
"amount": "375.72",
"category": "medicare"
},
{
"name": "Blue Ash Income Tax",
"amount": "323.88",
"category": "local"
}
],
"md5sum": "a9b85d17e3583203a854f85a29f78ed5",
"file": "https://citadelid-files.s3.amazonaws.com/sandbox/statements/1194546.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAZWHJR5UGKNMOUOTK%2F20260618%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260618T014334Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=6a0374095c4875ba336efeb045805aa914bd502654874de7b125cc127167f2b1",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 53 more pay statements (omitted for brevity)
],
"annual_income_summary": [
{
"id": "3a5d6a193fc7491689bc62317f4b046f",
"year": 2026,
"regular": "23229.24",
"bonus": null,
"commission": null,
"overtime": "2665.44",
"other_pay": null,
"net_pay": "19559.76",
"gross_pay": "25894.68"
},
{
"id": "1385cc45e75c474485c10124e306de8b",
"year": 2025,
"regular": "50330.02",
"bonus": null,
"commission": null,
"overtime": "5775.12",
"other_pay": null,
"net_pay": "42379.48",
"gross_pay": "56105.14"
},
{
"id": "2556ebea9d454ea18ddaf85a4143a692",
"year": 2024,
"regular": "50330.02",
"bonus": null,
"commission": null,
"overtime": "5775.12",
"other_pay": null,
"net_pay": "42379.48",
"gross_pay": "56105.14"
}
],
"bank_accounts": [
{
"account_number": "11114623",
"routing_number": "101014378",
"account_name": null,
"account_type": "C",
"deposit_type": "A",
"deposit_value": "1604.98",
"bank_name": "Sandbox Bank"
},
{
"account_number": "11111308",
"routing_number": "101013399",
"account_name": null,
"account_type": "C",
"deposit_type": "A",
"deposit_value": "25.00",
"bank_name": "Sandbox Bank"
}
],
"w2s": [
{
"file": "https://citadelid-files.s3.amazonaws.com/sandbox/w2s/2560.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAZWHJR5UGKNMOUOTK%2F20260618%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260618T014334Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=7bcd1e3f77c7f8a105a702f5c5745ddfb0dc02bb08cac464f8cc4a341a68a63a",
"md5sum": "385320b9c0f851260e86472707a5de18",
"year": 2023,
"wages": "56105.14",
"federal_tax": "3994.38",
"social_security_wages": "56105.14",
"social_security_tax": "3481.14",
"medicare_wages": "56105.14",
"medicare_tax": "814.06",
"gross_pay": null
}
// ...and 2 more W-2s (omitted for brevity)
],
"gse_accepted": true,
"last_period_end": "2026-06-08",
"last_pay_date": "2026-06-08"
}
]
}
]
}
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. TheVOIE-* 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.
Sample responses
Sample responses
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.- Weekly (W)
- Semi-monthly (SM)
- Monthly (M)
- Semi-annual (SA)
Same profile as the quick-start response with
pay_frequency: "W" — the full response carries 108 weekly statements and 3 W-2s.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": "F",
"is_active": true,
"start_date": "2023-01-01",
"end_date": null,
"original_hire_date": "2012-02-01",
"pay_frequency": "W",
"income": "56104.88",
"income_unit": "YEARLY",
"pay_rate": "1078.94",
"missing_data_fields": [],
"statements": [
{
"id": "fad2c095bc6c4f62aa4da7b90cf131c8",
"pay_date": "2026-06-15",
"net_pay": "815.00",
"net_pay_ytd": "19560.00",
"gross_pay": "1078.94",
"gross_pay_ytd": "25894.56",
"bonus": null,
"commission": null,
"hours": "38.20",
"basis_of_pay": null,
"period_start": "2026-06-09",
"period_end": "2026-06-15",
"regular": "967.88",
"regular_ytd": "23229.12",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "111.06",
"overtime_ytd": "2665.44",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "967.88",
"rate": "26.92",
"units": "35.95"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "80.77",
"rate": "53.84",
"units": "1.50"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "23229.12",
"rate": "26.92",
"units": "862.80"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "1938.48",
"rate": "53.84",
"units": "36.00"
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "76.81",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "66.94",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1843.44",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1606.56",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "4220b4840f0be92a126a81287b3cee3b",
"derived_fields": [
"hours"
],
"missing_data_fields": [],
"check_number": null
}
// ...and 107 more pay statements (omitted for brevity)
]
}
]
}
]
}
pay_frequency is SM (twice a month); 50 statements in the full response.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": "F",
"is_active": true,
"start_date": "2023-01-01",
"end_date": null,
"original_hire_date": "2012-02-01",
"pay_frequency": "SM",
"income": "51789.36",
"income_unit": "YEARLY",
"pay_rate": "2157.89",
"missing_data_fields": [],
"statements": [
{
"id": "3d22ee386e6943c0a3f0c5f70e7b6338",
"pay_date": "2026-06-15",
"net_pay": "1629.98",
"net_pay_ytd": "17929.78",
"gross_pay": "2157.89",
"gross_pay_ytd": "23736.79",
"bonus": null,
"commission": null,
"hours": "76.40",
"basis_of_pay": null,
"period_start": "2026-06-01",
"period_end": "2026-06-15",
"regular": "1935.77",
"regular_ytd": "21293.47",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "222.12",
"overtime_ytd": "2443.32",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "1935.77",
"rate": "26.92",
"units": "71.90"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "161.54",
"rate": "53.84",
"units": "3.00"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "21293.47",
"rate": "26.92",
"units": "790.90"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "1776.94",
"rate": "53.84",
"units": "33.00"
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "153.63",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "133.89",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1689.93",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1472.79",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "4c6cdc66d804cd0b0cd2327d53e7cf1b",
"derived_fields": [
"hours"
],
"missing_data_fields": [],
"check_number": null
}
// ...and 49 more pay statements (omitted for brevity)
]
}
]
}
]
}
pay_frequency is M; 26 statements in the full response.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": "F",
"is_active": true,
"start_date": "2023-01-01",
"end_date": null,
"original_hire_date": "2012-02-01",
"pay_frequency": "M",
"income": "51789.36",
"income_unit": "YEARLY",
"pay_rate": "4315.78",
"missing_data_fields": [],
"statements": [
{
"id": "f18d7adb48b246adabd18d4839fe4a47",
"pay_date": "2026-05-31",
"net_pay": "3259.96",
"net_pay_ytd": "16299.80",
"gross_pay": "4315.78",
"gross_pay_ytd": "21578.90",
"bonus": null,
"commission": null,
"hours": "152.81",
"basis_of_pay": null,
"period_start": "2026-05-01",
"period_end": "2026-05-31",
"regular": "3871.54",
"regular_ytd": "19357.70",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "444.24",
"overtime_ytd": "2221.20",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "3871.54",
"rate": "26.92",
"units": "143.81"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "323.08",
"rate": "53.84",
"units": "6.00"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "19357.70",
"rate": "26.92",
"units": "719.05"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "1615.40",
"rate": "53.84",
"units": "30.00"
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "307.26",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "267.78",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1536.30",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1338.90",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "f547c703115bdd5b72251180c0546540",
"derived_fields": [
"hours"
],
"missing_data_fields": [],
"check_number": null
}
// ...and 25 more pay statements (omitted for brevity)
]
}
]
}
]
}
Two payments per year, each statement covering a six-month period.
income, income_unit, and pay_rate come back null for this profile — read the cadence from pay_frequency and the statement period dates.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Timberline Consulting",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2025-06-30",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "SA",
"income": null,
"income_unit": null,
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "40afb60fd4f44f0587fbb750c9490de5",
"pay_date": "2026-06-30",
"net_pay": "27486.00",
"net_pay_ytd": null,
"gross_pay": "36000.00",
"gross_pay_ytd": "36000.00",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": "S",
"period_start": "2026-01-01",
"period_end": "2026-06-30",
"regular": "36000.00",
"regular_ytd": "36000.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "36000.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "36000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "4320.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "2232.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 2 more pay statements (omitted for brevity)
]
}
]
}
]
}
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 thebonus and commission statement fields, their *_ytd totals, and the earnings[].category on each line.
| Scenario | Username | What it returns |
|---|---|---|
VOIE-C1 | goodlogin.bonus | Wages plus periodic bonus payments (bonus, bonus_ytd, earnings[].category: "bonus") |
VOIE-C2 | goodlogin.bonus.commission | Wages plus bonus and commission on the same statements |
VOIE-C3 | goodlogin.commission | Commission only earner. Monthly statements where gross pay equals commission, with no hourly or salary base |
Sample responses
Sample responses
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 (C1)
- Bonus + commission (C2)
- Commission-only (C3)
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".{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Cascade Logistics",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-03-13",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": "35.00",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "468cb7b8a0d14a21a34ce124de026e21",
"pay_date": "2026-05-22",
"net_pay": "2519.55",
"net_pay_ytd": null,
"gross_pay": "3300.00",
"gross_pay_ytd": "18300.00",
"bonus": "500.00",
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-05-08",
"period_end": "2026-05-22",
"regular": "2800.00",
"regular_ytd": "16800.00",
"bonus_ytd": "1500.00",
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2800.00",
"rate": "35.00",
"units": "80.00"
},
{
"name": "Bonus",
"category": "bonus",
"amount": "500.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "16800.00",
"rate": null,
"units": null
},
{
"name": "Bonus",
"category": "bonus",
"amount": "1500.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "396.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "204.60",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 5 more pay statements (omitted for brevity)
]
}
]
}
]
}
bonus and commission land on the same statement on top of regular wages, each with its own *_ytd running total.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Northwest Sales",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-02-28",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "SM",
"income": "31.25",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "c18106445b7d48818df91a469f08f7fa",
"pay_date": "2026-05-15",
"net_pay": "3054.00",
"net_pay_ytd": null,
"gross_pay": "4000.00",
"gross_pay_ytd": "18500.00",
"bonus": "1000.00",
"commission": "500.00",
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-05-01",
"period_end": "2026-05-15",
"regular": "2500.00",
"regular_ytd": "15000.00",
"bonus_ytd": "2000.00",
"commission_ytd": "1500.00",
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": "31.25",
"units": "80.00"
},
{
"name": "Bonus",
"category": "bonus",
"amount": "1000.00",
"rate": null,
"units": null
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "15000.00",
"rate": null,
"units": null
},
{
"name": "Bonus",
"category": "bonus",
"amount": "2000.00",
"rate": null,
"units": null
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "480.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "248.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 5 more pay statements (omitted for brevity)
]
}
]
}
]
}
A commission-only earner:
gross_pay equals commission on every monthly statement, and income, income_unit, and hours are null — there is no hourly or salary base.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Pacific Coast Real Estate",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2025-11-01",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "M",
"income": null,
"income_unit": null,
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "098d90b0963742bf918661f18fed6485",
"pay_date": "2026-05-01",
"net_pay": "3970.20",
"net_pay_ytd": null,
"gross_pay": "5200.00",
"gross_pay_ytd": "23700.00",
"bonus": null,
"commission": "5200.00",
"hours": null,
"basis_of_pay": "S",
"period_start": "2026-04-01",
"period_end": "2026-04-30",
"regular": null,
"regular_ytd": null,
"bonus_ytd": null,
"commission_ytd": "23700.00",
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Commission",
"category": "commission",
"amount": "5200.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Commission",
"category": "commission",
"amount": "23700.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "624.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "322.40",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 5 more pay statements (omitted for brevity)
]
}
]
}
]
}
Employment type
| Scenario | Username | SSN | What it returns |
|---|---|---|---|
VOIE-E1 | fulltime | 2211 | Full-time salesperson with regular salaried paystubs |
VOIE-E2 | hourly.part-time | 666382548 | Hourly part-time worker with variable hours per stub |
VOIE-E3 | partial.data | 2222 | Payroll connection succeeds but returns sparse employment metadata — job_title, job_type, and original_hire_date come back null. Use to validate your handling of null fields on the employment object. |
VOIE-E4 | goodlogin.min-data | 991-91-9991 | Minimal information returned (no W-2s, sparse statements) |
VOIE-E5 | multiple.employments | — | Multiple different employers attached to one applicant |
VOIE-E6 | multiple.employments2 | 7740 | Multiple same-employer positions (e.g. transferred roles) |
VOIE-E7 | nonactive | 1890 | Employment with an end_date set and is_active: false |
VOIE-E8 | hourly.fulltime | 1122 | Hourly full-time worker — job_type is F and income_unit is HOURLY. Hours alternate between pay periods, so gross_pay moves with them. Use alongside VOIE-E1 (salaried full-time) and VOIE-E2 (hourly part-time) to cover both axes. |
Sample responses
Sample responses
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.- Full-time (E1)
- Part-time (E2)
- Partial data (E3)
- Min data (E4)
- Multi-employer (E5)
- Same-employer (E6)
- Ended (E7)
- Hourly full-time (E8)
Salaried full-time employee (
job_type: "F") with regular semi-monthly paystubs — 50 statements and 3 W-2s in the full response.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Real Estate Business",
"address": {
"zip": "20005",
"city": "Washington",
"state": "DC",
"street": "1 Thomas Cir NW",
"country": "US"
},
"phone": "2025556677",
"ein": null
},
"job_title": "Sales Associate",
"job_type": "F",
"is_active": true,
"start_date": "2023-03-12",
"end_date": null,
"original_hire_date": "2018-03-12",
"pay_frequency": "SM",
"income": "88663.20",
"income_unit": "YEARLY",
"pay_rate": "2812.50",
"missing_data_fields": [],
"statements": [
{
"id": "c72651a625fa42f1833a1aa8d0d38d7c",
"pay_date": "2026-06-15",
"net_pay": "3166.39",
"net_pay_ytd": "34830.29",
"gross_pay": "3694.30",
"gross_pay_ytd": "40637.30",
"bonus": "0.00",
"commission": "881.80",
"hours": "86.67",
"basis_of_pay": "S",
"period_start": "2026-06-01",
"period_end": "2026-06-15",
"regular": "2812.50",
"regular_ytd": "30937.50",
"bonus_ytd": null,
"commission_ytd": "9699.80",
"overtime": "0.00",
"overtime_ytd": null,
"other_pay": "0.00",
"other_pay_ytd": null,
"earnings": [
{
"name": "regular",
"category": "regular",
"amount": "2812.50",
"rate": null,
"units": null
},
{
"name": "commission",
"category": "commission",
"amount": "881.80",
"rate": null,
"units": null
}
// ...and 3 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "regular",
"category": "regular",
"amount": "30937.50",
"rate": null,
"units": null
},
{
"name": "commission",
"category": "commission",
"amount": "9699.80",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "153.63",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "133.89",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1689.93",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1472.79",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "9e48957bdd9cba8c283061b6e11b442a",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 49 more pay statements (omitted for brevity)
]
}
]
}
]
}
Hourly part-time worker:
job_type is P and income_unit is HOURLY. Hours alternate between pay periods, so gross_pay moves with them while the hourly rate in income stays fixed.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "Customer Service Representative",
"job_type": "P",
"is_active": true,
"start_date": "2023-01-01",
"end_date": null,
"original_hire_date": "2021-01-01",
"pay_frequency": "M",
"income": "17.00",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "dbdb41c897b84d30a2a2f69cd436c0c4",
"pay_date": "2026-07-31",
"net_pay": "2201.90",
"net_pay_ytd": "16391.90",
"gross_pay": "2295.00",
"gross_pay_ytd": "17085.00",
"bonus": null,
"commission": null,
"hours": "135.00",
"basis_of_pay": "H",
"period_start": "2026-07-01",
"period_end": "2026-07-31",
"regular": "2295.00",
"regular_ytd": "17085.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2295.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "17085.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "93.10",
"category": "federal"
}
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "693.10",
"category": "federal"
}
],
"md5sum": "06ce85d4262ed58e026519dda820cba7",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 25 more pay statements (omitted for brevity)
]
}
]
}
]
}
The connection succeeds but employment metadata comes back sparse —
job_title, job_type, and original_hire_date are null. (missing_data_fields is empty; the gaps surface as null fields on the employment object.){
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "INITECH",
"address": {
"zip": "78701",
"city": "Austin",
"state": "TX",
"street": "48 W 5th St",
"country": "US"
},
"phone": "5127775544",
"ein": null
},
"job_title": null,
"job_type": null,
"is_active": true,
"start_date": "2023-12-15",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "SM",
"income": "199999.92",
"income_unit": "YEARLY",
"pay_rate": "8333.33",
"missing_data_fields": [],
"statements": [
{
"id": "773ac579092449bbbbbe4a44c88e8406",
"pay_date": "2026-06-15",
"net_pay": "7805.42",
"net_pay_ytd": "85859.62",
"gross_pay": "8333.33",
"gross_pay_ytd": "91666.63",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": "S",
"period_start": "2026-06-01",
"period_end": "2026-06-15",
"regular": "8333.33",
"regular_ytd": "91666.63",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "regular",
"category": "regular",
"amount": "8333.33",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "regular",
"category": "regular",
"amount": "91666.63",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "153.63",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "133.89",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1689.93",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1472.79",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "ca86b090cd818479cef1200f01c82dd4",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 57 more pay statements (omitted for brevity)
]
}
]
}
]
}
Minimal information: the employment summary only.
statements is an empty array, there are no W-2s, and start_date is null.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": "F",
"is_active": true,
"start_date": null,
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": "56269.25",
"income_unit": "YEARLY",
"pay_rate": "2153.60",
"missing_data_fields": [],
"statements": []
}
]
}
]
}
Two different employers attached to one applicant under a single link — one active, one ended.
{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "PAPER COMPANY",
"address": {
"zip": "42419",
"city": "HENDERSON",
"state": "KY",
"street": "8500 CINDER BED RD",
"country": "US"
},
"phone": null,
"ein": null
},
"job_title": "Senior Engineer",
"job_type": "F",
"is_active": true,
"start_date": "2023-10-18",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": "75.96",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "cb674edbc7fd4adbbea0292bfdd5677f",
"pay_date": "2026-08-17",
"net_pay": "5961.17",
"net_pay_ytd": "101339.89",
"gross_pay": "7807.69",
"gross_pay_ytd": "132730.73",
"bonus": "1807.69",
"commission": null,
"hours": "80.00",
"basis_of_pay": "S",
"period_start": "2026-08-04",
"period_end": "2026-08-17",
"regular": "6000.00",
"regular_ytd": "102000.00",
"bonus_ytd": "30730.73",
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "4200.00",
"rate": null,
"units": null
},
{
"name": "On Sign Bonus",
"category": "bonus",
"amount": "1807.69",
"rate": null,
"units": null
}
// ...and 3 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "71400.00",
"rate": null,
"units": null
},
{
"name": "On Sign Bonus",
"category": "bonus",
"amount": "30730.73",
"rate": null,
"units": null
}
// ...and 2 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "936.92",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "484.08",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "15927.64",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "8229.36",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "b54c62828dabb8bea19e0f5b4a01be6f",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 54 more pay statements (omitted for brevity)
]
},
{
"company": {
"name": "TEXTILES",
"address": {
"zip": "42420",
"city": "HENDERSON",
"state": "KY",
"street": "1519 BARRETT BLVD",
"country": "US"
},
"phone": null,
"ein": null
},
"job_title": "Engineer",
"job_type": "F",
"is_active": false,
"start_date": "2022-06-15",
"end_date": "2023-09-30",
"original_hire_date": null,
"pay_frequency": "BW",
"income": "149430.58",
"income_unit": "YEARLY",
"pay_rate": "5747.33",
"missing_data_fields": [],
"statements": [
{
"id": "71a018d04e1e43bfbd387e0159685f7e",
"pay_date": "2023-09-30",
"net_pay": "4443.13",
"net_pay_ytd": "88862.60",
"gross_pay": "5819.42",
"gross_pay_ytd": "116388.40",
"bonus": "0.00",
"commission": null,
"hours": "96.00",
"basis_of_pay": null,
"period_start": "2023-09-19",
"period_end": "2023-09-30",
"regular": "5747.33",
"regular_ytd": "114946.60",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": "72.09",
"other_pay_ytd": "1441.80",
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "5747.33",
"rate": null,
"units": null
},
{
"name": "Waiver Credit",
"category": "other_pay",
"amount": "62.50",
"rate": null,
"units": null
}
// ...and 5 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "114946.60",
"rate": null,
"units": null
},
{
"name": "Waiver Credit",
"category": "other_pay",
"amount": "1250.00",
"rate": null,
"units": null
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "698.33",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "360.80",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "13966.60",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "7216.00",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "dd31553f19981b9f186175f33bbe88cf",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 33 more pay statements (omitted for brevity)
]
}
]
}
]
}
Two positions at the same employer (transferred roles), each with its own statement history.
{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Moment Developments",
"address": {
"zip": "90049",
"city": "LOS ANGELES",
"state": "CA",
"street": "1511 SOUTH 5TH AVE",
"country": "US"
},
"phone": null,
"ein": null
},
"job_title": "Director, Accounts",
"job_type": "F",
"is_active": false,
"start_date": "2023-07-15",
"end_date": "2024-01-15",
"original_hire_date": "2019-09-10",
"pay_frequency": "SM",
"income": "60000.00",
"income_unit": "YEARLY",
"pay_rate": "2500.00",
"missing_data_fields": [],
"statements": [
{
"id": "82d1d9c4954741479cbc25d8e7302e9b",
"pay_date": "2024-01-15",
"net_pay": "1908.75",
"net_pay_ytd": "1908.75",
"gross_pay": "2500.00",
"gross_pay_ytd": "2500.00",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": null,
"period_start": "2024-01-01",
"period_end": "2024-01-15",
"regular": "2500.00",
"regular_ytd": "2500.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "300.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "155.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "300.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "155.00",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "d3ee14f3532427a4c1f596461971f719",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 11 more pay statements (omitted for brevity)
]
},
{
"company": {
"name": "Moment Developments",
"address": {
"zip": "90049",
"city": "LOS ANGELES",
"state": "CA",
"street": "1511 SOUTH 5TH AVE",
"country": "US"
},
"phone": null,
"ein": null
},
"job_title": "Senior Account Manager",
"job_type": null,
"is_active": false,
"start_date": "2022-11-01",
"end_date": "2023-05-01",
"original_hire_date": "2019-09-10",
"pay_frequency": "SM",
"income": "54000.00",
"income_unit": "YEARLY",
"pay_rate": "2250.00",
"missing_data_fields": [],
"statements": [
{
"id": "fdfade6e928a41ecb839570be5823645",
"pay_date": "2023-05-01",
"net_pay": "1717.87",
"net_pay_ytd": "15460.83",
"gross_pay": "2250.00",
"gross_pay_ytd": "20250.00",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": null,
"period_start": "2023-05-01",
"period_end": "2023-05-01",
"regular": "2250.00",
"regular_ytd": "20250.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2250.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "20250.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "270.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "139.50",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "2430.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1255.50",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "4bd8e370aba0839d4b487c53cdd76310",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 12 more pay statements (omitted for brevity)
]
}
]
}
]
}
is_active: false with an end_date set; the statement history runs up to the end date.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Rhode Island Consultants",
"address": {
"zip": "00093",
"city": "Quahog",
"state": "RI",
"street": "11 Penchant Cres",
"country": "US"
},
"phone": "5554842596",
"ein": null
},
"job_title": "Admin Services Manager",
"job_type": "F",
"is_active": false,
"start_date": "2023-02-25",
"end_date": "2024-06-15",
"original_hire_date": null,
"pay_frequency": "SM",
"income": "72450.00",
"income_unit": "YEARLY",
"pay_rate": "3169.69",
"missing_data_fields": [],
"statements": [
{
"id": "fc7ea2cc31b441c7b000f3c7e6aa6f98",
"pay_date": "2024-06-15",
"net_pay": "5189.94",
"net_pay_ytd": "57089.34",
"gross_pay": "6797.56",
"gross_pay_ytd": "74773.16",
"bonus": null,
"commission": null,
"hours": "86.66",
"basis_of_pay": "S",
"period_start": "2024-06-01",
"period_end": "2024-06-15",
"regular": "3169.69",
"regular_ytd": "34866.59",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": "229.09",
"other_pay_ytd": "39906.57",
"earnings": [
{
"name": "Regular Hours | Salaried",
"category": "regular",
"amount": "3169.69",
"rate": null,
"units": null
},
{
"name": "Healthcare Reimbursement",
"category": "other_pay",
"amount": "225.00",
"rate": null,
"units": null
}
// ...and 2 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Gross Earnings",
"category": "other_pay",
"amount": "37386.58",
"rate": null,
"units": null
},
{
"name": "Regular Hours | Salaried",
"category": "regular",
"amount": "34866.59",
"rate": null,
"units": null
}
// ...and 2 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "815.71",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "421.45",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "8972.81",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "4635.95",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "7e95b791c59e38e2fdb536b06dc828bb",
"derived_fields": [
"basis_of_pay"
],
"missing_data_fields": [],
"check_number": null
}
// ...and 31 more pay statements (omitted for brevity)
]
}
]
}
]
}
Hourly full-time worker:
job_type is F and income_unit is HOURLY. Hours alternate between pay periods, so gross_pay moves with them while the hourly rate in income stays fixed — two consecutive statements are shown so the change is visible. Contrast with VOIE-E1, where job_type is also F but pay is salaried (income_unit: "YEARLY", basis_of_pay: "S"), and with VOIE-E2, which is hourly but part-time (job_type: "P").{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Retail Shop",
"address": {
"zip": "72211",
"city": "Little Rock",
"state": "AR",
"street": "111 Bowman Rd.",
"country": "US"
},
"phone": "8885556666",
"ein": null
},
"job_title": "Customer Service Representative",
"job_type": "F",
"is_active": true,
"start_date": "2020-01-01",
"end_date": null,
"original_hire_date": "2020-01-01",
"pay_frequency": "BW",
"income": "17.00",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "b4ad07ffcb4a471689b77afd5d8d0b8d",
"pay_date": "2026-08-03",
"net_pay": "1170.96",
"net_pay_ytd": "17843.20",
"gross_pay": "1428.00",
"gross_pay_ytd": "21760.00",
"bonus": null,
"commission": null,
"hours": "84.00",
"basis_of_pay": "H",
"period_start": "2026-07-21",
"period_end": "2026-08-03",
"regular": "1428.00",
"regular_ytd": "21760.00",
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
{
"id": "46c684469df9456d9859b89d32554aec",
"pay_date": "2026-08-17",
"net_pay": "1059.44",
"net_pay_ytd": "18902.64",
"gross_pay": "1292.00",
"gross_pay_ytd": "23052.00",
"bonus": null,
"commission": null,
"hours": "76.00",
"basis_of_pay": "H",
"period_start": "2026-08-04",
"period_end": "2026-08-17",
"regular": "1292.00",
"regular_ytd": "23052.00",
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 53 more pay statements (omitted for brevity)
]
}
]
}
]
}
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.| Scenario | Username | Returns |
|---|---|---|
VOIE-T1 | goodlogin.tn1 | Active employment with less than 12 months tenure at the current employer |
VOIE-T2 | goodlogin.tn2 | Less than 12 months tenure, already ended — is_active: false with an end_date set shortly after the start date, and no statements |
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.
Sample responses
Sample responses
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.- Under 12 mo (T1)
- Under 12 mo, ended (T2)
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.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": null,
"is_active": true,
"start_date": "2026-02-02",
"end_date": null,
"original_hire_date": "2026-02-02",
"pay_frequency": "SM",
"income": "51789.36",
"income_unit": "YEARLY",
"pay_rate": "2157.89",
"missing_data_fields": [],
"statements": [
{
"id": "6accf34de74c4daab60fb9e5eea9843f",
"pay_date": "2026-06-15",
"net_pay": "1629.98",
"net_pay_ytd": "14669.82",
"gross_pay": "2157.89",
"gross_pay_ytd": "19421.01",
"bonus": null,
"commission": null,
"hours": "76.40",
"basis_of_pay": null,
"period_start": "2026-06-01",
"period_end": "2026-06-15",
"regular": "1935.77",
"regular_ytd": "17421.93",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "222.12",
"overtime_ytd": "1999.08",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "1935.77",
"rate": "26.92",
"units": "71.90"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "161.54",
"rate": "53.84",
"units": "3.00"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "17421.93",
"rate": "26.92",
"units": "647.10"
},
{
"name": "Double Time",
"category": "overtime",
"amount": "1453.86",
"rate": "53.84",
"units": "27.00"
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "153.63",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "133.89",
"category": "socialsec"
}
// ...and 4 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Income Tax",
"amount": "1382.67",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1205.01",
"category": "socialsec"
}
// ...and 4 more deductions ytd lines (omitted for brevity)
],
"md5sum": "0f8a4119df06b41c0f726a35e77c13bc",
"derived_fields": [
"hours"
],
"missing_data_fields": [],
"check_number": null
}
// ...and 8 more pay statements (omitted for brevity)
]
}
]
}
]
}
The alternate sub-12-month profile: same recent
start_date, but the employment ended two weeks after it began — is_active is false, end_date is set, and statements is an empty array.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Acme",
"address": {
"zip": "98765",
"city": "Anytown",
"state": "CA",
"street": "123 Main Street",
"country": "US"
},
"phone": "5555551234",
"ein": null
},
"job_title": "PR associate",
"job_type": null,
"is_active": false,
"start_date": "2026-02-02",
"end_date": "2026-02-15",
"original_hire_date": "2026-02-02",
"pay_frequency": "SM",
"income": "51789.36",
"income_unit": "YEARLY",
"pay_rate": "2157.89",
"missing_data_fields": [],
"statements": []
}
]
}
]
}
Benefits and special cases
Both scenarios return SSN9988.
| Scenario | Username | What it returns |
|---|---|---|
VOIE-B1 | military | Military MyPay data via the DFAS myPay provider |
VOIE-B2 | unemployment | Weekly unemployment benefits |
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.
Sample responses
Sample responses
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 (B1)
- Unemployment (B2)
Military pay record via the DFAS myPay provider: monthly statements, employer United States Air Force.
{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "United States Air Force",
"address": {
"zip": "44199",
"city": "Cleveland",
"state": "OH",
"street": "1240 E 9th St",
"country": "US"
},
"phone": "2225557777",
"ein": null
},
"job_title": "AF O4",
"job_type": "F",
"is_active": true,
"start_date": "2023-03-16",
"end_date": null,
"original_hire_date": "2007-03-16",
"pay_frequency": "M",
"income": "141015.71",
"income_unit": "YEARLY",
"pay_rate": "7192.20",
"missing_data_fields": [],
"statements": [
{
"id": "11848253ef7e474da9abcc5798065257",
"pay_date": "2026-07-31",
"net_pay": "13092.30",
"net_pay_ytd": "91646.10",
"gross_pay": "16332.67",
"gross_pay_ytd": "114328.69",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": "S",
"period_start": "2026-07-01",
"period_end": "2026-07-31",
"regular": "10182.38",
"regular_ytd": "71276.66",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": "6150.29",
"other_pay_ytd": "43052.03",
"earnings": [
{
"name": "BASE PAY",
"category": "regular",
"amount": "7192.20",
"rate": null,
"units": null
},
{
"name": "SAVE PAY",
"category": "other_pay",
"amount": "4916.66",
"rate": null,
"units": null
}
// ...and 3 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "BASE PAY",
"category": "regular",
"amount": "50345.40",
"rate": null,
"units": null
},
{
"name": "SAVE PAY",
"category": "other_pay",
"amount": "34416.62",
"rate": null,
"units": null
}
// ...and 3 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Taxes",
"amount": "1959.92",
"category": "federal"
},
{
"name": "FICA-Social Security",
"amount": "1012.63",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": [
{
"name": "Federal Taxes",
"amount": "13719.44",
"category": "federal"
},
{
"name": "FICA-Social Security",
"amount": "7088.41",
"category": "socialsec"
}
// ...and 2 more deductions ytd lines (omitted for brevity)
],
"md5sum": "7727e0fbcf4a01dad3ac1289365b2daf",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 25 more pay statements (omitted for brevity)
]
}
]
}
]
}
Weekly unemployment benefit payments from a state workforce agency.
income is 450.00 with income_unit: "WEEKLY".{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Illinois Department of Employment Security",
"address": {
"zip": "62703",
"city": "Springfield",
"state": "Illinois",
"street": "1300 S 9th St",
"country": "US"
},
"phone": "8002445631",
"ein": null
},
"job_title": "Unemployed",
"job_type": null,
"is_active": true,
"start_date": "2023-08-14",
"end_date": null,
"original_hire_date": "2022-08-14",
"pay_frequency": "W",
"income": "450.00",
"income_unit": "WEEKLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "ab48d71f9db44f20936085d6732df6db",
"pay_date": "2026-06-15",
"net_pay": "750.00",
"net_pay_ytd": "18000.00",
"gross_pay": "750.00",
"gross_pay_ytd": "18000.00",
"bonus": null,
"commission": null,
"hours": null,
"basis_of_pay": null,
"period_start": "2026-06-09",
"period_end": "2026-06-15",
"regular": "450.00",
"regular_ytd": "10800.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": "300.00",
"other_pay_ytd": "7200.00",
"earnings": [
{
"name": "Weekly Benefit Amount",
"category": "regular",
"amount": "450.00",
"rate": null,
"units": null
},
{
"name": "FAC Payment",
"category": "other_pay",
"amount": "300.00",
"rate": null,
"units": null
}
],
"earnings_ytd": [
{
"name": "Weekly Benefit Amount",
"category": "regular",
"amount": "10800.00",
"rate": null,
"units": null
},
{
"name": "FAC Payment",
"category": "other_pay",
"amount": "7200.00",
"rate": null,
"units": null
}
],
"deductions": null,
"deductions_ytd": null,
"md5sum": "c8726877cb996592bd8fd9aa0cab64f0",
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 107 more pay statements (omitted for brevity)
]
}
]
}
]
}
Gig and shift workers
| Scenario | Username | What it returns |
|---|---|---|
VOIE-G1 | goodlogin.shift | Gig worker with earned wage access — use for testing gig-payroll VOIE flows where hours and earnings cadence differ from W-2 payroll |
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.
Sample response — gig / earned wage access
Sample response — gig / earned wage access
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.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "DoorDash",
"address": {
"zip": "94103",
"city": "San Francisco",
"state": "CA",
"street": "901 Market Street 6th Floor",
"country": "US"
},
"phone": null,
"ein": null
},
"job_title": "Gig Worker",
"job_type": null,
"is_active": true,
"start_date": "2026-04-06",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "W",
"income": null,
"income_unit": null,
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "4c6582ab29ff4930b41474c8d0e0e66b",
"pay_date": "2026-05-24",
"net_pay": null,
"net_pay_ytd": null,
"gross_pay": "618.50",
"gross_pay_ytd": null,
"bonus": null,
"commission": null,
"hours": "31.00",
"basis_of_pay": "H",
"period_start": "2026-05-17",
"period_end": "2026-05-23",
"regular": null,
"regular_ytd": null,
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": null,
"earnings_ytd": null,
"deductions": null,
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
// ...and 7 more pay statements (omitted for brevity)
]
}
]
}
]
}
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.| Scenario | Username | What it returns |
|---|---|---|
VOIE-D1 | pay.raise | Ongoing pay increase. gross_pay steps up across consecutive statements |
VOIE-D2 | pay.reduction | Ongoing pay decrease. gross_pay steps down across consecutive statements |
VOIE-D3 | extreme.income | Very high values for gross_pay, hours, and bonus on every statement |
VOIE-D4 | outlier.paystub | A steady history with one outlier statement far larger than the rest |
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.Sample responses
Sample responses
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.- Pay raise (D1)
- Pay reduction (D2)
- Extreme income (D3)
- Outlier paystub (D4)
gross_pay steps up across the history — 2,000.00 on the oldest statement to 3,500.00 on the newest.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Emerald City Tech",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-03-13",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": null,
"income_unit": null,
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "045a21cad7bc471ab9f2403cb59ae63b",
"pay_date": "2026-05-22",
"net_pay": "2672.25",
"net_pay_ytd": null,
"gross_pay": "3500.00",
"gross_pay_ytd": "16100.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-05-08",
"period_end": "2026-05-22",
"regular": "3500.00",
"regular_ytd": "16100.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "3500.00",
"rate": "43.75",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "16100.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "420.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "217.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...2 statements omitted...
{
"id": "9b9b9cd859424de999e2e832b44976c6",
"pay_date": "2026-04-10",
"net_pay": "1832.40",
"net_pay_ytd": null,
"gross_pay": "2400.00",
"gross_pay_ytd": "6600.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-03-27",
"period_end": "2026-04-10",
"regular": "2400.00",
"regular_ytd": "6600.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2400.00",
"rate": "30.00",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "6600.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "288.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "148.80",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...1 statements omitted...
{
"id": "889ad3525d084ecca48dbb63048148d3",
"pay_date": "2026-03-13",
"net_pay": "1527.00",
"net_pay_ytd": null,
"gross_pay": "2000.00",
"gross_pay_ytd": "2000.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-02-27",
"period_end": "2026-03-13",
"regular": "2000.00",
"regular_ytd": "2000.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2000.00",
"rate": "25.00",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "2000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "240.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "124.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
]
}
]
}
]
}
gross_pay steps down across the history — 3,500.00 on the oldest statement to 2,000.00 on the newest.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Coastal Retail Partners",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-03-13",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": null,
"income_unit": null,
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "cd6fea7c0c574b1f8f74030de268952d",
"pay_date": "2026-05-22",
"net_pay": "1527.00",
"net_pay_ytd": null,
"gross_pay": "2000.00",
"gross_pay_ytd": "16500.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-05-08",
"period_end": "2026-05-22",
"regular": "2000.00",
"regular_ytd": "16500.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2000.00",
"rate": "25.00",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "16500.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "240.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "124.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...2 statements omitted...
{
"id": "c35067ad8593422ca90d0c080547a48b",
"pay_date": "2026-04-10",
"net_pay": "2214.15",
"net_pay_ytd": null,
"gross_pay": "2900.00",
"gross_pay_ytd": "9600.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-03-27",
"period_end": "2026-04-10",
"regular": "2900.00",
"regular_ytd": "9600.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2900.00",
"rate": "36.25",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "9600.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "348.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "179.80",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...1 statements omitted...
{
"id": "71752ebf66b9435094efbd5699e82351",
"pay_date": "2026-03-13",
"net_pay": "2672.25",
"net_pay_ytd": null,
"gross_pay": "3500.00",
"gross_pay_ytd": "3500.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-02-27",
"period_end": "2026-03-13",
"regular": "3500.00",
"regular_ytd": "3500.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "3500.00",
"rate": "43.75",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "3500.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "420.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "217.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
]
}
]
}
]
}
gross_pay runs 40,000.00+ per bi-weekly period with hours: "320.00", plus a bonus on the newest statement. Use it to confirm your fields and decisioning hold at the top of the value range.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Apex Heavy Industries",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-03-13",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": "100.00",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "cabefa3b57b246e189ea5606011298e5",
"pay_date": "2026-05-22",
"net_pay": "36648.00",
"net_pay_ytd": null,
"gross_pay": "48000.00",
"gross_pay_ytd": "248000.00",
"bonus": "8000.00",
"commission": null,
"hours": "320.00",
"basis_of_pay": "H",
"period_start": "2026-05-08",
"period_end": "2026-05-22",
"regular": "16000.00",
"regular_ytd": "96000.00",
"bonus_ytd": "8000.00",
"commission_ytd": null,
"overtime": "24000.00",
"overtime_ytd": "144000.00",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Overtime",
"category": "overtime",
"amount": "24000.00",
"rate": "150.00",
"units": "160.00"
},
{
"name": "Regular",
"category": "regular",
"amount": "16000.00",
"rate": "100.00",
"units": "160.00"
}
// ...and 1 more earnings lines (omitted for brevity)
],
"earnings_ytd": [
{
"name": "Overtime",
"category": "overtime",
"amount": "144000.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "96000.00",
"rate": null,
"units": null
}
// ...and 1 more earnings ytd lines (omitted for brevity)
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "5760.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "2976.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...2 statements omitted...
{
"id": "cac94357482e4f178bd12a53ac129f7c",
"pay_date": "2026-04-10",
"net_pay": "30540.00",
"net_pay_ytd": null,
"gross_pay": "40000.00",
"gross_pay_ytd": "120000.00",
"bonus": null,
"commission": null,
"hours": "320.00",
"basis_of_pay": "H",
"period_start": "2026-03-27",
"period_end": "2026-04-10",
"regular": "16000.00",
"regular_ytd": "48000.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "24000.00",
"overtime_ytd": "72000.00",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Overtime",
"category": "overtime",
"amount": "24000.00",
"rate": "150.00",
"units": "160.00"
},
{
"name": "Regular",
"category": "regular",
"amount": "16000.00",
"rate": "100.00",
"units": "160.00"
}
],
"earnings_ytd": [
{
"name": "Overtime",
"category": "overtime",
"amount": "72000.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "48000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "4800.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "2480.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...1 statements omitted...
{
"id": "05bf0e3960b9463e86bf27e62006532b",
"pay_date": "2026-03-13",
"net_pay": "30540.00",
"net_pay_ytd": null,
"gross_pay": "40000.00",
"gross_pay_ytd": "40000.00",
"bonus": null,
"commission": null,
"hours": "320.00",
"basis_of_pay": "H",
"period_start": "2026-02-27",
"period_end": "2026-03-13",
"regular": "16000.00",
"regular_ytd": "16000.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": "24000.00",
"overtime_ytd": "24000.00",
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Overtime",
"category": "overtime",
"amount": "24000.00",
"rate": "150.00",
"units": "160.00"
},
{
"name": "Regular",
"category": "regular",
"amount": "16000.00",
"rate": "100.00",
"units": "160.00"
}
],
"earnings_ytd": [
{
"name": "Overtime",
"category": "overtime",
"amount": "24000.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "16000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "4800.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "2480.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
]
}
]
}
]
}
A steady 2,500.00 history with a single 24,000.00 statement mid-series. The newest statement shows the normal value, so scan the whole
statements[] array to find the spike.{
"links": [
{
"provider_name": "Truv payroll provider",
"employments": [
{
"company": {
"name": "Valley Manufacturing",
"address": {
"street": "",
"city": "",
"state": "",
"zip": ""
},
"phone": null,
"ein": null
},
"job_title": null,
"job_type": "F",
"is_active": true,
"start_date": "2026-03-13",
"end_date": null,
"original_hire_date": null,
"pay_frequency": "BW",
"income": "31.25",
"income_unit": "HOURLY",
"pay_rate": null,
"missing_data_fields": [],
"statements": [
{
"id": "424bc7bccd2c46c2bdd2a3cff16b9b60",
"pay_date": "2026-05-22",
"net_pay": "1908.75",
"net_pay_ytd": null,
"gross_pay": "2500.00",
"gross_pay_ytd": "36500.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-05-08",
"period_end": "2026-05-22",
"regular": "2500.00",
"regular_ytd": "15000.00",
"bonus_ytd": "21500.00",
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": "31.25",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Bonus",
"category": "bonus",
"amount": "21500.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "15000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "300.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "155.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...1 statements omitted...
{
"id": "367e3e13ae8a42a2af4f8ef9274c2eca",
"pay_date": "2026-04-24",
"net_pay": "18324.00",
"net_pay_ytd": null,
"gross_pay": "24000.00",
"gross_pay_ytd": "31500.00",
"bonus": "21500.00",
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-04-10",
"period_end": "2026-04-24",
"regular": "2500.00",
"regular_ytd": "10000.00",
"bonus_ytd": "21500.00",
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Bonus",
"category": "bonus",
"amount": "21500.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": "31.25",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Bonus",
"category": "bonus",
"amount": "21500.00",
"rate": null,
"units": null
},
{
"name": "Regular",
"category": "regular",
"amount": "10000.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "2880.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "1488.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
},
// ...2 statements omitted...
{
"id": "f5db374f51674eae8d810a33ea0af5a7",
"pay_date": "2026-03-13",
"net_pay": "1908.75",
"net_pay_ytd": null,
"gross_pay": "2500.00",
"gross_pay_ytd": "2500.00",
"bonus": null,
"commission": null,
"hours": "80.00",
"basis_of_pay": "H",
"period_start": "2026-02-27",
"period_end": "2026-03-13",
"regular": "2500.00",
"regular_ytd": "2500.00",
"bonus_ytd": null,
"commission_ytd": null,
"overtime": null,
"overtime_ytd": null,
"other_pay": null,
"other_pay_ytd": null,
"earnings": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": "31.25",
"units": "80.00"
}
],
"earnings_ytd": [
{
"name": "Regular",
"category": "regular",
"amount": "2500.00",
"rate": null,
"units": null
}
],
"deductions": [
{
"name": "Federal Income Tax",
"amount": "300.00",
"category": "federal"
},
{
"name": "Social Security Tax",
"amount": "155.00",
"category": "socialsec"
}
// ...and 2 more deductions lines (omitted for brevity)
],
"deductions_ytd": null,
"md5sum": null,
"derived_fields": [],
"missing_data_fields": [],
"check_number": null
}
]
}
]
}
]
}
Error scenarios
VOIE shares the universal authentication-error credentials. Use these to test your error handling and retry UX.| Scenario | Credential | Task status | Use it to test |
|---|---|---|---|
VOIE-X1 | goodlogin / no_data | no_data | Successful login, provider returns zero records |
VOIE-X2 | goodlogin / mfa | mfa → done | MFA flow — enter code 12345 |
VOIE-X3 | goodlogin / mfa_captcha | mfa → done | MFA captcha — enter answer 9M4BP |
VOIE-X4 | goodlogin / mfa_select | mfa → done | MFA verification-method selection |
VOIE-X5 | goodlogin / longcheck | parse → done (delayed) | ~30 second processing delay |
VOIE-X6 | error.user / login_error | login_error | Incorrect credentials |
VOIE-X7 | error.user / mfa_error | mfa_error | MFA verification failed |
VOIE-X8 | error.user / account_locked | account_locked | Account locked by provider |
VOIE-X9 | error.user / unavailable | unavailable | Provider under maintenance |
VOIE-X10 | error.user / error | error | Generic login error |
VOIE-X11 | error.user / config_error | config_error | Organization ID configuration failure |
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 onetask-status-updated event per status transition plus one order-status-updated event per connection when the user finishes the order.
Sample webhook payloads
Sample webhook payloads
Per-task event (one per employer connection):Order event (one per connection — fires for each unique
{
"webhook_id": "609a82aab21e4d9ba2569f35e9e8f26a",
"event_type": "task-status-updated",
"event_created_at": "2026-04-26T13:02:20.371215+00:00",
"user_id": "aab5e0f4c86a4b6f9b1e2d3c4f5a6b7c",
"product": "income",
"link_id": "64f8e374949c4b769706028022626bf1",
"data_source": "payroll",
"task_id": "67f2924530564282bbaf6d27655e94a4",
"tracking_info": "your-applicant-id",
"status": "done",
"template_id": null,
"updated_at": "2026-04-26T13:02:20.369267+00:00"
}
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):{
"webhook_id": "698e974cb30646189862229199f7ed1a",
"event_type": "order-status-updated",
"event_created_at": "2026-04-26T13:02:35.172897+00:00",
"user_id": "aab5e0f4c86a4b6f9b1e2d3c4f5a6b7c",
"order_id": "45771e47434341039c61ccb28caeb9d8",
"order_number": "your-loan-number",
"template_id": null,
"updated_at": "2026-04-26T13:02:35.170112+00:00",
"product": "income",
"status": "completed",
"link_id": "64f8e374949c4b769706028022626bf1",
"data_source": "payroll",
"employer_id": "8f50b58e35644bb5bff989341eafcdb5"
}
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