Skip to main content
Test Verification of Assets (VOA) and bank-derived income scenarios in sandbox using the credentials below. Pass product_type: assets on the bridge token or order, and search for Truv Bank OAuth or Truv Bank non-OAuth in Truv Bridge.
For additional login fields, use Phone: (111)111-1111 and Email: goodlogin@domain.com.

Quick start

CredentialProviderWhat you get
goodlogin / goodpasswordTruv Bank OAuth or Truv Bank non-OAuthComplete asset data — accounts, balances, transactions, derived income sources
For the underlying JSON shape, see the User Assets Report object. Sample response — captured from a live sandbox order. Expand a credential to see the response it returns.
The complete assets payload a successful bank connection returns: every connected account with balances and owners, plus the bank income engine’s bank_income_sources (income classification, cadence, forecasted monthly income, and a sample of the monthly historical_summary). Captured from a live sandbox order; per-month transaction arrays are truncated for length.
{
  "id": "aab7df0b814c4b5e9f8cde4b8a9d094a",
  "product_type": "assets",
  "status": "sent",
  "link_id": "7e625245547044ff9ab460048b8096ea",
  "data_source": "financial_accounts",
  "provider": {
    "logo_url": "https://d1uvo9h6rsmxet.cloudfront.net/provider_logos/truv_bank.svg",
    "id": "truv_bank",
    "name": "Truv Bank (non-oAuth)"
  },
  "is_suspicious": false,
  "last_task_status": "done",
  "accounts": [
    {
      "id": "56140694b55c4f83ac6e8abc1148c320",
      "type": "CHECKING",
      "subtype": null,
      "mask": "0685",
      "balance": "49635.00",
      "owners": [
        {
          "full_name": "John Doe"
        }
      ]
    },
    {
      "id": "7ba7a2aa0cb843f0906865515c02dd10",
      "type": "INVESTMENT",
      "subtype": null,
      "mask": "9950",
      "balance": "1000.00",
      "owners": [
        {
          "full_name": "John Doe"
        }
      ]
    },
    {
      "id": "cc4c1b7c79c243afb2477d192dfd2ad1",
      "type": "SAVINGS",
      "subtype": null,
      "mask": "3248",
      "balance": "5000.00",
      "owners": [
        {
          "full_name": "John Doe"
        }
      ]
    }
  ],
  "bank_income_sources": [
    {
      "start_date": "2024-06-18",
      "end_date": "2026-06-17",
      "account_id": "56140694b55c4f83ac6e8abc1148c320",
      "income_description": "doordashinc",
      "income_category": "GIG_ECONOMY",
      "pay_frequency": "BW",
      "next_payment_date": "2026-06-29",
      "total_amount": "29122.79",
      "iso_currency_code": "USD",
      "transaction_count": 52,
      "historical_summary": [
        {
          "start_date": "2026-06-01",
          "end_date": "2026-06-30",
          "total_amount": "1125.28",
          "iso_currency_code": "USD",
          "transactions": [
            {
              "amount": "528.79",
              "iso_currency_code": "USD",
              "date": "2026-06-15",
              "description": "doordashinc visa direct",
              "pending": false,
              "transaction_id": "45539b6e22814796924a71a15e855f6c",
              "check_number": null
            },
            {
              "amount": "596.49",
              "iso_currency_code": "USD",
              "date": "2026-06-01",
              "description": "doordashinc visa direct",
              "pending": false,
              "transaction_id": "9c7abe1751dd426bbf109aa1c410d3cf",
              "check_number": null
            }
          ]
        },
        {
          "start_date": "2026-05-01",
          "end_date": "2026-05-31",
          "total_amount": "1085.51",
          "iso_currency_code": "USD",
          "transactions": [
            {
              "amount": "556.72",
              "iso_currency_code": "USD",
              "date": "2026-05-18",
              "description": "doordashinc visa direct",
              "pending": false,
              "transaction_id": "bbe1ad37001548d8a2f2a25c650f8e05",
              "check_number": null
            },
            {
              "amount": "528.79",
              "iso_currency_code": "USD",
              "date": "2026-05-04",
              "description": "doordashinc visa direct",
              "pending": false,
              "transaction_id": "4b7a7e2f764b4f6a86f4580ba9da273d",
              "check_number": null
            }
          ]
        },
        "...and 22 more monthly periods (omitted for brevity)"
      ],
      "historical_average_monthly_income": "1217.28",
      "historical_average_monthly_gross_income": "1217.28",
      "forecasted_average_monthly_income": "1217.28",
      "avg_deposit_amount": "556.11",
      "avg_gross_deposit_amount": "556.11",
      "employer": {
        "id": "d7e91477807442c8ac6d6a818d163ece",
        "name": "DoorDash"
      }
    }
  ]
}

