List Employees
/unified/hris/employees
Partial response — use the "get" endpoint for the full object.
Query Parameters
Refer Specifying query parameters in Truto APIs
This represents the company
3 supported1 required2 notes
The company to use, referencing companies.id. Optional: when omitted the account's company is looked up automatically. The request fails if the account can see more than one company and none is given.
The Paychex company to use, referencing companies.id (Paychex companyId). A company pinned on the connection (company_id in the integrated account context) always wins and this parameter is then ignored. Otherwise, when omitted, the credential's companies are looked up and the single company with API permission is used. The request fails with a 400 when no company can be resolved (the credential sees more than one company with API permission, none, or 100 or more companies).
The unique identifier for companies
Flat alternative to company.id.
2 supported
This represents the employment status. If no clear mapping is available, then the raw value is returned.
activeallexcludedinactivenewHireon_leavependingretiredterminated
22 supported9 notes
activeinactiveFilter by employment status. When omitted, both active and inactive employees are returned.
activeinactivependingFilter by Deel person status: active (ACTIVE), pending (NOT_STARTED) or inactive (INACTIVE). Needs the Deel people_person_status.view permission on the token.
activeinactiveallactiveallactiveinactiveallnewHireactiveinactiveactiveinactivependingFilter by employment status. One value is sent to Justworks as status (active -> active, inactive -> terminated). Justworks' status takes one value, so active and inactive together are read without it and the requested set is kept from each page, which can come back with fewer records than the limit, or none, and still have a next_cursor. Justworks has no pending status, so pending (or any other value) alone returns an empty list without calling Justworks. A member is returned only when its mapped employment_status is one you asked for, so a member whose status is not visible is left out while this filter is set. Accepts one value, a comma-separated list, a repeated employment_status[]=… (or employment_status=… twice) and employment_status[eq]= / employment_status[in]=. A form that cannot be read (another operator, a nested value) is refused with a 400 that names the filter: it is never treated as no filter, which would return everything. Vendors and third-party admins (Justworks member types vendor and third_party_admin) are not listed: they are not workers. Owners, contractors and every employee type are listed. The type is Member.type (member.detail:read), else current_employment.type (member.employment:read); a member whose type is not visible is listed. Justworks has no type filter, so they are removed from each page after it is read (a page can come back with fewer records than the limit, or none, and still have a next_cursor). employees.get still returns any member by id. Fields behind optional Justworks OAuth scopes are silently absent when the connection lacks the scope (Justworks omits them, no error): emails/phones/home_location/manager need member.detail:read, date_of_birth member.dob:read, employments and termination_date member.employment:read, pay on employments member.pay:read, the work_location address company.detail:read.
activeinactivependingFilter by status. pending is a disabled user whose start date is after today (UTC): a future starter, which Kallidus's HR connectors create as a disabled user that becomes active on the start date. inactive is every other disabled user. active is sent as the OData filter isEnabled eq true. inactive and pending are both sent as isEnabled eq false, because Kallidus stores no pending flag and cannot filter users by start date; each page is then filtered by this mapping, which keeps only the statuses you asked for. A page can therefore hold fewer records than limit, or none, while next_cursor continues: keep paging until next_cursor is null. Repeat the parameter for several statuses (active together with inactive or pending sends no status filter to Kallidus; the page is filtered the same way). Any other value returns an empty list without calling Kallidus; unsupported values next to supported ones are ignored. Several statuses: repeat the parameter, employment_status[]=active, employment_status=active,inactive or employment_status[in]=active,inactive; employment_status[eq]= is the same as employment_status=. employment_status[ne]= and employment_status[nin]=a,b exclude instead, leaving the other statuses of the list above (active, inactive, pending); excluding all three returns an empty list without calling Kallidus. Any other form (employment_status[gte], employment_status[like], ...) is refused with a 400 instead of being dropped, which would have returned every user. Kallidus isEnabled also means the user holds a Learn licence and can sign in. When omitted, no status filter is sent (Kallidus does not document whether disabled users are then included; INFERRED yes). Every record on this list is partial (is_partial_response): groups holds only the primary group, without its name, and there is no manager or job_title; employees.get returns them, with every group the employee belongs to.
activeinactiveactiveinactivependingFilter by employment status, sent as Omni's employment_status codes: active = 1, pending = 2 (Onboarding / not started), inactive = 3 (Terminated). The codes are INFERRED from Omni's web app (the spec lists no values). Several statuses: comma-separated, repeated, [] or [in] (sent comma-separated); [eq] is one status. Values that are not one of the three are ignored, and if no value is one of the three the list is empty without calling Omni. Any other operator is refused with a 400. Without this filter Omni's own default applies; whether it includes terminated employees is undocumented.
activeinactivependingReturns exactly the employees whose employment_status is one of the values given: active = status type Active or Leave of Absence, inactive = Terminated; employees whose status type is unknown are returned by no value. One value, a comma-joined list, repeated values (employment_status[] or employment_status=a&employment_status=b), employment_status[eq] or employment_status[in]; any other form is refused with a 400 before Paylocity is called. Paylocity's only employee filter (activeOnly=true) leaves out employees on leave and it cannot select terminated employees, so every employee is read page by page (activeOnly=false) and the others are left out of each page after it is read: a page can be short or empty while next_cursor is still set, so keep paging until next_cursor is empty. pending matches no employee (the Employee API has no pending status), nor does any other value: when no value given can match, the list is empty and Paylocity is not called. Without this filter (or with an empty value) every employee is returned, terminated employees included (activeOnly=false is sent: Paylocity documents no default).
activeterminatedon_leaveretiredexcludedactiveinactivependingFilter by employment status: active (Remote active/offboarding), inactive (archived), pending (not onboarded yet); several values can be comma-separated. Any other value is sent to Remote's status filter unchanged (for example a Remote status such as deleted), so Remote filters on it or rejects it. Filtering switches to Remote's summary list, so records are partial (no manager, start date, company, addresses or timestamps; fetch employees.get for those).
activeinactiveactive or inactive (Sesame status[in]); active,inactive returns both. When omitted, Truto sends status[in]=active,inactive so inactive employees are included: Sesame alone returns only active employees. Inactive covers deactivated employees and hires whose contract has not started yet (Sesame keeps them disabled until then). Any other value returns an empty list, since no record is ever mapped to it. Accepts a plain value, a comma-separated list, repeated keys and [eq]/[in]; any other operator is refused (400) rather than dropped.
activeinactivependingactive returns people whose current UKG employment status is Active (UKG employmentStatus filter). inactive returns people whose current status is Inactive or Terminated: UKG's filter takes a single status, so every person is paged through and the others are left out of each page after it is read (pages can be short or empty while next_cursor is still set; keep paging). terminated is accepted as a spelling of inactive. Asking for active and inactive together pages everyone and leaves out only the people with no employee status (UKG's 'Not Applicable'). UKG has no pending (pre-hire) status, so pending returns an empty list without calling UKG — and so does any other value: a value UKG cannot match never returns everyone. When omitted, every person the API user may see is returned, including terminated people and user accounts without an employee status. Accepts one value, several comma-separated, a repeated key (x[]=a&x[]=b) or an eq/in filter; a filter form UKG cannot express is refused with 400 rather than ignored.
This represents the work location
5 supported4 notes
Filter by location (locations.id). Cannot be combined with groups or job_role.
This represents the work location
Filter by work location (locations.id). Ignored when employee_number is given. Paychex does not page filtered requests, so all workers at the location come back in one page; no match returns an empty list. Not available on Truto sandbox integrated accounts: a filtered request goes through a custom proxy method, which Truto rejects for sandbox accounts (405).
Only employees assigned to this office (locations.id, Sesame officeIds); several ids are sent as Sesame's comma-separated list. Accepts a plain value, a comma-separated list, repeated keys and [eq]/[in]; any other operator is refused (400) rather than dropped.
The unique identifier for locations
This represents the groups
7 supported4 notes
Filter by department (groups.id). Cannot be combined with work_location or job_role.
Filter by Deel Group (groups.id of a group with type group). Departments cannot be used here.
This represents the groups
Only employees assigned to this group (groups.id). department: filters by department (Sesame departmentIds), entity_group: by entity group (entityGroupIds); an id without a prefix is treated as a department id. Several ids of the same family are sent as Sesame's comma-separated list; ids from both families in one call are refused (400), since Sesame would AND them. An unknown prefix returns an empty list. Accepts a plain value, a comma-separated list, repeated keys and [eq]/[in]; any other operator is refused (400) rather than dropped.
The unique identifier for groups
Group's name
Type of the group. Some underlying providers use this to differentiate between in-built and user created groups.
Filter by role (job_roles.id). Cannot be combined with work_location or groups.
1 supported
This represents the name of the employee
11 supported5 notes
Filter by a full or partial name.
Search people by name (Deel search).
Free-text search, sent as Omni's search parameter ("A search term."). Which fields Omni matches is undocumented (at least names). One term (a plain value or a one-element array); several terms or an operator such as [eq] cannot be expressed as a search and are refused with a 400.
Partial match on the full name (each word matched, case- and accent-insensitive). Returns partial records, see employment_status.
Search workers by name or Workday worker ID (case-insensitive; space-separated terms are ORed). Workday matches names that start with the term.
This represents the date when the Employee was updated
14 supported2 notes
Return records modified on or after this date. Accepts an ISO date-time string, or an object with gte or gt. The bound is inclusive: gt is treated as gte. 7shifts filters by date only, so the value is converted to its UTC date and the time part is then ignored.
Members updated in a window. A plain value or gte/gt is the lower bound, sent as updated_at_gte; lte/lt is the upper bound, sent as updated_at_lte (gt and lt are treated as inclusive). eq: a date is sent as Justworks' exact-day updated_at; a date-time is read as both bounds (gte and lte of that instant). ne: sent as updated_at_ne, which leaves out members updated on that day; it needs a date, because no day filter can leave out a single instant, so any other value is refused with a 400. Justworks filters by calendar day only and does not document the time zone or the inclusivity of these day filters: a date (YYYY-MM-DD) is sent as is, and a date-time bound is converted to its UTC date and widened by one day outward, so no member updated in the window is missed. Expect members from the boundary days. A value that is neither a date nor a date-time is sent unchanged, so Justworks rejects it; an operator this filter does not support, or a list, is refused with a 400. Nothing is ever dropped silently.
Represents the manager of the employee. Is also an employee.
2 supported
The unique identifier for employees
This represents the employee number
10 supported5 notes
Only the persons with these personnel numbers (employees.employee_number). Sent as persons=&personIdentifierType=personnelNumber; HR WORKS then returns those persons whatever their status (include_inactive is ignored). An unknown number returns an empty list. Several values are supported: repeat the parameter, separate them with commas, use the [] form, or the operator forms [eq] / [in]. Any other form (for example [ne] or a nested object) is refused with a 400 instead of being ignored, so a filter Truto cannot express never returns unfiltered data.
Filter by employee number (the Kallidus Import Key). Exact, whole-value match sent as the OData filter importKey eq '' (Kallidus has no partial match; case sensitivity is not documented). Combined with the other filters using and. Several values mean any of them: Kallidus has no or, so no importKey condition is sent and this mapping keeps the matching records itself (comparing case-insensitively) — a page can come back short or empty while next_cursor continues, so keep paging until next_cursor is null. The other filters still narrow the query at Kallidus. Accepted forms: employee_number=, employee_number[]= or a repeated employee_number, employee_number[eq]= and employee_number[in]=a,b, all meaning any of the values. employee_number[ne]= and employee_number[nin]=a,b exclude instead, sent as the OData filter importKey ne '' (ANDed: none of them). A comma separates values only inside [in]; anywhere else it is part of the value. Any other form (employee_number[gte], employee_number[like], ...) is refused with a 400 instead of being dropped.
Filter by the Paychex employee ID (employees.employee_number). Paychex does not page filtered requests, so all matches come back in one page; no match returns an empty list. Not available on Truto sandbox integrated accounts: a filtered request goes through a custom proxy method, which Truto rejects for sandbox accounts (405).
Match on the Remote short ID (employees.employee_number); returns at most one employee. Returns partial records, see employment_status.
Employee code (Sesame code filter, an integer). Sesame's code filter takes one value, so several are refused (400); a value that is not a whole number returns an empty list without calling Sesame. Accepts a plain value, a comma-separated list, repeated keys and [eq]/[in]; any other operator is refused (400) rather than dropped.
Filter by first name. Exact, whole-value match sent as the OData filter givenName eq '' (Kallidus has no partial match; case sensitivity is not documented). Combined with the other filters using and. Several values mean any of them: Kallidus has no or, so no givenName condition is sent and this mapping keeps the matching records itself (comparing case-insensitively) — a page can come back short or empty while next_cursor continues, so keep paging until next_cursor is null. The other filters still narrow the query at Kallidus. Accepted forms: first_name=, first_name[]= or a repeated first_name, first_name[eq]= and first_name[in]=a,b, all meaning any of the values. first_name[ne]= and first_name[nin]=a,b exclude instead, sent as the OData filter givenName ne '' (ANDed: none of them). A comma separates values only inside [in]; anywhere else it is part of the value. Any other form (first_name[gte], first_name[like], ...) is refused with a 400 instead of being dropped.
5 supported
Filter by last name. Exact, whole-value match sent as the OData filter familyName eq '' (Kallidus has no partial match; case sensitivity is not documented). Combined with the other filters using and. Several values mean any of them: Kallidus has no or, so no familyName condition is sent and this mapping keeps the matching records itself (comparing case-insensitively) — a page can come back short or empty while next_cursor continues, so keep paging until next_cursor is null. The other filters still narrow the query at Kallidus. Accepted forms: last_name=, last_name[]= or a repeated last_name, last_name[eq]= and last_name[in]=a,b, all meaning any of the values. last_name[ne]= and last_name[nin]=a,b exclude instead, sent as the OData filter familyName ne '' (ANDed: none of them). A comma separates values only inside [in]; anywhere else it is part of the value. Any other form (last_name[gte], last_name[like], ...) is refused with a 400 instead of being dropped.
5 supported
When updated_at is provided, the emails query parameter is ignored.
9 supported
The email address
The phones of the user
2 supported
The phone number
This represents the date when the Employee was created
5 supported
This represents the start date
3 supported
This represents the termination date
3 supported
Flat alternative to groups.id.
2 supported
This represents gender
1 supported
The employee's tags
1 supported
The tag's unique identifier
Also return persons who have left the company and were set to gone in HR WORKS (sent as onlyActive=false). By default only active persons are returned (onlyActive=true is sent); a person whose first working day is still in the future counts as active for HR WORKS and is returned by default (Truto reports them as employment_status pending). Deleted persons are never returned. Ignored when a person filter is given: HR WORKS then returns the requested person whatever their status. Accepts true/false in any letter case, also as [eq]; any other value or form (several values, [ne], a nested object) is refused with a 400 instead of being read as false.
1 supported
4 supported4 notes
Filter by email address. Exact, whole-value match sent as the OData filter emailAddress eq '' (Kallidus has no partial match; case sensitivity is not documented). Combined with the other filters using and. Several values mean any of them: Kallidus has no or, so no emailAddress condition is sent and this mapping keeps the matching records itself (comparing case-insensitively) — a page can come back short or empty while next_cursor continues, so keep paging until next_cursor is null. The other filters still narrow the query at Kallidus. Accepted forms: email=, email[]= or a repeated email, email[eq]= and email[in]=a,b, all meaning any of the values. email[ne]= and email[nin]=a,b exclude instead, sent as the OData filter emailAddress ne '' (ANDed: none of them). A comma separates values only inside [in]; anywhere else it is part of the value. Any other form (email[gte], email[like], ...) is refused with a 400 instead of being dropped.
Return collaborators with this email on one of their contracts (PayFit does not match the login email).
Exact match on the login email. Returns partial records, see employment_status.
Exact login email (Sesame email filter). Sesame's email filter takes one address, so several are refused (400). Accepts a plain value, a comma-separated list, repeated keys and [eq]/[in]; any other operator is refused (400) rather than dropped.
Filter by username (the Kallidus sign-in name). Exact, whole-value match sent as the OData filter username eq '' (Kallidus has no partial match; case sensitivity is not documented). Combined with the other filters using and. Several values mean any of them: Kallidus has no or, so no username condition is sent and this mapping keeps the matching records itself (comparing case-insensitively) — a page can come back short or empty while next_cursor continues, so keep paging until next_cursor is null. The other filters still narrow the query at Kallidus. Accepted forms: username=, username[]= or a repeated username, username[eq]= and username[in]=a,b, all meaning any of the values. username[ne]= and username[nin]=a,b exclude instead, sent as the OData filter username ne '' (ANDed: none of them). A comma separates values only inside [in]; anywhere else it is part of the value. Any other form (username[gte], username[like], ...) is refused with a 400 instead of being dropped.
1 supported
Select the product for which you want to retrieve the employees.
azure_active_directory
1 supported
Job title of the employee
1 supported
This represents the middle name of the employee
1 supported
1 supported
This represents the date when the Employee was created
ascdesc
1 supported
This represents the first name of the employee
ascdesc
1 supported
This represents the last name of the employee
ascdesc
1 supported
This represents the date when the Employee was updated
ascdesc
1 supported
Flat alternative to work_location.id.
1 supported
Include terminated workers. By default Workday returns only current workers, and every record is returned with employment_status active; with include_terminated=true employment_status is left empty because Workday REST does not say which workers are terminated.
1 supported
Show Truto-specific parameters
The ID of the integrated account to use for the request.
62f44730-dd91-461e-bd6a-aedd9e0ad79dThe format of the response.
unifiedreturns the response with unified mappings applied.rawreturns the unprocessed, raw response from the remote API.normalizedapplies the unified mappings and returns the data in a normalized format.streamreturns the response as a stream, which is ideal for transmitting large datasets, files, or binary data. Using streaming mode helps to efficiently handle large payloads or real-time data flows without requiring the entire data to be buffered in memory.debugreturns the final unified result alongside raw remote fetch information. The response is an envelope containingresult(identical to unified mode output) anddebug(withrequestUrl,requestOptions,data,responseHeaders, and for list operations:nextCursor,isLooping,isEmptyResult,resultCount). When the upstream body exceeds 1 MiB,datais replaced by{ truto_truncated: true, truto_max_bytes, truto_excerpt }.debugisnullfor static responses or whentruto_skip_api_call=true.
Defaults to unified.
unifiedunifiedrawnormalizedstreamdebug
By default the result attribute is an array of objects. This parameter allows you to specify a field in each result objects to use as key, which transforms the result array into an object with the array items keyed by the field. This is useful for when you want to use the result as a lookup table.
idIgnores the limit query parameter.
Excludes the remote_data attribute from the response.
Array of fields to exclude from the response.
truto_exclude_fields[]=id&truto_exclude_fields[]=nameQuery parameters to pass to the underlying API without any transformations. Refer this guide to see how to structure the query parameters.
remote_query[foo]=barResponse Body
Present only when truto_response_format=debug. Contains raw fetch details: requestUrl, requestOptions, data, responseHeaders, nextCursor, isLooping, isEmptyResult, resultCount. data is the parsed upstream body; when its JSON form exceeds 1 MiB it is replaced by { truto_truncated: true, truto_max_bytes, truto_excerpt }, where truto_excerpt is the leading bytes of that body. The same applies to a string requestOptions.body. null for static responses or when truto_skip_api_call=true.
The cursor to use for the next page of results. Pass this value as next_cursor in the query parameter in the next request to get the next page of results.
List of Employees
The unique identifier for employees
57 supported
This represents the avatar
16 supported
This represents the company
22 supported
1 property
The unique identifier for companies
This represents the date when the Employee was created
32 supported
This represents date of birth
41 supported
The emails of the user
56 supported
3 properties
The email address
Whether the email address is primary
The type of email address
This represents the employee number
46 supported
This represents the employment status. If no clear mapping is available, then the raw value is returned.
activeinactivepending
49 supported
Represents a role or employment of the employee in the company
32 supported
15 properties
The unique identifier for employments
This represents the date when the employments was created
Represents the effective date of the employment
Employee associated with this employment
1 property
The unique identifier for employees
This represents the employment type
full_timepart_timecontractinternshiptemporarytraineevolunteerper_diem
Represents the end date of the employment
Represents why the employment ended
This represents the flsa status
Job title of the employee
This represents the pay currency
This represents the pay frequency
This represents the pay group
This represents the pay period
This represents the pay rate
This represents the date when the employments was updated
The unique identifier for the specific version of the resource.
1 supported
This represent ethnicity
10 supported
This represents the first name of the employee
52 supported
This represents gender
30 supported
This represents the groups
42 supported
3 properties
The unique identifier for groups
Group's name
Type of the group. Some underlying providers use this to differentiate between in-built and user created groups.
This represents the home location
29 supported
8 properties
The city of the home address
The country of the home address
The unique identifier for locations
This represents the name of the location
The postal code of the home address
The state/province of the home address
The first line of home address
The second line of home address
Job title of the employee
36 supported
This represents the last name of the employee
52 supported
Represents the manager of the employee. Is also an employee.
40 supported
2 properties
The unique identifier for employees
This represents the name of the employee
This represents marital status
12 supported
This represents the middle name of the employee
19 supported
This represents the name of the employee
54 supported
This represents the pay group
6 supported
1 property
The unique identifier for pay groups
The phones of the user
50 supported
3 properties
The extension of the phone number
The phone number
The type of phone number
Raw data returned from the remote API call.
This represents the ssn
11 supported
This represents the start date
43 supported
The employee's tags
2 supported
2 properties
The tag's unique identifier
The tag's name
This represents the termination date
40 supported
Represents the reason for termination
14 supported
Represents the type of termination. If no clear mapping exists, then raw value is returned.
voluntarydismissedredundancyend_of_contractretirementmutual
12 supported
This represents the date when the Employee was updated
31 supported
This represents the username
13 supported
This represents the work location
29 supported
8 properties
The city of the work address
The country of the work address
The unique identifier for locations
This represents the name of the location
The postal code of the work address
The state/province of the work address
The first line of work address
The second line of work address
truto unified hris employees \
-a '<integrated_account_id>' \
-o jsonimport Truto from '@truto/truto-ts-sdk';
const truto = new Truto({
token: '<your_api_token>',
});
const result = await truto.unifiedApi.list(
'hris',
'employees',
{ integrated_account_id: '<integrated_account_id>' }
);
console.log(result);import asyncio
from truto_python_sdk import TrutoApi
truto_api = TrutoApi(token="<your_api_token>")
async def main():
async for item in truto_api.unified_api.list(
"hris",
"employees",
{"integrated_account_id": "<integrated_account_id>"}
):
print(item)
asyncio.run(main())curl -X GET 'https://api.truto.one/unified/hris/employees?integrated_account_id=<integrated_account_id>' \
-H 'Authorization: Bearer <your_api_token>' \
-H 'Content-Type: application/json'const integratedAccountId = '<integrated_account_id>';
const response = await fetch(`https://api.truto.one/unified/hris/employees?integrated_account_id=${integratedAccountId}`, {
method: 'GET',
headers: {
'Authorization': 'Bearer <your_api_token>',
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);import requests
url = "https://api.truto.one/unified/hris/employees"
headers = {
"Authorization": "Bearer <your_api_token>",
"Content-Type": "application/json",
}
params = {
"integrated_account_id": "<integrated_account_id>"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())