{"removeAttribution":false,"l10n":{"translations":{"default_locale":{"translation":{}}},"defaultLocale":"default_locale","locales":[{"code":"default_locale","name":"default_locale"}]},"logo":{"srcSet":"/assets/dyflexis_landscape_dark.f8b3791d8baa58e8783fa6482666f4e12f8c11b3c57900f3ad565fd3c1df43aa.8a5edab2.svg light, /assets/dyflexis_landscape_white.19f593bfb48d71f6651bb69dff207cd5c2004b94a0f9d60eefb5e216894029cb.8a5edab2.svg dark","altText":"Dyflexis","link":"https://dyflexis.com"},"navbar":{"items":[{"type":"link","fsPath":"guides/quickstart.md","metadata":{"type":"markdown"},"label":"Quickstart","link":"/guides/quickstart","linePosition":"top","routeSlug":"/guides/quickstart"},{"type":"link","fsPath":"guides/use-cases.md","metadata":{"type":"markdown"},"label":"Use cases","link":"/guides/use-cases","linePosition":"top","routeSlug":"/guides/use-cases"},{"type":"link","fsPath":"guides/become-a-partner.md","metadata":{"type":"markdown"},"label":"Become a partner","link":"/guides/become-a-partner","linePosition":"top","routeSlug":"/guides/become-a-partner"},{"type":"link","fsPath":"openapi.yaml","metadata":{"type":"openapi","title":"Dyflexis API","description":"The Dyflexis API gives you programmatic access to the workforce data\nthat powers (automated) staff planning, time tracking, payrolling, absence\nmanagement, workload information and staff capacity in Dyflexis.\n\nEndpoints are organised by resource, **Employees**, **Contracts**,\n**Time clock**, **Payroll**, **Absence**, **Information streams**, and\nso on. The version of each endpoint (`v0`, `api2`, `v3`) lives in the\nURL; you can mix versions in the same integration.\n\n## Base URL\n\n```\nhttps://app.dyflexis.com/{systemName}\n```\n\nReplace `{systemName}` with the tenant identifier of the\ncustomer you are integrating with, the customer provides this\nvalue to you when they connect your integration (see the\n[`systemName` server variable](#section/Servers) below for\ndetails on where to find it). Every server URL in this\nspecification (and any new environment added in the future)\nstarts with this base; new environments extend it with\nadditional path segments rather than introducing a different\nhost. This is enforced by the `rule/server-url-base` lint\nassertion in `redocly.yaml`. Each version has its own URL\nprefix under that base:\n\n| Version | Prefix | Status |\n| --- | --- | --- |\n| v3 | `/api/<resource>/v3/...` | Latest production, preferred for new integrations |\n| api2 (v2) | `/api2/...` | Stable production, use when no v3 equivalent exists |\n| v0 | `/api/v0/...` | Legacy, one endpoint kept for existing Business Intelligence consumers |\n\n## Authentication\n\nAlmost every endpoint requires an API key, sent in the\n`Authorization` header with the `Token` prefix:\n\n```\nAuthorization: Token YOUR_AUTH_TOKEN\n```\n\n`YOUR_AUTH_TOKEN` is the API key issued to you by Dyflexis.\n\nTo call an endpoint directly from these docs: open the\noperation, click **Try it**, and open the **Security** tab of\nthe request panel. **Name** is pre-filled with `Authorization`\nand **API key** with `Token YOUR_AUTH_TOKEN`; replace\n`YOUR_AUTH_TOKEN` with your API key, keeping the `Token `\nprefix. The key is kept in your browser's session storage only\nand is cleared when the session ends.\n\n### API scopes\n\nEach token is issued with one or more **scopes** that gate which\nparts of the API it can call. A scope is a named permission on the\ntoken (for example `business`, `clock`, `payroll`, `absence`,\n`external_employees`, `information_lines`); every operation\ndeclares the scope it requires, and the scope must be **enabled on\nyour token** before that operation will accept the request. A\ntoken without the required scope is rejected with `403 Forbidden`,\neven when the token itself is otherwise valid.\n\nScopes are issued per integration, you do not pick them yourself.\nAsk a Dyflexis administrator to enable the scopes you need when you request your\ntoken. The required scope is listed on each operation.\n\n## Beta endpoints\n\nEndpoints marked with a **BETA** badge are in active development.\nTheir URLs, request and response bodies, and authentication may change\nat any time. Do not depend on them in production. They are listed\ninline with the resource they belong to so you can preview upcoming\nbehaviour.\n\n## Timezones\n\nAll date and time values in this API are expressed in the\n**timezone configured on the customer's Dyflexis tenant**, not\nUTC and not the partner's local timezone. A shift returned as\nstarting at `09:00` starts at `09:00` in the customer's\nconfigured timezone, regardless of where your client is\nrunning, and a timestamp you send in is interpreted the same\nway. The tenant timezone is a per-customer setting; if you\nintegrate with customers in different countries, treat the\ntimezone as a per-tenant property and read or store it\nalongside the data you process.\n\n## Errors\n\nThe API returns standard HTTP status codes. Successful responses are\nin the `2xx` range; client errors in the `4xx` range; server errors in\nthe `5xx` range.\n\n| Code | Meaning |\n| --- | --- |\n| `200 OK` | Request succeeded |\n| `201 Created` | Resource created |\n| `400 Bad Request` | Validation failed or the payload was malformed |\n| `401 Unauthorized` | Missing or invalid authentication |\n| `403 Forbidden` | Token does not include the required scope |\n| `404 Not Found` | Resource or path does not exist |\n| `429 Too Many Requests` | Rate limit exceeded, back off and retry |\n| `500 Internal Server Error` | Unexpected server error |\n| `503 Service Unavailable` | Upstream system temporarily unavailable |\n\nError bodies are returned as `application/json` **only when the request\nsends an `Accept: application/json` header**; without it the API may\nreturn an HTML error page instead, so always send that header. A JSON\nerror body has the fields `title`, `status`, `detail`, `message` (the\nsame text as `detail`), and `code`. Validation failures (`400`) add a\n`violations` array with one entry per invalid field (`propertyPath`,\n`title`, `type`).\n\n## Rate limiting\n\nRequests are rate-limited per token. When a token exceeds the limit,\nrequests return `429 Too Many Requests`. Implement exponential backoff\non `429` and `5xx` responses, and avoid tight polling loops.\n\n## Pagination\n\nList endpoints paginate with a `page` query parameter (or a path\nsegment, depending on the version). Where supported, responses\ninclude a `_links` block with `self`, `next`, `prev`, `first`, and\n`last` URLs you can follow without recomputing.\n","summary":"REST API for the Dyflexis workforce management platform."},"label":"API reference","link":"/openapi","linePosition":"top","routeSlug":"/openapi"}]},"footer":{"copyrightText":"© Dyflexis. All rights reserved.","items":[{"type":"group","label":"Documentation","items":[{"type":"link","fsPath":"guides/quickstart.md","metadata":{"type":"markdown"},"label":"Quickstart","link":"/guides/quickstart","linePosition":"top","routeSlug":"/guides/quickstart"},{"type":"link","fsPath":"guides/webhooks.md","metadata":{"type":"markdown"},"label":"Webhooks","link":"/guides/webhooks","linePosition":"top","routeSlug":"/guides/webhooks"},{"type":"link","fsPath":"openapi.yaml","metadata":{"type":"openapi","title":"Dyflexis API","description":"The Dyflexis API gives you programmatic access to the workforce data\nthat powers (automated) staff planning, time tracking, payrolling, absence\nmanagement, workload information and staff capacity in Dyflexis.\n\nEndpoints are organised by resource, **Employees**, **Contracts**,\n**Time clock**, **Payroll**, **Absence**, **Information streams**, and\nso on. The version of each endpoint (`v0`, `api2`, `v3`) lives in the\nURL; you can mix versions in the same integration.\n\n## Base URL\n\n```\nhttps://app.dyflexis.com/{systemName}\n```\n\nReplace `{systemName}` with the tenant identifier of the\ncustomer you are integrating with, the customer provides this\nvalue to you when they connect your integration (see the\n[`systemName` server variable](#section/Servers) below for\ndetails on where to find it). Every server URL in this\nspecification (and any new environment added in the future)\nstarts with this base; new environments extend it with\nadditional path segments rather than introducing a different\nhost. This is enforced by the `rule/server-url-base` lint\nassertion in `redocly.yaml`. Each version has its own URL\nprefix under that base:\n\n| Version | Prefix | Status |\n| --- | --- | --- |\n| v3 | `/api/<resource>/v3/...` | Latest production, preferred for new integrations |\n| api2 (v2) | `/api2/...` | Stable production, use when no v3 equivalent exists |\n| v0 | `/api/v0/...` | Legacy, one endpoint kept for existing Business Intelligence consumers |\n\n## Authentication\n\nAlmost every endpoint requires an API key, sent in the\n`Authorization` header with the `Token` prefix:\n\n```\nAuthorization: Token YOUR_AUTH_TOKEN\n```\n\n`YOUR_AUTH_TOKEN` is the API key issued to you by Dyflexis.\n\nTo call an endpoint directly from these docs: open the\noperation, click **Try it**, and open the **Security** tab of\nthe request panel. **Name** is pre-filled with `Authorization`\nand **API key** with `Token YOUR_AUTH_TOKEN`; replace\n`YOUR_AUTH_TOKEN` with your API key, keeping the `Token `\nprefix. The key is kept in your browser's session storage only\nand is cleared when the session ends.\n\n### API scopes\n\nEach token is issued with one or more **scopes** that gate which\nparts of the API it can call. A scope is a named permission on the\ntoken (for example `business`, `clock`, `payroll`, `absence`,\n`external_employees`, `information_lines`); every operation\ndeclares the scope it requires, and the scope must be **enabled on\nyour token** before that operation will accept the request. A\ntoken without the required scope is rejected with `403 Forbidden`,\neven when the token itself is otherwise valid.\n\nScopes are issued per integration, you do not pick them yourself.\nAsk a Dyflexis administrator to enable the scopes you need when you request your\ntoken. The required scope is listed on each operation.\n\n## Beta endpoints\n\nEndpoints marked with a **BETA** badge are in active development.\nTheir URLs, request and response bodies, and authentication may change\nat any time. Do not depend on them in production. They are listed\ninline with the resource they belong to so you can preview upcoming\nbehaviour.\n\n## Timezones\n\nAll date and time values in this API are expressed in the\n**timezone configured on the customer's Dyflexis tenant**, not\nUTC and not the partner's local timezone. A shift returned as\nstarting at `09:00` starts at `09:00` in the customer's\nconfigured timezone, regardless of where your client is\nrunning, and a timestamp you send in is interpreted the same\nway. The tenant timezone is a per-customer setting; if you\nintegrate with customers in different countries, treat the\ntimezone as a per-tenant property and read or store it\nalongside the data you process.\n\n## Errors\n\nThe API returns standard HTTP status codes. Successful responses are\nin the `2xx` range; client errors in the `4xx` range; server errors in\nthe `5xx` range.\n\n| Code | Meaning |\n| --- | --- |\n| `200 OK` | Request succeeded |\n| `201 Created` | Resource created |\n| `400 Bad Request` | Validation failed or the payload was malformed |\n| `401 Unauthorized` | Missing or invalid authentication |\n| `403 Forbidden` | Token does not include the required scope |\n| `404 Not Found` | Resource or path does not exist |\n| `429 Too Many Requests` | Rate limit exceeded, back off and retry |\n| `500 Internal Server Error` | Unexpected server error |\n| `503 Service Unavailable` | Upstream system temporarily unavailable |\n\nError bodies are returned as `application/json` **only when the request\nsends an `Accept: application/json` header**; without it the API may\nreturn an HTML error page instead, so always send that header. A JSON\nerror body has the fields `title`, `status`, `detail`, `message` (the\nsame text as `detail`), and `code`. Validation failures (`400`) add a\n`violations` array with one entry per invalid field (`propertyPath`,\n`title`, `type`).\n\n## Rate limiting\n\nRequests are rate-limited per token. When a token exceeds the limit,\nrequests return `429 Too Many Requests`. Implement exponential backoff\non `429` and `5xx` responses, and avoid tight polling loops.\n\n## Pagination\n\nList endpoints paginate with a `page` query parameter (or a path\nsegment, depending on the version). Where supported, responses\ninclude a `_links` block with `self`, `next`, `prev`, `first`, and\n`last` URLs you can follow without recomputing.\n","summary":"REST API for the Dyflexis workforce management platform."},"label":"API reference","link":"/openapi","linePosition":"top","routeSlug":"/openapi"}],"linePosition":"top"},{"type":"group","label":"Dyflexis","items":[{"type":"link","link":"https://dyflexis.com","label":"dyflexis.com","external":true,"linePosition":"top"},{"type":"link","link":"mailto:integrations@dyflexis.com","label":"integrations@dyflexis.com","linePosition":"top"}],"linePosition":"top"}]},"aiAssistant":{"hide":false,"suggestions":["How to connect to a Dyflexis system?","How to fetch the id of an department?"]},"markdown":{"frontMatterKeysToResolve":["image","links"],"partialsFolders":["**/_partials/**"],"lastUpdatedBlock":{"format":"timeago"},"toc":{"header":"On this page","depth":3},"editPage":{}},"openapi":{"codeSamples":{"languages":[{"lang":"curl"},{"lang":"JavaScript"},{"lang":"Node.js"},{"lang":"Python"},{"lang":"PHP"},{"lang":"Go"}]},"hideReplay":false,"corsProxyUrl":""},"mcp":{"hide":false,"docs":{"hide":false,"name":"Dyflexis API MCP server","ignore":[]}},"banner":[],"breadcrumbs":{"prefixItems":[]},"userMenu":{"hide":true},"auth":{"idpsInfo":[]},"search":{},"entitiesCatalog":{},"apiProducts":{},"mcpData":{"docs":{"enabled":true,"name":"Dyflexis API MCP server"}},"searchFeatures":{"advanced":{"enabled":false},"ai":{"enabled":true}},"analytics":{"ga":{"trackingId":"","exclude":[],"trackers":{}}}}