Manage company bank accounts

You must associate a verified bank account with each company before running payroll.

Bank accounts are verified through micro deposits, ensuring a secure and reliable connection to the company’s funding source.

1. Create a bank account

Create and connect a new bank account for a company using the POST /v1/companies/{company_id}/bank_accounts endpoint. If a default bank account exists, the new bank account will replace it as the company's default funding method.

You can also connect a bank account from Plaid using the POST plaid/processor_token endpoint.

When testing in Demo: Use the sample routing number 102001017. The API checks that the routing number is a valid US routing number, and therefore will reject false inputs.

Sample request

curl --request POST \
     --url https://api.gusto-demo.com/v1/companies/{company_uuid}/bank_accounts \
     --header 'accept: application/json' \
     --header 'authorization: Bearer {{company_access_token}}' \
     --header 'content-type: application/json' \
     --data '
{
     "routing_number": "102001017",
     "account_type": "Checking",
     "account_number": "9775014007"
}
'
const fetch = require('node-fetch');

const url = 'https://api.gusto-demo.com/v1/companies/{company_uuid}/bank_accounts';
const options = {
  method: 'POST',
  headers: {
    accept: 'application/json',
    'content-type': 'application/json',
    authorization: 'Bearer <<COMPANY_API_TOKEN>>'
  },
  body: JSON.stringify({
    routing_number: '115092013',
    account_type: 'Checking',
    account_number: '9775014007'
  })
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error('error:' + err));

Sample response

{
  "uuid": "{{uuid}}",
  "company_uuid": "{{company_uuid}}",
  "account_type": "Checking",
  "routing_number": "102001017",
  "hidden_account_number": "XXXX014007",
  "verification_status": "awaiting_deposits",
  "verification_type": "bank_deposits",
  "name": "Employer Funding Account"
}

Two verification deposits are automatically sent to the new bank account in 1-2 business days. During this stage, the bank account's verification_status is awaiting_deposits.

When the deposits are successfully transferred, the verification_status changes to ready_for_verification.

2. Verify a bank account

At this point, call the PUT /v1/companies/{company_id}/bank_accounts/{bank_account_uuid}/verify to verify the bank account. After a successful verification, the bank account's verification_status is returned as verified.

Sample request

curl --request PUT \
     --url https://api.gusto-demo.com/v1/companies/{company_uuid}/bank_accounts/{bank_account_uuid}/verify \
     --header 'accept: application/json' \
     --header 'authorization: Bearer {{company_access_token}}' \
     --header 'content-type: application/json' \
     --data '
{
     "deposit_1": 0.02,
     "deposit_2": 0.42
}
'
const fetch = require('node-fetch');

const url = 'https://api.gusto-demo.com/v1/companies/{company_uuid}/bank_accounts/{bank_account_uuid}/verify';
const options = {
  method: 'PUT',
  headers: {
    accept: 'application/json',
    'content-type': 'application/json',
    authorization: 'Bearer <<COMPANY_API_TOKEN>>'
  },
  body: JSON.stringify({deposit_1: 0.02, deposit_2: 0.42})
};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error('error:' + err));

Sample response

{
  "uuid": "{{uuid}}",
  "company_uuid": "{{company_uuid}}",
  "account_type": "Checking",
  "routing_number": "102001017",
  "hidden_account_number": "XXXX014007",
  "verification_status": "verified",
  "verification_type": "bank_deposits",
  "name": "Employer Funding Account"
}

πŸ“˜

Validation in Demo

For testing in Demo, use the POST companies/{company_id_or_uuid}/bank_accounts/{bank_account_uuid}/send_test_deposits endpoint simulate micro-deposit transfers.