Pagination, Filtering & Sorting

List endpoints on Worklio's v1.0 API (base path https://api.worklio.com/api/public/...) support pagination, filtering, and sorting through a shared set of parameters. This page documents that shared contract, using List Employees as a worked example. The /wep/... endpoints documented elsewhere in this guide — Get Companies, Workers' Compensation Rate — don't support these parameters; each of those returns its full result set on every call.

Every parameter below can be sent as a query-string parameter or as an x-api-* request header. The two styles can be mixed in the same request. If the same parameter is set both ways, the header value takes priority.

Auth

Requires a bearer access token (see How to Get API Access).

Two ways to paginate

Worklio supports two pagination styles: Data-Token-based, and skip-based (no token). They're not designed to be mixed within the same browsing session — pick one and stay on it while paging through a result set.

Data-Token-based pagination

The default and recommended approach. The first request returns a DataToken that encodes the query's filter, sort, and paging state on the server. Each following page request sends that token back instead of repeating the filter and sort parameters, and gets a new token in return.

  • The token expires 60 seconds after it's issued. Request the next page before it expires, or start over from page one.
  • TotalRecords and TotalPages are computed from the database once, on the first-page request, then carried forward via the token — they aren't recomputed on every page.

Request the first page

Query parameterHeaderTypeRequiredDescription
limitx-api-limitintegerYesPage size — records per page.
filterx-api-filterstringNoFilter query. See Filtering.
sortx-api-sortstringNoSort query. See Sorting.
include-deletedx-api-include-deletedbooleanNoInclude soft-deleted records. Only supported on entities that track a delete state.
GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25

or, with headers:

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees
x-api-limit: 25

Every response — first page or later — includes a Pagination object:

FieldTypeDescription
PageNointegerThe current page number.
PageSizeintegerRecords per page (echoes limit).
TotalRecordsintegerTotal records matching the filter. Computed once, on the first-page request.
TotalPagesintegerTotal number of pages.
DataTokenstringOpaque token to send with the next paging request. Expires 60 seconds after it's issued.

Request the next, previous, or a specific page

Send the DataToken from the previous response along with one of next-page, prev-page, or page. Filter and sort are already encoded in the token — don't resend them.

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?next-page&data-token={DataToken}
GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?prev-page&data-token={DataToken}
GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?page=3&data-token={DataToken}

or, with headers:

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees
x-api-next-page: true
x-api-data-token: {DataToken}
Query parameterHeaderTypeRequiredDescription
next-pagex-api-next-pageflagOne of these threeGet the next page.
prev-pagex-api-prev-pageflagGet the previous page.
pagex-api-pageintegerGet a specific page number.
data-tokenx-api-data-tokenstringYes, alongside any of the aboveThe DataToken returned by the previous response.

Skip-based pagination (no token)

An alternative to Data-Token pagination. Every request repeats its own limit, and — after the first page — its own skip. Nothing about the query is remembered server-side between requests: limit, filter, and sort must be sent identically on every page. If limit changes partway through, page boundaries shift and results aren't guaranteed to stay consistent.

First page

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25
GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&skip=0

Passing skip=0 explicitly, rather than omitting skip, suppresses the Pagination object in the response entirely.

Next pages

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&skip=25
Query parameterHeaderTypeRequiredDescription
limitx-api-limitintegerYesPage size. Must match the value used on the first request.
skipx-api-skipintegerYes, from the second page onNumber of records to skip.
filterx-api-filterstringNoSame filter query as the first page.
sortx-api-sortstringNoSame sort query as the first page.
include-deletedx-api-include-deletedbooleanNoInclude soft-deleted records, where supported.

No Pagination object is returned for skip-based requests beyond the bare first-page case above.

Filtering

Pass a filter query via the filter query parameter or the x-api-filter header. It can be combined with sort.

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&filter={FilterQuery}

or, with headers:

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees
x-api-limit: 25
x-api-filter: {FilterQuery}

A filter query is a sequence of operators separated by ;. At the top level, ; means AND. Inside a logical operator's parentheses, ; means whatever that operator specifies.

Logical operators

