{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}
Requests
Preview a request (dry run)
Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member’s allowance covers it, the existing requests it would collide with, and a single can_create verdict.
Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create.
Duration:duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create.
Allowance:is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true.
Conflicts:conflicts lists the member’s existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored.
Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else’s accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses.
Verdict:can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on.
Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.
Start/end of the request in ISO 8601. For day-based leave types (leave_unit: days) send the date at midnight UTC (e.g. 2026-06-01T00:00:00Z) and use start_at / end_at to set half-days. For hour-based leave types include the exact time of day (e.g. 2026-06-01T09:00:00Z); start_at / end_at are then ignored.
Start/end of the request in ISO 8601. For day-based leave types (leave_unit: days) send the date at midnight UTC (e.g. 2026-06-01T00:00:00Z) and use start_at / end_at to set half-days. For hour-based leave types include the exact time of day (e.g. 2026-06-01T09:00:00Z); start_at / end_at are then ignored.
For day-based leave types: whether the absence starts in the morning (the whole first day counts) or afternoon (only the second half of the first day). Ignored for hour-based leave types.
For day-based leave types: whether the absence ends at lunchtime (only the first half of the last day) or end_of_day (the whole last day counts). Ignored for hour-based leave types.
Member IDs to assign as representatives. Required for leave types that mandate representatives; omitting them returns REQUIRED_REPRESENTATIVES_COUNT_NOT_MET (as a 400 on create, as rejection.code on preview).
The one-line verdict: true means POST with this payload passes every rule the create endpoint applies, as of the data at preview time; false means it fails. False whenever rejection is set, a blocking conflict is listed or is_allowance_sufficient is false. Two things the preview cannot see: requests created in between, and changes to the member's approvers that the create call makes when approver sync from Microsoft 365 is on. A snapshot, not a reservation.
True means the allowance covers this payload, false means creating it fails with the allowance error. Always true for leave types that do not deduct. Null when rejection is set: the allowance was not evaluated. conflicts is reported separately and does not affect this flag.
Existing non-declined, non-cancelled requests of the member that overlap the absence, regardless of their leave type. Any entry blocks creation. Null when the payload was rejected before the overlap check ran (START_AFTER_END through OUTSIDE_EMPLOYMENT_PERIOD); populated for every later rejection so both problems are visible at once.
Set when creating the same payload would be rejected with 400: the first failing rule, in the order the create endpoint applies them. Overlapping requests and the allowance are never a rejection; see conflicts and is_allowance_sufficient. duration and is_allowance_sufficient are null when this is set. Match on code, not on message (which is translated into the API key member's language).
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"absentify®","colors":{"primary":"#6264A7","light":"#B3B5FF","dark":"#3D3E66"},"logo":{"light":"https://mintcdn.com/absentify/iNrFvPmeOqKvrSdH/logo/light.svg?fit=max\u0026auto=format\u0026n=iNrFvPmeOqKvrSdH\u0026q=85\u0026s=90d1c401ab5c62a6ba4676540859a9cb","dark":"https://mintcdn.com/absentify/iNrFvPmeOqKvrSdH/logo/dark.svg?fit=max\u0026auto=format\u0026n=iNrFvPmeOqKvrSdH\u0026q=85\u0026s=adc309f6bccae886f6db6c9ef38882fc"},"favicon":"https://mintcdn.com/absentify/iNrFvPmeOqKvrSdH/favicon.svg?fit=max\u0026auto=format\u0026n=iNrFvPmeOqKvrSdH\u0026q=85\u0026s=ad25ce5ffa0f179bd8c41b56b3d6b421","appearance":{"default":"light"},"navbar":{"links":[{"href":"https://absentify.com","label":"Website"}],"primary":{"type":"button","label":"Start","href":"https://absentify.com"}},"footer":{"socials":{"x":"https://x.com/absentify_com","linkedin":"https://linkedin.com/company/absentify","youtube":"https://youtube.com/@absentify"}},"integrations":{},"contextual":{"options":["view","copy","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":"en/introduction"},{"language":"de","href":"de/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"absentify","hasAudioNarration":false,"actualSubdomain":"absentify","customDomains":["absentify.com"],"gitSource":{"type":"github","owner":"absentify","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aea16626d75d7dbce56aedc","collectionId":"60d2335f-d52b-4682-85f9-f6b7bffb72ed","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aea16626d75d7dbce56aedc"},"feedback":{"thumbs":true,"issues":true,"edits":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6aea37cbedfac7d352719a8f","clientVersion":"0.0.4054","searchFilterCounts":[{"language":"en","tag":"HR Admins","count":102},{"language":"de","tag":"Documentation","count":101},{"language":"en","tag":"Documentation","count":101},{"language":"de","tag":"API Reference","count":95},{"language":"en","tag":"API Reference","count":95},{"language":"de","tag":"HR Admins","count":51},{"language":"de","tag":"HR-Admins","count":51},{"language":"de","tag":"Einstellungen","count":46},{"language":"en","tag":"Settings","count":46},{"language":"en","tag":"Microsoft 365 Admins","count":44},{"language":"de","tag":"Allowance Management","count":28},{"language":"en","tag":"Allowance Management","count":28},{"language":"de","tag":"Mitarbeiter","count":24},{"language":"en","tag":"Employee","count":24},{"language":"de","tag":"Microsoft 365-Administratoren","count":22},{"language":"de","tag":"Microsoft 365-Admins","count":22},{"language":"de","tag":"Integrationen","count":17},{"language":"en","tag":"Integrations","count":17},{"language":"en","tag":"Users","count":17},{"language":"en","tag":"Requests","count":17}]},"assistantConfig":{"deflection":{"enabled":true,"email":"support@absentify.com"}},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".responsive-iframe{height:500px!important;width:100%!important;color-scheme:light}@media (max-width:768px){.responsive-iframe{height:300px!important}}"}],"page":{"pagePath":"en/api-reference/requests/preview-a-request-dry-run","slug":"/en/api-reference/requests/preview-a-request-dry-run","pageMetadata":{"title":"Preview a request (dry run)","description":"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member's allowance covers it, the existing requests it would collide with, and a single `can_create` verdict.\n\n**Input:** identical to POST /requests, so one payload can be sent to both URLs. `reason`, `representative_member_ids` and `ignoreRepresentativeRequirement` are evaluated exactly as on create.\n\n**Duration:** `duration.workday_absence_duration` uses the same days-vs-minutes rule as `workday_absence_duration` on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in `start` / `end` is ignored, exactly as on create.\n\n**Allowance:** `is_allowance_sufficient: false` means POST /requests with this payload fails with the allowance error; `true` means it passes that check. Leave types that do not deduct return `takes_from_allowance: false`, `allowance_type: null` and `is_allowance_sufficient: true`.\n\n**Conflicts:** `conflicts` lists the member's existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored.\n\n**Rejection:** the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to `conflicts`, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in `rejection` while the overlap sits in `conflicts`. When a rule fails, the response is still 200 with `rejection` set instead of a 400, and `can_create` is false. Match on `rejection.code`: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else's accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses.\n\n**Verdict:** `can_create` is true only when `rejection` is null, `conflicts` is empty and the allowance covers the absence. It is the one field to gate a create call on.\n\n**Side effects:** no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/preview","href":"/en/api-reference/requests/preview-a-request-dry-run","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member’s allowance covers it, the existing requests it would collide with, and a single \", _jsx(_components.code, {\n children: \"can_create\"\n }), \" verdict.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Input:\"\n }), \" identical to POST /requests, so one payload can be sent to both URLs. \", _jsx(_components.code, {\n children: \"reason\"\n }), \", \", _jsx(_components.code, {\n children: \"representative_member_ids\"\n }), \" and \", _jsx(_components.code, {\n children: \"ignoreRepresentativeRequirement\"\n }), \" are evaluated exactly as on create.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Duration:\"\n }), \" \", _jsx(_components.code, {\n children: \"duration.workday_absence_duration\"\n }), \" uses the same days-vs-minutes rule as \", _jsx(_components.code, {\n children: \"workday_absence_duration\"\n }), \" on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in \", _jsx(_components.code, {\n children: \"start\"\n }), \" / \", _jsx(_components.code, {\n children: \"end\"\n }), \" is ignored, exactly as on create.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Allowance:\"\n }), \" \", _jsx(_components.code, {\n children: \"is_allowance_sufficient: false\"\n }), \" means POST /requests with this payload fails with the allowance error; \", _jsx(_components.code, {\n children: \"true\"\n }), \" means it passes that check. Leave types that do not deduct return \", _jsx(_components.code, {\n children: \"takes_from_allowance: false\"\n }), \", \", _jsx(_components.code, {\n children: \"allowance_type: null\"\n }), \" and \", _jsx(_components.code, {\n children: \"is_allowance_sufficient: true\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Conflicts:\"\n }), \" \", _jsx(_components.code, {\n children: \"conflicts\"\n }), \" lists the member’s existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Rejection:\"\n }), \" the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to \", _jsx(_components.code, {\n children: \"conflicts\"\n }), \", so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in \", _jsx(_components.code, {\n children: \"rejection\"\n }), \" while the overlap sits in \", _jsx(_components.code, {\n children: \"conflicts\"\n }), \". When a rule fails, the response is still 200 with \", _jsx(_components.code, {\n children: \"rejection\"\n }), \" set instead of a 400, and \", _jsx(_components.code, {\n children: \"can_create\"\n }), \" is false. Match on \", _jsx(_components.code, {\n children: \"rejection.code\"\n }), \": START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else’s accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Verdict:\"\n }), \" \", _jsx(_components.code, {\n children: \"can_create\"\n }), \" is true only when \", _jsx(_components.code, {\n children: \"rejection\"\n }), \" is null, \", _jsx(_components.code, {\n children: \"conflicts\"\n }), \" is empty and the allowance covers the absence. It is the one field to gate a create call on.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Side effects:\"\n }), \" no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Preview a request (dry run)","description":"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member's allowance covers it, the existing requests it would collide with, and a single `can_create` verdict.\n\n**Input:** identical to POST /requests, so one payload can be sent to both URLs. `reason`, `representative_member_ids` and `ignoreRepresentativeRequirement` are evaluated exactly as on create.\n\n**Duration:** `duration.workday_absence_duration` uses the same days-vs-minutes rule as `workday_absence_duration` on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in `start` / `end` is ignored, exactly as on create.\n\n**Allowance:** `is_allowance_sufficient: false` means POST /requests with this payload fails with the allowance error; `true` means it passes that check. Leave types that do not deduct return `takes_from_allowance: false`, `allowance_type: null` and `is_allowance_sufficient: true`.\n\n**Conflicts:** `conflicts` lists the member's existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored.\n\n**Rejection:** the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to `conflicts`, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in `rejection` while the overlap sits in `conflicts`. When a rule fails, the response is still 200 with `rejection` set instead of a 400, and `can_create` is false. Match on `rejection.code`: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else's accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses.\n\n**Verdict:** `can_create` is true only when `rejection` is null, `conflicts` is empty and the allowance covers the absence. It is the one field to gate a create call on.\n\n**Side effects:** no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/preview","href":"/en/api-reference/requests/preview-a-request-dry-run","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/absentify/d9569a8dd2540708/crisp.js","/docs/_mintlify/custom/absentify/51984cdb7c392f11/posthog.js"],"openApiReferenceData":{"operation":{"operationId":"request-previewRequest","summary":"Preview a request (dry run)","description":"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member's allowance covers it, the existing requests it would collide with, and a single `can_create` verdict.\n\n**Input:** identical to POST /requests, so one payload can be sent to both URLs. `reason`, `representative_member_ids` and `ignoreRepresentativeRequirement` are evaluated exactly as on create.\n\n**Duration:** `duration.workday_absence_duration` uses the same days-vs-minutes rule as `workday_absence_duration` on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in `start` / `end` is ignored, exactly as on create.\n\n**Allowance:** `is_allowance_sufficient: false` means POST /requests with this payload fails with the allowance error; `true` means it passes that check. Leave types that do not deduct return `takes_from_allowance: false`, `allowance_type: null` and `is_allowance_sufficient: true`.\n\n**Conflicts:** `conflicts` lists the member's existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored.\n\n**Rejection:** the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to `conflicts`, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in `rejection` while the overlap sits in `conflicts`. When a rule fails, the response is still 200 with `rejection` set instead of a 400, and `can_create` is false. Match on `rejection.code`: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else's accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses.\n\n**Verdict:** `can_create` is true only when `rejection` is null, `conflicts` is empty and the allowance covers the absence. It is the one field to gate a create call on.\n\n**Side effects:** no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.","tags":["Requests"],"security":["6deebfa9-6698-47b1-ab6e-cd407752439e"],"parameters":[],"requestBody":"1d19036f-d065-40a7-9cb5-7a184ed07868","responses":{"200":"07d4529d-ac6f-4ec8-b758-7fdd719bccd0","400":"bc8042e7-944f-46cf-9fda-2afd93927809","401":"78f86ae9-520f-415d-bbc1-3fee70c38940","403":"01bd56c2-dee1-4760-8603-41eef43f4ac5","500":"a9b689ef-ba8a-4f6a-8c0b-5b0fc9b5a9b5"},"method":"post","type":"path","servers":["e948ed60-f8cc-4c9d-aefa-a9126fe6b087"],"path":"/requests/preview","baseUrlOptions":["https://api.absentify.com/api/v1"],"title":"Preview a request (dry run)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"start":{"description":"Start/end of the request in ISO 8601. For day-based leave types (`leave_unit: days`) send the date at midnight UTC (e.g. `2026-06-01T00:00:00Z`) and use `start_at` / `end_at` to set half-days. For hour-based leave types include the exact time of day (e.g. `2026-06-01T09:00:00Z`); `start_at` / `end_at` are then ignored.","type":"string","isRequired":true,"uniqueKey":"start","typeLabel":"string"},"end":{"description":"Start/end of the request in ISO 8601. For day-based leave types (`leave_unit: days`) send the date at midnight UTC (e.g. `2026-06-01T00:00:00Z`) and use `start_at` / `end_at` to set half-days. For hour-based leave types include the exact time of day (e.g. `2026-06-01T09:00:00Z`); `start_at` / `end_at` are then ignored.","type":"string","isRequired":true,"uniqueKey":"end","typeLabel":"string"},"leave_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","isRequired":true,"uniqueKey":"leave_type_id","typeLabel":"string\u003cuuid>"},"requester_member_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","isRequired":true,"uniqueKey":"requester_member_id","typeLabel":"string\u003cuuid>"},"start_at":{"type":"string","enum":["morning","afternoon"],"description":"For day-based leave types: whether the absence starts in the `morning` (the whole first day counts) or `afternoon` (only the second half of the first day). Ignored for hour-based leave types.","uniqueKey":"start_at","typeLabel":"enum\u003cstring>"},"end_at":{"type":"string","enum":["lunchtime","end_of_day"],"description":"For day-based leave types: whether the absence ends at `lunchtime` (only the first half of the last day) or `end_of_day` (the whole last day counts). Ignored for hour-based leave types.","uniqueKey":"end_at","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","uniqueKey":"reason","typeLabel":"string"},"representative_member_ids":{"description":"Member IDs to assign as representatives. Required for leave types that mandate representatives; omitting them returns REQUIRED_REPRESENTATIVES_COUNT_NOT_MET (as a 400 on create, as `rejection.code` on preview).","type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$","uniqueKey":"representative_member_ids.items.[INDEX]","typeLabel":"string\u003cuuid>"},"uniqueKey":"representative_member_ids","typeLabel":"string\u003cuuid>[]"},"ignoreRepresentativeRequirement":{"description":"Skip the representative requirement. Only honored when the API key's member is an admin and the request is created for another member.","type":"boolean","uniqueKey":"ignoreRepresentativeRequirement","typeLabel":"boolean"}},"required":["start","end","leave_type_id","requester_member_id"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"start":"\u003cstring>","end":"\u003cstring>","leave_type_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","requester_member_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","reason":"\u003cstring>","representative_member_ids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"ignoreRepresentativeRequirement":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"07d4529d-ac6f-4ec8-b758-7fdd719bccd0":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"can_create":{"type":"boolean","description":"The one-line verdict: true means POST with this payload passes every rule the create endpoint applies, as of the data at preview time; false means it fails. False whenever `rejection` is set, a blocking conflict is listed or `is_allowance_sufficient` is false. Two things the preview cannot see: requests created in between, and changes to the member's approvers that the create call makes when approver sync from Microsoft 365 is on. A snapshot, not a reservation.","isRequired":true,"uniqueKey":"can_create","typeLabel":"boolean"},"duration":{"oneOf":[{"type":"object","required":["workday_absence_duration","duration","leave_unit","outside_of_schedule","per_year"],"properties":{"workday_absence_duration":{"type":"number","description":"Same field and unit rule as `workday_absence_duration` on GET /requests: days for day and half-day leave units, minutes for hour and minute units.","isRequired":true,"uniqueKey":"duration.oneOf.0.workday_absence_duration","typeLabel":"number"},"duration":{"type":"number","description":"The span as it would be stored on the request: calendar days for day units, minutes for hour units. Use `workday_absence_duration` for the counted duration.","isRequired":true,"uniqueKey":"duration.oneOf.0.duration","typeLabel":"number"},"leave_unit":{"type":"string","enum":["days","half_days","hours","minutes_30","minutes_15","minutes_10","minutes_5","minutes_1"],"isRequired":true,"uniqueKey":"duration.oneOf.0.leave_unit","typeLabel":"enum\u003cstring>"},"outside_of_schedule":{"type":"boolean","description":"True when the whole absence falls on non-working time of the member's schedule.","isRequired":true,"uniqueKey":"duration.oneOf.0.outside_of_schedule","typeLabel":"boolean"},"per_year":{"type":"array","items":{"type":"object","properties":{"fiscal_year":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"duration.oneOf.0.per_year.items.[INDEX].fiscal_year","typeLabel":"integer"},"workday_duration_in_days":{"type":"number","description":"This fiscal year's share of the counted duration, in days.","isRequired":true,"uniqueKey":"duration.oneOf.0.per_year.items.[INDEX].workday_duration_in_days","typeLabel":"number"},"workday_duration_in_minutes":{"type":"number","description":"This fiscal year's share of the counted duration, in minutes.","isRequired":true,"uniqueKey":"duration.oneOf.0.per_year.items.[INDEX].workday_duration_in_minutes","typeLabel":"number"},"carry_over_days_used_in_period":{"type":"number","isRequired":true,"uniqueKey":"duration.oneOf.0.per_year.items.[INDEX].carry_over_days_used_in_period","typeLabel":"number"},"carry_over_minutes_used_in_period":{"type":"number","isRequired":true,"uniqueKey":"duration.oneOf.0.per_year.items.[INDEX].carry_over_minutes_used_in_period","typeLabel":"number"}},"required":["fiscal_year","workday_duration_in_days","workday_duration_in_minutes","carry_over_days_used_in_period","carry_over_minutes_used_in_period"],"additionalProperties":false,"description":"Portion of the absence falling into this fiscal year. An absence crossing the fiscal year boundary costs different amounts in different years; the entries add up to the total.","uniqueKey":"duration.oneOf.0.per_year.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"duration.oneOf.0.per_year","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"duration.oneOf.0","typeLabel":"object"},{"type":"null","isRequired":true,"uniqueKey":"duration.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"duration","typeLabel":"object | null"},"takes_from_allowance":{"type":"boolean","isRequired":true,"uniqueKey":"takes_from_allowance","typeLabel":"boolean"},"allowance_type":{"oneOf":[{"type":"object","description":"The allowance the absence deducts from. Null when it deducts nothing.","required":["id","name","allowance_unit"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"allowance_type.oneOf.0.id","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"allowance_type.oneOf.0.name","typeLabel":"string"},"allowance_unit":{"type":"string","enum":["days","hours"],"isRequired":true,"uniqueKey":"allowance_type.oneOf.0.allowance_unit","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"allowance_type.oneOf.0","typeLabel":"object"},{"type":"null","description":"The allowance the absence deducts from. Null when it deducts nothing.","isRequired":true,"uniqueKey":"allowance_type.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"allowance_type","typeLabel":"object | null"},"is_allowance_sufficient":{"oneOf":[{"type":"boolean","description":"True means the allowance covers this payload, false means creating it fails with the allowance error. Always true for leave types that do not deduct. Null when `rejection` is set: the allowance was not evaluated. `conflicts` is reported separately and does not affect this flag.","isRequired":true,"uniqueKey":"is_allowance_sufficient.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"True means the allowance covers this payload, false means creating it fails with the allowance error. Always true for leave types that do not deduct. Null when `rejection` is set: the allowance was not evaluated. `conflicts` is reported separately and does not affect this flag.","isRequired":true,"uniqueKey":"is_allowance_sufficient.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"is_allowance_sufficient","typeLabel":"boolean | null"},"conflicts":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"request_id":{"type":"string","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].request_id","typeLabel":"string"},"start":{"type":"string","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].start","typeLabel":"string"},"end":{"type":"string","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].end","typeLabel":"string"},"start_at":{"type":"string","enum":["morning","afternoon"],"isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].start_at","typeLabel":"enum\u003cstring>"},"end_at":{"type":"string","enum":["lunchtime","end_of_day"],"isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].end_at","typeLabel":"enum\u003cstring>"},"status":{"type":"string","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].status","typeLabel":"string"},"leave_type_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].leave_type_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].leave_type_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"conflicts.oneOf.0.items.[INDEX].leave_type_name","typeLabel":"string | null"}},"required":["request_id","start","end","start_at","end_at","status","leave_type_name"],"additionalProperties":false,"uniqueKey":"conflicts.oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"Existing non-declined, non-cancelled requests of the member that overlap the absence, regardless of their leave type. Any entry blocks creation. Null when the payload was rejected before the overlap check ran (START_AFTER_END through OUTSIDE_EMPLOYMENT_PERIOD); populated for every later rejection so both problems are visible at once.","isRequired":true,"uniqueKey":"conflicts.oneOf.0","typeLabel":"object[]"},{"type":"null","description":"Existing non-declined, non-cancelled requests of the member that overlap the absence, regardless of their leave type. Any entry blocks creation. Null when the payload was rejected before the overlap check ran (START_AFTER_END through OUTSIDE_EMPLOYMENT_PERIOD); populated for every later rejection so both problems are visible at once.","isRequired":true,"uniqueKey":"conflicts.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"conflicts","typeLabel":"object[] | null"},"rejection":{"oneOf":[{"type":"object","description":"Set when creating the same payload would be rejected with 400: the first failing rule, in the order the create endpoint applies them. Overlapping requests and the allowance are never a rejection; see `conflicts` and `is_allowance_sufficient`. `duration` and `is_allowance_sufficient` are null when this is set. Match on `code`, not on `message` (which is translated into the API key member's language).","required":["code","message"],"properties":{"code":{"type":"string","enum":["START_AFTER_END","HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE","LEAVE_TYPE_DISABLED","REASON_REQUIRED","REASON_TOO_LONG","OUTSIDE_FISCAL_YEAR_WINDOW","PAST_DATE_NOT_ALLOWED","OUTSIDE_EMPLOYMENT_PERIOD","REPRESENTATIVE_CONFLICT","MAX_ABSENT_REACHED","NO_APPROVER_SET","REPRESENTATIVES_INVALID","REQUIRED_REPRESENTATIVES_COUNT_NOT_MET","INVALID_REQUEST"],"isRequired":true,"uniqueKey":"rejection.oneOf.0.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"rejection.oneOf.0.message","typeLabel":"string"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"rejection.oneOf.0","typeLabel":"object"},{"type":"null","description":"Set when creating the same payload would be rejected with 400: the first failing rule, in the order the create endpoint applies them. Overlapping requests and the allowance are never a rejection; see `conflicts` and `is_allowance_sufficient`. `duration` and `is_allowance_sufficient` are null when this is set. Match on `code`, not on `message` (which is translated into the API key member's language).","isRequired":true,"uniqueKey":"rejection.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"rejection","typeLabel":"object | null"}},"required":["can_create","duration","takes_from_allowance","allowance_type","is_allowance_sufficient","conflicts","rejection"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"can_create":true,"duration":{"workday_absence_duration":123,"duration":123,"leave_unit":"days","outside_of_schedule":true,"per_year":[{"fiscal_year":0,"workday_duration_in_days":123,"workday_duration_in_minutes":123,"carry_over_days_used_in_period":123,"carry_over_minutes_used_in_period":123}]},"takes_from_allowance":true,"allowance_type":{"id":"\u003cstring>","name":"\u003cstring>","allowance_unit":"days"},"is_allowance_sufficient":true,"conflicts":[{"request_id":"\u003cstring>","start":"\u003cstring>","end":"\u003cstring>","start_at":"morning","end_at":"lunchtime","status":"\u003cstring>","leave_type_name":"\u003cstring>"}],"rejection":{"code":"START_AFTER_END","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"bc8042e7-944f-46cf-9fda-2afd93927809":{"description":"Invalid input data","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Invalid input data","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"The error code","example":"BAD_REQUEST","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"required":["message"],"additionalProperties":false,"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"required":["message","code"],"additionalProperties":false,"title":"Invalid input data error (400)","description":"The error information","example":{"code":"BAD_REQUEST","message":"Invalid input data","issues":[]},"uniqueKey":"","typeLabel":"Invalid input data error (400) · object"},"examples":{"Example":{"title":"Example","value":{"code":"BAD_REQUEST","message":"Invalid input data","issues":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"78f86ae9-520f-415d-bbc1-3fee70c38940":{"description":"Authorization not provided","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Authorization not provided","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"The error code","example":"UNAUTHORIZED","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"required":["message"],"additionalProperties":false,"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"required":["message","code"],"additionalProperties":false,"title":"Authorization not provided error (401)","description":"The error information","example":{"code":"UNAUTHORIZED","message":"Authorization not provided","issues":[]},"uniqueKey":"","typeLabel":"Authorization not provided error (401) · object"},"examples":{"Example":{"title":"Example","value":{"code":"UNAUTHORIZED","message":"Authorization not provided","issues":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"01bd56c2-dee1-4760-8603-41eef43f4ac5":{"description":"Insufficient access","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Insufficient access","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"The error code","example":"FORBIDDEN","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"required":["message"],"additionalProperties":false,"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"required":["message","code"],"additionalProperties":false,"title":"Insufficient access error (403)","description":"The error information","example":{"code":"FORBIDDEN","message":"Insufficient access","issues":[]},"uniqueKey":"","typeLabel":"Insufficient access error (403) · object"},"examples":{"Example":{"title":"Example","value":{"code":"FORBIDDEN","message":"Insufficient access","issues":[]}}},"exampleType":"generated"}},"exampleType":"generated"},"a9b689ef-ba8a-4f6a-8c0b-5b0fc9b5a9b5":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Internal server error","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"The error code","example":"INTERNAL_SERVER_ERROR","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"}},"required":["message"],"additionalProperties":false,"uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"uniqueKey":"issues","typeLabel":"object[]"}},"required":["message","code"],"additionalProperties":false,"title":"Internal server error error (500)","description":"The error information","example":{"code":"INTERNAL_SERVER_ERROR","message":"Internal server error","issues":[]},"uniqueKey":"","typeLabel":"Internal server error error (500) · object"},"examples":{"Example":{"title":"Example","value":{"code":"INTERNAL_SERVER_ERROR","message":"Internal server error","issues":[]}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"6deebfa9-6698-47b1-ab6e-cd407752439e":{"ApiKey":{"type":"apiKey","name":"X-API-KEY","in":"header","scopes":[],"schemeName":"ApiKey"}}},"servers":{"e948ed60-f8cc-4c9d-aefa-a9126fe6b087":{"url":"https://api.absentify.com/api/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","name":"X-API-KEY","in":"header","scopes":[],"schemeName":"ApiKey"},"schema":{"title":"X-API-KEY","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKey","name":"X-API-KEY"}],"title":"ApiKey"}]},"originalFileLocation":"https://api.absentify.com/api/v1/openapi.json"},"subdomain":"absentify","siteName":"absentify®","title":"Preview a request (dry run) - absentify®","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/api-reference/requests/preview-a-request-dry-run","matchLevel":0},"de":{"href":"/de/api-reference/requests/preview-a-request-dry-run","matchLevel":1}}},"lastModified":"2026-11-03T10:10:29.330Z","originalFileLocation":"en/api-reference/requests/preview-a-request-dry-run.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member\u0026#x27;s allowance covers it, the existing requests it would collide with, and a single can_create verdict. Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create. Duration: duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create. Allowance: is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true. Conflicts: conflicts lists the member\u0026#x27;s existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored. Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else\u0026#x27;s accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses. Verdict: can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on. Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\">\u003cmeta data-mint-head name=\"application-name\" content=\"absentify®\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Preview a request (dry run) - absentify®\">\u003cmeta data-mint-head property=\"og:description\" content=\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member\u0026#x27;s allowance covers it, the existing requests it would collide with, and a single can_create verdict. Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create. Duration: duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create. Allowance: is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true. Conflicts: conflicts lists the member\u0026#x27;s existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored. Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else\u0026#x27;s accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses. Verdict: can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on. Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"absentify®\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://absentify.mintlify.app/_mintlify/api/og/v2?division=Requests\u0026amp;title=Preview+a+request+%28dry+run%29\u0026amp;description=Answer+what+POST+%2Frequests+would+do+with+this+payload+without+creating+anything%3A+the+counted+duration%2C+its+split+by+fiscal+year%2C+whether+the+member%27s+allowance+\u0026amp;theme=432f40b01025e6009f4d3383\u0026amp;signature=3a78b745fb417eae6d2fd141918b02278275b0434aa5d29a0fa6a8db0aa3881b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Preview a request (dry run) - absentify®\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member\u0026#x27;s allowance covers it, the existing requests it would collide with, and a single can_create verdict. Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create. Duration: duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create. Allowance: is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true. Conflicts: conflicts lists the member\u0026#x27;s existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored. Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else\u0026#x27;s accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses. Verdict: can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on. Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://absentify.mintlify.app/_mintlify/api/og/v2?division=Requests\u0026amp;title=Preview+a+request+%28dry+run%29\u0026amp;description=Answer+what+POST+%2Frequests+would+do+with+this+payload+without+creating+anything%3A+the+counted+duration%2C+its+split+by+fiscal+year%2C+whether+the+member%27s+allowance+\u0026amp;theme=432f40b01025e6009f4d3383\u0026amp;signature=3a78b745fb417eae6d2fd141918b02278275b0434aa5d29a0fa6a8db0aa3881b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/absentify/gKgFKKaR3jLynfl2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"absentify®\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6264A7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/api-reference/requests/preview-a-request-dry-run.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://absentify.com/docs/de/api-reference/requests/preview-a-request-dry-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://absentify.com/#organization\",\"name\":\"absentify®\",\"url\":\"https://absentify.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/absentify/iNrFvPmeOqKvrSdH/logo/light.svg?fit=max\u0026auto=format\u0026n=iNrFvPmeOqKvrSdH\u0026q=85\u0026s=90d1c401ab5c62a6ba4676540859a9cb\"}},{\"@type\":\"WebSite\",\"@id\":\"https://absentify.com/docs#website\",\"name\":\"absentify®\",\"url\":\"https://absentify.com/docs\",\"publisher\":{\"@id\":\"https://absentify.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run#webpage\",\"url\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\",\"name\":\"Preview a request (dry run)\",\"description\":\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member's allowance covers it, the existing requests it would collide with, and a single can_create verdict. Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create. Duration: duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create. Allowance: is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true. Conflicts: conflicts lists the member's existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored. Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else's accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses. Verdict: can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on. Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\",\"dateModified\":\"2026-11-03T10:10:29.330Z\",\"isPartOf\":{\"@id\":\"https://absentify.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Requests\",\"item\":\"https://absentify.com/docs/en/api-reference/requests/get-all-requests\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preview a request (dry run)\",\"item\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run#apireference\",\"headline\":\"Preview a request (dry run)\",\"name\":\"Preview a request (dry run)\",\"description\":\"Answer what POST /requests would do with this payload without creating anything: the counted duration, its split by fiscal year, whether the member's allowance covers it, the existing requests it would collide with, and a single can_create verdict. Input: identical to POST /requests, so one payload can be sent to both URLs. reason, representative_member_ids and ignoreRepresentativeRequirement are evaluated exactly as on create. Duration: duration.workday_absence_duration uses the same days-vs-minutes rule as workday_absence_duration on GET /requests (days for day and half-day leave units, minutes for hour units); preview and created request always agree. For day-based leave types the time of day in start / end is ignored, exactly as on create. Allowance: is_allowance_sufficient: false means POST /requests with this payload fails with the allowance error; true means it passes that check. Leave types that do not deduct return takes_from_allowance: false, allowance_type: null and is_allowance_sufficient: true. Conflicts: conflicts lists the member's existing requests that overlap this absence and would block creation. Every leave type counts, including informational ones such as home office; only declined or cancelled requests are ignored. Rejection: the preview runs the same validations as POST /requests, in the same order, with one difference: an overlapping request is not a rejection but goes to conflicts, so where POST /requests would stop with the overlap error the preview keeps going and may name a later rule in rejection while the overlap sits in conflicts. When a rule fails, the response is still 200 with rejection set instead of a 400, and can_create is false. Match on rejection.code: START_AFTER_END, HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE, LEAVE_TYPE_DISABLED (disabled for this member), REASON_REQUIRED, REASON_TOO_LONG, OUTSIDE_FISCAL_YEAR_WINDOW, PAST_DATE_NOT_ALLOWED (manager or self-service retroactive limits), OUTSIDE_EMPLOYMENT_PERIOD, REPRESENTATIVE_CONFLICT (the member is someone else's accepted representative in that period), MAX_ABSENT_REACHED (department limit), NO_APPROVER_SET (the leave type needs approval and the member has no approver), REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET. Permission and scoping failures stay real 403 / 404 responses. Verdict: can_create is true only when rejection is null, conflicts is empty and the allowance covers the absence. It is the one field to gate a create call on. Side effects: no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.\",\"url\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run\",\"mainEntityOfPage\":{\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-a-request-dry-run#webpage\"},\"dateModified\":\"2026-11-03T10:10:29.330Z\",\"publisher\":{\"@id\":\"https://absentify.com/#organization\"},\"isPartOf\":{\"@id\":\"https://absentify.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"absentify®\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"absentify®","nav":{"global":null,"languages":[{"language":"en","anchors":[{"anchor":"Documentation","icon":"book-open","pages":[{"title":"Documentation","href":"/en/introduction"}]},{"anchor":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/en/changelog"}]},{"anchor":"Website","icon":"globe","href":"https://absentify.com"},{"anchor":"Help","icon":"comment-question","href":"mailto:support@absentify.com"},{"anchor":"Blog","icon":"newspaper","href":"https://absentify.com/blog"},{"anchor":"API Reference","icon":"square-terminal","tabs":[{"tab":"Developers","groups":[{"group":"Developers","pages":[{"title":"REST API introduction","sidebarTitle":"Introduction","href":"/en/api-reference/introduction"},{"title":"Quick start","sidebarTitle":"Quick start","href":"/en/api-reference/quick_start"},{"title":"MCP Server","sidebarTitle":"MCP Server","href":"/en/api-reference/mcp_server"},{"title":"Authentication","sidebarTitle":"Authentication","href":"/en/api-reference/authentication"},{"title":"API limits","sidebarTitle":"API limits","href":"/en/api-reference/limits"},{"title":"API responses","sidebarTitle":"Responses","href":"/en/api-reference/responses"},{"title":"Webhook integration","sidebarTitle":"Webhooks","href":"/en/api-reference/webhooks"},{"title":"Exports","sidebarTitle":"Exports","href":"/en/api-reference/exports"}]}]}],"groups":[{"group":"Members","pages":[{"title":"Get all members","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members","href":"/en/api-reference/members/get-all-members"},{"title":"Invite a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members","href":"/en/api-reference/members/invite-a-member"},{"title":"Read a member by id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{id}","href":"/en/api-reference/members/read-a-member-by-id"},{"title":"Update a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{id}","href":"/en/api-reference/members/update-a-member"},{"title":"Delete a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /members/{id}","href":"/en/api-reference/members/delete-a-member"},{"title":"Read a member by Microsoft user id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/microsoft/{microsoft_user_id}","href":"/en/api-reference/members/read-a-member-by-microsoft-user-id"},{"title":"Read a member by email","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/email/{email}","href":"/en/api-reference/members/read-a-member-by-email"},{"title":"Read a member by custom_id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/custom_id/{custom_id}","href":"/en/api-reference/members/read-a-member-by-custom_id"},{"title":"Update approvers for a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{id}/approvers","href":"/en/api-reference/members/update-approvers-for-a-member"},{"title":"Update a member's allowance (deprecated)","deprecated":true,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{id}/allowance/{allowance_type_id}/{year}","href":"/en/api-reference/members/update-a-members-allowance-deprecated"},{"title":"Set a member's default and hidden allowance types","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{member_id}/allowance-type-configurations/{allowance_type_id}","href":"/en/api-reference/members/set-a-members-default-and-hidden-allowance-types"},{"title":"Add a member's schedule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members/{id}/schedule","href":"/en/api-reference/members/add-a-members-schedule"},{"title":"Update a member's schedule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{member_id}/schedule/{id}","href":"/en/api-reference/members/update-a-members-schedule"},{"title":"Get a member's representative settings and list","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{id}/representatives","href":"/en/api-reference/members/get-a-members-representative-settings-and-list"},{"title":"Update representatives for a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{id}/representatives","href":"/en/api-reference/members/update-representatives-for-a-member"}]},{"group":"Departments","pages":[{"title":"Get all departments","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /departments","href":"/en/api-reference/departments/get-all-departments"},{"title":"Create a department","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /departments","href":"/en/api-reference/departments/create-a-department"},{"title":"Read a department by id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /departments/{id}","href":"/en/api-reference/departments/read-a-department-by-id"},{"title":"Update a department","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /departments/{id}","href":"/en/api-reference/departments/update-a-department"},{"title":"Delete a department","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /departments/{id}","href":"/en/api-reference/departments/delete-a-department"}]},{"group":"Leave types","pages":[{"title":"Get all leave types","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /leave_types","href":"/en/api-reference/leave-types/get-all-leave-types"},{"title":"Create a leave type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /leave_types","href":"/en/api-reference/leave-types/create-a-leave-type"},{"title":"Read a leave type by id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /leave_types/{id}","href":"/en/api-reference/leave-types/read-a-leave-type-by-id"},{"title":"Update a leave type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /leave_types/{id}","href":"/en/api-reference/leave-types/update-a-leave-type"},{"title":"Delete a leave type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /leave_types/{id}","href":"/en/api-reference/leave-types/delete-a-leave-type"},{"title":"Restore an archived leave type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /leave_types/{id}/restore","href":"/en/api-reference/leave-types/restore-an-archived-leave-type"}]},{"group":"Workspace","pages":[{"title":"Get current workspace settings","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /workspace","href":"/en/api-reference/workspace/get-current-workspace-settings"},{"title":"Update the workspace settings","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /workspace","href":"/en/api-reference/workspace/update-the-workspace-settings"}]},{"group":"Public holidays","pages":[{"title":"Get all public holidays","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /public_holidays","href":"/en/api-reference/public-holidays/get-all-public-holidays"},{"title":"Read a public holiday by id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /public_holidays/{id}","href":"/en/api-reference/public-holidays/read-a-public-holiday-by-id"}]},{"group":"Requests","pages":[{"title":"Get all requests","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /requests","href":"/en/api-reference/requests/get-all-requests"},{"title":"Create a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests","href":"/en/api-reference/requests/create-a-request"},{"title":"Get all requests per day","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /requests_per_day","href":"/en/api-reference/requests/get-all-requests-per-day"},{"title":"Read a request by id","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /requests/{id}","href":"/en/api-reference/requests/read-a-request-by-id"},{"title":"Create recurring requests","description":"Create multiple recurring requests based on a recurrence pattern. Note: half_day='morning'/'afternoon' requires a leave type with leave_unit 'half_days' — on a full-day-only 'days' leave type it is rejected. Employment period: the series is created all-or-nothing, so a single occurrence that starts before employment_start_date or ends after employment_end_date rejects the whole series with 400 rather than skipping that occurrence. An occurrence straddling either boundary is rejected too, never truncated. The comparison is on calendar days, so both boundary dates are themselves bookable and a null boundary means open ended on that side.","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/recurring","href":"/en/api-reference/requests/create-recurring-requests"},{"title":"Preview a request (dry run)","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/preview","href":"/en/api-reference/requests/preview-a-request-dry-run"},{"title":"Preview recurring requests (dry run)","description":"Answer what POST /requests/recurring would do with this payload without creating anything: the number of occurrences, the summed counted duration and its split by fiscal year, whether the member's allowance covers the whole series, and the per-occurrence conflicts.\n\n**Input:** identical to POST /requests/recurring. `files` is accepted and ignored. `reason`, `admin_approval_option`, `ignoreMaximumAbsence` and `representative_member_ids` are validated exactly as on create.\n\n**Duration:** `duration.workday_absence_duration` follows the same days-vs-minutes rule as `workday_absence_duration` on GET /requests and is the sum over all occurrences; preview and created series always agree. `per_year` splits that sum by fiscal year.\n\n**Allowance:** `is_allowance_sufficient` is one verdict for the whole series, matching the all-or-nothing behaviour of POST /requests/recurring: `false` means creating the series fails with the allowance error and leaves nothing behind. Leave types that do not deduct return `true`.\n\n**Conflicts:** `conflicts` lists occurrences overlapping the member's existing requests, `department_limit_conflicts` the occurrences on which a department's maximum absent limit is already reached, `representative_overlaps` the occurrences on which the member is someone else's representative (pending or accepted), and `representative_unavailable` the occurrences on which a passed representative is absent.\n\n**Rejection:** when the payload would be rejected with 400 by POST /requests/recurring, the response is still 200 with `rejection` set and `can_create: false`. Match on `rejection.code`: neither `until` nor `count` given (RECURRENCE_END_REQUIRED), day/month/pos/weekDays not matching `repeat` (RECURRENCE_RULE_INVALID), a series reaching more than 365 days into the future (RECURRENCE_WINDOW_EXCEEDED), fewer than two occurrences (RECURRENCE_TOO_FEW_OCCURRENCES), an hour-based leave type without a valid start_time/end_time (HOUR_LEAVE_TYPE_REQUIRES_TIME_RANGE), a half_day on a full-day-only leave type (HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE), or an occurrence outside the member's employment period (OUTSIDE_EMPLOYMENT_PERIOD). After that the rules the create endpoint applies to every occurrence follow, in its order: a leave type disabled for the member (LEAVE_TYPE_DISABLED), a missing or too long reason (REASON_REQUIRED, REASON_TOO_LONG), an occurrence outside the bookable fiscal-year window (OUTSIDE_FISCAL_YEAR_WINDOW) or too far in the past for the caller's role (PAST_DATE_NOT_ALLOWED), an occurrence on which a non-admin is someone else's accepted representative (REPRESENTATIVE_CONFLICT), a leave type needing approval while the member has no approver (NO_APPROVER_SET), and the representative requirement (REPRESENTATIVES_INVALID, REQUIRED_REPRESENTATIVES_COUNT_NOT_MET). A workspace without the Essentials plan, or a non-admin passing `admin_approval_option: approve_request_immediately`, gets the same 403 as the create endpoint.\n\n**Verdict:** `can_create` is true only when `rejection` is null, `conflicts` is empty, `department_limit_conflicts` is empty (or the caller is an admin passing `ignoreMaximumAbsence`) and the allowance covers the series. `representative_unavailable` is informational.\n\n**Side effects:** no request, approver, notification, webhook or calendar sync entry is created. Safe to repeat; each call evaluates the data as it is at that moment.","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/recurring/preview","href":"/en/api-reference/requests/preview-recurring-requests-dry-run"},{"title":"Approve a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/approve","href":"/en/api-reference/requests/approve-a-request"},{"title":"Decline a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/decline","href":"/en/api-reference/requests/decline-a-request"},{"title":"Approve a request as a representative","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/approve_representative","href":"/en/api-reference/requests/approve-a-request-as-a-representative"},{"title":"Decline a request as a representative","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/decline_representative","href":"/en/api-reference/requests/decline-a-request-as-a-representative"},{"title":"Cancel a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/cancel","href":"/en/api-reference/requests/cancel-a-request"},{"title":"List the changes of a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /requests/{id}/changes","href":"/en/api-reference/requests/list-the-changes-of-a-request"},{"title":"Change a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/changes","href":"/en/api-reference/requests/change-a-request"},{"title":"Approve a change of a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/changes/{changeId}/approve","href":"/en/api-reference/requests/approve-a-change-of-a-request"},{"title":"Decline a change of a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/changes/{changeId}/decline","href":"/en/api-reference/requests/decline-a-change-of-a-request"},{"title":"Withdraw a change of a request","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /requests/{id}/changes/{changeId}/withdraw","href":"/en/api-reference/requests/withdraw-a-change-of-a-request"}]},{"group":"Absences","pages":[{"title":"Get all requests and public holiday per member per day","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /absences_per_day","href":"/en/api-reference/absences/get-all-requests-and-public-holiday-per-member-per-day"}]},{"group":"Allowance Management","pages":[{"title":"List all rules for an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /allowance-types/{allowance_type_id}/rules","href":"/en/api-reference/allowance-management/list-all-rules-for-an-allowance-type"},{"title":"Create a new allowance rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /allowance-types/{allowance_type_id}/rules","href":"/en/api-reference/allowance-management/create-a-new-allowance-rule"},{"title":"Delete an allowance rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /rules/{id}","href":"/en/api-reference/allowance-management/delete-an-allowance-rule"},{"title":"Update an allowance rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json patch /rules/{id}","href":"/en/api-reference/allowance-management/update-an-allowance-rule"},{"title":"List rule assignments for a member","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/rule-assignments","href":"/en/api-reference/allowance-management/list-rule-assignments-for-a-member"},{"title":"Assign a member to an allowance rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members/{member_id}/rule-assignments","href":"/en/api-reference/allowance-management/assign-a-member-to-an-allowance-rule"},{"title":"Remove a member from an allowance rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /rule-assignments/{id}","href":"/en/api-reference/allowance-management/remove-a-member-from-an-allowance-rule"},{"title":"Update a rule assignment","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json patch /rule-assignments/{id}","href":"/en/api-reference/allowance-management/update-a-rule-assignment"},{"title":"List a member's allowance adjustments","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/adjustments","href":"/en/api-reference/allowance-management/list-a-members-allowance-adjustments"},{"title":"Create an allowance adjustment","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members/{member_id}/adjustments","href":"/en/api-reference/allowance-management/create-an-allowance-adjustment"},{"title":"Delete an allowance adjustment","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /adjustments/{id}","href":"/en/api-reference/allowance-management/delete-an-allowance-adjustment"},{"title":"Set the organisation default rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /allowance-types/{allowance_type_id}/default-rule","href":"/en/api-reference/allowance-management/set-the-organisation-default-rule"},{"title":"Move a member to another rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members/{member_id}/rule-change","href":"/en/api-reference/allowance-management/move-a-member-to-another-rule"},{"title":"Switch a member to manual allowance management","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /members/{member_id}/manual-rule","href":"/en/api-reference/allowance-management/switch-a-member-to-manual-allowance-management"},{"title":"List the members currently on a rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /rules/{rule_id}/members","href":"/en/api-reference/allowance-management/list-the-members-currently-on-a-rule"},{"title":"Read the audit log of a rule","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /rules/{rule_id}/audit-log","href":"/en/api-reference/allowance-management/read-the-audit-log-of-a-rule"},{"title":"Read the audit log of an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /allowance-types/{allowance_type_id}/audit-log","href":"/en/api-reference/allowance-management/read-the-audit-log-of-an-allowance-type"},{"title":"Read a member's rule history","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/rule-audit-log","href":"/en/api-reference/allowance-management/read-a-members-rule-history"},{"title":"List all allowance types","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /allowance-types","href":"/en/api-reference/allowance-management/list-all-allowance-types"},{"title":"Create an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /allowance-types","href":"/en/api-reference/allowance-management/create-an-allowance-type"},{"title":"Read an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /allowance-types/{id}","href":"/en/api-reference/allowance-management/read-an-allowance-type"},{"title":"Delete an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /allowance-types/{id}","href":"/en/api-reference/allowance-management/delete-an-allowance-type"},{"title":"Update an allowance type","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json patch /allowance-types/{id}","href":"/en/api-reference/allowance-management/update-an-allowance-type"},{"title":"Reorder the allowance types","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /allowance-types/reorder","href":"/en/api-reference/allowance-management/reorder-the-allowance-types"},{"title":"List a member's allowances","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/allowances","href":"/en/api-reference/allowance-management/list-a-members-allowances"},{"title":"Read a member's allowance history","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/allowance-audit-log","href":"/en/api-reference/allowance-management/read-a-members-allowance-history"},{"title":"Explain one year of a member's allowance","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/allowance-breakdown","href":"/en/api-reference/allowance-management/explain-one-year-of-a-members-allowance"},{"title":"Let the carry-over be computed again","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /allowances/{id}/revert-carryover-override","href":"/en/api-reference/allowance-management/let-the-carry-over-be-computed-again"}]},{"group":"Out of office","pages":[{"title":"Get a member's out of office settings","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /members/{member_id}/out-of-office-settings","href":"/en/api-reference/out-of-office/get-a-members-out-of-office-settings"},{"title":"Create or update a member's out of office message","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json put /members/{member_id}/out-of-office-settings/{leave_type_id}","href":"/en/api-reference/out-of-office/create-or-update-a-members-out-of-office-message"},{"title":"Delete a member's out of office message","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json delete /members/{member_id}/out-of-office-settings/{leave_type_id}","href":"/en/api-reference/out-of-office/delete-a-members-out-of-office-message"}]},{"group":"Exports","pages":[{"title":"Start an export","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /exports","href":"/en/api-reference/exports/start-an-export"},{"title":"Get the file of an export","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /exports/{id}/file","href":"/en/api-reference/exports/get-the-file-of-an-export"}]},{"group":"Overtime","pages":[{"title":"List overtime entries","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /overtime-entries","href":"/en/api-reference/overtime/list-overtime-entries"},{"title":"Log overtime","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /overtime-entries","href":"/en/api-reference/overtime/log-overtime"},{"title":"Get an overtime entry","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json get /overtime-entries/{id}","href":"/en/api-reference/overtime/get-an-overtime-entry"},{"title":"Approve an overtime entry","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /overtime-entries/{id}/approve","href":"/en/api-reference/overtime/approve-an-overtime-entry"},{"title":"Decline an overtime entry","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /overtime-entries/{id}/decline","href":"/en/api-reference/overtime/decline-an-overtime-entry"},{"title":"Cancel an overtime entry","deprecated":null,"version":null,"openapi":"https://api.absentify.com/api/v1/openapi.json post /overtime-entries/{id}/cancel","href":"/en/api-reference/overtime/cancel-an-overtime-entry"}]}]}]},{"language":"de","pages":[{"title":"de","href":"/de/api-reference/requests/preview-a-request-dry-run"}]}]},"basePath":"","title":"Preview a request (dry run) - absentify®","buildId":"dpl_GWQzn6k13MqphA3qck3hQKoQXDzM","deploymentId":"dpl_GWQzn6k13MqphA3qck3hQKoQXDzM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-vlKR2tYY.js","utils-DBDPZSWe.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CxHK4zz2.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-27b98BOz.js","snippetPresets-DNnui32z.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-cDVS2zyo.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BEE-OyDQ.js","shallow-fqEMZOYR.js","getApiPlaygroundDisplay-BPut1_OB.js","CodeSnippet-h9vp8UTG.js","CodeSnippets-DoMjCW5Q.js","Page-BOWGOUSK.js","getPastedJson-C4r-hmQ_.js","icon-CCDahfhO.js","MethodPill-Dpq0JSrS.js","DuplicateIcon-BGPwFt-j.js","createIcon-DBULrQp7.js","DynamicMarkdown-B74atANy.js","SectionHeading-DZCpbSmT.js","axios-vUo_bRtp.js","Markdown-BwkgxkAH.js","clsx-CEIlvfOI.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-f6OgbvLC.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-DvlTOml0.js"]}