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

Enterprise Domain Model 1


Enterprise Domain Model 2


Enterprise Domain Model 3


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

  1. POST the Training Agreement → receive 202 Accepted with an id.
  2. GET the status using that id.
  3. If status is InProgress, wait and try again.
  4. Once status is Completed, look at hrssWorkflowStatus.data.isActive:
    • If true, the workflow is still being processed internally by your organization (e.g. pending signatures/approvals) — keep polling.
    • If false, check hrssWorkflowStatus.data.endStatus for the final outcome (OK or NOK).
  5. If status is Error or InternalError, the request could not be submitted — check errorDetails if 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 GET calls with the same VacancyCode as 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: owner and ownerEmailAddress are 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

  1. New hire — if this is a brand-new person, submit a hire directly.
  2. In case of a rehire — if the candidate have worked here before, search for them first using a small set of identifying fields.
  3. Rehire — if found, create a new contract for that existing person instead of creating a duplicate.
  4. 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.
Hire Rehire Process

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

  • customFields lets 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

  • personCode must 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/phoneNumber is 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}