OperatorMeaning
Or(...)The enclosed operators are OR'd together instead of AND'd.
And(...)The enclosed operators are AND'd together — useful nested inside an Or(...).

Both can be combined and nested:

Number.GreaterThan(0);Or(Number.Equal(1);Number.Equal(3);Number.Equal(5);Number.Equal(7))
→ (Number > 0 AND (Number = 1 OR Number = 3 OR Number = 5 OR Number = 7))

Or(Ssn.Contains('xxx');And(Number.GreaterThan(0);Number.LessThan(100)))
→ (Ssn LIKE '%xxx%' OR (Number > 0 AND Number < 100))

Single-field operators

A parameter value is compared against one entity field.

OperatorSupported typesExample
Equalstring, numeric, datetimeEmail.Equal('[email protected]'), Number.Equal(123), CreatedOn.Equal(2020-01-01)
NotEqualstring, numeric, datetimeEmail.NotEqual('[email protected]')
LessThannumeric, datetimeNumber.LessThan(123)
LessThanOrEqualnumeric, datetimeNumber.LessThanOrEqual(123)
GreaterThannumeric, datetimeNumber.GreaterThan(123)
GreaterThanOrEqualnumeric, datetimeNumber.GreaterThanOrEqual(123)
ContainsstringEmail.Contains('jon.doe')
StartsWithstringEmail.StartsWith('jon')
EndsWithstringEmail.EndsWith('company.com')
NotContainsstringEmail.NotContains('jon.doe')
NotStartsWithstringEmail.NotStartsWith('jon')
NotEndsWithstringEmail.NotEndsWith('company.com')
IsNullstring, numeric, datetimeModifiedOn.IsNull()
IsNotNullstring, numeric, datetimeModifiedOn.IsNotNull()
InArraystring, numeric, datetimeYear.InArray(2018,2019,2020)field == array[1] OR field == array[2] OR ...
InArrayOrNullstring, numeric, datetimeYear.InArrayOrNull(2018,2019,2020) — same as InArray, plus OR field == null
NotInArraystring, numeric, datetimeYear.NotInArray(2018,2019,2020)field != array[1] AND field != array[2] AND ...
NotInArrayOrNullstring, numeric, datetimeYear.NotInArrayOrNull(2018,2019,2020) — same as NotInArray, OR'd with field == null

Quoting string values is optional: Email.Equal([email protected]) and Email.Equal('[email protected]') are equivalent.

Multi-field operators

A parameter value is compared against several entity fields at once, OR'd together.

OperatorSupported typesExample
EqualInFieldsstring, numeric, datetime'CodeX'.EqualInFields(Code1,Code2,Code3)field1 == value OR field2 == value OR ...
LessThanInFieldsnumeric, datetime500.LessThanInFields(Amount1,Amount2,Amount3)
LessThanOrEqualInFieldsnumeric, datetime500.LessThanOrEqualInFields(Amount1,Amount2,Amount3)
GreaterThanInFieldsnumeric, datetime500.GreaterThanInFields(Amount1,Amount2,Amount3)
GreaterThanOrEqualInFieldsnumeric, datetime500.GreaterThanOrEqualInFields(Amount1,Amount2,Amount3)
ContainsInFieldsstring'Jon'.ContainsInFields(FirstName,MiddleName)
StartsWithInFieldsstring'Jo'.StartsWithInFields(FirstName,MiddleName)
EndsWithInFieldsstring'n'.EndsWithInFields(FirstName,MiddleName)

Example

https://api.worklio.com/api/public/clients/${CLIENT_ID}/employees?limit=100&filter=CreatedOn.GreaterThanOrEqual(2020-01-01);FirstName.Equal('John')

is equivalent to:

Status == Active AND CreatedOn >= 2020-01-01 AND FirstName == "John"

Filtering with deleted records

RowStatus.Equal(2)         → deleted records only
RowStatus.InArray(1,2)     → valid and deleted records

Sorting

Pass a sort query via the sort query parameter or the x-api-sort header. It can be combined with filter.

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&sort={SortQuery}
GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&filter={FilterQuery}&sort={SortQuery}

or, with headers:

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees
x-api-limit: 25
x-api-sort: {SortQuery}

