Skip to main content

Account Updater Testing

Basis Theory provides an Account Updater sandbox environment that provides stubbed responses without forwarding your requests to the card networks for updates.

Once the feature is enabled, test tenants will be configured to use the Account Updater sandbox, and you can use the test cards defined below to simulate various scenarios.

Test Cards

You can use the following test cards within Account Updater enabled test tenants to simulate specific Account Updater Result Codes.

PANExp. MonthExp. YearCard BrandResult CodeUpdate Details
4111111111111111122023VISAUPD_PAN4166676667666746
4012888888881881122023VISAUPD_PAN4212345678910006, 12/2026
5555555555554444122023MASTERCARDUPD_PAN5454545454545454
5105105105105100122023MASTERCARDUPD_PAN5233580618829955, 12/2026
6011111111111117122023DISCOVERUPD_PAN6011000990139424
6011601160116611122023DISCOVERUPD_PAN6445644564456445, 12/2026
378282246310005122023AMEXUPD_PAN375155165213132
371449635398431122023AMEXUPD_PAN348835199015504, 12/2026
4539097887163333122023VISAUPD_EXP_DATE12/2026
5325191087030619122023MASTERCARDUPD_EXP_DATE12/2026
6011690151507086122023DISCOVERUPD_EXP_DATE12/2026
373555735376156122023AMEXUPD_EXP_DATE12/2026
6011760519541711122023DISCOVERUPD_BRAND_CONVN/A
6011490740263725122023DISCOVERUPD_CORRECTEDN/A
4711358892785746122023VISANO_UPDATEN/A
5412000000001009122023MASTERCARDNO_UPDATEN/A
4929980395567582122023VISAWRN_CONTACT_CARDHOLDERN/A
6011444770992901122023DISCOVERWRN_CONTACT_CARDHOLDERN/A
4929544240318920122023VISAWRN_ISSUER_NOT_ENROLLEDN/A
5580422612666704122023MASTERCARDWRN_ISSUER_NOT_ENROLLEDN/A
4916725297925395122023VISAWRN_ISSUER_NO_DATAN/A
5157204564548129122023MASTERCARDWRN_ISSUER_NO_DATAN/A
4035501000000008122023VISAWRN_OPT_OUTN/A
5461310156953048122023MASTERCARDWRN_CLOSED_ACCOUNTN/A
6011168802268945122023DISCOVERWRN_CLOSED_ACCOUNTN/A
370488998077498122023AMEXWRN_CLOSED_ACCOUNTN/A
122000000000003122023N/AWRN_UNSUPPORTED_NETWORKN/A
4035501428146300122023VISAERR_INVALID_PANN/A
5555341244441115122023MASTERCARDERR_INVALID_PANN/A
6011829379808385122023DISCOVERERR_INVALID_PANN/A
378025849667382122023AMEXERR_INVALID_PANN/A
4111111145551142122023VISAERR_INVALID_EXP_DATEN/A
5577000055770004122023MASTERCARDERR_INVALID_EXP_DATEN/A
6011648103759866122023DISCOVERERR_INVALID_EXP_DATEN/A
378734493671000122023AMEXERR_INVALID_EXP_DATEN/A
4111112014267661122023VISAERR_INVALID_CONFIGN/A
5555444433331111122023MASTERCARDERR_INVALID_CONFIGN/A
370000000000002122023AMEXERR_INVALID_CONFIGN/A
6011178332216017122023DISCOVERERR_UNDEFINEDN/A

Generating Test Tokens

Since Account Updater Batch and Real-Time requests accept a card token as input, you will first need to tokenize one or more of the Test Cards defined above.

To help you quickly get started, you can use the following script to generate card tokens for each of these test cards in your test tenant.

#!/bin/bash

# Set your Basis Theory API key with token:create permission
BT_API_KEY="<Enter Your BT-API-KEY>"

