# Personio Personnel Data API

> Personio Personnel Data API on Apizie: 29 endpoints (List Company Employees, Create an employee, Show employee by ID, Update an employee, …) returned as clean JSON through one API key. Send your own provider key in the x-upstream-key header. Call it over REST at https://apizie.tech/v1/business:personio-data/{endpoint} or from Claude, ChatGPT and Cursor through the Apizie MCP server. Free plan: 1,000 requests a month.

- Project key: `business:personio-data`
- Category: Business
- Status: byok
- Source: https://personio.com
- Page: https://apizie.tech/api/business/personio-data
- OpenAPI: https://apizie.tech/api/business/personio-data/openapi.json

API for reading and writing personnel data including data about attendances, absences, documents, etc

## Endpoints

### List Company Employees
`GET https://apizie.tech/v1/business:personio-data/employees-get-list` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| limit | integer | no | Pagination attribute to limit the number of employees returned per page. |
| offset | integer | no | Pagination attribute to identify the first item in the collection to return. |
| email | string | no | Find an employee with the given email address. The response is still a list, containing only the filtered employee. NOTE: when using the… |
| attributes[] | array | no | A list of attributes that will be returned for the employees, ie. a projection of the employee fields and relationships. In case… |
| updated_since | string | no | Filter to select and return only the employees that have been updated after `updated_since`. When it is used together with the… |

### Create an employee
`POST https://apizie.tech/v1/business:personio-data/employees-create-employee` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | no | JSON request body |

### Show employee by ID
`GET https://apizie.tech/v1/business:personio-data/employees-show-by-id` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| employee_id | integer | yes | Numeric `id` of the employee |

### Update an employee
`POST https://apizie.tech/v1/business:personio-data/employees-update-employee-fields` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| employee_id | integer | yes | Numeric `id` of the employee |
| body | object | no | JSON request body |

### Retrieve the absence balance for a specific employee
`GET https://apizie.tech/v1/business:personio-data/employees-get-absence-balance` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| employee_id | integer | yes | Numeric `id` of the employee |

### This endpoint is an alias for `/company/employees/attributes`.
`GET https://apizie.tech/v1/business:personio-data/employees-get-custom-attributes` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |

### Lists all the allowed atrributes per API credentials including custom (dynamic) attributes.
`GET https://apizie.tech/v1/business:personio-data/employees-list-attributes` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |

### Show employee's profile picture. If profile picture is missing, the 404 error will be thrown. The `Profile…
`GET https://apizie.tech/v1/business:personio-data/employees-show-profile-picture` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| employee_id | integer | yes | Numeric `id` of the employee |
| width | integer | yes | Width of the image. Default is original size |

### Fetch attendance data for the company employees. The result can be `paginated` and `filtered` by period, the…
`GET https://apizie.tech/v1/business:personio-data/attendances-get-list` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| start_date | string | yes | First day of the period to be queried. It is inclusive, so the day specified as start_date will also be considered on the results |
| end_date | string | yes | Last day of the period to be queried. It is inclusive, so the day specified as end_date will also be considered on the results. |
| updated_from | string | no | Datetime from when the queried periods have been updated. Same format as updated_at. It is inclusive, so the day specified as updated_from… |
| updated_to | string | no | Datetime until when the queried periods have been updated. Same format as updated_at. It is inclusive, so the day specified as updated_to… |
| includePending | boolean | no | Returns AttendancePeriods with a status of pending, rejected and confirmed. For pending periods, the end_date attribute is nullable. The… |
| employees[] | array | no | A list of Personio employee ID's to filter the results. The result filters including only attendances of provided employees. |
| limit | integer | no | Pagination attribute to limit how many attendances are per page |
| offset | integer | no | The offset from the first record that would be returned. With 3 results [A, B, C] and an offset of 1, the following two results will be… |

### This endpoint is responsible for adding attendance data for the company employees. It is possible to add…
`POST https://apizie.tech/v1/business:personio-data/attendances-create-multiple-attendances` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | yes | JSON request body |

### This endpoint is responsible for updating attendance data for the company employees. Attributes are not…
`POST https://apizie.tech/v1/business:personio-data/attendances-update-attendance-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| id | integer | yes | ID of the attendance period to update |
| body | object | yes | JSON request body |

### This endpoint is responsible for deleting attendance data for the company employees.
`POST https://apizie.tech/v1/business:personio-data/attendances-delete-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| id | integer | yes | ID of the attendance period to delete |
| skip_approval | boolean | no | Optional, default value is true. If set to false, the approval status of the attendance period will be "pending" if an approval rule is… |

### Provides a list of all company projects.
`GET https://apizie.tech/v1/business:personio-data/projects-get-all` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |

### Creates a project into the company account
`POST https://apizie.tech/v1/business:personio-data/projects-create-project` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | no | JSON request body |

### Updates a project with the given data
`POST https://apizie.tech/v1/business:personio-data/projects-update-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | yes | Numeric `id` of the project |
| body | object | no | JSON request body |

### Deletes a project from the company account
`POST https://apizie.tech/v1/business:personio-data/projects-delete-project` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | yes | Numeric `id` of the project |

### Provides a list of absence types for absences **time unit** set to either **days** or **hours**. For example…
`GET https://apizie.tech/v1/business:personio-data/absences-list-time-off-types` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| limit | integer | no | Pagination attribute to limit how many records will be returned per page |
| offset | integer | no | Pagination attribute to identify which page you are requesting, by the form of telling an offset from the first record that would be… |