A sort query supports multiple fields, each set to Asc or Desc, separated by ;:

Status=Asc
CreatedOn=Desc
Status=Asc;CreatedOn=Desc

Worked example: List Employees

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees

Example request

require("dotenv").config();

const TOKEN = process.env.API_KEY;
const CLIENT_ID = 1028;
const url = `https://api.worklio.com/api/public/clients/${CLIENT_ID}/employees?limit=1`;

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

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

listEmployees();
curl -s -X GET "https://api.worklio.com/api/public/clients/1028/employees?limit=1" \
  -H "accept: application/json" \
  -H "api-version: 1.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 1.0" | jq .

Example response

{
  "Data": [
    {
      "W2Id": 3698,
      "ClientId": 1028,
      "EmployeeNumber": 1,
      "FirstName": "Michael",
      "LastName": "Brown",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "223584084",
      "BirthOn": "1990-07-14T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "ResidentialAddressId": 6000,
      "PeoHireDate": "2026-09-01T00:00:00Z",
      "OrigHireDate": "2026-09-01T00:00:00Z",
      "LastPaidOn": "2026-09-18T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-01T00:00:00Z",
      "LastEarnedWagesOn": "2026-09-18T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4277,
      "CreatedOn": "2026-09-11T11:30:21Z",
      "ModifiedOn": "2026-09-11T11:30:21Z",
      "RowStatus": 1,
      "Files": []
    },
    {
      "W2Id": 3701,
      "ClientId": 1028,
      "EmployeeNumber": 2,
      "FirstName": "Michael",
      "LastName": "Red",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "223584024",
      "BirthOn": "1990-07-14T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "ResidentialAddressId": 6001,
      "PeoHireDate": "2026-09-01T00:00:00Z",
      "OrigHireDate": "2026-09-01T00:00:00Z",
      "LastPaidOn": "2026-09-18T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-01T00:00:00Z",
      "LastEarnedWagesOn": "2026-09-18T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4278,
      "CreatedOn": "2026-09-11T11:43:39Z",
      "ModifiedOn": "2026-09-11T11:43:39Z",
      "RowStatus": 1,
      "Files": []
    },
    {
      "W2Id": 3716,
      "ClientId": 1028,
      "EmployeeNumber": 4,
      "FirstName": "Michael",
      "LastName": "Blue",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "211114084",
      "BirthOn": "1990-07-14T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "ResidentialAddressId": 6050,
      "PeoHireDate": "2026-09-08T00:00:00Z",
      "OrigHireDate": "2026-09-08T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-08T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4297,
      "CreatedOn": "2026-09-17T12:00:49Z",
      "ModifiedOn": "2026-09-17T12:00:50Z",
      "RowStatus": 1,
      "Files": []
    }
  ],
  "Status": 1,
  "Code": "200",
  "ErrorCode": "",
  "Message": "OK",
  "StackTrace": "",
  "Pagination": {
    "PageNo": 1,
    "PageSize": 3,
    "TotalRecords": 7,
    "TotalPages": 3,
    "DataToken": "Inj_iZ4klS-VYtwZgW0X5GdH9ZZwixPoB_0R1l4GzoJ5v-jzz1nF_yx09ujjIAeLmZoTGSePhmDnemBvmz2Phlohi0jg8S8LSlWdPBNOQ3luFqw799-XwBXfzD1sM94TTPs6dQtxa119cbsjZ-h41ceVQXYhuUQzMIc91J5QpTxEogIbr-k04RgFi8M6yTmZxKtzQF8rmAMZzF6uXt5AzCA@@"
  }
}

Error response — invalid or missing next-page

{
  "Status": 3,
  "Code": "DataValidationError",
  "ErrorCode": "",
  "Message": "One or more validation errors occurred.\r\nnext-page: [The value '' is invalid.]",
  "StackTrace": "",
  "Pagination": {
    "PageNo": 0,
    "PageSize": 0,
    "TotalRecords": 0,
    "TotalPages": 0,
    "DataToken": ""
  },
  "ValidationErrors": {
    "next-page": [
      [
        "validation_error",
        "The value '' is invalid."
      ]
    ]
  }
}

