> ## Documentation Index
> Fetch the complete documentation index at: https://docs.truv.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Assets Testing

> Sandbox credentials, account variants, and bank income source scenarios for VOA integrations

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.

<Tip>
  For additional login fields, use **Phone:** `(111)111-1111` and **Email:** `goodlogin@domain.com`.
</Tip>

***

## Quick start

| Credential                   | Provider                               | What you get                                                                   |
| ---------------------------- | -------------------------------------- | ------------------------------------------------------------------------------ |
| `goodlogin` / `goodpassword` | Truv Bank OAuth or Truv Bank non-OAuth | Complete asset data — accounts, balances, transactions, derived income sources |

For the underlying JSON shape, see the [User Assets Report object](/api-reference/user-asset-verification-reports/object).

**Sample response** — captured from a live sandbox order. Expand a credential to see the response it returns.

<AccordionGroup>
  <Accordion title="goodlogin / goodpassword — full assets suborder shape">
    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.

    ```json theme={null}
    {
      "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"
          }
        }
      ]
    }
    ```
  </Accordion>
</AccordionGroup>

***

## Credential scenarios

Every credential here connects through **Truv Bank OAuth** or **Truv Bank non-OAuth** and returns the same shape as [Quick start](#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

| Scenario | Credential                                    | Account types returned                |
| -------- | --------------------------------------------- | ------------------------------------- |
| `VOA-A1` | `goodlogin.checking` / `goodpassword`         | Checking                              |
| `VOA-A2` | `goodlogin.checking.savings` / `goodpassword` | Checking, Savings                     |
| `VOA-A3` | `goodlogin.card` / `goodpassword`             | Checking, Savings                     |
| `VOA-A4` | `goodlogin.inv` / `goodpassword`              | Investment                            |
| `VOA-A5` | `goodlogin.all` / `goodpassword`              | Checking, Savings, Investment         |
| `VOA-A6` | `sit` / `goodpassword`                        | Certificate of Deposit, Stocks, Bonds |

Use these to validate your handling of `accounts[].type` and `accounts[].subtype` across the common shapes.

<Accordion title="Sample responses">
  <Tabs>
    <Tab title="Checking (A1)">
      Returns a single Checking account.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "CHECKING",
            "subtype": null,
            "mask": "6447",
            "balance": "16595.84"
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Checking + Savings (A2)">
      Returns Checking + Savings.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "SAVINGS",
            "subtype": null,
            "mask": "5341",
            "balance": "12635.78"
          },
          {
            "type": "CHECKING",
            "subtype": null,
            "mask": "6447",
            "balance": "16595.84"
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Card (A3)">
      Returns Checking + Savings.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "SAVINGS",
            "subtype": null,
            "mask": "5341",
            "balance": "12635.78"
          },
          {
            "type": "CHECKING",
            "subtype": null,
            "mask": "6447",
            "balance": "16595.84"
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Investment (A4)">
      Returns an Investment account (subtype `IRA`) with balances populated and no transactions.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "INVESTMENT",
            "subtype": "IRA",
            "mask": "0244",
            "balance": "10398.52"
          }
        ]
      }
      ```
    </Tab>

    <Tab title="All types (A5)">
      Returns Investment + Savings + Checking across multiple `account_id` values.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "INVESTMENT",
            "subtype": "IRA",
            "mask": "0244",
            "balance": "10398.52"
          },
          {
            "type": "SAVINGS",
            "subtype": null,
            "mask": "5341",
            "balance": "12635.78"
          },
          {
            "type": "CHECKING",
            "subtype": null,
            "mask": "6447",
            "balance": "16595.84"
          }
        ]
      }
      ```
    </Tab>

    <Tab title="CD + Stocks + Bonds (A6)">
      Returns a Certificate of Deposit (Savings subtype `CERTIFICATE_OF_DEPOSIT`) and a Brokerage investment account alongside Checking.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "INVESTMENT",
            "subtype": "BROKERAGE",
            "mask": "2422",
            "balance": "56780.00"
          },
          {
            "type": "SAVINGS",
            "subtype": "CERTIFICATE_OF_DEPOSIT",
            "mask": "2112",
            "balance": "7500.00"
          },
          {
            "type": "CHECKING",
            "subtype": null,
            "mask": "6789",
            "balance": "14500.00"
          }
        ]
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

