1. Overview
Domain Purpose:
The Enterprise domain enables integration between HR Core and external systems who are responsible for employees within an organization.
Typical Use Cases:
Base URL:
https://api.youforce.com/enterprise
Swagger page:
For more detailed information about the endpoints available in this API, please visit the Youforce Enterprise API Swagger page
Postman collection:
For a complete example, you can check our Postman collection
2. Domain model



3. Included entities
This is the list of available endpoints for this domain.
Take into account that the endpoints will show the information that has been already processed by HR Core. This means that changes in the recent future might be shown in the response of the APIs and not the current value.
| Entity | Description | Access capabilities |
|---|---|---|
| Assignments | Allocation of specific tasks or duties to an employee within an employment. For example, an employee is assigned to a different department as a temporary replacement or to help another department without changing his own employment. HR Core: Inzet | READ |
| Contact Details | It refers to the information used to reach or communicate with a person, such as phone numbers and email addresses. Note that, for reading purposes, this information is available in the Persons endpoint. | WRITE |
| Contract Types | Reference table that exposes the type of contracts available. HR Core: Soort contract | READ |
| Cost Allocations | Regarding the distribution of financial resources or expenses across different departments or projects, it is the cost center of an employee. An employee can have multiple cost allocations. HR Core: Loonverdeling | READ |
| Cost Centers | In the entity Country are exposed the possible code and description of the different cost centers. HR Core: Kostenplaats | READ |
| Country | In the entity Country are exposed the possible countries recorded as a reference table. HR Core: Land | READ |
| Employments | The formal relationship between an employer and an employee regarding their job position. A person can have multiple employments at the same time. HR Core: Dienstverband | READ |
| Employment Timelines | The chronological sequence of events in the past pertaining to an individual’s employment within an organization, including start and end dates. It is based on the history table of HR Core. The endpoint contains the same fields as the endpoint employments. HR Core: Dienstverband Historie | READ |
| Employment Planned Changes | Changes in employment type, organization unit, job profile and amount of hours that will come in the future detailing the start and end dates of the change. HR Core: Indirecte Mutaties | READ |
| Employment Types | Show details of the employment types. HR Core: Soort Arbeidsrelatie | READ |
| Employment Work Schedules | The planned working hours and days for an employee within their employment. HR Core: Werkrooster | READ |
| Entitlements | Different users that have a certain entitlement. | READ |
| Job Profiles | Different profiles or functions existing for each role within the company. HR Core: Functie | READ |
| Job Families | Reference table that exposes the possible position groups or job families that can be logged. HR Core: Functiegroep | READ |
| File Upload | Ability of uploading files to a repository of an individual’s employment records, including certifications, diplomas, contracts and other personal documents. | WRITE |
| Leave Entitlements | Extra adjustments made to an employee’s leave entitlement due the decision of the employee to buy or sell a specific amount of leave hours. This endpoint will return only the information of the last 2 years. HR Core: Verlofrechten | READ |
| Leave Entitlements Changes | Extra adjustments made to an employee’s leave entitlement due to certain employment circumstances.This endpoint will return only the information of the last 2 years. HR Core: Verlofrecht Mutaties | READ |
| Leave Hours | Specific number of hours of leave taken or scheduled by an employee. This endpoint will return only the information of the last 2 years. HR Core: Verlof tijdvakken | READ |
| Leave Periods | Specific time frames during which an employee has some time off. This endpoint will return only the information of the last 2 years. HR Core: DV Verlof tijdvak | READ |
| Locations | Reference table that shows the possible locations. HR Core: | READ |
| Maternity Leave | Leave granted to an employee around the time of childbirth or adoption. HR Core: Ziekte zwangerschapverlof | READ |
| Name Assemble Order | Reference table that shows the possible ways to use the surname. HR Core: Gebruik achternaam | READ |
| Organization Units | Distinct business units, departments, divisions, etc within a larger organization that represent functional or geographical areas and how these are related to each other. HR Core: Organisatie eenheden | READ |
| Payroll Client | Potentially segments an organization into several sub-organizations or units, such as dividing a municipal partnership into individual municipalities, separating by companies, or by Collective Labor Agreement (CLA) criteria. HR Core: CEA-nummer | READ |
| Pay Components | The Enterprise system can share the number of hours of overtime, extra shifts etc. that are relevant for the payroll. | WRITE |
| Persons | An individual employee or worker within the organization, including some personal details. This could also contain people without (active) employment. Additionally, if the person has an employment which is out of the historicaldays, then the person won’t be retrieved neither. HR Core: Persoon | READ |
| Person Timelines | The chronological sequence of processed events in HR Core pertaining to a person within an organization. It is based on the history table of HR Core. The endpoint contains the same fields as the endpoint persons. HR Core: Persoon Historie | READ |
| Role Assignments | Allocation of specific roles or responsibilities to a person within the organization. The role assignment describes “who” is responsible for “what“ and “when“ within the organization unit. HR Core: Rol toewijzing | READ |
| Role Assignment Descriptions | Reference table that exposes the functions of roles that are identified within an organizational unit. HR Core: Rol Org. eenheid | READ |
| Role User Management | Reference table that exposes the functions of roles that are identified within an organizational unit. HR Core: Rol Org. eenheid | READ |
| Salary Details | Information regarding an employee’s salary, including base pay, payroll scale, seniority, … HR Core: Dienstverband | READ |
| Salary Details Planned Changes | Changes in Salary Details fields: guaranteedPayrollScale and guaranteedSeniority that will come in the future detailing the start and end dates of the change. HR Core: Indirecte Mutaties | READ |
| Salary Scales | Reference table that exposes the current set of payroll scales for a employment to determine the salary. HR Core: Salaris schaal | READ |
| Sick Leave | Leave granted to an employee due to illness, including the sickness periods, allowing them to recover without job or pay loss. HR Core: Ziekte algemeen | READ |
| Users | Individuals with unique identifiers who have access to an organization’s systems, resources or data and their entitlements. Youforce User account. | READ WRITE |
| Workflow | A defined series of tasks or steps to complete a business process, like setting up the study cost agreements. | READ WRITE |
| Work Patterns | The agreed schedule of working hours along the days and rest periods for an employee. This endpoint will return only the information of the last 12 months. HR Core: Werkpatroon | READ |
3.1 Training Agreements
Start a Training Agreement workflow for a person’s contract, and check on its progress. This triggers a workflow in the HR Self Service system — the request is accepted immediately, but processing happens asynchronously, so you’ll need to poll the status endpoint to find out what actually happened.
Start a Training Agreement
Path parameters
| Parameter | Type | Required |
|---|---|---|
personId |
integer | Yes |
contractId |
integer | Yes |
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
trainingName |
string | Yes | Must not be empty |
trainerName |
string | Yes | Must not be empty |
price |
number | Yes | Must be >= 0 |
startDate |
string (date) | No | |
endDate |
string (date) | No | If both startDate and endDate are supplied, endDate must be on or after startDate |
additionalExplanation |
string | No | |
information |
string | No | |
customFields |
array of { fieldCode, fieldValue } |
No | For passing additional values not covered by the fields above, if agreed with your implementation contact |
Example request
{
"trainingName": "Project Management Fundamentals",
"trainerName": "Jane Smith",
"price": 450.00,
"startDate": "2026-03-01",
"endDate": "2026-03-15",
"additionalExplanation": "Required for upcoming role change"
}
Example response — 202 Accepted
{
"id": "fede49ce-7043-482d-aba8-152478712c4b"
}
Keep this id — you’ll need it to check the outcome.
Possible responses
| Code | Meaning |
|---|---|
202 Accepted |
Request accepted. Processing is asynchronous — check the status endpoint below to find out what happened. |
400 Bad Request |
A required field is missing, price is negative, or endDate is before startDate. |
401 Unauthorized |
Token missing, invalid, or expired. |
403 Forbidden |
Your token’s scope doesn’t match the domain you’re calling, or your organization’s configured IP allow-list doesn’t include the calling address. |
Check the status
Example response — 200 OK
{
"id": "fede49ce-7043-482d-aba8-152478712c4b",
"status": "Completed",
"workflowName": "Studieovereenkomst",
"startActivity": "Behandelen PA",
"startButton": "verzenden",
"hrssWorkflowStatus": {
"data": {
"companyId": "4028868",
"isActive": true,
"currentActivity": "Tekenen",
"endStatus": "InProgress",
"endStatusName": "",
"workflowInstanceId": 233900
},
"workflowInstanceId": 233900
},
"errorDetails": null
}
| Field | Meaning | Possible values |
|---|---|---|
id |
The tracking id you received from the POST call | guid string |
status |
Whether we successfully submitted your request to the workflow system. Important: "Completed" here does not mean the workflow has actually finished — it means your request was successfully handed off. Keep reading for how to tell whether the workflow itself is done. |
InProgress, Completed, Error, InternalError |
workflowName |
The name of the workflow that was triggered | Configured per your organization |
startActivity / startButton |
The starting step/action of the workflow | Configured per your organization |
hrssWorkflowStatus |
The actual, live progress of the workflow — refreshed every time you call this endpoint. Only present once your request has been successfully submitted. | object, or absent while still InProgress/on failure |
hrssWorkflowStatus.data.isActive |
Whether the workflow is still running (hasn’t reached a final outcome yet) | true / false |
hrssWorkflowStatus.data.currentActivity |
The step the workflow is currently at | Text defined by your organization’s own workflow setup — we can’t tell you what a particular step name means in your business process |
hrssWorkflowStatus.data.endStatus |
This is the field to check for the actual outcome. | OK (approved/completed successfully), NOK (rejected/not approved), InProgress (still running) |
hrssWorkflowStatus.data.endStatusName |
A human-readable label for endStatus, defined by your organization |
Text, can be empty |
hrssWorkflowStatus.data.exportDate |
When the result was exported, if applicable | date-time, or absent |
errorDetails |
Details about what went wrong — present only when status is "Error" |
object, or absent |
Recommended check for “is this actually done”: don’t stop at status: "Completed" alone — that only confirms your submission succeeded. Poll until hrssWorkflowStatus.data.isActive is false, then read endStatus (OK/NOK) for the outcome. If status comes back as Error or InternalError, the submission itself failed and no workflow was started — see errorDetails (when present) for more information, or contact support.
Possible responses
| Code | Meaning |
|---|---|
200 OK |
Status found and returned |
400 Bad Request |
Malformed request |
401 Unauthorized |
Token missing, invalid, or expired |
403 Forbidden |
Your token’s scope doesn’t match the domain you’re calling |
404 Not Found |
No request exists with that id |
Typical flow
POSTthe Training Agreement → receive202 Acceptedwith anid.GETthe status using thatid.- If
statusisInProgress, wait and try again. - Once
statusisCompleted, look athrssWorkflowStatus.data.isActive:- If
true, the workflow is still being processed internally by your organization (e.g. pending signatures/approvals) — keep polling. - If
false, checkhrssWorkflowStatus.data.endStatusfor the final outcome (OKorNOK).
- If
- If
statusisErrororInternalError, the request could not be submitted — checkerrorDetailsif present, or contact support.
3.2 Vacancy endpoint
The Vacancy entity is the trigger of the recruitment process. Within the HR Core module, HR Self Service (HSS) managers start a vacancy based on an open position or an additional staffing need. Once a vacancy is approved by the company in HSS, it becomes the starting point for one or multiple recruitment cases (single or multiple employees).
The Recruitment API vacancy endpoint exposes this vacancy data to external recruitment systems so that:
- new vacancies can be published for recruitment, and
- existing vacancies can be kept in sync when they are updated in HR Core Self Service.
| Aspect | Detail |
|---|---|
| Operation | Export of vacancies (created and updated) |
| HTTP method | GET — used for both new vacancies and updates to existing vacancies |
| Idempotency key | VacancyCode (unique within the tenant) |
| Direction | Outbound from HR Core Self Service → consuming recruitment system |
Note on updates: the vacancy can be edited after initial publication (HSS provides a vacancy overview with edit capability). Integrators should treat repeated
GETcalls with the sameVacancyCodeas an upsert: if the code is unknown, create the vacancy; if it already exists, apply the payload as an update.
Vacancy fields
The vacancy entity contains general information (code, title, etc.), job-related information (job profile, job level, organizational unit, etc.), and process information (start/end date, number of positions required).
| Attribute | Description | Type | Example | HR Core Self Service field (default) |
|---|---|---|---|---|
VacancyCode |
Unique vacancy number in HR Core Self Service. This job request number is unique within the tenant. | string | VAC0012 |
VC0001 – vacature nummer |
Title |
Title of the vacancy. | string | Case manager |
VC0017 – Vacature titel |
organizationUnit |
Logical code of the organization unit; logical reference to the organization unit entity. Note: in HSS this is the technical ID of the org unit — the API translates it into the logical code. | string | HR01 |
VC0002 – organisatie eenheid |
payrollCompany |
Logical code of the company; reference to the company entity. | string | B01 |
VC0020 – employer |
recruitmentChannel |
Channel in which the recruitment system will publish the job request (e.g. internal only, external only, both, or a specific employment agency). Reference table is customer-specific and needs to be aligned with the recruitment system. | string | extern |
VC0009 – Intern/Extern werven (values: Intern, Extern) |
recruitmentReason |
Reason for the new position: new position, extension of an existing position, or replacement of an existing person. | string | Replacement |
VC0023 – Recruitment reden (values: 1 = Vervanging, 2 = Uitbreiding) |
experienceLevel |
Required experience level, e.g. 0-3 years, 4-6 years, 7-10 years, over 10 years. | string | 4-6 |
VC0021 – Ervaringsniveau (values: under3years, under6years, under10years, over10years) |
jobProfile |
Logical code of the job profile; reference to the job profile entity. | string | CMAN |
VC0003 – Functie |
jobLevel |
Required level of the job, e.g. Junior, Medior, Senior. Reference table is customer-specific and needs to be aligned with the recruitment system. | string | — | VC0004 – functie niveau |
jobFamily |
Job family code or job family title. | string | HR |
VC0018 – functiehuis titel |
employeeType |
Type of employee. | string | Intern |
VC0005 – type medewerker |
amountHoursWeek |
Amount of hours per week. | number | 40,00 |
VC0006 – uren per week |
contractType |
Contract type: temporal or indefinite. | string | temporal |
not available |
salaryIndication |
Indication for the salary: a range (e.g. 1500–1800 euro), a maximum (e.g. max 2000 euro), or a scale (e.g. Schaal 10). | string | Schaal 10 |
VC0022 – Salaris Indicatie |
contractualDuration |
Only relevant when contractType is temporal, e.g. 6 months, 1 year. |
string | 1 year |
not available |
establishmentUnit |
Logical code of the location/establishment unit where the work is performed; mainly follows the contractual arrangement. | string | AMS |
not available |
numberOfPositionsRequired |
Total number of positions required for the job request. | number | 5 |
VC0007 – aantal te vervullen posities |
numberOfPositionsCompleted |
Number of positions already filled. | number | 1 |
VC0008 – Aantal reeds vervuld |
ApprovalDate |
Approval date of the job request. | date | 2020-12-20 |
VC0010 – Datum initieel goedgekeurd |
startDate |
Start date of the job request. | date | 2021-01-01 |
VC0011 – Start datum vacature |
endDate |
End date of the job request. | date | 2021-04-01 |
VC0016 – Vervaldatum vacature |
owner |
Owner/manager of the job request. | string | J. Janssen |
VC0019 – vacature houder |
ownerEmailAddress |
Email address of the owner of the job request. | string | j.jansen@visma.com |
VC0025 – Email adres vacature houder |
PII note:
ownerandownerEmailAddressare personal data under GDPR/AVG. Consumers must transmit and store this data encrypted (TLS in transit, encryption at rest) and must not log or persist it in plain text.
3.3 Hiring / Rehiring process
This endpoints help to onboard a new employee, or create a new contract for someone who has worked for the organization before. All actions are asynchronous: your request is accepted immediately, and you then poll a status endpoint to find out what actually happened.
The process
- New hire — if this is a brand-new person, submit a hire directly.
- In case of a rehire — if the candidate have worked here before, search for them first using a small set of identifying fields.
- Rehire — if found, create a new contract for that existing person instead of creating a duplicate.
- Later changes — once someone is hired, changes to their contract (job, hours, salary, etc.) go through a separate contract-adjustment call, not through the hire endpoint again.