Returned when next-page is requested without a valid page to advance to — for example, calling it with no data-token, or past the last page of results.

Worked example: Filtering

Filters the same employees list used above down to records whose LastName matches, using the Equal operator.

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&filter=LastName.Equal('Brown')

Example request

require("dotenv").config();
 
const TOKEN = process.env.API_KEY;
const CLIENT_ID = 1028;
const filter = "LastName.Equal('Brown')";
const url = `https://api.worklio.com/api/public/clients/${CLIENT_ID}/employees?limit=25&filter=${encodeURIComponent(filter)}`;
 
async function listEmployeesFiltered() {
  const response = await fetch(url, {
    method: "GET",
    headers: {
      accept: "application/json",
      "api-version": "1.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/json",
      "x-api-version": "1.0"
    },
  });
 
  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}
 
listEmployeesFiltered();
curl -s -G "https://api.worklio.com/api/public/clients/1028/employees" \
  --data-urlencode "limit=25" \
  --data-urlencode "filter=LastName.Equal('Brown')" \
  -H "accept: application/json" \
  -H "api-version: 1.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 1.0" | jq .

Example response

{
  "Data": [
    {
      "W2Id": 3698,
      "ClientId": 1028,
      "EmployeeNumber": 1,
      "FirstName": "Michael",
      "LastName": "Brown",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "223584084",
      "BirthOn": "1990-07-14T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "ResidentialAddressId": 6000,
      "PeoHireDate": "2026-09-01T00:00:00Z",
      "OrigHireDate": "2026-09-01T00:00:00Z",
      "LastPaidOn": "2026-09-18T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-01T00:00:00Z",
      "LastEarnedWagesOn": "2026-09-18T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4277,
      "CreatedOn": "2026-09-11T11:30:21Z",
      "ModifiedOn": "2026-09-11T11:30:21Z",
      "RowStatus": 1,
      "Files": []
    } 
  ],
  "Status": 1,
  "Code": "200",
  "ErrorCode": "",
  "Message": "OK",
  "StackTrace": "",
  "Pagination": {
    "PageNo": 1,
    "PageSize": 3,
    "TotalRecords": 7,
    "TotalPages": 3,
    "DataToken": "Inj_iZ4klS-VYtwZgW0X5GdH9ZZwixPoB_0R1l4GzoJ5v-jzz1nF_yx09ujjIAeLmZoTGSePhmDnemBvmz2Phlohi0jg8S8LSlWdPBNOQ3luFqw799-XwBXfzD1sM94TTPs6dQtxa119cbsjZ-h41ceVQXYhuUQzMIc91J5QpTxEogIbr-k04RgFi8M6yTmZxKtzQF8rmAMZzF6uXt5AzCA@@"
  }
}

Worked example: Sorting

Sorts the same employees list by CreatedOn, descending.

GET https://api.worklio.com/api/public/clients/{CLIENT_ID}/employees?limit=25&sort=CreatedOn=Desc

Example request

require("dotenv").config();
 
const TOKEN = process.env.API_KEY;
const CLIENT_ID = 1028;
const sort = "CreatedOn=Desc";
const url = `https://api.worklio.com/api/public/clients/${CLIENT_ID}/employees?limit=25&sort=${encodeURIComponent(sort)}`;
 
async function listEmployeesSorted() {
  const response = await fetch(url, {
    method: "GET",
    headers: {
      accept: "application/json",
      "api-version": "1.0",
      authorization: `Bearer ${TOKEN}`,
      "content-type": "application/json",
      "x-api-version": "1.0"
    },
  });
 
  console.log(response.status);
  const raw = await response.text();
  console.log(JSON.stringify(JSON.parse(raw), null, 2));
}
 
listEmployeesSorted();
curl -s -G "https://api.worklio.com/api/public/clients/1028/employees" \
  --data-urlencode "limit=25" \
  --data-urlencode "sort=CreatedOn=Desc" \
  -H "accept: application/json" \
  -H "api-version: 1.0" \
  -H "authorization: Bearer $API_KEY" \
  -H "content-type: application/json" \
  -H "x-api-version: 1.0" | jq .

Example response