<Note>
  `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.
</Note>

### 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.

| Scenario  | Credential                                | `income_category` returned |
| --------- | ----------------------------------------- | -------------------------- |
| `VOA-I1`  | `goodlogin.gig` / `goodpassword`          | `GIG_ECONOMY`              |
| `VOA-I2`  | `goodlogin.gov.employee` / `goodpassword` | `GOVERNMENT_EMPLOYMENT`    |
| `VOA-I3`  | `goodlogin.ewa` / `goodpassword`          | `EWA_PAYROLL`              |
| `VOA-I4`  | `goodlogin.retirement` / `goodpassword`   | `RETIREMENT`               |
| `VOA-I5`  | `goodlogin.rental` / `goodpassword`       | `RENTAL`                   |
| `VOA-I6`  | `goodlogin.unemployment` / `goodpassword` | `UNEMPLOYMENT`             |
| `VOA-I7`  | `goodlogin.gov.benefits` / `goodpassword` | `GOVERNMENT_BENEFITS`      |
| `VOA-I8`  | `goodlogin.benefits` / `goodpassword`     | `PRIVATE_BENEFITS`         |
| `VOA-I9`  | `goodlogin.tax.credits` / `goodpassword`  | `PAYCHECK`                 |
| `VOA-I10` | `goodlogin.interest` / `goodpassword`     | `PAYCHECK`                 |

<Accordion title="Sample responses">
  <Tabs>
    <Tab title="Gig economy (I1)">
      Bank income classified as `GIG_ECONOMY` (DoorDash deposits).

      ```json theme={null}
      {
        "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
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Govt employment (I2)">
      Bank income classified as `GOVERNMENT_EMPLOYMENT`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "GOVERNMENT_EMPLOYMENT",
            "income_description": "U.S. Department Of The Treasury",
            "pay_frequency": null,
            "total_amount": "234169.38",
            "transaction_count": 53,
            "next_payment_date": null,
            "historical_average_monthly_income": "9585.64",
            "forecasted_average_monthly_income": null,
            "avg_deposit_amount": "4747.50",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "5393.77",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "5393.77",
                  "iso_currency_code": "USD",
                  "date": "2026-06-02",
                  "description": "Salary/Regular Income from U.S. Department Of The Treasury",
                  "pending": false,
                  "transaction_id": "25fecd1582ec4dab85a83e5915b95958",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="EWA payroll (I3)">
      Returns `EWA_PAYROLL` (earned wage access) alongside a `PAYCHECK` source.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "EWA_PAYROLL",
            "income_description": "PAYACTIV JOHN DOE",
            "pay_frequency": null,
            "total_amount": "11126.00",
            "transaction_count": 31,
            "next_payment_date": null,
            "historical_average_monthly_income": "1022.50",
            "forecasted_average_monthly_income": null,
            "avg_deposit_amount": "433.54",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-03-01",
              "end_date": "2026-03-31",
              "total_amount": "676.00",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "211.00",
                  "iso_currency_code": "USD",
                  "date": "2026-03-16",
                  "description": "UKG26322 PAYACTIV 8328 JOHN DOE ACH CREDIT",
                  "pending": false,
                  "transaction_id": "8a7d14367e3d4b9d9c52fdaa6471776a",
                  "check_number": null
                },
                {
                  "amount": "465.00",
                  "iso_currency_code": "USD",
                  "date": "2026-03-09",
                  "description": "UKG26244 PAYACTIV 0667 JOHN DOE ACH CREDIT",
                  "pending": false,
                  "transaction_id": "2accd056c1bc46febf18d60397415629",
                  "check_number": null
                }
              ]
            }
          },
          {
            "income_category": "PAYCHECK",
            "income_description": "Home Depot Payroll",
            "pay_frequency": "BW",
            "total_amount": "69047.68",
            "transaction_count": 52,
            "next_payment_date": "2026-06-29",
            "historical_average_monthly_income": "2886.61",
            "forecasted_average_monthly_income": "2886.61",
            "avg_deposit_amount": "1327.84",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "2655.68",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-15",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "cd1c90f41e104c67b23adff277ade255",
                  "check_number": null
                },
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-01",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "acfe1ca8f11241a8951a24612eb78460",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Retirement (I4)">
      Bank income classified as `RETIREMENT`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "RETIREMENT",
            "income_description": "OHIO PERS RETIREMENT",
            "pay_frequency": "M",
            "total_amount": "91529.03",
            "transaction_count": 23,
            "next_payment_date": "2026-06-01",
            "historical_average_monthly_income": "3979.52",
            "forecasted_average_monthly_income": "3979.52",
            "avg_deposit_amount": "4051.00",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-04-01",
              "end_date": "2026-04-30",
              "total_amount": "4108.61",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "4108.61",
                  "iso_currency_code": "USD",
                  "date": "2026-04-30",
                  "description": "OHIO PERS RETIREMENT PPD ID: 1110111111",
                  "pending": false,
                  "transaction_id": "8b82b8b53d8540168662e78b2bee70b7",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Rental (I5)">
      Returns a `RENTAL` source alongside a `PAYCHECK` source.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "RENTAL",
            "income_description": "AIRBNB",
            "pay_frequency": "SM",
            "total_amount": "54687.33",
            "transaction_count": 29,
            "next_payment_date": "2026-07-01",
            "historical_average_monthly_income": "3771.54",
            "forecasted_average_monthly_income": "3771.54",
            "avg_deposit_amount": "1885.77",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "3771.54",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "1885.77",
                  "iso_currency_code": "USD",
                  "date": "2026-06-15",
                  "description": "AIRBNB 4977      DES:AIRBNB     ID:XXXXXXXXXX           INDN:XXXXXXXXXX            CO ID:XXXXXXXXXX PPD           PMT INFO:TRN*1*G-XXXXXXXXXXXXX",
                  "pending": false,
                  "transaction_id": "466ba8f84ad4465daa14e52c8d921900",
                  "check_number": null
                },
                {
                  "amount": "1885.77",
                  "iso_currency_code": "USD",
                  "date": "2026-06-01",
                  "description": "AIRBNB 4977      DES:AIRBNB     ID:XXXXXXXXXX           INDN:XXXXXXXXXX            CO ID:XXXXXXXXXX PPD           PMT INFO:TRN*1*G-XXXXXXXXXXXXX",
                  "pending": false,
                  "transaction_id": "6bacc3d5b5714fd49e8720e0fa25d603",
                  "check_number": null
                }
              ]
            }
          },
          {
            "income_category": "PAYCHECK",
            "income_description": "Home Depot Payroll",
            "pay_frequency": "BW",
            "total_amount": "69047.68",
            "transaction_count": 52,
            "next_payment_date": "2026-06-29",
            "historical_average_monthly_income": "2886.61",
            "forecasted_average_monthly_income": "2886.61",
            "avg_deposit_amount": "1327.84",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "2655.68",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-15",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "e80b93c972aa4bef984eded598148a9e",
                  "check_number": null
                },
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-01",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "ea17a96d5b1747aa94d8c4b6d0090735",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Unemployment (I6)">
      Bank income classified as `UNEMPLOYMENT`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "UNEMPLOYMENT",
            "income_description": "MA DUA MA UI TAX",
            "pay_frequency": null,
            "total_amount": "36039.00",
            "transaction_count": 41,
            "next_payment_date": null,
            "historical_average_monthly_income": "2637.00",
            "forecasted_average_monthly_income": null,
            "avg_deposit_amount": "879.00",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "1758.00",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "879.00",
                  "iso_currency_code": "USD",
                  "date": "2026-06-11",
                  "description": "MA DUA MA UI TAX",
                  "pending": false,
                  "transaction_id": "9d95978fffbd477897d74a5109acbc07",
                  "check_number": null
                },
                {
                  "amount": "879.00",
                  "iso_currency_code": "USD",
                  "date": "2026-06-06",
                  "description": "MA DUA MA UI TAX",
                  "pending": false,
                  "transaction_id": "6d63ecaa25ec464ca3dd4da49509219d",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Govt benefits (I7)">
      Bank income classified as `GOVERNMENT_BENEFITS`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "GOVERNMENT_BENEFITS",
            "income_description": "Ssi Treas 310",
            "pay_frequency": "M",
            "total_amount": "18373.00",
            "transaction_count": 19,
            "next_payment_date": "2026-06-30",
            "historical_average_monthly_income": "967.00",
            "forecasted_average_monthly_income": "967.00",
            "avg_deposit_amount": "967.00",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-05-01",
              "end_date": "2026-05-31",
              "total_amount": "967.00",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "967.00",
                  "iso_currency_code": "USD",
                  "date": "2026-05-25",
                  "description": "Ssi Treas 310, Xxsupp Sec",
                  "pending": false,
                  "transaction_id": "a98d8c4fdc4840a6b8f97fa38e745948",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Private benefits (I8)">
      Bank income classified as `PRIVATE_BENEFITS`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "PRIVATE_BENEFITS",
            "income_description": "WORKERS COMP PAYABLES",
            "pay_frequency": "SM",
            "total_amount": "18720.72",
            "transaction_count": 27,
            "next_payment_date": "2026-07-01",
            "historical_average_monthly_income": "1386.72",
            "forecasted_average_monthly_income": "1386.72",
            "avg_deposit_amount": "693.36",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "693.36",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "693.36",
                  "iso_currency_code": "USD",
                  "date": "2026-06-05",
                  "description": "WORKERS COMP     PAYABLES   010111 1011111         DOE, JOHN",
                  "pending": false,
                  "transaction_id": "106ebf3600fd4f1cbd66abeaae918354",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Tax credits (I9)">
      The detected income source classifies as `PAYCHECK`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "PAYCHECK",
            "income_description": "Home Depot Payroll",
            "pay_frequency": "BW",
            "total_amount": "69047.68",
            "transaction_count": 52,
            "next_payment_date": "2026-06-29",
            "historical_average_monthly_income": "2886.61",
            "forecasted_average_monthly_income": "2886.61",
            "avg_deposit_amount": "1327.84",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "2655.68",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-15",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "2d7832e4d663445cb4b93dbed6ee8316",
                  "check_number": null
                },
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-01",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "aa5557d4a3ab4274a07fdd3d45b87d22",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>

    <Tab title="Interest (I10)">
      The detected income source classifies as `PAYCHECK`.

      ```json theme={null}
      {
        "bank_income_sources": [
          {
            "income_category": "PAYCHECK",
            "income_description": "Home Depot Payroll",
            "pay_frequency": "BW",
            "total_amount": "69047.68",
            "transaction_count": 52,
            "next_payment_date": "2026-06-29",
            "historical_average_monthly_income": "2886.61",
            "forecasted_average_monthly_income": "2886.61",
            "avg_deposit_amount": "1327.84",
            "iso_currency_code": "USD",
            "historical_summary_sample": {
              "start_date": "2026-06-01",
              "end_date": "2026-06-30",
              "total_amount": "2655.68",
              "iso_currency_code": "USD",
              "transactions": [
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-15",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "8cf18029ee824f7fa2c9ee392efe442a",
                  "check_number": null
                },
                {
                  "amount": "1327.84",
                  "iso_currency_code": "USD",
                  "date": "2026-06-01",
                  "description": "Home Depot Payroll",
                  "pending": false,
                  "transaction_id": "a1cffb149686473fa2b80b59a04c8811",
                  "check_number": null
                }
              ]
            }
          }
        ]
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

<Note>
  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.
</Note>

### 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.

| Scenario | Credential                 | What it returns                                         |
| -------- | -------------------------- | ------------------------------------------------------- |
| `VOA-R1` | `goodlogin` / `good_asset` | 30 days of data — use to test recency-based decisioning |
| `VOA-R2` | `goodlogin` / `low_risk`   | Low-risk consumer profile                               |
| `VOA-R3` | `goodlogin` / `high_risk`  | High-risk consumer profile                              |

<Accordion title="Sample responses">
  <Tabs>
    <Tab title="30 days (R1)">
      Recency-limited profile for testing recency-based decisioning.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "CHECKING",
            "mask": "8773",
            "balance": "2283.99"
          },
          {
            "type": "CHECKING",
            "mask": "0685",
            "balance": "5410.36"
          }
        ],
        "bank_income_sources_count": 0,
        "income_categories": []
      }
      ```
    </Tab>

    <Tab title="Low risk (R2)">
      Low-risk consumer profile.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "SAVINGS",
            "mask": "0684",
            "balance": "15000.00"
          },
          {
            "type": "CHECKING",
            "mask": "0685",
            "balance": "6000.00"
          }
        ],
        "bank_income_sources_count": 2,
        "income_categories": [
          "OTHER",
          "PAYCHECK"
        ]
      }
      ```
    </Tab>

    <Tab title="High risk (R3)">
      High-risk consumer profile.

      ```json theme={null}
      {
        "accounts": [
          {
            "type": "CHECKING",
            "mask": "0685",
            "balance": "0.00"
          },
          {
            "type": "CHECKING",
            "mask": "8773",
            "balance": "0.00"
          }
        ],
        "bank_income_sources_count": 1,
        "income_categories": [
          "PAYCHECK"
        ]
      }
      ```
    </Tab>
  </Tabs>
</Accordion>

***

## Error scenarios

VOA shares the universal authentication-error credentials. Use these to test your error handling and retry UX.

| Scenario | Credential                      | Task status                         |
| -------- | ------------------------------- | ----------------------------------- |
| `VOA-X1` | `goodlogin` / `no_data`         | `no_data`                           |
| `VOA-X2` | `goodlogin` / `mfa`             | `mfa` → `done` (enter code `12345`) |
| `VOA-X3` | `error.user` / `login_error`    | `login_error`                       |
| `VOA-X4` | `error.user` / `account_locked` | `account_locked`                    |
| `VOA-X5` | `error.user` / `unavailable`    | `unavailable`                       |
| `VOA-X6` | `error.user` / `error`          | `error`                             |

See [Task lifecycle](/api-reference/tasks/lifecycle) for the full status reference.

***

## Recurring transactions endpoint

The [recurring transactions endpoint](/api-reference/recurring-transactions/applicant-recurring-transactions) (`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.

