Documentation Get help

Pagination, sorting and search

ListsPagingSortSearch
Employees, contractors, vacancies, teams, projects, custom attribute definitionspage, limitsortBy, sortDirsearch
Assignmentspage, limitsortDir (by start date)—
Functional groupsoffset, limitBy namesearch
Salary adjustments, contractor rate adjustmentsNone; full history——

Page-based lists

ParameterTypeDefault
pageinteger ≥ 11
limitinteger 1–10020
sortBystringper resourceUnrecognised values use the default.
sortDirasc | descasc
searchstring—Case-insensitive substring match.

An out-of-range page or limit, or any other sortDir, returns 400 VALIDATION_ERROR.

{
  "data": [ … ],
  "meta": { "page": 2, "limit": 50, "total": 142, "hasNextPage": true }
}

total counts every match across pages. Stop when hasNextPage is false:

async function* listAll(path) {
  for (let page = 1; ; page++) {
    const res = await fetch(`${BASE_URL}${path}?page=${page}&limit=100`, {
      headers: { Authorization: `Bearer ${process.env.FLOWSTATE_API_KEY}` },
    });
    const { data, meta } = await res.json();
    yield* data;
    if (!meta.hasNextPage) return;
  }
}

Paging is by position, so records created or deleted during a walk can shift between pages. For a full sync, sort by a stable field and match on externalId.

Sort and search fields

ResourcesortByDefaultsearch matches
EmployeeslastName, firstName, email, startDatelastNamefirstName, lastName, email
Contractorsname, email, contractorType, startDatenamename, email
Vacanciesrole, status, targetStartDate, targetEndDaterolerole, description
Teamsname, teamType, createdAtnamename, description
Projectsname, startDate, priority, projectCodenamename, description, projectCode
Custom attribute definitionssortOrder, name, createdAt, fieldTypesortOrdername, description
curl "https://{tenant}.flowstate.inc/api/v1/org/{orgId}/employees?search=chen&sortBy=startDate&sortDir=desc&limit=25" \
  -H "Authorization: Bearer $FLOWSTATE_API_KEY"

Assignments

GET /assignments/employees, /contractors, /vacancies and /teams take page, limit and sortDir, are ordered by startDate, and return meta. They list every assignment in the organisation; sortBy, search and filters are ignored.

For one record’s allocations, use include=assignments on GET /employees/{id}, GET /contractors/{id} or GET /vacancies/{id}.

Functional groups

GET /functional-groups:

ParameterDefault
offset0Groups to skip.
limit201–100.
search—Case-insensitive match on name or description, up to 255 characters.
parentId—Children of this group only.
rootsOnly—true for top-level groups only.
asOftodayYYYY-MM-DD.

Groups are ordered by name. The response has no meta; the count is in the body:

{ "data": { "groups": [ … ], "total": 37 } }

GET /functional-groups/tree returns the whole hierarchy, up to 500 groups, in one call. See Functional groups.

Unpaged lists

GET /employees/{id}/salary-adjustments and GET /contractors/{id}/rate-adjustments return the whole history as { "data": [ … ] }, with no meta.