Company Basics
Companies are the top-level entity in Worklio. Create one first, then use its id (referred to as CLIENT_ID in path parameters throughout this page) for later steps, such as creating employees.
This page covers the company record's full lifecycle: creating a company, retrieving company data, updating an existing company, and blocking or unblocking a company.
All endpoints on this page require a bearer access token (see How to Get API Access).
Create a Company
Creates a new company under your developer account. This is the next step after getting an access token — you'll need the company id returned by this call for later steps, such as creating employees.
You can also set up the company's default payroll policy in the same call, by including a payrollPolicy object in the request. If you skip it, the company is created with no payroll policy — see Payroll Policies to create one afterward.
Endpoint
POST https://api.worklio.com/wep/companies
Required fields:
| Field | Description |
|---|---|
name | Legal name |
fein | Federal EIN, with or without the dash |
companyType | One of the company type codes — see Company type below |
companyAddress | addressLine1, addressCity, addressState, addressZIP, addressCountry |
companyAddressmust be a real, deliverable address. Worklio uses it to determine the company's tax jurisdiction — state and local tax setup is derived from this address — so a placeholder or fake address will produce incorrect tax configuration for the company.
Company type
companyType is an integer. These are the values Worklio accepts:
| Value | Name | Description |
|---|---|---|
| 1 | Corporation | C-Corp |
| 2 | Partnership | Partnership |
| 3 | SCorp | S-Corp |
| 4 | LLCPartnership | LLC Partnership |
| 5 | SoleProprietorship | Sole Proprietor |
| 6 | LLCSoleProprietor | LLC Sole Proprietor |
| 7 | LLC | LLC C-Corp |
| 8 | LLCSCorp | LLC S-Corp |
| 9 | NonProfit | Non Profit |
| 10 | GovernmentalEntity | Governmental Entity |
Payroll policy (optional)
Include payrollPolicy in the request to create a default payroll policy for the company at the same time. This becomes the company's DEFAULT payroll policy — you'll get its id back in the payrollPolicies array of the response.
| Field | Description |
|---|---|
payFrequency | Pay frequency, as an integer. |
firstPayPeriodEndDate | End date of the first pay period. |
firstPayDate | Date employees are paid for the first pay period. |
movePayDayOnHolidaysAndWeekends | 0 = move the pay day to after the holiday/weekend, 1 = move it to before. |
Example request
require("dotenv").config();
const TOKEN = process.env.API_KEY;
const url = "https://api.worklio.com/wep/companies";
const payload = {
name: "Guide Company",
companyType: 2, // Partnership
fein: "123456789",
tradeName: "Guide Company",
startOn: "2027-09-01T00:00:00.000Z",
externalId: "sandbox-test-001",
email: "[email protected]",
website: "https://guidecompany.com",
phone: "+12125551234",
companyAddress: {
addressLine1: "233 S Wacker Drive",
addressLine2: "Suite 8400",
addressCity: "Chicago",
addressState: "IL",
addressZIP: "60606",
addressCountry: "US",
geoLatitude: 41.8789,
geoLongitude: -87.6359
},
payrollPolicy: {
payFrequency: 1, // weekly
firstPayPeriodEndDate: "2027-09-10T00:00:00.000Z",
firstPayDate: "2027-09-12T00:00:00.000Z",
movePayDayOnHolidaysAndWeekends: 1 // 0 = after, 1 = before
},
metaData: "sandbox test company",
enabledEWA: true,
enabledUnions: true
};
async function createCompany() {
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);
console.log(await response.text());
}
createCompany();curl -s -X POST "https://api.worklio.com/wep/companies" \
-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 '{
"name": "Guide Company",
"companyType": 2,
"fein": "123456789",
"tradeName": "Guide Company",
"startOn": "2027-09-01T00:00:00.000Z",
"externalId": "sandbox-test-001",
"email": "[email protected]",
"website": "https://guidecompany.com",
"phone": "+12125551234",
"companyAddress": {
"addressLine1": "233 S Wacker Drive",
"addressLine2": "Suite 8400",
"addressCity": "Chicago",
"addressState": "IL",
"addressZIP": "60606",
"addressCountry": "US",
"geoLatitude": 41.8789,
"geoLongitude": -87.6359
},
"payrollPolicy": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2027-09-10T00:00:00.000Z",
"firstPayDate": "2027-09-12T00:00:00.000Z",
"movePayDayOnHolidaysAndWeekends": 1
},
"metaData": "sandbox test company",
"enabledEWA": true,
"enabledUnions": true
}' | jq .Example response
{
"id": 1026,
"name": "Guide Company",
"fein": "123456789",
"companyType": 2,
"tradeName": "Guide Company",
"startOn": "2027-09-01",
"createdOn": "2026-09-11T09:06:53Z",
"externalId": "sandbox-test-001",
"website": "https://guidecompany.com",
"phone": "+12125551234",
"email": "[email protected]",
"timeZone": 3,
"companyAddress": {
"id": 5984,
"addressLine1": "233 S Wacker Drive",
"addressLine2": "Suite 8400",
"addressCity": "Chicago",
"addressState": "IL",
"addressZIP": "60606",
"addressCountry": "US"
},
"payrollPolicy": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2027-09-10",
"firstPayDate": "2027-09-12",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
},
"payrollPolicies": [
{
"id": 1082,
"companyId": 1026,
"name": "DEFAULT",
"frequency": 1,
"autoRun": false,
"initialSetup": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2027-09-10",
"firstPayDate": "2027-09-12",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
}
}
],
"metaData": "sandbox test company",
"reqEEJobCostCode": false,
"enabledUnions": true,
"enabledEWA": true,
"blocked": false,
"refCode": "wepL7156817",
"uiNumber": 1054
}id is the company's unique identifier — save it for later steps, like creating employees under this company. This is the value used as CLIENT_ID in the path parameters below.
If you included payrollPolicy in the request, the created policy also appears in payrollPolicies, named DEFAULT. Save payrollPolicies[0].id if you'll need to reference this policy later (for example, when running payroll).
Time zone
timeZone in the response identifies the company's local time zone. It's determined from companyAddress — this is another reason the address must be accurate. It can be set in a request.
| Value | Name | Description |
|---|---|---|
| 1 | PacificStandardTime | Pacific Standard Time |
| 2 | MountainStandardTime | Mountain Standard Time |
| 3 | CentralStandardTime | Central Standard Time |
| 4 | EasternStandardTime | Eastern Standard Time |
| 5 | AlaskanStandardTime | Alaskan Standard Time |
| 6 | HawaiianStandardTime | Hawaiian Standard Time |
| 7 | AtlanticStandardTime | Atlantic Standard Time |
| 8 | NewfoundlandStandardTime | Newfoundland Standard Time |
| 9 | USMountainStandardTime | US Mountain Standard Time |
If you don't sendstartOn, Worklio sets it to the date the request was made — you don't need to set it just to get a runnable request going.
If you don't sendpayrollPolicy, the company is created with an emptypayrollPoliciesarray. You can create a policy afterward — see Payroll Policies.
Get Companies
Worklio has three GET endpoints for retrieving company data: a basic list of every company visible to the current user, an admin-focused list with more operational fields, and a lookup for a single company's full detail.
None of the three endpoints accept query parameters — there is no pagination, filtering, or sorting support. Each list endpoint always returns the full set of companies visible to the caller.
List companies
Returns a company for every company visible to the current user, using a minimal projection.
GET https://api.worklio.com/wep/companies
Example request
require("dotenv").config();
const TOKEN = process.env.API_KEY;
const url = "https://api.worklio.com/wep/companies";
async function listCompanies() {
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));
}
listCompanies();curl -s -X GET "https://api.worklio.com/wep/companies" \
-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
[
{
"id": 1029,
"name": "Guide Company Test",
"fein": "123456789",
"status": 1,
"uiNumber": 1057,
"createdOn": "2026-09-11T11:51:16Z"
},
{
"id": 1031,
"name": "Guide Company REAL FINAL",
"fein": "123456789",
"status": 1,
"uiNumber": 1059,
"createdOn": "2026-09-11T12:19:00Z"
},
{
"id": 1032,
"name": "Milk Company",
"fein": "123456789",
"status": 1,
"uiNumber": 1060,
"createdOn": "2026-09-11T13:57:36Z"
}
]List companies (admin projection)
Returns the same set of companies as List companies above, but with a more administration-focused set of fields — pay schedule and processing-deadline info, contact details, and whether the company is blocked.
GET https://api.worklio.com/wep/companies/list
Example request
require("dotenv").config();
const TOKEN = process.env.API_KEY;
const url = "https://api.worklio.com/wep/companies/list";
async function listCompaniesAdmin() {
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));
}
listCompaniesAdmin();curl -s -X GET "https://api.worklio.com/wep/companies/list" \
-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
[
{
"id": 1029,
"name": "Guide Company Test",
"tradeName": "Guide Company",
"fein": "123456789",
"nextPayDate": "2026-09-11",
"deadline": "2026-09-07T21:00:00Z",
"daysForProcess": 4,
"phoneNumber": "+12125551234",
"email": "[email protected]",
"blocked": false,
"createdOn": "2026-09-11T11:51:16Z"
},
{
"id": 1031,
"name": "Guide Company REAL FINAL",
"tradeName": "Guide Company",
"fein": "123456789",
"nextPayDate": "2026-09-11",
"deadline": "2026-09-07T21:00:00Z",
"daysForProcess": 4,
"phoneNumber": "+12125551234",
"email": "[email protected]",
"blocked": false,
"createdOn": "2026-09-11T12:19:00Z"
},
{
"id": 1032,
"name": "Milk Company",
"tradeName": "Guide Company",
"fein": "123456789",
"nextPayDate": "2026-09-18",
"deadline": "2026-09-14T21:00:00Z",
"daysForProcess": 4,
"phoneNumber": "+12125551234",
"email": "[email protected]",
"blocked": false,
"createdOn": "2026-09-11T13:57:36Z"
}
]Get a company
Returns the full detail record for a single company.
GET https://api.worklio.com/wep/companies/{CLIENT_ID}
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id, as returned by List companies or List companies (admin projection). Path parameter. |
Example request
require("dotenv").config();
const TOKEN = process.env.API_KEY;
const CLIENT_ID = 1031;
const url = `https://api.worklio.com/wep/companies/${CLIENT_ID}`;
async function getCompany() {
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));
}
getCompany();curl -s -X GET "https://api.worklio.com/wep/companies/1031" \
-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
{
"id": 1031,
"name": "Guide Company REAL FINAL",
"fein": "123456789",
"companyType": 2,
"tradeName": "Guide Company",
"startOn": "2026-09-11",
"businessSince": "2026-09-11",
"createdOn": "2026-09-11T12:19:00Z",
"externalId": "sandbox-test-001",
"website": "https://guidecompany.com",
"phone": "+12125551234",
"email": "[email protected]",
"timeZone": 3,
"companyAddress": {
"id": 6013,
"addressLine1": "233 S Wacker Drive",
"addressLine2": "Suite 8400",
"addressCity": "Chicago",
"addressState": "IL",
"addressZIP": "60606",
"addressCountry": "US"
},
"payrollPolicy": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2026-09-11",
"firstPayDate": "2026-09-11",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
},
"payrollPolicies": [
{
"id": 1087,
"companyId": 1031,
"name": "DEFAULT",
"frequency": 1,
"autoRun": false,
"initialSetup": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2026-09-11",
"firstPayDate": "2026-09-11",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
}
},
{
"id": 1089,
"companyId": 1031,
"name": "newTestPayroll",
"frequency": 1,
"autoRun": false,
"initialSetup": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2026-09-10",
"firstPayDate": "2026-09-11",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
}
},
],
"metaData": "sandbox test company",
"reqEEJobCostCode": false,
"enabledUnions": true,
"enabledEWA": true,
"blocked": false,
"refCode": "wepL7156817",
"uiNumber": 1059
}Error response
If CLIENT_ID doesn't exist, or isn't accessible to the current user, the endpoint returns:
403 Access Denied
Update a Company
Updates an existing company's details. Use this to change information set at creation time — company name, contact info, address, and similar fields — without recreating the company.
Endpoint
PATCH https://api.worklio.com/wep/companies/{CLIENT_ID}
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id, as returned by Create a Company or Get Companies. Path parameter. |
Content type
This endpoint requires application/merge-patch+json, not application/json. Send only the fields you want to change — fields you omit keep their current value.
content-type: application/merge-patch+json
Fields
All fields from Create a Company can be updated through this endpoint, except fein — see Updating fein below.
| Field | Description |
|---|---|
name | Legal name |
tradeName | Trade / DBA name |
companyType | One of the company type codes — see Company type |
externalId | Your own reference id for the company |
email | Company contact email |
website | Company website |
phone | Company contact phone |
companyAddress | addressLine1, addressLine2, addressCity, addressState, addressZIP, addressCountry, geoLatitude, geoLongitude |
metaData | Free-text metadata field |
enabledEWA | Whether earned wage access is enabled |
enabledUnions | Whether union support is enabled |
reqEEJobCostCode | Whether employees are required to have a job cost code |
startOn | Company start date. Accepted by this endpoint but not applied — see the note below. |
companyAddressdetermines the company's tax jurisdiction — state and local tax setup is derived from it, and so istimeZoneon the response. Changing it changes those downstream values too.
startOnandpayrollPolicyare accepted but not applied. The request still returns200with no error, but the company's stored start date and payroll policy are left exactly as they were. A200response from this endpoint does not mean either field changed.
Updating fein
feinfein cannot be changed through this endpoint. Any request that includes fein — whether or not the value actually differs from what's stored — is rejected outright:
{
"status": 0,
"code": "400",
"errorCode": "FEINUpdateNotAllowed",
"message": "9/15/2026 - 8:17:38 AM : Missing localization for key: Worklio.Business.WEP.Logic.CompanyLogic.FEINUpdateNotAllowed",
"stackTrace": "",
"pagination": {
"pageNo": 0,
"pageSize": 0,
"totalRecords": 0,
"totalPages": 0,
"dataToken": ""
},
"validationErrors": null
}
Themessagetext above ("Missing localization for key: ...") is what the API actually returns — it's a broken/untranslated error string, not a copy-paste mistake in this guide. Treat the HTTP 400 pluserrorCode: "FEINUpdateNotAllowed"as the signal, not the message text.
If you need to correct a company's FEIN, it can't be done through this endpoint.
Example request
This example updates Guide Company's name.
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}`;
const payload = {
name: "Guide Company PATCHED"
};
async function updateCompany() {
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));
}
updateCompany();curl -s -X PATCH "https://api.worklio.com/wep/companies/$CLIENT_ID" \
-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 '{
"name": "Guide Company PATCHED"
}' | jq .Example response
A successful update returns the full, updated company object — the same shape as Get a Company.
{
"id": 1031,
"name": "Guide Company PATCHED",
"fein": "123456789",
"companyType": 2,
"tradeName": "Guide Company",
"startOn": "2026-09-11",
"businessSince": "2026-09-11",
"createdOn": "2026-09-11T12:19:00Z",
"externalId": "sandbox-test-001",
"website": "https://guidecompany.com",
"phone": "+12125551234",
"email": "[email protected]",
"timeZone": 3,
"companyAddress": {
"id": 6013,
"addressLine1": "233 S Wacker Drive",
"addressLine2": "Suite 8400",
"addressCity": "Chicago",
"addressState": "IL",
"addressZIP": "60606",
"addressCountry": "US"
},
"payrollPolicy": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2026-09-11",
"firstPayDate": "2026-09-11",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
},
"payrollPolicies": [
{
"id": 1087,
"companyId": 1031,
"name": "DEFAULT",
"frequency": 1,
"autoRun": false,
"initialSetup": {
"payFrequency": 1,
"firstPayPeriodEndDate": "2026-09-11",
"firstPayDate": "2026-09-11",
"movePayDayOnHolidaysAndWeekends": 1,
"autoRun": false,
"lastDayOfMonth": false
}
}
],
"metaData": "sandbox test company",
"reqEEJobCostCode": false,
"enabledUnions": true,
"enabledEWA": true,
"blocked": false,
"refCode": "wepL7156817",
"uiNumber": 1059
}Please save the returned object if you need to confirm what changed — the response reflects the company's full current state, not just the fields you sent.
Block a Company
Blocks a company and records why, using reason (plus customReason or state when the reason calls for it). The company's blocked field — already visible in the responses above — reflects this.
Endpoint
POST https://api.worklio.com/wep/companies/{CLIENT_ID}/block
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id, as returned by Create a Company or Get Companies. Path parameter. |
content-type: application/json
Fields
| Field | Type | Required | Description |
|---|---|---|---|
reason | int32 (enum) | Yes | Reason the company is being blocked. See Block reason below. |
customReason | string | null | Conditional | Custom reason. Valid only when reason is 5 (Other). |
state | string | null | Conditional | Two-letter state code (for example, IL). Valid only when reason is 2 (MissingStateTaxAccountInfo) or 3 (UnableToMakeFillingOrPayment). |
Block reason
reason is an integer. These are the values Worklio accepts:
| Value | Name | Description |
|---|---|---|
| 1 | WaitingForAuth | Company authorization process was not completed |
| 2 | MissingStateTaxAccountInfo | Certain state tax account information needed |
| 3 | UnableToMakeFillingOrPayment | Unable to make a filing or payment |
| 4 | NeededAdditionalDoc | Our team needs additional documentation |
| 5 | Other | Other reason |
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}/block`;
const payload = {
reason: 2, // MissingStateTaxAccountInfo
state: "IL"
};
async function blockCompany() {
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);
console.log(await response.text());
}
blockCompany();curl -s -X POST "https://api.worklio.com/wep/companies/$CLIENT_ID/block" \
-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 '{
"reason": 2,
"state": "IL"
}' | jq .Unblock a Company
Unblocks a company. This is a separate endpoint from Block a Company — it takes no request body.
Endpoint
POST https://api.worklio.com/wep/companies/{CLIENT_ID}/unblock
| Parameter | Type | Required | Description |
|---|---|---|---|
CLIENT_ID | integer | Yes | The company's id, as returned by Create a Company or Get Companies. Path parameter. |
No request body.
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}/unblock`;
async function unblockCompany() {
const response = await fetch(url, {
method: "POST",
headers: {
accept: "application/json",
"api-version": "2.0",
authorization: `Bearer ${TOKEN}`,
"x-api-version": "2.0"
}
});
console.log(response.status);
console.log(await response.text());
}
unblockCompany();curl -s -X POST "https://api.worklio.com/wep/companies/$CLIENT_ID/unblock" \
-H "accept: application/json" \
-H "api-version: 2.0" \
-H "authorization: Bearer $API_KEY" \
-H "x-api-version: 2.0" | jq .Updated 3 days ago