# Define the card data
cards=(
# Format: "PAN,ExpMonth,ExpYear,CardBrand,ResultCode"
"4111111111111111,12,2023,VISA,UPD_PAN"
"4012888888881881,12,2023,VISA,UPD_PAN"
"5555555555554444,12,2023,MASTERCARD,UPD_PAN"
"5105105105105100,12,2023,MASTERCARD,UPD_PAN"
"6011111111111117,12,2023,DISCOVER,UPD_PAN"
"6011601160116611,12,2023,DISCOVER,UPD_PAN"
"378282246310005,12,2023,AMEX,UPD_PAN"
"371449635398431,12,2023,AMEX,UPD_PAN"
"4539097887163333,12,2023,VISA,UPD_EXP_DATE"
"5325191087030619,12,2023,MASTERCARD,UPD_EXP_DATE"
"6011690151507086,12,2023,DISCOVER,UPD_EXP_DATE"
"373555735376156,12,2023,AMEX,UPD_EXP_DATE"
"6011760519541711,12,2023,DISCOVER,UPD_BRAND_CONV"
"6011490740263725,12,2023,DISCOVER,UPD_CORRECTED"
"4711358892785746,12,2023,VISA,NO_UPDATE"
"5412000000001009,12,2023,MASTERCARD,NO_UPDATE"
"4929980395567582,12,2023,VISA,WRN_CONTACT_CARDHOLDER"
"6011444770992901,12,2023,DISCOVER,WRN_CONTACT_CARDHOLDER"
"4929544240318920,12,2023,VISA,WRN_ISSUER_NOT_ENROLLED"
"5580422612666704,12,2023,MASTERCARD,WRN_ISSUER_NOT_ENROLLED"
"4916725297925395,12,2023,VISA,WRN_ISSUER_NO_DATA"
"5157204564548129,12,2023,MASTERCARD,WRN_ISSUER_NO_DATA"
"4035501000000008,12,2023,VISA,WRN_OPT_OUT"
"5461310156953048,12,2023,MASTERCARD,WRN_CLOSED_ACCOUNT"
"6011168802268945,12,2023,DISCOVER,WRN_CLOSED_ACCOUNT"
"370488998077498,12,2023,AMEX,WRN_CLOSED_ACCOUNT"
"122000000000003,12,2023,N/A,WRN_UNSUPPORTED_NETWORK"
"4035501428146300,12,2023,VISA,ERR_INVALID_PAN"
"5555341244441115,12,2023,MASTERCARD,ERR_INVALID_PAN"
"6011829379808385,12,2023,DISCOVER,ERR_INVALID_PAN"
"378025849667382,12,2023,AMEX,ERR_INVALID_PAN"
"4111111145551142,12,2023,VISA,ERR_INVALID_EXP_DATE"
"5577000055770004,12,2023,MASTERCARD,ERR_INVALID_EXP_DATE"
"6011648103759866,12,2023,DISCOVER,ERR_INVALID_EXP_DATE"
"378734493671000,12,2023,AMEX,ERR_INVALID_EXP_DATE"
"4111112014267661,12,2023,VISA,ERR_INVALID_CONFIG"
"5555444433331111,12,2023,MASTERCARD,ERR_INVALID_CONFIG"
"370000000000002,12,2023,AMEX,ERR_INVALID_CONFIG"
"6011178332216017,12,2023,DISCOVER,ERR_UNDEFINED"
)