| Credential                       | Returns                                                                                                                                                                                     |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `goodlogin` / `goodpassword`     | A single recurring inflow (gig income), 53 historical transactions, one `account_id`. Suitable for basic happy-path testing.                                                                |
| `goodlogin.all` / `goodpassword` | Multiple recurring inflow sources distributed across multiple `account_id` values — paycheck and gig income land on different accounts. Use this when validating multi-account aggregation. |

<Note>
  **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.
</Note>

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](mailto: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](/api-reference/recurring-transactions/applicant-recurring-transactions).

***

## 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.

<CardGroup cols={2}>
  <Card title="Fannie Mae VOA samples" icon="building-columns" href="/developers/testing/gse-testing#fannie-mae-day-1-certainty">
    Sample VOA PDFs tied to Fannie Mae D1C borrower scenarios
  </Card>

  <Card title="Freddie Mac VOA samples" icon="building-columns" href="/developers/testing/gse-testing#freddie-mac-asset-and-income-modeler">
    Sample VOA PDFs tied to Freddie Mac AIM borrower scenarios
  </Card>
</CardGroup>

***

## 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.

<Accordion title="Sample webhook payload">
  ```json theme={null}
  {
    "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"
  }
  ```
</Accordion>

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](/api-reference/webhook-events) for the full catalog.

***

## Next steps

<CardGroup cols={2}>
  <Card title="Bank Aggregation" icon="building-columns" href="/credit/products/bank-aggregation">
    Product overview for transactions and bank income
  </Card>

  <Card title="Bank Income" icon="receipt" href="/credit/integration/bank-income">
    Integration guide for bank-derived income
  </Card>

  <Card title="GSE Testing" icon="check-double" href="/developers/testing/gse-testing">
    AIM-VOA submission flow with Freddie Mac
  </Card>

  <Card title="Report Object" icon="file-lines" href="/api-reference/user-asset-verification-reports/object">
    JSON schema for the VOA report
  </Card>
</CardGroup>
