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
| Field | Type | Description |
|---|---|---|
accountId | integer | Unique identifier of the account. Save it: it is the BANK_ACCOUNT_ID path parameter in the endpoints below. |
accountName | string | A label for the account, shown in Worklio's UI. |
accountNumber | string | The bank account number. |
routingNumber | string | The bank's routing number. |
type | integer | Account type. See Account type. |
purpose | integer | What the account is used for. See Purpose. |
nextCheckNumber | integer | Next check number for this account. Returned by create and update only. |
bankAccountStatus | integer | Status of the account setup step. See Status values. Returned by get only. |
bankProviderStatus | integer | Status of the bank provider step. See Status values. |
verificationStatus | integer | Status of the account's verification. See Status values. Returned by get only. |
plaidLinkStatus | integer | Whether the account is linked through Plaid. See Plaid link status. Returned by get only. |
Account type
| Value | Meaning |
|---|---|
| 1 | Checking |
| 2 | Savings |
Purpose
| Value | Meaning |
|---|---|
| 1 | General (Payroll) |
| 2 | Invoice (Vendor) |
| 4 | Deposit Account |
Status values
bankAccountStatus, bankProviderStatus, verificationStatus, and kotapayStatus all use the same values:
| Value | Name | Meaning |
|---|---|---|
| 0 | Disabled | The step is not enabled yet. |
| 1 | Active | The step is active and can be edited. |
| 2 | Completed | The step is completed and read-only. |
| 3 | InProgress | The step is in progress or processing in the background. |
| 4 | Failed | The step failed and needs to be repaired. |
| 9 | NotAvailable | The step or module is not available. |
Plaid link status
| Value | Name | Meaning |
|---|---|---|
| 0 | NotLinked | The account is not linked through Plaid yet. |
| 1 | Linked | The account is linked through Plaid. |
| 2 | LinkFailed | Linking 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
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The 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}
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id. Path parameter. |
BANK_ACCOUNT_ID | integer | Yes | The 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
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id. Path parameter. |
Fields
| Field | Type | Required | Description |
|---|---|---|---|
accountName | string | Yes | A label for the account, shown in Worklio's UI. |
accountNumber | string | Yes | The bank account number. |
routingNumber | string | Yes | The bank's routing number. |
type | integer | Yes | Account type. See Account type. |
purpose | integer | Yes | What 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}
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id. Path parameter. |
BANK_ACCOUNT_ID | integer | Yes | The 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
| Field | Type | Required | Description |
|---|---|---|---|
routingNumber | string | Yes | The bank's routing number. Required in every request, can't be updated. |
accountName | string | No | A label for the account, shown in Worklio's UI. |
accountNumber | string | No | The accounts' new account number. |
type | integer | No | Accounts' 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.
Updated 41 minutes ago