Targeting a specific workflow: X-Raet-Workflow
Every POST action below supports an optional X-Raet-Workflow header, letting you target a specific workflow configured for your tenant for that one call, instead of using the default. Some actions may support their own specific set of workflow names — check with your implementation contact for the values available to you.
Attachment rules
Apply to the files array on every endpoint below that accepts it:
- The combined size of all attachments in a single request must not exceed 23 MB.
- File names may only contain: uppercase letters (
A–Z), lowercase letters (a–z), numbers (0–9), and the symbols space,+,-,_,(,),[,],{,},.,:,;.
1. Hire a new employee
POST /{domain}/v1.0/hires
Request body — key fields
| Field | Required | Notes |
|---|---|---|
candidateID |
Required | The candidate’s ID in the recruitment system. |
lastName, lastNameAtBirth, lastNameAtPrefix, knownAs, initials, firstNames |
Optional | Name components. |
gender |
Optional | 1 = Male, 2 = Female, 0/9 = not specified. |
birthDate, birthPlace, birthCountry, primaryNationality |
Optional | |
titlePrefix, titleSuffix |
Optional | e.g. “Dr.”, “MSc”. |
maritalStatus, lastNamePreference, lastNamePartner, partnerNamePrefix |
Optional | |
socialSecurityNumber |
Optional | Sensitive data — handle accordingly in your own systems. |
phoneNumbers.phoneNumberHome / .phoneNumberMobile |
Optional | |
emailAddress |
Optional | |
addresses.homeAddress / .postalAddress |
Optional | Each: street, number, numberAdditional, postalCode, city, country. |
vacancyNumberHR, vacancyNumberATS, offerApproveDate |
Optional | Application/vacancy reference details. |
employmentDetails.payrollClientCode |
Required | |
employmentDetails.payrollInstitutionCode |
Required | |
employmentDetails.hireDate |
Required | |
employmentDetails.employeeType |
Required | |
employmentDetails.contractType |
Required | Indefinite vs. fixed-term. |
employmentDetails.organizationUnit |
Required | |
employmentDetails.jobProfile |
Required | |
employmentDetails.amountOfHours |
Required | |
employmentDetails.endDate, .originalHireDate, .collectiveLaborAgreement, .establishmentUnit, .probationPeriod, .probationPeriodDuration, .probationPeriodEnddate, .parttimePercentage |
Optional | |
salaryDetails.salary |
Optional | Flat agreed salary amount. |
salaryDetails.hourlyRate |
Optional | For contracts paid an hourly rate. |
salaryDetails.payScale / .payScaleStep / .payScaleAmountNo |
Optional | For scale-based contracts. |
benefits |
Optional | [{ "benefitCode": "...", "value": "..." }] — other agreed benefits. |
customFields |
Optional | [{ "fieldCode": "...", "fieldValue": "..." }] — for any additional field not covered above. |
assignments |
Optional | [{ startDate, endDate, assignmentType, organizationUnit, jobProfile, amountOfHours }] — create an assignment alongside the hire. |
files |
Optional | [{ "name": "...", "contentBase64": "...", "category": "..." }] — attachments, base64-encoded; see Attachment rules above. category is optional. |
Example — minimal hire
POST /{domain}/v1.0/hires
{
"lastNameAtBirth": "Smit",
"lastNameAtPrefix": "van de",
"knownAs": "Alex",
"initials": "AS",
"firstNames": "Alexander Simon",
"gender": 1,
"birthDate": "1985-06-15",
"emailAddress": "alex.smith@example.com",
"employmentDetails": {
"payrollClientCode": "23625",
"payrollInstitutionCode": "1",
"hireDate": "2023-10-01",
"employeeType": "V",
"organizationUnit": 914,
"jobProfile": "17",
"amountOfHours": 20
}
}
Response — 202 Accepted
{ "id": "fede49ce-7043-482d-aba8-152478712c4b" }
Keep this id to check the outcome (see below).
2. Check if the candidate already exists (before a rehire)
GET /{domain}/v1.0/persons/search
Only use a small, necessary set of search fields — this endpoint is deliberately limited for privacy reasons. Available fields: lastNameAtBirth, lastNameAtBirthPrefix, birthDate, birthPlace, knownAs.
GET /{domain}/v1.0/persons/search?lastNameAtBirth=VERWAAL&birthDate=1980-03-19
If a match is found, use that person’s id for the rehire call below instead of creating a new hire.
3. Rehire — new contract for an existing person
POST /{domain}/v1.0/persons/{personId}/contracts
Same request body fields as a new hire (§1). {personId} comes from the search above.
If the person has an active contract this rehire relates to, you can additionally identify it via:
| Field | Notes |
|---|---|
currentEmployment.personCode |
Optional. |
currentEmployment.employmentCode |
Optional. |
Response: 202 Accepted with { "id": "..." }, same as a new hire.
4. Change an existing contract
POST /{domain}/v1.0/persons/{personId}/contracts/{contractId}/Adjustments
For changes to a contract that’s already active — job profile, hours, salary, or ending it.
| Field | Notes |
|---|---|
effectiveDate |
Required. When the change takes effect. |
employeeType, contractType, organizationUnit, jobProfile, amountOfHours, parttimePercentage |
Same meaning as on a hire. |
endDate |
Set this to end the contract as part of the change. |
salaryDetails |
Same shape as a hire. |
customFields, files |
Same shape as a hire; attachments follow the same rules above. |
POST /{domain}/v1.0/persons/35002/contracts/1/Adjustments
{
"effectiveDate": "2024-01-01",
"employeeType": "V",
"contractType": "01",
"organizationUnit": 914,
"jobProfile": "4000",
"amountOfHours": 20,
"salaryDetails": {
"payScale": "10",
"payScaleStep": "4"
}
}
Response: 202 Accepted with { "id": "..." }.
5. Checking the outcome
Every POST above is asynchronous. Poll the matching status endpoint using the id you got back:
| Action | Status endpoint |
|---|---|
| Hire | GET /{domain}/v1.0/hires/{id}/status |
| Rehire | GET /{domain}/v1.0/persons/{personId}/contracts/{id}/status |
| Contract adjustment | GET /{domain}/v1.0/persons/{personId}/contracts/{contractId}/adjustments/{id}/status |
Example response
{
"id": "f42a3ec1-96cf-4ae1-94fa-ba68a6e0e57a",
"status": "Completed",
"workflowName": "YF API - Nieuwe Medewerker",
"startActivity": "Youforce API",
"startButton": "verzenden",
"hrssWorkflowStatus": {
"data": {
"companyId": "4028868",
"isActive": true,
"currentActivity": "Aanvullen LG",
"endStatus": "InProgress",
"endStatusName": "",
"workflowInstanceId": 1063367
},
"workflowInstanceId": 1063367
}
}
| Field | Meaning | Possible values |
|---|---|---|
status |
Whether your request was successfully submitted. "Completed" does not mean the workflow itself has finished — keep reading. |
InProgress, Completed, Error, InternalError |
hrssWorkflowStatus.data.isActive |
Whether the workflow is still running. | true / false |
hrssWorkflowStatus.data.currentActivity |
The step the workflow is currently at. | Defined by your organization’s workflow setup. |
hrssWorkflowStatus.data.endStatus |
The field to check for the actual outcome. | OK, NOK, InProgress |
Recommended check for “is this actually done”: poll until hrssWorkflowStatus.data.isActive is false, then read endStatus for the result.
Notes
customFieldslets you pass additional values not covered by the named fields above, if agreed with your implementation contact.
3.4 Write-Back Contact Details
Update a person’s email address and/or phone number. For reading contact details, use the Persons endpoint — this entity is for writing only.
Important: emailAddress and phoneNumber here write to the person’s work email and work phone number specifically, not their private email or mobile number.
Updating one person
POST /{domain}/v1.0/ContactDetails/{personCode}
| Field | Required |
|---|---|
emailAddress |
At least one of emailAddress/phoneNumber must be provided |
phoneNumber |
At least one of emailAddress/phoneNumber must be provided |
Example
POST /iam/v1.0/ContactDetails/123456
{
"emailAddress": "frits.bakker@example.com",
"phoneNumber": "+31612345678"
}
Response — 200 OK
{
"ticketId": "fede49ce-7043-482d-aba8-152478712c4b",
"status": "None",
"errorMessage": null,
"contactDetails": [
{ "personCode": "123456", "emailAddress": "frits.bakker@example.com", "phoneNumber": "+31612345678" }
]
}
The write is processed asynchronously — a 200 OK here means the request was accepted, not that the update has completed. Keep the ticketId to check progress.
Updating multiple people at once
POST /{domain}/v1.0/ContactDetails/bulk
Body: an array of objects, each with:
| Field | Required |
|---|---|
personCode |
Required |
emailAddress |
At least one of emailAddress/phoneNumber must be provided per entry |
phoneNumber |
At least one of emailAddress/phoneNumber must be provided per entry |
Maximum 100 entries per request.
POST /iam/v1.0/ContactDetails/bulk
[
{ "personCode": "123456", "emailAddress": "frits.bakker@example.com" },
{ "personCode": "123457", "phoneNumber": "+31612345679" }
]
Response shape is the same as above.
Validation rules
personCodemust be numeric.- The person must exist and be visible to your client (same authorization rules as the Persons endpoint) — otherwise you’ll get a
404. emailAddress: max 99 characters, must be a valid email format.phoneNumber: max 15 characters; optional leading+, otherwise digits, spaces, dots and hyphens.- At least one of
emailAddress/phoneNumberis required per person.
Checking the outcome
GET /{domain}/v1.0/ContactDetails/{ticketId}/status
status value |
Meaning |
|---|---|
None |
Just received, not yet picked up for processing. |
InProgress |
Being processed. |
Complete |
Successfully written. |
Error |
Failed — see errorMessage field for details. |
GET /iam/v1.0/ContactDetails/fede49ce-7043-482d-aba8-152478712c4b/status
{
"ticketId": "fede49ce-7043-482d-aba8-152478712c4b",
"status": "Complete",
"errorMessage": null,
"contactDetails": [
{ "personCode": "123456", "emailAddress": "frits.bakker@example.com", "phoneNumber": "+31612345678" }
]
}
Response codes
| Code | Meaning |
|---|---|
200 OK |
Request accepted (POST) or ticket status returned (GET). |
400 Bad Request |
Invalid personCode format, no contact field provided, invalid/too-long email or phone, malformed body, or more than 100 entries in a bulk request. |
401 Unauthorized |
Token missing, invalid, or expired. |
403 Forbidden |
Your token’s scope doesn’t cover this domain, or your IP isn’t on your organization’s allow-list. |
404 Not Found |
The person doesn’t exist, isn’t visible to your client, or the ticket id doesn’t exist. |
3.5 Write-Back Pay Components
A pay component is an individual building block used to describe or calculate an employee’s pay (in Dutch: looncomponent/salariscomponent) — think “a defined type of pay-related item,” not the employee’s total salary.
Finding valid element codes
Not every field can be written through this endpoint — only elements enabled for this purpose for your organization. Check the Employment Extensions entity for the employment you’re updating: each entry there includes a bo4FieldCode value, and that’s exactly what you pass as elementCode here. If a code isn’t listed there, it isn’t usable through Pay Components.
Writing pay components
POST /{domain}/v1.0/PayComponents/{employment}
Body: an array of:
| Field | Required | Notes |
|---|---|---|
elementCode |
Required | From Employment Extensions’ bo4FieldCode — see above. |
value |
Required | Must respect that element’s own length, decimal, and range rules. |
effectiveDate |
Required | Format yyyy-MM-dd. |
Maximum 100 elements per request, and no two entries can share the same elementCode.
Example
POST /wfm/v1.0/PayComponents/55555-1
[
{ "elementCode": "pcf21", "value": "125.50", "effectiveDate": "2026-01-01" }
]
Response — 200 OK
{
"ticketId": "fede49ce-7043-482d-aba8-152478712c4b",
"status": "None",
"errorMessage": null,
"employmentCode": "55555-1",
"payComponents": [
{ "elementCode": "pcf21", "value": "125.50", "effectiveDate": "2026-01-01" }
]
}
The write is processed asynchronously — a 200 OK means the request was accepted, not that the update has completed. Keep the ticketId to check progress.
Checking the outcome
GET /{domain}/v1.0/PayComponents/{ticketId}/status
status value |
Meaning |
|---|---|
None |
Just received, not yet picked up for processing. |
InProgress |
Being processed. |
Complete |
Successfully written. |
Error |
Failed — see errorMessage. |
GET /wfm/v1.0/PayComponents/fede49ce-7043-482d-aba8-152478712c4b/status
{
"ticketId": "fede49ce-7043-482d-aba8-152478712c4b",
"status": "Complete",
"errorMessage": null,
"employmentCode": "55555-1",
"payComponents": [
{ "elementCode": "pcf21", "value": "125.50", "effectiveDate": "2026-01-01" }
]
}
Response codes
| Code | Meaning |
|---|---|
200 OK |
Request accepted (POST) or ticket status returned (GET). |
400 Bad Request |
An elementCode isn’t valid/enabled, a value doesn’t fit that element’s rules (too long, too many decimals, out of range), effectiveDate isn’t in yyyy-MM-dd format, duplicate element codes in the same request, more than 100 entries, or a malformed body. |
401 Unauthorized |
Token missing, invalid, or expired. |
403 Forbidden |
Your token’s scope doesn’t cover this domain, or your IP isn’t on your organization’s allow-list. |
404 Not Found |
The employment doesn’t exist, or the ticket id doesn’t exist. |
4. Security and Scopes
All available endpoints are secured using OAuth 2.0 and protected by scopes.
| Scope | Description | Affected endpoints |
|---|---|---|
| Youforce-Enterprise:GetPrivateContactDetails | Grants access to private contact details of the employees | GET /v1.0/persons GET /v1.0/persons/timelines Extra fields shown: social security number, addresses, e-mail addresses (business and private) and phone numbers (business and private) |
| Youforce-Enterprise:GetSocialSecurityNumber | Grants access to the Social Security Number (bsn) | GET /v1.0/persons Extra fields shown: socialSecurityNumber |
| Youforce-Enterprise:Get_Assignments | Grants access to Assignments data | GET /v1.0/assignments |
| Youforce-Enterprise:Get_CostAllocations | Grants access to Cost Allocations data | GET /v1.0/costAllocations |
| Youforce-Enterprise:Get_CostCenters | Grants access to Cost Centers data | GET /v1.0/costCenters |
| Youforce-Enterprise:Get_ContractTypes | Grants access to CostAllocations data | GET /v1.0/contractTypes |
| Youforce-Enterprise:Get_Country | Grants access to Country data | GET /v1.0/country |
| Youforce-Enterprise:Get_EmploymentExtensionPlannedChanges | Grants access to Employment Extension Planned Changes data | GET /extensions/v1.0/enterprise/employments/plannedChanges |
| Youforce-Enterprise:Get_EmploymentExtensions | Grants access to Employment Extensions data | GET /extensions/v1.0/enterprise/employments |
| Youforce-Enterprise:Get_EmploymentExtensionTimelines | Grants access to Employment Extension Timelines data | GET /extensions/v1.0/enterprise/employments/timelines |
| Youforce-Enterprise:Get_EmploymentPlannedChanges | Grants access to Employment Planned Changes data | GET /v1.0/employments/plannedChanges |
| Youforce-Enterprise:Get_Employments | Grants access to Employments data | GET /v1.0/employments |
| Youforce-Enterprise:Get_EmploymentTimeline | Grants access to Employment Timeline data | GET /v1.0/employments/timelines |
| Youforce-Enterprise:Get_EmploymentTypes | Grants access to Employment Types data | GET /v1.0/employmentTypes |
| Youforce-Enterprise:Get_EmploymentWorkSchedules | Grants access to Employment Work Schedules data | GET /v1.0/employmentWorkSchedules |
| Youforce-Enterprise:Get_Entitlements | Grants access to Entitlements data | GET /v1.0/entitlements |
| Youforce-Enterprise:Get_JobProfileExtensions | Grants access to Job Profile Extensions data | GET /extensions/v1.0/enterprise/jobprofiles |
| Youforce-Enterprise:Get_JobProfiles | Grants access to Job Profiles data | GET /v1.0/jobProfiles |
| Youforce-Enterprise:Get_JobFamilies | Grants access to Job Families data | GET /v1.0/jobFamilies |
| Youforce-Enterprise:Get_Locations | Grants access to Locations data | GET /v1.0/locations |
| Youforce-Enterprise:Get_LeaveEntitlementChanges | Grants access to Leave Entitlement Changes data | GET /v1.0/leaveEntitlementChanges |
| Youforce-Enterprise:Get_LeaveEntitlements | Grants access to Leave Entitlements data | GET /v1.0/leaveEntitlements |
| Youforce-Enterprise:Get_LeaveHours | Grants access to Leave Hours data | GET /v1.0/leaveHours |
| Youforce-Enterprise:Get_LeavePeriods | Grants access to Leave Periods data | GET /v1.0/leavePeriods |
| Youforce-Enterprise:Get_maternityLeave | Grants access to Maternity Leave data | GET /v1.0/maternityLeave |
| Youforce-Enterprise:Get_NameAssembleOrder | Grants access to Name Assemble Order data | GET /extensions/v1.0/enterprise/ nameAssembleOrder |
| Youforce-Enterprise:Get_OrganizationUnitExtensions | Grants access to Organization Unit Extensions data | GET /extensions/v1.0/enterprise/organizationunits |
| Youforce-Enterprise:Get_OrgUnit | Grants access to Organization Units data | GET /v1.0/OrganizationUnits |
| Youforce-Enterprise:Get_PayrollClients | Grants access to Payroll Clients data | GET /v1.0/payrollClients |
| Youforce-Enterprise:Get_PersonExtenionTimelines | Grants access to Person Extension Timelines data | GET /extensions/v1.0/enterprise/Persons/timelines |
| Youforce-Enterprise:Get_PersonExtensions | Grants access to Person Extensions data | GET /extensions/v1.0/enterprise/Persons |
| Youforce-Enterprise:Get_Persons | Grants access to Persons data | GET /v1.0/persons |
| Youforce-Enterprise:Get_PersonTimelines | Grants access to Person Timelines data | GET /v1.0/persons/Timelines |
| Youforce-Enterprise:Get_RoleAssignments | Grants access to Role Assignments data | GET /v1.0/roleAssignments |
| Youforce-Enterprise:Get_RoleAssignmentDescriptions | Grants access to Role Assignment Descriptions data | GET /v1.0/roleAssignmentDescriptions |
| Youforce-Enterprise:Get_RoleUserManagement | Grants access to Role User Management data | GET /v1.0/roleUserManagement |
| Youforce-Enterprise:Get_SalaryDetailPlannedChanges | Grants access to Salary Detail Planned Changes data | GET /v1.0/salaryDetails/plannedChanges |
| Youforce-Enterprise:Get_SalaryDetails | Grants access to Salary Details data | GET /v1.0/salaryDetails |
| Youforce-Enterprise:Get_SalaryDetailTimelines | Grants access to Salary Detail Timelines data | GET /v1.0/salaryDetails/timelines |
| Youforce-Enterprise:Get_SalaryScales | Grants access to Salary Scales data | GET /v1.0/salaryScales |
| Youforce-Enterprise:Get_SickLeaves | Grants access to Sick Leaves data | GET /v1.0/sickLeaves |
| Youforce-Enterprise:Get_Vacancy | Grants access to Vacancy data | GET /v1.0/vacancy |
| Youforce-Enterprise:Get_WorkPatterns | Grants access to Work Patterns data | GET /v1.0/workPatterns |
| Youforce-Enterprise:HSS_startWorkflow | Grants access to start workflows on Self Service | GET /v1.0/vacancies POST /v1.0/hires GET /v1.0/hires/{StatusId}/status POST /v1.0/persons/{PersonId}/contracts GET /v1.0/persons/{PersonId}/contracts/{StatusId}/status POST /v1.0/persons/{PersonId}/contracts/{ContractId}/adjustments GET /v1.0/persons/{PersonId}/contracts/{ContractId}/adjustments/{StatusId}/status |
| Youforce-Enterprise:Update_Identity | Enables to write back changes in the Identity of the Youforce User | PATCH /v1.0/users(employeeId={employeeId})/identity |
| Youforce-Enterprise:Upload_documents | Grants access to upload documents to the personal file system, like certificates, diplomas and other relevant documents | GET /v1.0/employees/documents/{TicketId}/status POST /v1.1/employees/{PersonId}/documents/{certificate, diploma, careerAgreement, careerMail, careerOther, performanceReview, appraisalReview} |
| Youforce-Enterprise:Write_ContactDetails | Enables to write back basic information like e-mail address and phone number to HR Core | POST /v1.0/contactDetails/{personCode} POST /v1.0/contactDetails/bulk |
| Youforce-Enterprise:Write_EmploymentExtensions | Grants access to write data back to the Core like Person extensions or Employment extensions | PATCH /extensions/v1.0/{domain}/persons/{id} PATCH /extensions/v1.0/{domain}/employments/{id} |
| Youforce-Enterprise:Write_PayComponents | Enables to write back changes for payroll calculation (hours & other paycomponents) | POST /v1.0/payComponents/{ComponentId} GET /v1.0/payComponents/{TicketId}/status |
5. Pagination & Filtering parameters
Learn how to efficiently manage large amounts of information by using pagination and filtering parameters to improve performance and user experience.
Pagination Parameters:
These parameters control the pagination of API results:
- take: Use this parameter to retrieve a certein amount of registers per call, being the minimun value 1 and the maximum value 1000.
- skip: Use this parameter to skip a certein amount of records. Use it for offset-based pagination.
- nextLink: For large paginated responses, if there are more registers than shown in the output, we will provide a continuation token that you can use in the next call to get the next page.
Date Filtering Parameters:
The latestSync field in the response reflects the last synchronization datetime (creation or modification dates) we stored because we received an update from the HRCore. So it is not related to the dischargedate value.
These parameters filter records based on this latestSync field:
- from: Use this parameter to filter records based on creation or last modification dates and retrieve records which modification date is greater or equal to the value in the filter → records that have latestSync datetime >= from
- to: Use this parameter to filter records based on creation or last modification dates and retrieve records which modification date is less or equal to the value in the filter → records that have latestSync datetime <= to
Filters on validity of a record:
- validOn: Use this parameter to filter temporal entities that are valid on a specific date (e.g., contract validity based on its start and end dates).
This filter is meant to be used in combination with From and To parameters. For example, with From and To you will get the Employments that are modified in a specific range, and with validOn you will limit the response to the records that are active on a specific date.
Available endpoints: timelines, assignment and role assignment endpoints.
Other Parameters:
-
isActive: Use this parameter to distinguish between active or deleted records. Active means that it is still in the HR Core database but it has not been deleted from there. It doesn’t correspond to the block field in HR Core.
Available for all endpoints.
Example 1:
- we have a record that is active (not deleted in HR Core)
- today is 01/12/2025
- historical days is set at 60 days in the subscription (Configuration API)
- the discharge date is 01/11/2025 (within the historical days window)
→ then the record will be returned in the API
Example 2:
- we have a record that is active (not deleted in HR Core)
- today is 01/12/2025
- historical days is set at 15 days in the subscription (Configuration API)
- the discharge date is 01/11/2025 (outside the historical days window)
→ then the record will NOT be returned in the API
Example 3:
- the record has been deleted on 01/12/2025 from HR Core (it is not active)
- today is 01/12/2025
- historical days is set at 75 days in the subscription (Configuration API)
- the discharge date is 01/11/2025 (within the historical days window)
- It is within the 7 days after its deletion and:
- the filter isActive is true → then the record will NOT be returned in the API
- the filter isActive is false → then the record will be returned in the API
- the filter isActive not provided → then the record will be returned in the API
Example 4:
- the record has been deleted on 10/11/2025 from HR Core (it is not active)
- today is 01/12/2025
- historical days is set at 75 days in the subscription (Configuration API)
- the discharge date is 01/11/2025 (within the historical days window)
- it is not within the 7 days after its deletion
→ then the record will NOT be returned in the API (regardless of the value of isActive parameter) - personId, personCode: Use one of these parameters to filter indistinctly by the code of an specific individual.
Available endpoints: Assignment, CostAllocation, Person, RoleAssignment and PlannedChanged. - company: Use this parameter to filter by company field.
Available endpoints: Employment. - organizationUnit: Use this parameter to filter by department or team structure.
Available endpoints: Employment. - shortName: Use this parameter to filter by the short name of an organization unit or job profile depending on the endpoint.
Available endpoints: JobProfile, RoleAssignment and OrganizationUnit. - statusFrom: Use this parameter to filter records based on the status date field and retrieve records which status date is greater or equal to the value in the filter.
Available endpoints: PlannedChanges. - statusTo: Use this parameter to filter records based on the status date field and retrieve records which status date is less or equal to the value in the filter.
Available endpoints: PlannedChanges. - status: Use this parameter to filter records based on the status field. The possible values are: pending, processed, blocked and rejected.
Available endpoints: PlannedChanges. - employmentType: Use this parameter to filter by the employment type code.
Available endpoints: Employment. - leaveEntitlementYear: Use this parameter to filter by the year of the leave entitlemente.
Available endpoints: LeaveEntitlements, leaveEntitlementChanges, leaveHours and leavePeriods.
6. Deprecated Endpoints
List of Deprecated Routes:
- GET /v1.0/employmentTimelines:
This behavior has been incorporated as part of the employments endpoint –> GET /v1.0/employments/Timelines - GET /v1.0/employmentTimelines/{id}:
This behavior has been incorporated as part of the employments endpoint –> GET /v1.0/employments/Timelines/{id} - GET /v1.0/salaryDetailtimelines:
This behavior has been incorporated as part of the salaryDetails endpoint –> GET /v1.0/salaryDetails/Timelines - GET /v1.0/salaryDetailtimelines/{id}:
This behavior has been incorporated as part of the salaryDetails endpoint –> GET /v1.0/salaryDetails/Timelines/{id}