Gets basic bank account names linked to user handle.

This will return a list of account names, along with basic account information, linked to the requested user handle. These are the accounts that were linked using the /link_account endpoint.

If you have been approved to pass account and routing numbers directly through the /link_account, you need not poll this endpoint unless you have a failed transaction and want to investigate.


The request body at this endpoint is the get_accounts_msg JSON object.

Authorization / Authentication

Apps using Access Token Authorization

Use a valid access token in an Authorization: Bearer request header.

See Authenticating with an Access Token for more details.

Apps using ECDSA Authentication

Both authsignature and usersignature headers are required for this request. The usersignature header should be generated with a keypair registered to the user (either registered from the /register endpoint or the /register_wallet endpoint).

See the section on ECDSA Authentication for more detail about ECDSA signature generation.

Note - We recently renamed the field auth_handle to app_handle. For backward compatibility, auth_handle is still valid but has been removed from our documentation.

POST /0.2/get_accounts HTTP/1.1
Content-Type: application/json
// if using OAuth2
Authorization: Bearer [GENERATED JWT TOKEN HERE]
// if using ECDSA

  "header": {
    "created": 1234567890, 
    "app_handle": "handle.silamoney.eth", 
    "version": "0.2",
    "crypto": "ETH", 
    "reference": "<your unique id>"
  "message": "get_accounts_msg"


HTTP/1.1 200 OK

    "account_number": "*1234",
    "routing_number": "123456789",
    "account_name": "default",
    "account_type": "CHECKING",
    "account_status": "active",
    "active": true/false,
    "account_link_status": "Plaid",
    "match_score": 0.825,
    "account_owner_name": "Test User",
    "entity_name": "Test User",
const res = await Sila.getAccounts(userHandle, walletPrivateKey);

// Success Response Object
console.log(res.statusCode); // 200
console.log(res.data[0].account_name); // Account name
console.log(res.data[0].account_number); // Account number
console.log(res.data[0].account_status); // Account status
console.log(res.data[0].account_type); // Account type
console.log(res.data[0].web_debit_verified); // true/false

        "user_handle": "user.silamoney.eth"    #Required

User.getAccounts(silaApp,payload,user_private_key) # users_private_key (256 bits) associated with ethereum address                  

### Success Response Object
    "account_number": "*1234",
    "routing_number": "123456789",
    "account_name": "default",
    "account_type": "CHECKING",
    "account_status": "active",
    "active": true/false,
    "account_link_status": "microdeposit_automatically_verified",
    "match_score": 0.825,
    "account_owner_name": "Test User",
    "entity_name": "Test User",

### Failure Response Object
    status: 'FAILURE'
ApiResponse response = api.getAccounts("userHandle", "userPrivateKey");

// Success Response Object
System.out.println(response.getStatusCode()); // 200
System.out.println(((List<Account>) response.getData()).get(0).accountName); // Account name
System.out.println(((List<Account>) response.getData()).get(0).accountNumber); // Account Number
System.out.println(((List<Account>) response.getData()).get(0).accountStatus); // Account Status 
System.out.println(((List<Account>) response.getData()).get(0).accountType); // Account Type
System.out.println(((List<Account>) response.getData()).get(0).accountListStatus); // Account Link Status.
System.out.println(((List<Account>) response.getData()).get(0).routingNumber);
System.out.println(((List<Account>) response.getData()).get(0).active);
System.out.println(((List<Account>) response.getData()).get(0).matchScore);
System.out.println(((List<Account>) response.getData()).get(0).accountOwnerName);
System.out.println(((List<Account>) response.getData()).get(0).entityName);
System.out.println(((List<Account>) response.getData()).get(0).getWebDebitVerified()); // true/false
$userHandle = 'user.silamoney.eth';
$userPrivateKey = 'some private key'; // Hex format
$response = $client->getAccounts($userHandle, $userPrivateKey);

// Success 200
echo $response->getStatusCode();    // 200
$accounts = $response->getData();   // Array of Silamoney\Client\Domain\Account
if (count($accounts)) {
    echo $accounts[0]->accountName;     // Account Name
    echo $accounts[0]->accountNumber;   // Account Number
    echo $accounts[0]->accountStatus;   // Account Status
    echo $accounts[0]->accountType;     // Account Type
    echo $accounts[0]->matchScore;     // Match Score
    echo $accounts[0]->accountOwnerName;     // Account Owner Name
    echo $accounts[0]->entityName;     // Entity Name
ApiResponse<object> response = api.GetAccounts(userHandle, walletPrivateKey);

// Success Object Response

Console.WriteLine(response.StatusCode); // 200
Console.WriteLine(((List<Account>)response.Data)[0].AccountLinkStatus); // Account Link Status
Console.WriteLine(((List<Account>)response.Data)[0].AccountName); // Account Name
Console.WriteLine(((List<Account>)response.Data)[0].AccountNumber); // Account Number
Console.WriteLine(((List<Account>)response.Data)[0].AccountStatus); // Account Status
Console.WriteLine(((List<Account>)response.Data)[0].AccountType); // Account Type
Console.WriteLine(((List<Account>)response.Data)[0].Active); // Active
Console.WriteLine(((List<Account>)response.Data)[0].RoutingNumber); // Routing Number
Console.WriteLine(((List<Account>)response.Data)[0].MatchScore); // Match Score
Console.WriteLine(((List<Account>)response.Data)[0].AccountOwnerName); // Account Owner Name
Console.WriteLine(((List<Account>)response.Data)[0].EntityName); // Entity Name
Console.WriteLine(((List<Account>)response.Data)[0].WebDebitVerified); // true
headerJSON objectRequired. Requires these keys in JSON format: created, app_handle, user_handle. See the /check_handle endpoint for the complete list of fields in this object.


Status CodeDescription
200Successfully fetched array of accounts.
400Bad request format - check validation_details for more information.
401authsignature or usersignature header was absent or incorrect.

Response Contents


If the account is in one of the microdeposit pending link states, a record with null account and routing numbers will be returned.

account_numberstring or nullMasked bank account number, last 4 digits visible.
routing_numberstring or nullBank account ACH routing number.
account_namestringOptional: Custom nickname assigned for each linked bank account which is displayed to end user (details here).
account_typestringBank account subtype.
account_statusstringWhether the account is "frozen".
activebooleanWhether the account is "frozen".
account_link_statusstringPlaid or MX link status.
match_scorestring or nullEntity name match score with the account holder name
account_owner_namestringAccount owner name from Plaid or MX.
entity_namestringFull name of the end-user.
web_debit_verifiedbooleanAccount will have a new property which denotes if the account satisfies the “account validation” aspect of the Web Debit Rule.

account_status values:

  • active
  • inactive

account_link_status values:

  • instantly_verified
  • microdeposit_automatically_verified
  • microdeposit_manually_verified
  • microdeposit_pending_automatic_verification
  • microdeposit_pending_manual_verification
  • verification_expired


Fuzzy Name Match and the /get_accounts response body

Within the response body of /get_accounts you will see the values:
"match_score": 0.825,
"account_owner_name": "Test User",
"entity_name": "Test User"

The account owner name is the name on the account provided by Plaid or MX, while the entity name is the name of the person or business as provided to Sila through your request to /register.

These two names need to closely match otherwise the account will not be useable. If the match score is less than 0.73 the account will be frozen and not useable.

Steps to unfreezing a linked account can be found HERE