### Fetches absence periods for absences with **time unit** set to **days**. The result can be `paginated` and…
`GET https://apizie.tech/v1/business:personio-data/absences-get-absence-periods` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| start_date | string | no | First day of the period to be queried. It is inclusive, so the result starts from and including the provided `start_date` |
| end_date | string | no | Last day of the period to be queried. It is inclusive, so the result ends on `end_date` including absences from the `end_date` |
| updated_from | string | no | Query the periods that created or modified from the date `updated_from`. It is inclusive, so all the periods created or modified from the… |
| updated_to | string | no | Query the periods that created or modified until the date `updated_to`. It is inclusive, so all the periods created or modified until the… |
| employees[] | array | no | A list of Personio employee ID's to filter the results. The result filters including only absences of provided employees |
| limit | integer | no | Pagination attribute to limit the number of absence periods per page |
| offset | integer | no | Pagination attribute to identify which page number you are requesting |

### Adds absence data for absence types with **time unit** set to **days**.
`POST https://apizie.tech/v1/business:personio-data/absences-add-absence-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | yes | Form fields as a JSON object |

### Gets an absence period for absences with **time unit** set to **days**.
`GET https://apizie.tech/v1/business:personio-data/absences-get-absence-period` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| id | integer | yes | Numeric `id` of the absence period |

### Deletes absence period data for absence types with **time unit** set to **days**.
`POST https://apizie.tech/v1/business:personio-data/absences-delete-absence-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| id | integer | yes | ID of the absence period to delete |

### Fetches absence periods for absences with **time unit** set to **hours**. The result can be `paginated` and…
`GET https://apizie.tech/v1/business:personio-data/absences-get-hourly-periods` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| start_date | string | no | Filter by absence periods that start at or before given date. |
| end_date | string | no | Filter by absence periods that start at or before given date. |
| updated_from | string | no | Filter by periods that were created or modified from the date updated_from. It is inclusive, so all the periods created or modified from… |
| updated_to | string | no | Filter by periods that were created or modified until the date updated_to. It is inclusive, so all the periods created or modified until… |
| employees[] | array | no | A list of Personio employee ID's to filter the results. The result filters including only absences of provided employees |
| absence_types[] | array | no | A list of Personio absence type IDs to filter the results. The result filters including only absences of provided absence types. |
| absence_periods[] | array | no | A list of Personio absence period IDs to filter the results. The result filters including only absences containing the provided ids. |
| limit | integer | no | Pagination attribute to limit how many absence periods are returned per page. |
| offset | integer | no | Pagination attribute to identify which page you are requesting, by the form of telling an offset from the first record that would be… |

### Adds absence data for absence types with **time unit** set to **hours**. Note that creating periods for…
`POST https://apizie.tech/v1/business:personio-data/absences-add-absence-periods-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | yes | Form fields as a JSON object |

### Deletes absence period data for absence types with **time unit** set to **hours**.
`POST https://apizie.tech/v1/business:personio-data/absences-delete-period-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| id | string | yes | ID of the absence period to delete |

### This endpoint is responsible for fetching all document categories of the company. The result contains a list…
`GET https://apizie.tech/v1/business:personio-data/documents-get-categories` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |

### This endpoint is responsible for uploading documents for the company employees.
`POST https://apizie.tech/v1/business:personio-data/documents-upload-for-employees` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| body | object | no | Form fields as a JSON object |

### This endpoint provides you with metadata about existing custom reports in your Personio account, such as…
`GET https://apizie.tech/v1/business:personio-data/custom-reports-get-metadata` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| report_ids | array | no | A list of report ID's to filter the results. |
| status | string | no | The status of the report to filter the results. |

### This endpoint provides you with the data of an existing Custom Report.
`GET https://apizie.tech/v1/business:personio-data/custom-reports-get-data` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| report_id | string | yes | The ID of the report to filter the result. |
| locale | string | no | locale used to translate localized fields. |
| page | integer | no | Pagination parameter to identify the page to return. |
| limit | integer | no | Pagination parameter to limit the number of employees returned per page. |

### This endpoint provides human-readable labels for report table columns. It is particularly important if you…
`GET https://apizie.tech/v1/business:personio-data/custom-reports-get-column-labels` (byok)

| Parameter | Type | Required | Description |
|---|---|---|---|
| X-Personio-Partner-ID | string | no | The partner identifier |
| X-Personio-App-ID | string | no | The application identifier |
| columns | array | no | The columns to filter the results. |
| locale | string | no | locale used to translate localized fields. |
| report_id | string | no | The ID of the report to filter the result of the columns. If no ID is passed, all columns for the company are returned. |

## Example
```
curl "https://apizie.tech/v1/business:personio-data/employees-get-list" \
  -H "x-api-key: $APIZIE_KEY" \
  -H "x-upstream-key: $PROVIDER_KEY"
```

## FAQ

### How do I call the Personio Personnel Data API?
Create a free Apizie key, then send GET https://apizie.tech/v1/business:personio-data/employees-get-list with the header x-api-key. Every endpoint returns { project, data, timestamp }.

### Is the Personio Personnel Data API free on Apizie?
Yes. The Free plan includes 1,000 requests a month at 100 requests a minute, no credit card. Personio Personnel Data itself also needs your own key from api.personio.de.

### Can AI agents use the Personio Personnel Data API?
Yes. Add the Apizie MCP server (https://apizie.tech/mcp) to Claude, ChatGPT, Cursor or VS Code, then ask in plain language. The agent calls run_scraper with project key business:personio-data.

### What is the status of the Personio Personnel Data API?
Needs your own provider key (bring your own key)
