POST /v2/own-workforce/employees creates employees with their contracts and remunerations, and trainings and absences have their own v2 routes (POST /v2/own-workforce/trainings, POST /v2/own-workforce/absences). To load a file, the Imports API exposes these templates:
There is no endpoint that lists the available
template_id values. Get Template fetches one by id, but there is no catalogue to enumerate them. These ids are only discoverable from this page, so treat them as the reference.template_id and your file, map the columns, validate, correct rows if needed, then submit. Submission is asynchronous — poll the status.
Order matters
own_workforce_trainings and own_workforce_accidents_absenteeisms attach rows to an employee by external_employee_id, and the accepted values are the employees that already exist in the organization. Import own_workforce first; the other two will reject rows for people the system does not know yet.
A note on “required”
In the Get Template response,required: true appears only for columns with a hard required rule. Columns that are conditionally required — through required_with or required_without — come back as required: false, with the condition inside validations. Reading only the boolean will tell you a column is optional when in practice it is mandatory as soon as you fill in its siblings. The tables below mark those as conditional.
own_workforce — employees, contracts and pay
Each row creates or updates one employee and their contract, plus a remuneration period when the pay columns are filled in.
Remuneration start, amount and currency are required together; the end date stays optional. Leave all remuneration columns blank to import an employee and contract with no pay data.
Send the same contract fields in every row of a contract, and keep each employee’s rows next to each other: a large
file is applied in blocks of 15,000 rows, and a row’s contract rules (its end date, its end reason, a new contract
closing the previous one) take into account the rows of its block, with the rows of earlier blocks already stored.
Scoped contract and remuneration imports
own_workforce_contracts and own_workforce_remunerations reuse the native columns and validation rules above. The app fixes the employee context when the import is opened from its child list, and fixes the selected contract for remuneration imports. The remuneration template always requires remuneration_start_date, remuneration_amount and remuneration_currency.
These two template ids and own_workforce_accidents_absenteeisms offer the destination’s importable custom columns and allow declaring columns from file headers. A contract template writes only the contract sidecar, a remuneration template only the remuneration sidecar, and an accident/absence template the combined parent record. Required fields, defaults, types and relation resolution use the standard custom-column import rules. Formula and user fields follow the same import restrictions as other categories. Native records are retained if a custom-value write fails; the processing job reports missing custom values in its error summary.
Deploy the updated worker before enabling the manual-entry feature for clients. The scoped templates use the existing Own Workforce heavy-file category; no new worker queue category is introduced.
own_workforce_trainings — training records
own_workforce_accidents_absenteeisms — absences and accidents
One row can carry an accident, an absence, or both. The shape is driven by which columns you fill.
In practice: a row with only accident columns records an accident; a row with only absence columns records an absence; a row with both records an accident and the sick leave it caused, linked together.
Validation rules
Five rules apply per row and two across the whole file. Two of the seven are warnings, which annotate a row without blocking the import.Per row
Across the file
Both file-level rules flag every row in the offending group, not just the second one, so a duplicate shows up twice in the error list.
The employee is resolved against the row’s effective organization — the
organization_id cell when filled, otherwise the organization of the upload. This matters in a group: the same external_employee_id can legitimately exist in several organizations of the tree, and the rule checks the one the row points at.Category values
Columns typedcategory accept a fixed set of values, which you can fetch at runtime with Get Options Source. location, nationality and organization_id resolve against the shared country and organization sources; the workforce-specific ones are:
Only the last one is organization-specific: it is resolved live against your employees, so fetch it per organization rather than caching it. The contract-type and end-reason catalogues are shared across organizations.
Related Endpoints
Create an import session
Start here, with one of the three
template_id valuesGet template
Fetch a template’s columns at runtime
Validate
Apply the rules above before submitting
Own Workforce API
Read back what you imported