# Batch size
batch_size=5 # default tokenization limit tenant setting
total_cards=${#cards[@]}
declare -a pan_array brand_array result_array token_array

for ((i=0; i<total_cards; i+=batch_size)); do
batch_json="["

for ((j=i; j<i+batch_size && j<total_cards; j++)); do
IFS=',' read -r pan exp_month exp_year brand result_code <<< "${cards[j]}"
pan_array+=("$pan")
brand_array+=("$brand")
result_array+=("$result_code")

token_json=$(cat <<EOF
{
"type": "card",
"data": {
"number": "$pan",
"expiration_month": "$exp_month",
"expiration_year": "$exp_year"
},
"metadata": {
"result_code": "$result_code"
}
}
EOF
)
batch_json+="$token_json"
if [[ $j -lt $((i + batch_size - 1)) && $j -lt $((total_cards - 1)) ]]; then
batch_json+=","
fi
done

batch_json+="]"

response=$(curl --silent --location 'https://api.basistheory.com/tokenize' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "BT-API-KEY: $BT_API_KEY" \
--data "$batch_json")

token_ids=($(echo "$response" | jq -r '.[].id'))
token_array+=("${token_ids[@]}")
done

printf "| %-36s | %-20s | %-12s | %-25s |\n" "Token ID" "Test Card Number" "Card Brand" "Result Code"
printf -- "|--------------------------------------|----------------------|--------------|---------------------------|\n"

for ((i = 0; i < ${#token_array[@]}; i++)); do
printf "| %-36s | %-20s | %-12s | %-25s |\n" \
"${token_array[$i]}" \
"${pan_array[$i]}" \
"${brand_array[$i]}" \
"${result_array[$i]}"
done

Running this script with your API key should print the following output:

| Token ID   | Test Card Number     | Card Brand   | Result Code               |
|------------|----------------------|--------------|---------------------------|
| <token id> | 4111111111111111 | VISA | UPD_PAN |
| <token id> | 4012888888881881 | VISA | UPD_PAN |
| <token id> | 5555555555554444 | MASTERCARD | UPD_PAN |
| <token id> | 5105105105105100 | MASTERCARD | UPD_PAN |
| <token id> | 6011111111111117 | DISCOVER | UPD_PAN |
| <token id> | 6011601160116611 | DISCOVER | UPD_PAN |
| <token id> | 378282246310005 | AMEX | UPD_PAN |
| <token id> | 371449635398431 | AMEX | UPD_PAN |
| <token id> | 4539097887163333 | VISA | UPD_EXP_DATE |
| <token id> | 5325191087030619 | MASTERCARD | UPD_EXP_DATE |
| <token id> | 6011690151507086 | DISCOVER | UPD_EXP_DATE |
| <token id> | 373555735376156 | AMEX | UPD_EXP_DATE |
| <token id> | 6011760519541711 | DISCOVER | UPD_BRAND_CONV |
| <token id> | 6011490740263725 | DISCOVER | UPD_CORRECTED |
| <token id> | 4711358892785746 | VISA | NO_UPDATE |
| <token id> | 5412000000001009 | MASTERCARD | NO_UPDATE |
| <token id> | 4929980395567582 | VISA | WRN_CONTACT_CARDHOLDER |
| <token id> | 6011444770992901 | DISCOVER | WRN_CONTACT_CARDHOLDER |
| <token id> | 4929544240318920 | VISA | WRN_ISSUER_NOT_ENROLLED |
| <token id> | 5580422612666704 | MASTERCARD | WRN_ISSUER_NOT_ENROLLED |
| <token id> | 4916725297925395 | VISA | WRN_ISSUER_NO_DATA |
| <token id> | 5157204564548129 | MASTERCARD | WRN_ISSUER_NO_DATA |
| <token id> | 4035501000000008 | VISA | WRN_OPT_OUT |
| <token id> | 5461310156953048 | MASTERCARD | WRN_CLOSED_ACCOUNT |
| <token id> | 6011168802268945 | DISCOVER | WRN_CLOSED_ACCOUNT |
| <token id> | 370488998077498 | AMEX | WRN_CLOSED_ACCOUNT |
| <token id> | 122000000000003 | N/A | WRN_UNSUPPORTED_NETWORK |
| <token id> | 4035501428146300 | VISA | ERR_INVALID_PAN |
| <token id> | 5555341244441115 | MASTERCARD | ERR_INVALID_PAN |
| <token id> | 6011829379808385 | DISCOVER | ERR_INVALID_PAN |
| <token id> | 378025849667382 | AMEX | ERR_INVALID_PAN |
| <token id> | 4111111145551142 | VISA | ERR_INVALID_EXP_DATE |
| <token id> | 5577000055770004 | MASTERCARD | ERR_INVALID_EXP_DATE |
| <token id> | 6011648103759866 | DISCOVER | ERR_INVALID_EXP_DATE |
| <token id> | 378734493671000 | AMEX | ERR_INVALID_EXP_DATE |
| <token id> | 4111112014267661 | VISA | ERR_INVALID_CONFIG |
| <token id> | 5555444433331111 | MASTERCARD | ERR_INVALID_CONFIG |
| <token id> | 370000000000002 | AMEX | ERR_INVALID_CONFIG |
| <token id> | 6011178332216017 | DISCOVER | ERR_UNDEFINED |