Person
A Person represents a worker or individual registered in a project (company). People belong to a project and are assigned to one or more offices via PersonOffice.
Hierarchy: Project (company) → Office (work location) → Person (worker).
People are the main subjects of the compliance schedule: action subscriptions (ActionSubscription)
and certificates (Certificate) are typically linked to a person via their person_id.
Use this API to:
- Find a person by name, last name, or tax code within a project
- Get the
person_idneeded to create certificates, compliance schedule entries, or office assignments - Look up personal and employment details of a worker
A person can have a linked user account via entity_id (email) and related_user (permission level).
- Version
- 2.0.0
- OpenAPI version
- 3.0.0
Authentication
Section titled “ Authentication ”AccessToken
Section titled “AccessToken ”Security scheme type: apiKey
Query parameter name: access-token
OAuth2
Section titled “OAuth2 ”Security scheme type: oauth2
Flow type: password
Token URL: https://auth.4hse.com/realms/4hse/protocol/openid-connect/token
Operations
Section titled “Operations” POST /v2/person/index
Returns a paginated list of persons.
Most useful filters:
project_id+last_name: find a person by last name within a companyproject_id+tax_code: find a person by tax code (exact match)project_id+code: find a person by company employee codeis_employee: 1: filter employees only
Authorizations
Section titled “Authorizations ”Request Body
Section titled “Request Body ”Parameters for searching persons
object
object
Unique identifier of the person. Certificates reference the person via resource_id, compliance schedule entries via subscriber_id — pass this value.
Alternative identifier, typically the company employee code.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code).
Free-text notes.
Employment contract type.
1: company employee0: not an employee
1: external prevention and safety staff0: not external prevention staff
The email of the linked user account.
The project (company) this person belongs to.
Name of the project (company) this person belongs to.
Status of the parent project.
Country of the parent project.
Permission level of the linked user account:
relatedUser_user: basic accessrelatedUser_manager: management access
Whether this person is currently active in their validity period.
Whether the parent project is currently active.
Field to sort by. Prefix with minus for descending order (e.g. “-last_name”).
If true, includes historicized (no longer active) entries in the results. By default only current entries are returned.
Example
{ "filter": { "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "last_name": "Smith", "is_employee": 1 }, "per-page": 50, "page": 1, "sort": "last_name"}Responses
Section titled “ Responses ”List of persons
object
Unique identifier of the person. Certificates reference the person via resource_id, compliance schedule entries via subscriber_id — pass this value.
Alternative identifier, typically the company employee code.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code).
Free-text notes.
Employment contract type.
1: company employee0: not an employee
1: external prevention and safety staff0: not external prevention staff
The email of the linked user account.
The project (company) this person belongs to.
Name of the project (company) this person belongs to.
Status of the parent project.
Country of the parent project.
Permission level of the linked user account:
relatedUser_user: basic accessrelatedUser_manager: management access
Whether this person is currently active in their validity period.
Whether the parent project is currently active.
Example
[ { "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Smith", "code": "JS001", "tax_code": "SMTJHN85C15H501Z", "birth_date": "1985-03-15", "is_employee": 1, "is_prevention_people": 0, "entity_id": "john.smith@example.com", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "project_name": "Acme Construction Ltd", "project_status": "active", "owned_active": true, "parent_active": true }]Headers
Section titled “Headers ”Current page
Total number of pages
Number of items per page
Total number of items
GET /v2/person/view/{id}
Retrieves a single person. Can be looked up in two ways:
- By
person_id(passed as path parameterid) - By
code+project_id(passed as query parameters, if theperson_idis not known)
Authorizations
Section titled “Authorizations ”Path Parameters
Section titled “Path Parameters ”The person_id to retrieve. Required if code and project_id are not provided.
Query Parameters
Section titled “Query Parameters ”Employee code. Required together with project_id if id is not provided.
Required together with code if id is not provided.
Responses
Section titled “ Responses ”Person found
object
Unique identifier of the person. Certificates reference the person via resource_id, compliance schedule entries via subscriber_id — pass this value.
Alternative identifier, typically the company employee code.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code).
Free-text notes.
Employment contract type.
1: company employee0: not an employee
1: external prevention and safety staff0: not external prevention staff
The email of the linked user account.
The project (company) this person belongs to.
Name of the project (company) this person belongs to.
Status of the parent project.
Country of the parent project.
Permission level of the linked user account:
relatedUser_user: basic accessrelatedUser_manager: management access
Whether this person is currently active in their validity period.
Whether the parent project is currently active.
Example
{ "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Smith", "code": "JS001", "tax_code": "SMTJHN85C15H501Z", "birth_date": "1985-03-15", "is_employee": 1, "is_prevention_people": 0, "entity_id": "john.smith@example.com", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "project_name": "Acme Construction Ltd", "project_status": "active", "owned_active": true, "parent_active": true}Person not found
create
Section titled “create” POST /v2/person/create
Creates a new person within a project.
Requires first_name, last_name, and project_id. The person_id is auto-generated if not provided.
Creating a person does not assign them to any office. To assign a person to an office, create a PersonOffice after creating the person.
Special parameter unique_code: if true and a person with the same code already exists
in the project, the existing person is updated instead of creating a new one. If the person
was historicized, they are reactivated with a new period.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”Person object to be created
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
If true and a person with the same code already exists in the project, the existing person is updated instead of creating a new one. If the person was historicized, they are reactivated with a new period.
Example
{ "first_name": "John", "last_name": "Smith", "code": "JS001", "tax_code": "SMTJHN85C15H501Z", "birth_date": "1985-03-15", "is_employee": 1, "entity_id": "john.smith@example.com", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "related_user": "relatedUser_user"}Responses
Section titled “ Responses ”Person created successfully
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Example
{ "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Smith", "code": "JS001", "tax_code": "SMTJHN85C15H501Z", "birth_date": "1985-03-15", "is_employee": 1, "entity_id": "john.smith@example.com", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "related_user": "relatedUser_user"}update
Section titled “update” PUT /v2/person/update/{id}
Updates an existing person. Can be identified by person_id or by code + project_id.
Authorizations
Section titled “Authorizations ”Path Parameters
Section titled “Path Parameters ”The person_id to update. Required if code and project_id are not provided.
Query Parameters
Section titled “Query Parameters ”Employee code. Required together with project_id if id is not provided.
Required together with code if id is not provided.
Request Body required
Section titled “Request Body required ”Person fields to update
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Example
{ "last_name": "Johnson", "code": "JJ002"}Responses
Section titled “ Responses ”Person updated successfully
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Example
{ "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Johnson", "code": "JJ002"}Person not found
historicize
Section titled “historicize” POST /v2/person/historicize/{id}
Historicizes a person — marks them as no longer active from a specified date.
The person and their data remain in the system but will not appear in normal queries.
Use the history: true parameter in the index to include historicized persons.
If no date is specified, the current date is used.
Historicization propagates automatically: all child entities of the person (office assignments,
compliance schedule entries, etc.) are excluded from normal queries without any direct changes
to their data. The parent_active field in child entity responses reflects this state.
This applies at all levels of the hierarchy.
Authorizations
Section titled “Authorizations ”Path Parameters
Section titled “Path Parameters ”The person_id to historicize. Required if code and project_id are not provided.
Query Parameters
Section titled “Query Parameters ”Employee code. Required together with project_id if id is not provided.
Required together with code if id is not provided.
Request Body
Section titled “Request Body ”Historicization date
object
The date from which the person is no longer active. Defaults to the current date.
Example
{ "date": "2025-06-10"}Responses
Section titled “ Responses ”Person historicized successfully
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Person not found
delete
Section titled “delete” DELETE /v2/person/delete/{id}
Deletes a person. Can be identified by person_id or by code + project_id.
With historicize=true, the person is historicized instead of deleted (equivalent to the historicize endpoint).
If force=false (default), the operation is interrupted and the response lists related entities.
If force=true, the person and all related entities are deleted.
Authorizations
Section titled “Authorizations ”Path Parameters
Section titled “Path Parameters ”The person_id to delete. Required if code and project_id are not provided.
Query Parameters
Section titled “Query Parameters ”Employee code. Required together with project_id if id is not provided.
Required together with code if id is not provided.
If true, the person is historicized instead of deleted.
If true, deletes the person and all related entities. If false, returns a preview of affected entities.
Responses
Section titled “ Responses ”Person deleted successfully
Preview of entities that would be deleted (returned when force=false)
Webhooks
Section titled “Webhooks”PERSON::CREATE
Section titled “PERSON::CREATE”Triggered when a new person is created.
Request Body
Section titled “Request Body ”The newly created person
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Example
{ "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Smith", "code": "JS001", "birth_date": "1985-03-15", "entity_id": "john.smith@example.com", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01", "related_user": "relatedUser_user"}Responses
Section titled “ Responses ”Acknowledgment of the webhook event
PERSON::UPDATE
Section titled “PERSON::UPDATE”Triggered when a person is updated. Provides the person ID and an object containing old and new values for each updated field.
Request Body
Section titled “Request Body ”Updated person with old and new values for changed fields
object
The person_id of the updated person.
Each key is an updated field name, with its old and new values.
object
object
Example
{ "entity_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "updated_fields": { "last_name": { "new": "Johnson", "old": "Smith" } }}Responses
Section titled “ Responses ”Acknowledgment of the webhook event
PERSON::DELETE
Section titled “PERSON::DELETE”Triggered when a person is deleted.
Request Body
Section titled “Request Body ”The deleted person
object
Unique identifier of the person. Auto-generated if not provided on creation. Certificates reference the person via the resource_id field — pass this value. Compliance schedule entries reference the person via the subscriber_id field — pass this value. If unknown, use the index endpoint filtering by project_id and last_name or tax_code to find it.
Alternative identifier, typically the company employee code. Can be used with project_id as an alternative to person_id for view, update, historicize, and delete operations.
First name.
Last name.
Residential address.
City.
Postal code.
Region or province.
Sex.
ISO 3166-1 alpha-2 country code.
Date of birth.
Place of birth.
Tax code (fiscal code). Useful for unique lookup within a project.
Free-text notes.
Employment contract type.
1: the person is a company employee0: the person is not an employee Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
1: the person is external prevention and safety staff (e.g. external safety officer, occupational physician)0: the person is not external prevention staff Normally a person is either an employee (is_employee: 1) or external prevention staff (is_prevention_people: 1), not both.
The email of the linked user account. When set together with related_user, the person is connected to a platform account that can authenticate.
The project (company) this person belongs to. Pass the project_id obtained from the Project API.
The permission level of the linked user account on this person:
relatedUser_user: basic access to their own profilerelatedUser_manager: management access If not specified, inherited from the project configuration.
Example
{ "person_id": "e3a1f5d2-8c4b-4e7a-9f6d-2b1c3d4e5f6a", "first_name": "John", "last_name": "Smith", "code": "JS001", "project_id": "b5a7d602-3fc9-4e2a-9d1a-6e5b4c8f7a01"}Responses
Section titled “ Responses ”Acknowledgment of the webhook event