Bank Account Basics

A company's bank accounts hold the funds Worklio uses for payroll, vendor payments, and deposits. This page covers listing a company's accounts, retrieving one account, creating an account, and updating an account.

Create at least one account with purpose: 1 (General/Payroll) before running payroll for a company.

All endpoints on this page require a bearer access token (see How to Get API Access). CLIENT_ID in the paths below is the company's id, returned when you create the company.



The bank account object

FieldTypeDescription
accountIdintegerUnique identifier of the account. Save it: it is the BANK_ACCOUNT_ID path parameter in the endpoints below.
accountNamestringA label for the account, shown in Worklio's UI.
accountNumberstringThe bank account number.
routingNumberstringThe bank's routing number.
typeintegerAccount type. See Account type.
purposeintegerWhat the account is used for. See Purpose.
nextCheckNumberintegerNext check number for this account. Returned by create and update only.
bankAccountStatusintegerStatus of the account setup step. See Status values. Returned by get only.
bankProviderStatusintegerStatus of the bank provider step. See Status values.
verificationStatusintegerStatus of the account's verification. See Status values. Returned by get only.
plaidLinkStatusintegerWhether the account is linked through Plaid. See Plaid link status. Returned by get only.

Account type

ValueMeaning
1Checking
2Savings

Purpose

ValueMeaning
1General (Payroll)
2Invoice (Vendor)
4Deposit Account

Status values

bankAccountStatus, bankProviderStatus, verificationStatus, and kotapayStatus all use the same values:

ValueNameMeaning
0DisabledThe step is not enabled yet.
1ActiveThe step is active and can be edited.
2CompletedThe step is completed and read-only.
3InProgressThe step is in progress or processing in the background.
4FailedThe step failed and needs to be repaired.
9NotAvailableThe step or module is not available.

Plaid link status

ValueNameMeaning
0NotLinkedThe account is not linked through Plaid yet.
1LinkedThe account is linked through Plaid.
2LinkFailedLinking the account through Plaid failed.

List company bank accounts

Returns every bank account for a company. If the company has no bank accounts, the response is an empty array ([]).

GET https://api.worklio.com/wep/companies/{CLIENT_ID}/bankaccounts
ParameterTypeRequiredDescription
CLIENT_IDintegerYesThe company's id. Path parameter.

Example request

require("dotenv").config();

const TOKEN = process.env.API_KEY;
const CLIENT_ID = process.env.CLIENT_ID;
const url = `https://api.worklio.com/wep/companies/${CLIENT_ID}/bankaccounts`;

async function listCompanyAccounts() {
  const response = await fetch(url, {
    method: "GET",
    headers: {
      accept: "application/json",
      "api-version": "2.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/json",
      "x-api-version": "2.0"
    }
  });

  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}

listCompanyAccounts();
curl -s -X GET "https://api.worklio.com/wep/companies/$CLIENT_ID/bankaccounts" \
  -H "accept: application/json" \
  -H "api-version: 2.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 2.0" | jq .

Example response

[
  {
    "accountId": 767,
    "accountName": "GUIDE COMPANY ACCOUNT CHECKING",
    "accountNumber": "124450000",
    "routingNumber": "071000505",
    "type": 1,
    "purpose": 1,
    "bankAccountStatus": 2,
    "bankProviderStatus": 9,
    "kotapayStatus": 0,
    "verificationStatus": 9,
    "plaidLinkStatus": 0
  }
]

In this example the account setup step is Completed (bankAccountStatus: 2), no bank provider applies (bankProviderStatus: 9, NotAvailable), and the account is not linked through Plaid (plaidLinkStatus: 0).

For a company with no bank accounts:

[]

Get a company bank account

Returns a single bank account. The response is one account object, in the same shape as an item in the list response, not wrapped in an array.

GET https://api.worklio.com/wep/companies/{CLIENT_ID}/bankaccounts/{BANK_ACCOUNT_ID}
ParameterTypeRequiredDescription
CLIENT_IDintegerYesThe company's id. Path parameter.
BANK_ACCOUNT_IDintegerYesThe account's accountId, as returned by List company bank accounts or Create a company bank account. Path parameter.

Example request

require("dotenv").config();

const TOKEN = process.env.API_KEY;
const CLIENT_ID = process.env.CLIENT_ID;
const BANK_ACCOUNT_ID = 767;
const url = `https://api.worklio.com/wep/companies/${CLIENT_ID}/bankaccounts/${BANK_ACCOUNT_ID}`;

async function getCompanyAccount() {
  const response = await fetch(url, {
    method: "GET",
    headers: {
      accept: "application/json",
      "api-version": "2.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/json",
      "x-api-version": "2.0"
    }
  });

  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}

getCompanyAccount();
curl -s -X GET "https://api.worklio.com/wep/companies/$CLIENT_ID/bankaccounts/767" \
  -H "accept: application/json" \
  -H "api-version: 2.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 2.0" | jq .

Example response

{
  "accountId": 767,
  "accountName": "GUIDE COMPANY ACCOUNT CHECKING",
  "accountNumber": "124450000",
  "routingNumber": "071000505",
  "type": 1,
  "purpose": 1,
  "bankAccountStatus": 2,
  "bankProviderStatus": 9,
  "kotapayStatus": 0,
  "verificationStatus": 9,
  "plaidLinkStatus": 0
}

