# Get absences
Source: https://developers.malibou.com/api-reference/absences/get-absences
/api-reference/openapi/public-api-1.11.0.json get /organizations/{organizationId}/absences
Required scope: `org:absence:read`
# Get collaborator by id
Source: https://developers.malibou.com/api-reference/collaborators/get-collaborator-by-id
/api-reference/openapi/public-api-1.11.0.json get /organizations/{organizationId}/collaborators/{collaboratorId}
Required scope: `org:employee:read`
# Get collaborators
Source: https://developers.malibou.com/api-reference/collaborators/get-collaborators
/api-reference/openapi/public-api-1.11.0.json get /organizations/{organizationId}/collaborators
Required scope: `org:employee:read`
# Create complementary contract affiliation
Source: https://developers.malibou.com/api-reference/complementary-contracts-affiliations/create-complementary-contract-affiliation
/api-reference/openapi/public-api-1.11.0-partners.json put /organizations/{organizationId}/collaborators/{collaboratorId}/affiliations
Required scope: `org:employee:health_insurance:manage`
# Create complementary contract affiliations
Source: https://developers.malibou.com/api-reference/complementary-contracts-affiliations/create-complementary-contract-affiliations
/api-reference/openapi/public-api-1.11.0-partners.json put /organizations/{organizationId}/complementary-contracts/affiliations
Required scope: `org:employee:health_insurance:manage`
# Get complementary contract affiliations
Source: https://developers.malibou.com/api-reference/complementary-contracts-affiliations/get-complementary-contract-affiliations
/api-reference/openapi/public-api-1.11.0-partners.json get /organizations/{organizationId}/collaborators/{collaboratorId}/affiliations
Required scope: `org:employee:health_insurance:manage`
# Create complementary contracts from fiche parametrage
Source: https://developers.malibou.com/api-reference/complementary-contracts/create-complementary-contracts-from-fiche-parametrage
/api-reference/openapi/public-api-1.11.0-partners.json post /organizations/{organizationId}/complementary-contracts/fiche-parametrage
Required scope: `org:employee:health_insurance:manage`
# Get complementary contracts
Source: https://developers.malibou.com/api-reference/complementary-contracts/get-complementary-contracts
/api-reference/openapi/public-api-1.11.0-partners.json get /organizations/{organizationId}/complementary-contracts
Required scope: `org:employee:health_insurance:manage`
# Get meal vouchers
Source: https://developers.malibou.com/api-reference/meal-vouchers/get-meal-vouchers
/api-reference/openapi/public-api-1.11.0-partners.json get /organizations/{organizationId}/meal-vouchers
Required scope: `org:company:read`
# Get company
Source: https://developers.malibou.com/api-reference/organizations/get-company
/api-reference/openapi/public-api-1.11.0-partners.json get /organizations/{organizationId}
Required scope: `org:company:read`
# Get work locations
Source: https://developers.malibou.com/api-reference/work-locations/get-work-locations
/api-reference/openapi/public-api-1.11.0.json get /organizations/{organizationId}/work-locations
Required scope: `org:work_location:read`
# Authentication
Source: https://developers.malibou.com/authentication
How to authenticate against the malibou public API.
The malibou public API authenticates requests with an **API key**. You create a
key from the malibou app, then send it as a **Bearer token** on every request.
Creating and revoking API keys requires an **Admin** role on the organization.
## Create an API key
In the malibou app, go to [**Profile button → My company → API keys**](https://app.malibou.com/admin/company/api-keys).
Click **Create an API key**, give it a descriptive name (for example "Planning
integration"), and tick the permissions the key should grant. Each permission
limits the key to a specific kind of data. See [Scopes](#scopes) for the full
list.
The secret is shown **only once**. Copy it and store it somewhere safe (a
secret manager, not source control). You will not be able to view it again
after closing the window.
Treat the API key like a password. Anyone with the key can read the data
covered by its permissions on behalf of your organization.
## Scopes
Each API key is granted one or more scopes that restrict what data it can
access. Select only the scopes your integration actually needs.
| Scope | Description |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `org:employee:read` | Read collaborators basic data (last name, first name, personnel number, email) |
| `org:employee:details:read` | Read collaborators personal data (social security number, address, phone, bank account, etc.). Requires `org:employee:read` |
| `org:contract:details:read` | Read contract data (start date and end date). Requires `org:employee:read` |
| `org:absence:read` | Read absence requests |
| `org:absence:type:read` | Read absence type (leave code). Requires `org:absence:read` |
| `org:work_location:read` | Read work location and remote work requests |
## Partner-only scopes
Some endpoints, grouped under **Partners only** in the [API reference](/api-reference),
require scopes that are not listed above (`org:company:read`,
`org:employee:health_insurance:manage`). These scopes are not selectable when creating
an API key from the app: they are only granted to integration partners with an approved
partnership agreement with malibou. If you are interested in using these endpoints, please contact us.
If you are building a self-serve integration, you can safely ignore the
**Partners only** section of the API reference: your API key will always
return `403` on those endpoints, regardless of the permissions you select.
## Retrieve your organization id
Every endpoint is scoped to an organization, whose id is part of the request path
(`/api/public/v1/organizations/{organizationId}/...`). You need it before calling
any endpoint. Retrieve it from the
[API keys page](https://app.malibou.com/admin/company/api-keys): open the actions
menu (next to **Create an API key**) and choose **Copy organization ID**.
## Authenticate your requests
Send the key in the `Authorization` header as a Bearer token:
```bash theme={null}
curl https://app.malibou.com/api/public/v1/organizations/{organizationId}/collaborators \
-H "Authorization: Bearer YOUR_API_KEY"
```
Every endpoint under `/api/public/v1` requires this header. A request with a
missing or invalid key returns `401`, and a key that lacks the permission an
endpoint requires returns `403` (see [Errors](/usage/errors)).
## Manage and revoke keys
The [API keys page](https://app.malibou.com/admin/company/api-keys) lists every
key for your organization with its name, permissions, status and creation date.
API keys **do not expire** by default. If a key is compromised or no longer
needed, **revoke** it from this page. Revocation is **immediate and
irreversible**. Any request made with a revoked key returns `401`.
# Changelog
Source: https://developers.malibou.com/changelog
All notable changes to the malibou public API.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## \[1.11.0] - 2026-08-03
### Changed
* `organismeCode` is now nullable on the complementary contracts and affiliations read endpoints.
## \[1.10.0] - 2026-07-20
### Added
* expose `type` (the leave code) on the absences list endpoint (needs `org:absence:type:read`)
## \[1.9.0] - 2026-06-29
### Added
* expose `phoneNumber` on the collaborators list and detail endpoints (needs `org:employee:details:read`)
* expose `manager` and `team` on the collaborators list endpoint (needs `org:employee:details:read`)
* all paginated endpoints now return a deterministic order: collaborators by last name then first name, absences and work locations by start date; the collaborator contracts array (returned with `org:contract:details:read`, not paginated) is also sorted by start date
### Changed
* `email` is now returned with the base `org:employee:read` scope on the collaborators endpoints (previously required `org:employee:details:read`)
* `GET /organizations/[organizationId]/collaborators/[collaboratorId]` now only requires `org:employee:read`; personal data is still returned only with `org:employee:details:read`, so the endpoint can be used to resolve a collaborator by id with the base scope
* renamed the absences response field `employeeId` to `collaboratorId`, for consistency with the other endpoints
> **Note on versioning**: renaming `employeeId` to `collaboratorId` is technically a breaking change but is released as a **minor** version. The absences endpoint has no production consumer yet, so the rename breaks no one in practice.
## \[1.8.0] - 2026-06-29
### Added
* List of contracts in API `GET /organizations/[organizationId]/collaborators/[collaboratorId]` (needs `org:contract:details:read scope`)
### Changed
* `GET /organizations/[organizationId]/collaborators` now requires `org:employee:details:read` to return detailed personal data and `org:contract:details:read` to return the current contract. Existing credentials with only `org:employee:read` have been migrated to include both scopes.
## \[1.7.0] - 2026-06-26
### Removed
* **Breaking change**: removed all `/companies/[organizationId]` endpoints (company, collaborators, complementary-contracts, meal-vouchers). Use the `/organizations/[organizationId]` equivalents instead (available since v1.3.0).
> **Note on versioning**: although this is technically a breaking change, it is released as a **minor** version (not a major bump). Every known consumer has already migrated to the `/organizations/[organizationId]` endpoints, so removing the `/companies` aliases breaks no one in practice. This is a deliberate, one-off exception to our Semantic Versioning policy; it is **not** a precedent (future breaking changes will still warrant a major version bump).
## \[1.6.0] - 2026-06-23
### Added
* work locations API: `GET /organizations/[organizationId]/work-locations`, returning work locations overlapping the requested `startDate`/`endDate` range, with an optional `status` filter and optional `establishmentId` filter
## \[1.5.0] - 2026-06-22
### Added
* collaborator API: `GET /organizations/[organizationId]/collaborators/[collaboratorId]`, returning a specific collaborator with detailed personal data.
## \[1.4.0] - 2026-06-22
### Added
* absences API: `GET /organizations/[organizationId]/absences`, returning absences overlapping the requested `startDate`/`endDate` range, with an optional `status` filter
## \[1.3.0] - 2026-06-18
### Added
* add `status` field (`past` / `active` / `future`) on the collaborators endpoint
* expose all endpoints under the `/organizations/[organizationId]` path, as an alias of `/companies/[organizationId]`
### Changed
* make the `establishmentId` query parameter optional on read endpoints (organization-wide results when omitted)
* make `establishmentId` nullable in the OIDC user info response
## \[1.2.1] - 2026-02-03
### Fixed
* do not allow non positive numbers for pagination `page` and `limit` parameters
## \[1.2.0] - 2026-01-07
### Changed
* make `estCadre` boolean field nullable
## \[1.1.0] - 2025-12-15
### Added
* add "external\_staff" employment type
## \[1.0.0] - 2025-10-15 (initial release)
### Added
* company API
* collaborators API
* meal-vouchers API
* complementary-contracts API
# Introduction
Source: https://developers.malibou.com/introduction
Build integrations on top of malibou with the public API.
The malibou public API lets partners and customers read and manage HR and
payroll data programmatically.
All endpoints are served under the `/api/public/v1` prefix.
Some endpoints, grouped under **Partners only** in the [API
reference](/api-reference), are reserved for integration partners with an
approved partnership agreement with malibou — a self-serve API key cannot
access them. See [Partner-only scopes](/authentication#partner-only-scopes).
## Next steps
Make your first successful call in a few minutes.
Create an API key to call the API.
Browse every endpoint, its parameters and responses.
## Conventions
* All requests and responses use `application/json`.
* Dates are ISO 8601 strings.
* List endpoints are paginated (see [Pagination](/usage/pagination)).
* Errors follow standard HTTP status codes (see [Errors](/usage/errors)).
# Quickstart
Source: https://developers.malibou.com/quickstart
Make your first successful call to the malibou public API.
Get your first successful call working in a few minutes: create an API key,
call an endpoint, then page through the results.
In the malibou app, go to [**Profile button → My company → API
keys**](https://app.malibou.com/admin/company/api-keys), click **Create
an API key**, and tick the `org:employee:read` permission. Copy the
secret shown (you won't be able to view it again). See
[Authentication](/authentication) for the full list of scopes and how to
manage keys.
Open the [API keys page](https://app.malibou.com/admin/company/api-keys), open
the actions menu (next to **Create an API key**) and choose **Copy
organisation ID**. See
[Authentication](/authentication#retrieve-your-organization-id) for details.
Call the collaborators endpoint with your key as a Bearer token:
```bash theme={null}
curl "https://app.malibou.com/api/public/v1/organizations/{organizationId}/collaborators" \
-H "Authorization: Bearer $API_KEY"
```
List endpoints return results in pages. Add `page` and `limit` to control
how many results come back:
```bash theme={null}
curl "https://app.malibou.com/api/public/v1/organizations/{organizationId}/collaborators?page=1&limit=50" \
-H "Authorization: Bearer $API_KEY"
```
Iterate by incrementing `page` until a page returns fewer items than
`limit`. See [Pagination](/usage/pagination) for details.
## Next steps
Scopes, key management and the full authentication guide.
Browse every endpoint, its parameters and responses.
How the API reports errors.
Stay within the request limits.
# Errors
Source: https://developers.malibou.com/usage/errors
How the API reports errors.
The API uses standard HTTP status codes. Errors return a JSON body describing
what went wrong.
| Status | Meaning |
| ------ | -------------------------------------------------------------------------- |
| `400` | Bad request: invalid parameters or body. |
| `401` | Unauthorized: missing, invalid or expired API key. |
| `403` | Forbidden: the API key lacks the required [scope](/authentication#scopes). |
| `404` | Not found: the resource does not exist or is not accessible. |
| `429` | Too many requests: see [Rate limits](/usage/rate-limits). |
| `500` | Internal server error: retry later or contact support. |
## Handling expired or revoked API keys
A `401` typically means the API key has expired or has been revoked. You may
generate a new API key.
## Handling validation errors
A `400` indicates a malformed request, for example a non-positive `page` or
`limit` (see [Pagination](/usage/pagination)). Inspect the response body for
details and correct the request before retrying.
# Pagination
Source: https://developers.malibou.com/usage/pagination
How to page through list endpoints.
List endpoints return results in pages. Control pagination with two query
parameters:
| Parameter | Type | Description |
| --------- | ------- | ----------------------------------------------------- |
| `page` | integer | 1-based page number. Must be a positive integer. |
| `limit` | integer | Number of items per page. Must be a positive integer. |
`page` and `limit` must be strictly positive integers. Non-positive values are
rejected with `400 Bad Request`.
## Example
```bash theme={null}
curl "https://app.malibou.com/api/public/v1/organizations/{organizationId}/collaborators?page=1&limit=50" \
-H "Authorization: Bearer $API_KEY"
```
Iterate by incrementing `page` until a page returns fewer items than `limit`.
# Rate limits
Source: https://developers.malibou.com/usage/rate-limits
Stay within the request limits.
To keep the API healthy for everyone, requests are rate limited. When you
exceed the limit, the API responds with `429 Too Many Requests`.
## Best practices
* **Back off and retry.** On a `429`, wait before retrying, ideally with
exponential backoff.
* **Page efficiently.** Use a reasonable `limit` rather than many small requests
(see [Pagination](/usage/pagination)).
* **Cache when possible.** Avoid re-fetching data that rarely changes.
If your integration needs a higher limit, [contact
us](mailto:support@malibou.com).
# Versioning
Source: https://developers.malibou.com/usage/versioning
How the malibou public API is versioned.
The malibou public API follows [Semantic Versioning](https://semver.org). The
current major version is **v1** and is served under `/api/public/v1`.
Only the latest version of the API is exposed and documented. There is no
access to previous minor versions (as they do not introduce breaking changes).
* **Major** (`v1` → `v2`): breaking changes.
* **Minor** (`1.1.0` → `1.2.0`): backward-compatible additions (new endpoints,
new optional fields).
* **Patch** (`1.2.0` → `1.2.1`): backward-compatible fixes.
## Staying up to date
Every change is recorded in the [Changelog](/changelog).