Credential scenarios

Every credential here connects through Truv Bank OAuth or Truv Bank non-OAuth and returns the same shape as Quick start — the Sample responses panels show only the fields that differ. Each credential string is a stable test-case identifier you can cite in tickets.

Account types

ScenarioCredentialAccount types returned
VOA-A1goodlogin.checking / goodpasswordChecking
VOA-A2goodlogin.checking.savings / goodpasswordChecking, Savings
VOA-A3goodlogin.card / goodpasswordChecking, Savings
VOA-A4goodlogin.inv / goodpasswordInvestment
VOA-A5goodlogin.all / goodpasswordChecking, Savings, Investment
VOA-A6sit / goodpasswordCertificate of Deposit, Stocks, Bonds
Use these to validate your handling of accounts[].type and accounts[].subtype across the common shapes.
Returns a single Checking account.
{
  "accounts": [
    {
      "type": "CHECKING",
      "subtype": null,
      "mask": "6447",
      "balance": "16595.84"
    }
  ]
}
goodlogin.all returns income sources spread across multiple account_id values (not all attributed to one account). Use this credential when you need to validate handling of the same applicant having recurring activity on more than one connected account — for example, paycheck deposit on checking + gig income on a separate savings account.

Bank income sources

Each credential drives the bank income engine’s income_category classification. Use these to validate your decisioning across the categories Truv classifies bank deposits into.
ScenarioCredentialincome_category returned
VOA-I1goodlogin.gig / goodpasswordGIG_ECONOMY
VOA-I2goodlogin.gov.employee / goodpasswordGOVERNMENT_EMPLOYMENT
VOA-I3goodlogin.ewa / goodpasswordEWA_PAYROLL
VOA-I4goodlogin.retirement / goodpasswordRETIREMENT
VOA-I5goodlogin.rental / goodpasswordRENTAL
VOA-I6goodlogin.unemployment / goodpasswordUNEMPLOYMENT
VOA-I7goodlogin.gov.benefits / goodpasswordGOVERNMENT_BENEFITS
VOA-I8goodlogin.benefits / goodpasswordPRIVATE_BENEFITS
VOA-I9goodlogin.tax.credits / goodpasswordPAYCHECK
VOA-I10goodlogin.interest / goodpasswordPAYCHECK
Bank income classified as GIG_ECONOMY (DoorDash deposits).
{
  "bank_income_sources": [
    {
      "income_category": "GIG_ECONOMY",
      "income_description": "DoorDash, Inc.",
      "pay_frequency": "SM",
      "total_amount": "17436.56",
      "transaction_count": 34,
      "next_payment_date": "2026-07-01",
      "historical_average_monthly_income": "1025.68",
      "forecasted_average_monthly_income": "1025.68",
      "avg_deposit_amount": "512.84",
      "iso_currency_code": "USD",
      "historical_summary_sample": {
        "start_date": "2026-06-01",
        "end_date": "2026-06-30",
        "total_amount": "1025.68",
        "iso_currency_code": "USD",
        "transactions": [
          {
            "amount": "512.84",
            "iso_currency_code": "USD",
            "date": "2026-06-15",
            "description": "DoorDash, Inc.   DES:DoorDash,  ID:XXXXXXXXXX           INDN:XXXXXXXXXX         CO ID:XXXXXXXXXX CCD",
            "pending": false,
            "transaction_id": "0615692c9b60429c9a8ee019115b17ab",
            "check_number": null
          },
          {
            "amount": "512.84",
            "iso_currency_code": "USD",
            "date": "2026-06-01",
            "description": "DoorDash, Inc.   DES:DoorDash,  ID:XXXXXXXXXX           INDN:XXXXXXXXXX         CO ID:XXXXXXXXXX CCD",
            "pending": false,
            "transaction_id": "3daa89b553df4a0f9c0081fd4b46af08",
            "check_number": null
          }
        ]
      }
    }
  ]
}
The full income_category enum includes PAYCHECK, GOVERNMENT_EMPLOYMENT, EWA_PAYROLL, GIG_ECONOMY, RETIREMENT, RENTAL, UNEMPLOYMENT, GOVERNMENT_BENEFITS, PRIVATE_BENEFITS, P2P_TRANSFER, TAX_CREDITS, CASH_OR_CHECK, INTEREST, INVESTMENT, and OTHER. If your enum validation is strict, allow all of these values.