{
  "Data": [
    {
      "W2Id": 3725,
      "ClientId": 1028,
      "EmployeeNumber": 8,
      "FirstName": "Amy",
      "LastName": "Nguyen",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "123222281",
      "BirthOn": "1988-02-23T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4306,
      "CreatedOn": "2026-09-17T12:08:48Z",
      "ModifiedOn": "2026-09-17T12:08:48Z",
      "RowStatus": 1,
      "Files": []
    }, 
    {
      "W2Id": 3723,
      "ClientId": 1028,
      "EmployeeNumber": 6,
      "FirstName": "Sarah",
      "LastName": "Nguyen",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "122222281",
      "BirthOn": "1988-02-23T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "PeoHireDate": "2026-09-08T00:00:00Z",
      "OrigHireDate": "2026-09-08T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-08T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4304,
      "CreatedOn": "2026-09-17T12:05:20Z",
      "ModifiedOn": "2026-09-17T12:05:20Z",
      "RowStatus": 1,
      "Files": []
    },  
    {
      "W2Id": 3698,
      "ClientId": 1028,
      "EmployeeNumber": 1,
      "FirstName": "Michael",
      "LastName": "Brown",
      "MiddleName": "",
      "OtherNames": "",
      "NickName": "",
      "Suffix": "",
      "Ssn": "223584084",
      "BirthOn": "1990-07-14T00:00:00Z",
      "PersonalEmail": "",
      "WorkEmail": "",
      "PersonalPhone": "",
      "CellPhone": "",
      "WorkPhone": "",
      "WorkCellPhone": "",
      "ResidentialAddressId": 6000,
      "PeoHireDate": "2026-09-01T00:00:00Z",
      "OrigHireDate": "2026-09-01T00:00:00Z",
      "LastPaidOn": "2026-09-18T00:00:00Z",
      "EePortal": false,
      "IdentificationType": 1,
      "DrivingLicense": "",
      "DrivingLicenseClass": "",
      "DrivingLicenseState": "  ",
      "ClockNumber": "",
      "BenefitWaitPeriodStart": "2026-09-01T00:00:00Z",
      "LastEarnedWagesOn": "2026-09-18T00:00:00Z",
      "EligibleForRehire": false,
      "EligibleFor401k": false,
      "SetupFeeCharged": false,
      "TerminationFeeCharged": false,
      "VeteranStatus": 0,
      "ForcePrintPaystub": false,
      "Handicaped": false,
      "Blind": false,
      "Deceased": false,
      "HCE": false,
      "Citizenship": 1,
      "VisaType": "",
      "Checklist": 959,
      "Source": 1,
      "Id": 4277,
      "CreatedOn": "2026-09-11T11:30:21Z",
      "ModifiedOn": "2026-09-11T11:30:21Z",
      "RowStatus": 1,
      "Files": []
    }
  ],
  "Status": 1,
  "Code": "200",
  "ErrorCode": "",
  "Message": "OK",
  "StackTrace": "",
  "Pagination": {
    "PageNo": 1,
    "PageSize": 25,
    "TotalRecords": 7,
    "TotalPages": 1,
    "DataToken": "xk7FaGUGFYi9Qy_yNIeRrxRxb9VP6dwRETucJzOxlvUbRuj7yf0aRhtzFsiODUtL4SWbSeXa9Kc9c0fhwgdVd5_bsMo_GAurJd_mW3CrzJXBcxsqDbF1dp5eEctqyD-Tg5eJeS8FLVgC4t_pqwoBbzF_PFGRWh5jZN2Z-90cGwEkcMudu0kMAmhpfEDz70-3cY3IrMmiFi7xKeHk6kIUrxvAf"
  }
}

Notes

  • Field casing in this API family's responses is PascalCase (Data, Pagination, PageNo, TotalRecords, ...). This differs from the camelCase envelope used on the /wep/... endpoints documented elsewhere in this guide (e.g. pagination.pageNo in Create a Pay Allocation). That's not an inconsistency to fix — /api/public/... and /wep/... are separate API families with their own conventions.
  • next-page, prev-page, and page all require a valid data-token from a prior response. Calling any of them without one, or past the last page, returns 400 DataValidationError rather than an empty result set.

Did this page help you?