Create a company bank account

Creates a bank account for a company.

POST https://api.worklio.com/wep/companies/{CLIENT_ID}/bankaccounts
ParameterTypeRequiredDescription
CLIENT_IDintegerYesThe company's id. Path parameter.

Fields

FieldTypeRequiredDescription
accountNamestringYesA label for the account, shown in Worklio's UI.
accountNumberstringYesThe bank account number.
routingNumberstringYesThe bank's routing number.
typeintegerYesAccount type. See Account type.
purposeintegerYesWhat the account is used for. See Purpose.

Example request

require("dotenv").config();

const TOKEN = process.env.API_KEY;
const CLIENT_ID = process.env.CLIENT_ID;
const url = `https://api.worklio.com/wep/companies/${CLIENT_ID}/bankaccounts`;

const payload = {
  accountName: "Guide account",
  accountNumber: "12305140000",
  routingNumber: "011401533",
  type: 1,
  purpose: 1
};

async function createCompanyAccount() {
  const response = await fetch(url, {
    method: "POST",
    headers: {
      accept: "application/json",
      "api-version": "2.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/json",
      "x-api-version": "2.0"
    },
    body: JSON.stringify(payload)
  });

  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}

createCompanyAccount();
curl -s -X POST "https://api.worklio.com/wep/companies/$CLIENT_ID/bankaccounts" \
  -H "accept: application/json" \
  -H "api-version: 2.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 2.0" \
  -d '{
    "accountName": "Guide account",
    "accountNumber": "12305140000",
    "routingNumber": "011401533",
    "type": 1,
    "purpose": 1
  }' | jq .

Example response

{
  "accountId": 779,
  "accountName": "Guide account",
  "accountNumber": "12305140000",
  "routingNumber": "011401533",
  "type": 1,
  "purpose": 1,
  "nextCheckNumber": 1,
  "bankProviderStatus": 0,
  "kotapayStatus": 0
}

Save accountId. You need it to get or update this account.


Update a company bank account

Updates an existing bank account's details, for example its accountName.

PATCH https://api.worklio.com/wep/companies/{CLIENT_ID}/bankaccounts/{BANK_ACCOUNT_ID}
ParameterTypeRequiredDescription
CLIENT_IDintegerYesThe company's id. Path parameter.
BANK_ACCOUNT_IDintegerYesThe account's accountId. Path parameter.

When you can update an account

You can update an account only when Plaid is enabled for the company and the account is not linked through Plaid (plaidLinkStatus is not 1). Any other request is rejected.

Content type

This endpoint requires application/merge-patch+json, not application/json.

content-type: application/merge-patch+json

Fields

FieldTypeRequiredDescription
routingNumberstringYesThe bank's routing number. Required in every request, can't be updated.
accountNamestringNoA label for the account, shown in Worklio's UI.
accountNumberstringNoThe accounts' new account number.
typeintegerNoAccounts' new type.

Example request

This example renames the account and keeps its routing number unchanged.

require("dotenv").config();

const TOKEN = process.env.API_KEY;
const CLIENT_ID = process.env.CLIENT_ID;
const BANK_ACCOUNT_ID = 578;
const url = `https://api.worklio.com/wep/companies/${CLIENT_ID}/bankaccounts/${BANK_ACCOUNT_ID}`;

const payload = {
  accountName: "Guide account PATCHED",
  routingNumber: "011401533"
};

async function updateCompanyAccount() {
  const response = await fetch(url, {
    method: "PATCH",
    headers: {
      accept: "application/json",
      "api-version": "2.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/merge-patch+json",
      "x-api-version": "2.0"
    },
    body: JSON.stringify(payload)
  });

  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}

updateCompanyAccount();
curl -s -X PATCH "https://api.worklio.com/wep/companies/$CLIENT_ID/bankaccounts/578" \
  -H "accept: application/json" \
  -H "api-version: 2.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/merge-patch+json" \
  -H "x-api-version: 2.0" \
  -d '{
    "accountName": "Guide account PATCHED",
    "routingNumber": "011401533"
  }' | jq .

Example response

A successful update returns the full updated account.

{
  "accountId": 578,
  "accountName": "Guide account PATCHED",
  "accountNumber": "12005120000",
  "routingNumber": "011401533",
  "type": 1,
  "purpose": 1,
  "nextCheckNumber": 1,
  "bankProviderStatus": 0,
  "kotapayStatus": 0
}

Error response

If the request body does not include routingNumber, the API returns HTTP 500 with the message "Routing Number is invalid.":

{
  "status": 0,
  "code": "500",
  "errorCode": null,
  "message": "9/29/2026 - 7:47:06 AM : Routing Number is invalid.",
  "stackTrace": "",
  "pagination": {
    "pageNo": 0,
    "pageSize": 0,
    "totalRecords": 0,
    "totalPages": 0,
    "dataToken": ""
  },
  "validationErrors": null
}

This is a validation failure returned as a 500. Always include routingNumber in the request body to avoid it. The message text is prefixed with a timestamp, so match on the text after the timestamp, not the whole string.


Did this page help you?