Risk profiles

Combine the asset credential with these passwords to simulate different consumer risk profiles. Use them to test downstream decisioning that consumes Truv’s asset and bank income data.
ScenarioCredentialWhat it returns
VOA-R1goodlogin / good_asset30 days of data — use to test recency-based decisioning
VOA-R2goodlogin / low_riskLow-risk consumer profile
VOA-R3goodlogin / high_riskHigh-risk consumer profile
Recency-limited profile for testing recency-based decisioning.
{
  "accounts": [
    {
      "type": "CHECKING",
      "mask": "8773",
      "balance": "2283.99"
    },
    {
      "type": "CHECKING",
      "mask": "0685",
      "balance": "5410.36"
    }
  ],
  "bank_income_sources_count": 0,
  "income_categories": []
}

Error scenarios

VOA shares the universal authentication-error credentials. Use these to test your error handling and retry UX.
ScenarioCredentialTask status
VOA-X1goodlogin / no_datano_data
VOA-X2goodlogin / mfamfadone (enter code 12345)
VOA-X3error.user / login_errorlogin_error
VOA-X4error.user / account_lockedaccount_locked
VOA-X5error.user / unavailableunavailable
VOA-X6error.user / errorerror
See Task lifecycle for the full status reference.

Recurring transactions endpoint

The recurring transactions endpoint (GET /v1/users/{user_id}/transactions/recurring/) runs on top of the same assets connection — once an applicant has completed a VOA verification, you can call the endpoint to retrieve detected recurring inflows and outflows on the connected accounts.
CredentialReturns
goodlogin / goodpasswordA single recurring inflow (gig income), 53 historical transactions, one account_id. Suitable for basic happy-path testing.
goodlogin.all / goodpasswordMultiple recurring inflow sources distributed across multiple account_id values — paycheck and gig income land on different accounts. Use this when validating multi-account aggregation.
Sandbox seeds recurring inflows only. Sandbox responses populate the inflows[] array; the outflows[] array (subscriptions, recurring expenses, loan payments) returns empty across every documented login variant today. Validate your inflow-handling logic end to end in sandbox, but plan to test outflow handling against production data or a controlled test in your production environment. We’re tracking this gap internally.
The endpoint requires the is_recurring_transactions_detection_enabled UWS flag to be on for your account. If you call it and receive empty arrays for both inflows and outflows with goodlogin / goodpassword, contact support@truv.com to confirm the flag is enabled on your sandbox. For the full endpoint contract — source_id vs account_id, status semantics, historical transactions per source — see the Recurring Transactions API reference.

Accounts without transactions

Sandbox connections occasionally return bank accounts that have no transactions on them yet — a recently opened checking account, an investment account that hasn’t seen activity in the lookback window, etc. This is a valid scenario, not an error. To confirm your integration handles it: pass goodlogin.inv / goodpassword and inspect the response. The investment account is returned with balance fields populated but an empty or sparse transactions[] array. Validate that your decisioning logic treats transactions: [] as a real signal (e.g., “this account exists but has no income evidence”) rather than treating it as a failed connection.

Sample VOA reports

Truv’s VOA report format is the same whether the report is consumed by a non-GSE lender or submitted to Fannie Mae DU / Freddie Mac LPA. The PDFs linked from the GSE pages are the canonical sample VOA report references today.

Fannie Mae VOA samples

Sample VOA PDFs tied to Fannie Mae D1C borrower scenarios

Freddie Mac VOA samples

Sample VOA PDFs tied to Freddie Mac AIM borrower scenarios

Webhook events

When testing VOA end to end, your webhook endpoint receives a task-status-updated event for the financial-accounts task plus per-resource events as accounts, transactions, and bank income are extracted.
{
  "webhook_id": "609a82aab21e4d9ba2569f35e9e8f26a",
  "event_type": "task-status-updated",
  "updated_at": "2026-04-26T13:02:20.369267+00:00",
  "task_id": "67f2924530564282bbaf6d27655e94a4",
  "link_id": "64f8e374949c4b769706028022626bf1",
  "product": "assets",
  "tracking_info": "your-applicant-id",
  "status": "done"
}
Other events you may receive during a VOA flow include bank-accounts-created, transactions-created, and (for derived bank income) updates that surface through the standard task lifecycle. See Webhook Events for the full catalog.

Next steps

Bank Aggregation

Product overview for transactions and bank income

Bank Income

Integration guide for bank-derived income

GSE Testing

AIM-VOA submission flow with Freddie Mac

Report Object

JSON schema for the VOA report