Create Sandbox test data
Use Sandbox accounts to create rich test data for Plaid products
Customize Sandbox account data
In addition to a set of pre-populated Sandbox test users, the Sandbox environment also provides the ability to create custom user accounts, which can be used in conjunction with /sandbox/public_token/create or Plaid Link to generate custom Sandbox data, or in conjunction with Plaid Link to test Link flows in the Sandbox.
Using these accounts, you can create your own testing data for the Assets, Auth, Balance, Identity, Investments, Liabilities, and Transactions products. You can also simulate an account with regular income or one that makes regular loan payments. For Link testing, custom accounts support multi-factor authentication, reCAPTCHA, and Link error flows.
To customize testing data for Document Income, see Testing Document Income.
Configuring the custom user account
Custom user accounts can be configured and accessed in two ways. The easiest (and recommended) method is by using the Sandbox Users tool, located in the Plaid Dashboard under Developers -> Sandbox. Set the username and configuration object in the Dashboard, then go through the Link flow on Sandbox with that username and any non-empty password. You can also use /sandbox/public_token/create with options.override_username and options.override_password to create a public token for a custom user account while bypassing Link. Alternatively, you can log into Sandbox with the username user_custom and provide the configuration object as the password.
To aid in testing, Plaid maintains a GitHub repo of pre-created custom user accounts that some users have found helpful.
Limitations of the custom user account
Very large configuration objects (larger than approximately 55kb, or approximately 250 transactions) are not supported and may cause the Link attempt to fail.
Using more than ten accounts on a single custom user is not supported and will cause the Link attempt to fail.
If you are using Consumer Report by Plaid Check, to use a custom user, you must click "add new account" in the Link flow rather than using one of the existing banks. Using an existing bank in the Plaid Passport flow will skip the ability to enter a custom username.
At OAuth institutions, custom users may not work properly: certain less frequently used customized fields may be overridden by the default values after the Link flow has completed, or the login may fail. If this occurs, retry the configuration using a non-OAuth institution, such as First Gingham Credit Union or First Platypus Bank.
Configuration object schema
Custom test accounts are configured with a JSON configuration object formulated according to the schema below. All top level fields are optional. Sending an empty object as a configuration will result in an account configured with random balances and transaction history.
Properties
The version of the password schema to use, possible values are 1 or 2. The default value is 2. You should only specify 1 if you know it is necessary for your test suite.
A seed, in the form of a string, that will be used to randomly generate account and transaction data, if this data is not specified using the override_accounts argument. If no seed is specified, the randomly generated data will be different each time.
Note that transactions data is generated relative to the Item's creation date. Different Items created on different dates with the same seed for transactions data will have different dates for the transactions. The number of days between each transaction and the Item creation will remain constant. For example, an Item created on December 15 might show a transaction on December 14. An Item created on December 20, using the same seed, would show that same transaction occurring on December 19.
An array of account overrides to configure the accounts for the Item. By default, if no override is specified, transactions and account data will be randomly generated based on the account type and subtype, and other products will have fixed or empty data.
investment: Investment account.
credit: Credit card
depository: Depository account
loan: Loan account
payroll: Payroll account
other: Non-specified account type
See the Account type schema for a full listing of account types and corresponding subtypes.
investment, credit, depository, loan, payroll, otherSee the Account type schema for a full listing of account types and corresponding subtypes.
401a, 401k, 403B, 457b, 529, auto, brokerage, business, cash isa, cash management, cd, checking, commercial, construction, consumer, credit card, crypto exchange, ebt, education savings account, fhsa, fixed annuity, gic, health reimbursement arrangement, home equity, hsa, isa, ira, keogh, lif, life insurance, limited purpose checking, line of credit, lira, loan, lrif, lrsp, money market, mortgage, mutual fund, non-custodial wallet, non-taxable brokerage account, other, other insurance, other annuity, overdraft, paypal, payroll, pension, prepaid, prif, profit sharing plan, qshr, rdsp, resp, retirement, rlif, roth, roth 401k, roth 403B, roth 457b, roth pension, roth profit sharing plan, roth thrift savings plan, rrif, rrsp, sarsep, savings, sep ira, simple ira, sipp, stock plan, student, thrift savings plan, tfsa, trust, ugma, utma, variable annuityIf provided, the account will start with this amount as the current balance.
double If provided, the account will always have this amount as its available balance, regardless of current balance or changes in transactions over time. Cannot be set together with has_null_available_balance.
double If set to true, the account will always have null as its available balance, regardless of current balance or changes in transactions over time. Cannot be set together with force_available_balance.
ISO-4217 currency code. If provided, the account will be denominated in the given currency. Transactions will also be in this currency by default.
Allows specifying the metadata of the test account
The account's name
The account's official name
The account's limit
double The account's mask. Should be an empty string or a string of 2-4 alphanumeric characters. This allows you to model a mask which does not match the account number (such as with a virtual account number).
^$|^[A-Za-z0-9]{2,4}$ Account and bank identifier number data used to configure the test account. All values are optional.
Will be used for the account number.
Must be a valid ACH routing number. To test /transfer/capabilities/get, set this to 322271627 to force a true result.
Must be a valid wire transfer routing number.
EFT institution number. Must be specified alongside eft_branch.
EFT branch number. Must be specified alongside eft_institution.
Bank identifier code (BIC). Must be specified alongside international_iban.
International bank account number (IBAN). If no account number is specified via account, will also be used as the account number by default. Must be specified alongside international_bic.
BACS sort code
Specify the list of transactions on the account.
The date of the transaction, in ISO 8601 (YYYY-MM-DD) format. Transactions in Sandbox will move from pending to posted once their transaction date has been reached. If a date_transacted is not provided by the institution, a transaction date may be available in the authorized_date field.
date The date the transaction posted, in ISO 8601 (YYYY-MM-DD) format. Posted dates in the past or present will result in posted transactions; posted dates in the future will result in pending transactions.
date The transaction amount. Can be negative.
double The transaction description.
The ISO-4217 format currency code for the transaction.
Specify the holdings on the account.
The last price given by the institution for this security
double The date at which institution_price was current. Must be formatted as an ISO 8601 date.
date The total cost basis of the holding (e.g., the total amount spent to acquire all assets currently in the holding).
double The total quantity of the asset held, as reported by the financial institution.
double Either a valid iso_currency_code or unofficial_currency_code
Specify the security associated with the holding or investment transaction. When inputting custom security data to the Sandbox, Plaid will perform post-data-retrieval normalization and enrichment. These processes may cause the data returned by the Sandbox to be slightly different from the data you input. An ISO-4217 currency code and a security identifier (ticker_symbol, cusip, or isin) are required.
12-character ISIN, a globally unique securities identifier. A verified CUSIP Global Services license is required to receive this data. This field will be null by default for new customers, and null for existing customers starting March 12, 2024. If you would like access to this field, please request ISIN/CUSIP access here.
9-character CUSIP, an identifier assigned to North American securities. A verified CUSIP Global Services license is required to receive this data. This field will be null by default for new customers, and null for existing customers starting March 12, 2024. If you would like access to this field, please request ISIN/CUSIP access here.
A descriptive name for the security, suitable for display.
The security’s trading symbol for publicly traded securities, and otherwise a short identifier if available.
Either a valid iso_currency_code or unofficial_currency_code
Specify the list of investments transactions on the account.
Posting date for the transaction. Must be formatted as an ISO 8601 date.
date The institution's description of the transaction.
The number of units of the security involved in this transaction. Must be positive if the type is a buy and negative if the type is a sell.
double The price of the security at which this transaction occurred.
double The combined value of all fees applied to this transaction.
double The type of the investment transaction. Possible values are:
buy: Buying an investment
sell: Selling an investment
cash: Activity that modifies a cash position
fee: A fee on the account
transfer: Activity that modifies a position, but not through buy/sell activity e.g. options exercise, portfolio transfer
Either a valid iso_currency_code or unofficial_currency_code
Specify the security associated with the holding or investment transaction. When inputting custom security data to the Sandbox, Plaid will perform post-data-retrieval normalization and enrichment. These processes may cause the data returned by the Sandbox to be slightly different from the data you input. An ISO-4217 currency code and a security identifier (ticker_symbol, cusip, or isin) are required.
12-character ISIN, a globally unique securities identifier. A verified CUSIP Global Services license is required to receive this data. This field will be null by default for new customers, and null for existing customers starting March 12, 2024. If you would like access to this field, please request ISIN/CUSIP access here.
9-character CUSIP, an identifier assigned to North American securities. A verified CUSIP Global Services license is required to receive this data. This field will be null by default for new customers, and null for existing customers starting March 12, 2024. If you would like access to this field, please request ISIN/CUSIP access here.
A descriptive name for the security, suitable for display.
The security’s trading symbol for publicly traded securities, and otherwise a short identifier if available.
Either a valid iso_currency_code or unofficial_currency_code
Data about the owner or owners of an account. Any fields not specified will be filled in with default Sandbox information.
A list of names associated with the account by the financial institution. These should always be the names of individuals, even for business accounts. Note that the same name data will be used for all accounts associated with an Item.
A list of phone numbers associated with the account.
The phone number.
When true, identifies the phone number as the primary number on an account.
The type of phone number.
home, work, office, mobile, mobile1, otherA list of email addresses associated with the account.
The email address.
When true, identifies the email address as the primary email on an account.
The type of email account as described by the financial institution.
primary, secondary, otherData about the various addresses associated with the account.
Data about the components comprising an address.
The full city name
The region or state. In API versions 2018-05-22 and earlier, this field is called state.
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
The postal code. In API versions 2018-05-22 and earlier, this field is called zip.
The ISO 3166-1 alpha-2 country code
When true, identifies the address as the primary address on an account.
Used to configure Sandbox test data for the Liabilities product
The type of the liability object, either credit or student. Mortgages are not currently supported in the custom Sandbox.
The purchase APR percentage value. For simplicity, this is the only interest rate used to calculate interest charges. Can only be set if type is credit.
double The cash APR percentage value. Can only be set if type is credit.
double The balance transfer APR percentage value. Can only be set if type is credit.
double The special APR percentage value. Can only be set if type is credit.
double Override the last_payment_amount field. Can only be set if type is credit.
double Override the minimum_payment_amount field. Can only be set if type is credit or student.
double Override the is_overdue field
The date on which the loan was initially lent, in ISO 8601 (YYYY-MM-DD) format. Can only be set if type is student.
date The original loan principal. Can only be set if type is student.
double The interest rate on the loan as a percentage. Can only be set if type is student.
double If set, interest capitalization begins at the given number of months after loan origination. By default interest is never capitalized. Can only be set if type is student.
Student loan repayment information used to configure Sandbox test data for the Liabilities product
The only currently supported value for this field is standard.
Configures the number of months before repayment starts.
Configures the number of months of repayments before the loan is paid off.
Override the expected_payoff_date field. Can only be set if type is student.
date Override the guarantor field. Can only be set if type is student.
Override the is_federal field. Can only be set if type is student.
Override the loan_name field. Can only be set if type is student.
An object representing the status of the student loan
The date until which the loan will be in its current status. Dates are returned in an ISO 8601 format (YYYY-MM-DD).
date The status type of the student loan
cancelled, charged off, claim, consolidated, deferment, delinquent, discharged, extension, forbearance, in grace, in military, in school, not fully disbursed, other, paid in full, refunded, repayment, transferred, pending idrOverride the payment_reference_number field. Can only be set if type is student.
Override the repayment_plan.description field. Can only be set if type is student.
Override the repayment_plan.type field. Can only be set if type is student. Possible values are: "extended graduated", "extended standard", "graduated", "income-contingent repayment", "income-based repayment", "income-sensitive repayment", "interest only", "other", "pay as you earn", "revised pay as you earn", "standard", or "saving on a valuable education".
Override the sequence_number field. Can only be set if type is student.
A physical mailing address.
Data about the components comprising an address.
The full city name
The region or state. In API versions 2018-05-22 and earlier, this field is called state.
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
The postal code. In API versions 2018-05-22 and earlier, this field is called zip.
The ISO 3166-1 alpha-2 country code
When true, identifies the address as the primary address on an account.
The inflow_model allows you to model a test account that receives regular income or make regular payments on a loan. Any transactions generated by the inflow_model will appear in addition to randomly generated test data or transactions specified by override_accounts.
Inflow model. One of the following:
none: No income
monthly-income: Income occurs once per month monthly-balance-payment: Pays off the balance on a liability account at the given statement day of month.
monthly-interest-only-payment: Makes an interest-only payment on a liability account at the given statement day of month.
Note that account types supported by Liabilities will accrue interest in the Sandbox. The types impacted are account type credit with subtype credit or paypal, and account type loan with subtype student or mortgage.
Amount of income per month. This value is required if type is monthly-income.
double Number between 1 and 28, or last meaning the last day of the month. The day of the month on which the income transaction will appear. The name of the income transaction. This field is required if type is monthly-income, monthly-balance-payment or monthly-interest-only-payment.
The name of the income transaction. This field is required if type is monthly-income, monthly-balance-payment or monthly-interest-only-payment.
Number between 1 and 28, or last meaning the last day of the month. The day of the month on which the balance is calculated for the next payment. The name of the income transaction. This field is required if type is monthly-balance-payment or monthly-interest-only-payment.
Specify payroll data on the account.
A list of paystubs associated with the account.
The employer on the paystub.
The name of the employer.
The address of the employer.
The full city name.
The region or state
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
5 digit postal code.
The country of the address.
The employee on the paystub.
The name of the employee.
The address of the employee.
The full city name.
The region or state
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
5 digit postal code.
The country of the address.
Marital status of the employee - either single or married.
single, marriedTaxpayer ID of the individual receiving the paystub.
Type of ID, e.g. 'SSN'
ID mask; i.e. last 4 digits of the taxpayer ID
An object representing information about the net pay amount on the paystub.
Description of the net pay
The ISO-4217 currency code of the net pay.
The year-to-date amount of the net pay
double An object with the deduction information found on a paystub.
Raw amount of the deduction
double Description of the deduction line item
The ISO-4217 currency code of the line item.
The year-to-date amount of the deduction
double An object representing the total deductions for the pay period
Raw amount of the deduction
double The ISO-4217 currency code of the line item.
The year-to-date total amount of the deductions
double An object representing both a breakdown of earnings on a paystub and the total earnings.
Commonly used term to describe the earning line item.
BONUS, COMMISSION, OVERTIME, PAID TIME OFF, REGULAR PAY, VACATION, BASIC ALLOWANCE HOUSING, BASIC ALLOWANCE SUBSISTENCE, OTHER, nullRaw amount of the earning line item.
double Description of the earning line item.
Number of hours applicable for this earning.
The ISO-4217 currency code of the line item.
Hourly rate applicable for this earning.
double The year-to-date amount of the deduction.
double An object representing both the current pay period and year to date amount for an earning category.
Total number of hours worked for this pay period
The ISO-4217 currency code of the line item
The year-to-date amount for the total earnings
double Details about the pay period.
The amount of the paycheck.
double Name of the account for the given distribution.
The name of the bank that the payment is being deposited to.
The amount distributed to this account.
double The ISO-4217 currency code of the net pay. Always null if unofficial_currency_code is non-null.
The last 2-4 alphanumeric characters of an account's official account number.
Type of the account that the paystub was sent to (e.g. 'checking').
The pay period end date, in ISO 8601 format: "yyyy-mm-dd".
date Total earnings before tax/deductions.
double The date on which the paystub was issued, in ISO 8601 format ("yyyy-mm-dd").
date The frequency at which an individual is paid.
PAY_FREQUENCY_UNKNOWN, PAY_FREQUENCY_WEEKLY, PAY_FREQUENCY_BIWEEKLY, PAY_FREQUENCY_SEMIMONTHLY, PAY_FREQUENCY_MONTHLY, nullThe date on which the paystub was issued, in ISO 8601 format ("yyyy-mm-dd").
date The pay period start date, in ISO 8601 format: "yyyy-mm-dd".
date A list of w2s associated with the account.
The employer on the paystub.
The name of the employer.
The address of the employer.
The full city name.
The region or state
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
5 digit postal code.
The country of the address.
The employee on the paystub.
The name of the employee.
The address of the employee.
The full city name.
The region or state
Example: "NC"
The full street address
Example: "564 Main Street, APT 15"
5 digit postal code.
The country of the address.
Marital status of the employee - either single or married.
single, marriedTaxpayer ID of the individual receiving the paystub.
Type of ID, e.g. 'SSN'
ID mask; i.e. last 4 digits of the taxpayer ID
The tax year of the W2 document.
An employer identification number or EIN.
Wages from tips and other compensation.
Federal income tax withheld for the tax year.
Wages from social security.
Social security tax withheld for the tax year.
Wages and tips from medicare.
Medicare tax withheld for the tax year.
Tips from social security.
Allocated tips.
Contents from box 9 on the W2.
Dependent care benefits.
Nonqualified plans.
W2 Box 12 code.
W2 Box 12 amount.
Statutory employee.
Retirement plan.
Third party sick pay.
Other.
State associated with the wage.
State identification number of the employer.
Wages and tips from the specified state.
Income tax from the specified state.
Wages and tips from the locality.
Income tax from the locality.
Name of the locality.
Specifies the multi-factor authentication settings to use with this test account
Possible values are device, selections, or questions.
If value is device, the MFA answer is 1234.
If value is selections, the MFA answer is always the first option.
If value is questions, the MFA answer is answer_<i>_<j> for the j-th question in the i-th round, starting from 0. For example, the answer to the first question in the second round is answer_1_0.
Number of rounds of questions. Required if value of type is questions.
Number of questions per round. Required if value of type is questions. If value of type is selections, default value is 2.
Number of rounds of selections, used if type is selections. Defaults to 1.
Number of available answers per question, used if type is selection. Defaults to 2.
You may trigger a reCAPTCHA in Plaid Link in the Sandbox environment by using the recaptcha field. Possible values are good or bad. A value of good will result in successful Item creation and bad will result in a RECAPTCHA_BAD error to simulate a failed reCAPTCHA. Both values require the reCAPTCHA to be manually solved within Plaid Link.
An error code to force on Item creation. Possible values are:
"INSTITUTION_NOT_RESPONDING"
"INSTITUTION_NO_LONGER_SUPPORTED"
"INVALID_CREDENTIALS"
"INVALID_MFA"
"ITEM_LOCKED"
"ITEM_LOGIN_REQUIRED"
"ITEM_NOT_SUPPORTED"
"INVALID_LINK_TOKEN"
"MFA_NOT_SUPPORTED"
"NO_ACCOUNTS"
"PLAID_ERROR"
"USER_INPUT_TIMEOUT"
"USER_SETUP_REQUIRED"
{
"seed": "my-seed-string-3",
"override_accounts": [
{
"type": "depository",
"subtype": "checking",
"identity": {
"names": [
"John Doe"
],
"phone_numbers": [
{
"primary": true,
"type": "home",
"data": "4673956022"
}
],
"emails": [
{
"primary": true,
"type": "primary",
"data": "accountholder0@example.com"
}
],
"addresses": [
{
"primary": true,
"data": {
"city": "Malakoff",
"region": "NY",
"street": "2992 Cameron Road",
"postal_code": "14236",
"country": "US"
}
}
]
},
"transactions": [
{
"date_transacted": "2023-10-01",
"date_posted": "2023-10-03",
"currency": "USD",
"amount": 100,
"description": "1 year Netflix subscription"
},
{
"date_transacted": "2023-10-01",
"date_posted": "2023-10-02",
"currency": "USD",
"amount": 100,
"description": "1 year mobile subscription"
}
]
},
{
"type": "loan",
"subtype": "student",
"liability": {
"type": "student",
"origination_date": "2023-01-01",
"principal": 10000,
"nominal_apr": 6.25,
"loan_name": "Plaid Student Loan",
"repayment_model": {
"type": "standard",
"non_repayment_months": 12,
"repayment_months": 120
}
}
},
{
"type": "credit",
"subtype": "credit card",
"starting_balance": 10000,
"inflow_model": {
"type": "monthly-interest-only-payment",
"payment_day_of_month": 15,
"statement_day_of_month": 13,
"transaction_name": "Interest Payment"
},
"liability": {
"type": "credit",
"purchase_apr": 12.9,
"balance_transfer_apr": 15.24,
"cash_apr": 28.45,
"special_apr": 0,
"last_payment_amount": 500,
"minimum_payment_amount": 10
}
},
{
"type": "investment",
"subtype": "brokerage",
"investment_transactions": [
{
"date": "2023-07-01",
"name": "buy stock",
"quantity": 10,
"price": 10,
"fees": 20,
"type": "buy",
"currency": "USD",
"security": {
"ticker_symbol": "PLAID",
"currency": "USD"
}
}
],
"holdings": [
{
"institution_price": 10,
"institution_price_as_of": "2023-08-01",
"cost_basis": 10,
"quantity": 10,
"currency": "USD",
"security": {
"ticker_symbol": "PLAID",
"currency": "USD"
}
}
]
},
{
"type": "payroll",
"subtype": "payroll",
"income": {
"paystubs": [
{
"employer": {
"name": "Heartland Toy Company"
},
"employee": {
"name": "Chip Hazard",
"address": {
"city": "Burbank",
"region": "CA",
"street": "411 N Hollywood Way",
"postal_code": "91505",
"country": "US"
}
},
"income_breakdown": [
{
"type": "regular",
"rate": 20,
"hours": 40,
"total": 800
},
{
"type": "overtime",
"rate": 30,
"hours": 6.68,
"total": 200.39
}
],
"pay_period_details": {
"start_date": "2021-05-04",
"end_date": "2021-05-18",
"gross_earnings": 1000.39,
"check_amount": 499.28
}
}
]
}
}
]
}