{
"code": "INTERNAL_SERVER_ERROR",
"message": "Internal server error",
"issues": []
}
Requests
Preview recurring requests (dry run)
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.
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.
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.
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.
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.
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.
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.
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.
Date/time in ISO 8601 format, e.g. 2026-06-01 (interpreted as UTC midnight) or 2026-06-01T09:00:00Z. Always include a time zone designator (Z for UTC) when sending a time of day. Localized formats such as 01.06.2026 or 06/01/2026 are misinterpreted and must not be used.
Date/time in ISO 8601 format, e.g. 2026-06-01 (interpreted as UTC midnight) or 2026-06-01T09:00:00Z. Always include a time zone designator (Z for UTC) when sending a time of day. Localized formats such as 01.06.2026 or 06/01/2026 are misinterpreted and must not be used.
Date/time in ISO 8601 format, e.g. 2026-06-01 (interpreted as UTC midnight) or 2026-06-01T09:00:00Z. Always include a time zone designator (Z for UTC) when sending a time of day. Localized formats such as 01.06.2026 or 06/01/2026 are misinterpreted and must not be used.
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. department_limit_conflicts block unless the caller is an admin passing ignoreMaximumAbsence; representative_unavailable never blocks.
Verdict for the whole series: true means the allowance covers it, false means creating it fails with the allowance error and leaves nothing behind. Always true for leave types that do not deduct. Null when rejection is set: the allowance was not evaluated. The conflict arrays are reported separately and do not affect this flag.
Occurrences on which the member is someone else's representative, pending or accepted. Only accepted ones reject the series for non-admins (REPRESENTATIVE_CONFLICT).
Set when creating the same series would be rejected with 400: the first failing rule, series rules first and then the per-occurrence rules, in the order the create endpoint applies them. Overlaps, the allowance and department limits are never a rejection; see the conflict arrays 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":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"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-recurring-requests-dry-run","slug":"/en/api-reference/requests/preview-recurring-requests-dry-run","pageMetadata":{"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","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: [_jsx(_components.p, {\n children: \"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\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Input:\"\n }), \" identical to POST /requests/recurring. \", _jsx(_components.code, {\n children: \"files\"\n }), \" is accepted and ignored. \", _jsx(_components.code, {\n children: \"reason\"\n }), \", \", _jsx(_components.code, {\n children: \"admin_approval_option\"\n }), \", \", _jsx(_components.code, {\n children: \"ignoreMaximumAbsence\"\n }), \" and \", _jsx(_components.code, {\n children: \"representative_member_ids\"\n }), \" are validated 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 }), \" follows the same days-vs-minutes rule as \", _jsx(_components.code, {\n children: \"workday_absence_duration\"\n }), \" on GET /requests and is the sum over all occurrences; preview and created series always agree. \", _jsx(_components.code, {\n children: \"per_year\"\n }), \" splits that sum by fiscal year.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Allowance:\"\n }), \" \", _jsx(_components.code, {\n children: \"is_allowance_sufficient\"\n }), \" is one verdict for the whole series, matching the all-or-nothing behaviour of POST /requests/recurring: \", _jsx(_components.code, {\n children: \"false\"\n }), \" means creating the series fails with the allowance error and leaves nothing behind. Leave types that do not deduct return \", _jsx(_components.code, {\n children: \"true\"\n }), \".\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Conflicts:\"\n }), \" \", _jsx(_components.code, {\n children: \"conflicts\"\n }), \" lists occurrences overlapping the member’s existing requests, \", _jsx(_components.code, {\n children: \"department_limit_conflicts\"\n }), \" the occurrences on which a department’s maximum absent limit is already reached, \", _jsx(_components.code, {\n children: \"representative_overlaps\"\n }), \" the occurrences on which the member is someone else’s representative (pending or accepted), and \", _jsx(_components.code, {\n children: \"representative_unavailable\"\n }), \" the occurrences on which a passed representative is absent.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Rejection:\"\n }), \" when the payload would be rejected with 400 by POST /requests/recurring, the response is still 200 with \", _jsx(_components.code, {\n children: \"rejection\"\n }), \" set and \", _jsx(_components.code, {\n children: \"can_create: false\"\n }), \". Match on \", _jsx(_components.code, {\n children: \"rejection.code\"\n }), \": neither \", _jsx(_components.code, {\n children: \"until\"\n }), \" nor \", _jsx(_components.code, {\n children: \"count\"\n }), \" given (RECURRENCE_END_REQUIRED), day/month/pos/weekDays not matching \", _jsx(_components.code, {\n children: \"repeat\"\n }), \" (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 \", _jsx(_components.code, {\n children: \"admin_approval_option: approve_request_immediately\"\n }), \", gets the same 403 as the create endpoint.\"]\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, \", _jsx(_components.code, {\n children: \"department_limit_conflicts\"\n }), \" is empty (or the caller is an admin passing \", _jsx(_components.code, {\n children: \"ignoreMaximumAbsence\"\n }), \") and the allowance covers the series. \", _jsx(_components.code, {\n children: \"representative_unavailable\"\n }), \" is informational.\"]\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 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","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-previewRecurringRequests","summary":"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.","tags":["Requests"],"security":["1a64309a-c937-4ba8-8799-e374c22b410a"],"parameters":[],"requestBody":"cda4dc20-3c2e-4311-8be6-c08e7bad2a67","responses":{"200":"c01aebe6-f311-4c6f-bfcd-3266888fbe81","400":"39df8698-421d-48db-b4f4-25ab68ee7061","401":"09333b2d-cc35-4fcb-a03a-7fd5aa7a4d6f","403":"a9ea5cae-df2f-4f9c-841e-cd12df39b6af","500":"74ddab08-c92d-4a8e-9043-a59a3bfe3178"},"method":"post","type":"path","servers":["e948ed60-f8cc-4c9d-aefa-a9126fe6b087"],"path":"/requests/recurring/preview","baseUrlOptions":["https://api.absentify.com/api/v1"],"title":"Preview recurring requests (dry run)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"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>"},"repeat":{"type":"string","enum":["daily","weekly","monthly"],"isRequired":true,"uniqueKey":"repeat","typeLabel":"enum\u003cstring>"},"interval":{"type":"integer","minimum":1,"maximum":100,"isRequired":true,"uniqueKey":"interval","typeLabel":"integer"},"from":{"description":"Date/time in ISO 8601 format, e.g. `2026-06-01` (interpreted as UTC midnight) or `2026-06-01T09:00:00Z`. Always include a time zone designator (`Z` for UTC) when sending a time of day. Localized formats such as `01.06.2026` or `06/01/2026` are misinterpreted and must not be used.","type":"string","isRequired":true,"uniqueKey":"from","typeLabel":"string"},"until":{"oneOf":[{"type":"string","description":"Date/time in ISO 8601 format, e.g. `2026-06-01` (interpreted as UTC midnight) or `2026-06-01T09:00:00Z`. Always include a time zone designator (`Z` for UTC) when sending a time of day. Localized formats such as `01.06.2026` or `06/01/2026` are misinterpreted and must not be used.","isRequired":true,"uniqueKey":"until.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"until.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"until","typeLabel":"string | null"},"count":{"oneOf":[{"type":"integer","maximum":365,"minimum":1,"isRequired":true,"uniqueKey":"count.oneOf.0","typeLabel":"integer"},{"type":"null","isRequired":true,"uniqueKey":"count.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"count","typeLabel":"integer | null"},"weekDays":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"weekDays.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"weekDays.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"weekDays","typeLabel":"string | null"},"day":{"oneOf":[{"type":"integer","maximum":31,"minimum":1,"isRequired":true,"uniqueKey":"day.oneOf.0","typeLabel":"integer"},{"type":"string","isRequired":true,"uniqueKey":"day.oneOf.1","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"day.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"day","typeLabel":"integer | string | null"},"month":{"oneOf":[{"type":"integer","maximum":12,"minimum":1,"isRequired":true,"uniqueKey":"month.oneOf.0","typeLabel":"integer"},{"type":"null","isRequired":true,"uniqueKey":"month.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"month","typeLabel":"integer | null"},"pos":{"oneOf":[{"type":"integer","maximum":5,"minimum":-1,"isRequired":true,"uniqueKey":"pos.oneOf.0","typeLabel":"integer"},{"type":"string","isRequired":true,"uniqueKey":"pos.oneOf.1","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"pos.oneOf.2","typeLabel":"null"}],"isRequired":true,"uniqueKey":"pos","typeLabel":"integer | string | null"},"reason":{"type":"string","uniqueKey":"reason","typeLabel":"string"},"start_time":{"type":"object","properties":{"hour":{"type":"integer","minimum":0,"maximum":23,"isRequired":true,"uniqueKey":"start_time.hour","typeLabel":"integer"},"minute":{"type":"integer","minimum":0,"maximum":59,"isRequired":true,"uniqueKey":"start_time.minute","typeLabel":"integer"}},"required":["hour","minute"],"uniqueKey":"start_time","typeLabel":"object"},"end_time":{"type":"object","properties":{"hour":{"type":"integer","minimum":0,"maximum":23,"isRequired":true,"uniqueKey":"end_time.hour","typeLabel":"integer"},"minute":{"type":"integer","minimum":0,"maximum":59,"isRequired":true,"uniqueKey":"end_time.minute","typeLabel":"integer"}},"required":["hour","minute"],"uniqueKey":"end_time","typeLabel":"object"},"half_day":{"type":"string","enum":["full_day","morning","afternoon"],"uniqueKey":"half_day","typeLabel":"enum\u003cstring>"},"exDates":{"type":"array","items":{"description":"Date/time in ISO 8601 format, e.g. `2026-06-01` (interpreted as UTC midnight) or `2026-06-01T09:00:00Z`. Always include a time zone designator (`Z` for UTC) when sending a time of day. Localized formats such as `01.06.2026` or `06/01/2026` are misinterpreted and must not be used.","type":"string","uniqueKey":"exDates.items.[INDEX]","typeLabel":"string"},"uniqueKey":"exDates","typeLabel":"string[]"},"files":{"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":"files.items.[INDEX]","typeLabel":"string\u003cuuid>"},"uniqueKey":"files","typeLabel":"string\u003cuuid>[]"},"representative_member_ids":{"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>[]"},"ignoreMaximumAbsence":{"type":"boolean","uniqueKey":"ignoreMaximumAbsence","typeLabel":"boolean"},"admin_approval_option":{"type":"string","enum":["approve_request_immediately","go_through_the_normal_approval_process"],"uniqueKey":"admin_approval_option","typeLabel":"enum\u003cstring>"}},"required":["leave_type_id","requester_member_id","repeat","interval","from","until","count","weekDays","day","month","pos"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"leave_type_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","requester_member_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","interval":50,"from":"\u003cstring>","until":"\u003cstring>","count":183,"weekDays":"\u003cstring>","day":16,"month":6,"pos":2,"reason":"\u003cstring>","exDates":["\u003cstring>"],"files":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"representative_member_ids":["3c90c3cc-0d44-4b50-8888-8dd25736052a"],"ignoreMaximumAbsence":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"c01aebe6-f311-4c6f-bfcd-3266888fbe81":{"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. `department_limit_conflicts` block unless the caller is an admin passing `ignoreMaximumAbsence`; `representative_unavailable` never blocks.","isRequired":true,"uniqueKey":"can_create","typeLabel":"boolean"},"occurrence_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"occurrence_count","typeLabel":"integer"},"duration":{"oneOf":[{"type":"object","required":["workday_absence_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. Summed over all occurrences.","isRequired":true,"uniqueKey":"duration.oneOf.0.workday_absence_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 at least one occurrence falls entirely 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":"Verdict for the whole series: true means the allowance covers it, false means creating it fails with the allowance error and leaves nothing behind. Always true for leave types that do not deduct. Null when `rejection` is set: the allowance was not evaluated. The conflict arrays are reported separately and do not affect this flag.","isRequired":true,"uniqueKey":"is_allowance_sufficient.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Verdict for the whole series: true means the allowance covers it, false means creating it fails with the allowance error and leaves nothing behind. Always true for leave types that do not deduct. Null when `rejection` is set: the allowance was not evaluated. The conflict arrays are reported separately and do not affect this flag.","isRequired":true,"uniqueKey":"is_allowance_sufficient.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"is_allowance_sufficient","typeLabel":"boolean | null"},"conflicts":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].date","typeLabel":"string"},"conflicts_with":{"type":"array","items":{"type":"object","properties":{"request_id":{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].request_id","typeLabel":"string"},"start":{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].start","typeLabel":"string"},"end":{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].end","typeLabel":"string"},"status":{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].status","typeLabel":"string"},"leave_type_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].leave_type_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].leave_type_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX].leave_type_name","typeLabel":"string | null"}},"required":["request_id","start","end","status","leave_type_name"],"additionalProperties":false,"uniqueKey":"conflicts.items.[INDEX].conflicts_with.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"conflicts.items.[INDEX].conflicts_with","typeLabel":"object[]"}},"required":["date","conflicts_with"],"additionalProperties":false,"uniqueKey":"conflicts.items.[INDEX]","typeLabel":"object"},"description":"Occurrences that overlap an existing non-declined, non-cancelled request of the member.","isRequired":true,"uniqueKey":"conflicts","typeLabel":"object[]"},"department_limit_conflicts":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","isRequired":true,"uniqueKey":"department_limit_conflicts.items.[INDEX].date","typeLabel":"string"},"department_id":{"type":"string","isRequired":true,"uniqueKey":"department_limit_conflicts.items.[INDEX].department_id","typeLabel":"string"},"department_name":{"type":"string","isRequired":true,"uniqueKey":"department_limit_conflicts.items.[INDEX].department_name","typeLabel":"string"},"current_absent":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"department_limit_conflicts.items.[INDEX].current_absent","typeLabel":"integer"},"max_allowed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"department_limit_conflicts.items.[INDEX].max_allowed","typeLabel":"integer"}},"required":["date","department_id","department_name","current_absent","max_allowed"],"additionalProperties":false,"uniqueKey":"department_limit_conflicts.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"department_limit_conflicts","typeLabel":"object[]"},"representative_unavailable":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].date","typeLabel":"string"},"representatives":{"type":"array","items":{"type":"object","properties":{"member_id":{"type":"string","isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX].member_id","typeLabel":"string"},"member_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX].member_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX].member_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX].member_name","typeLabel":"string | null"},"reason":{"type":"string","isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX].reason","typeLabel":"string"}},"required":["member_id","member_name","reason"],"additionalProperties":false,"uniqueKey":"representative_unavailable.items.[INDEX].representatives.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"representative_unavailable.items.[INDEX].representatives","typeLabel":"object[]"}},"required":["date","representatives"],"additionalProperties":false,"uniqueKey":"representative_unavailable.items.[INDEX]","typeLabel":"object"},"description":"Only populated when representative_member_ids are passed: occurrences on which a chosen representative is absent.","isRequired":true,"uniqueKey":"representative_unavailable","typeLabel":"object[]"},"representative_overlaps":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].date","typeLabel":"string"},"representing_for":{"type":"array","items":{"type":"object","properties":{"member_id":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].member_id","typeLabel":"string"},"member_name":{"oneOf":[{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].member_name.oneOf.0","typeLabel":"string"},{"type":"null","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].member_name.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].member_name","typeLabel":"string | null"},"request_id":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].request_id","typeLabel":"string"},"status":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].status","typeLabel":"string"},"start":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].start","typeLabel":"string"},"end":{"type":"string","isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX].end","typeLabel":"string"}},"required":["member_id","member_name","request_id","status","start","end"],"additionalProperties":false,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"representative_overlaps.items.[INDEX].representing_for","typeLabel":"object[]"}},"required":["date","representing_for"],"additionalProperties":false,"uniqueKey":"representative_overlaps.items.[INDEX]","typeLabel":"object"},"description":"Occurrences on which the member is someone else's representative, pending or accepted. Only accepted ones reject the series for non-admins (REPRESENTATIVE_CONFLICT).","isRequired":true,"uniqueKey":"representative_overlaps","typeLabel":"object[]"},"rejection":{"oneOf":[{"type":"object","description":"Set when creating the same series would be rejected with 400: the first failing rule, series rules first and then the per-occurrence rules, in the order the create endpoint applies them. Overlaps, the allowance and department limits are never a rejection; see the conflict arrays 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":["RECURRENCE_WINDOW_EXCEEDED","RECURRENCE_END_REQUIRED","RECURRENCE_RULE_INVALID","RECURRENCE_TOO_FEW_OCCURRENCES","HOUR_LEAVE_TYPE_REQUIRES_TIME_RANGE","HALF_DAY_NOT_ALLOWED_FOR_FULL_DAY_LEAVE_TYPE","OUTSIDE_EMPLOYMENT_PERIOD","LEAVE_TYPE_DISABLED","REASON_REQUIRED","REASON_TOO_LONG","OUTSIDE_FISCAL_YEAR_WINDOW","PAST_DATE_NOT_ALLOWED","REPRESENTATIVE_CONFLICT","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 series would be rejected with 400: the first failing rule, series rules first and then the per-occurrence rules, in the order the create endpoint applies them. Overlaps, the allowance and department limits are never a rejection; see the conflict arrays 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","occurrence_count","duration","takes_from_allowance","allowance_type","is_allowance_sufficient","conflicts","department_limit_conflicts","representative_unavailable","representative_overlaps","rejection"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"can_create":true,"occurrence_count":0,"duration":{"workday_absence_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":[{"date":"\u003cstring>","conflicts_with":[{"request_id":"\u003cstring>","start":"\u003cstring>","end":"\u003cstring>","status":"\u003cstring>","leave_type_name":"\u003cstring>"}]}],"department_limit_conflicts":[{"date":"\u003cstring>","department_id":"\u003cstring>","department_name":"\u003cstring>","current_absent":0,"max_allowed":0}],"representative_unavailable":[{"date":"\u003cstring>","representatives":[{"member_id":"\u003cstring>","member_name":"\u003cstring>","reason":"\u003cstring>"}]}],"representative_overlaps":[{"date":"\u003cstring>","representing_for":[{"member_id":"\u003cstring>","member_name":"\u003cstring>","request_id":"\u003cstring>","status":"\u003cstring>","start":"\u003cstring>","end":"\u003cstring>"}]}],"rejection":{"code":"RECURRENCE_WINDOW_EXCEEDED","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"39df8698-421d-48db-b4f4-25ab68ee7061":{"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"},"09333b2d-cc35-4fcb-a03a-7fd5aa7a4d6f":{"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"},"a9ea5cae-df2f-4f9c-841e-cd12df39b6af":{"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"},"74ddab08-c92d-4a8e-9043-a59a3bfe3178":{"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":{"1a64309a-c937-4ba8-8799-e374c22b410a":{"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 recurring requests (dry run) - absentify®","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/api-reference/requests/preview-recurring-requests-dry-run","matchLevel":0},"de":{"href":"/de/api-reference/requests/preview-recurring-requests-dry-run","matchLevel":1}}},"lastModified":"2026-11-03T10:10:29.343Z","originalFileLocation":"en/api-reference/requests/preview-recurring-requests-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/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\u0026#x27;s allowance covers the whole series, and the per-occurrence conflicts. 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. 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. 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. Conflicts: conflicts lists occurrences overlapping the member\u0026#x27;s existing requests, department_limit_conflicts the occurrences on which a department\u0026#x27;s maximum absent limit is already reached, representative_overlaps the occurrences on which the member is someone else\u0026#x27;s representative (pending or accepted), and representative_unavailable the occurrences on which a passed representative is absent. 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\u0026#x27;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\u0026#x27;s role (PAST_DATE_NOT_ALLOWED), an occurrence on which a non-admin is someone else\u0026#x27;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. 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. 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 recurring requests (dry run) - absentify®\">\u003cmeta data-mint-head property=\"og:description\" content=\"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\u0026#x27;s allowance covers the whole series, and the per-occurrence conflicts. 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. 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. 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. Conflicts: conflicts lists occurrences overlapping the member\u0026#x27;s existing requests, department_limit_conflicts the occurrences on which a department\u0026#x27;s maximum absent limit is already reached, representative_overlaps the occurrences on which the member is someone else\u0026#x27;s representative (pending or accepted), and representative_unavailable the occurrences on which a passed representative is absent. 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\u0026#x27;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\u0026#x27;s role (PAST_DATE_NOT_ALLOWED), an occurrence on which a non-admin is someone else\u0026#x27;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. 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. 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-recurring-requests-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+recurring+requests+%28dry+run%29\u0026amp;description=Answer+what+POST+%2Frequests%2Frecurring+would+do+with+this+payload+without+creating+anything%3A+the+number+of+occurrences%2C+the+summed+counted+duration+and+its+split+\u0026amp;theme=432f40b01025e6009f4d3383\u0026amp;signature=7f5275a865e1f26c2e5616d6b8b636c1ca17421f0335d60450093fea460d338e\">\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 recurring requests (dry run) - absentify®\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"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\u0026#x27;s allowance covers the whole series, and the per-occurrence conflicts. 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. 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. 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. Conflicts: conflicts lists occurrences overlapping the member\u0026#x27;s existing requests, department_limit_conflicts the occurrences on which a department\u0026#x27;s maximum absent limit is already reached, representative_overlaps the occurrences on which the member is someone else\u0026#x27;s representative (pending or accepted), and representative_unavailable the occurrences on which a passed representative is absent. 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\u0026#x27;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\u0026#x27;s role (PAST_DATE_NOT_ALLOWED), an occurrence on which a non-admin is someone else\u0026#x27;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. 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. 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+recurring+requests+%28dry+run%29\u0026amp;description=Answer+what+POST+%2Frequests%2Frecurring+would+do+with+this+payload+without+creating+anything%3A+the+number+of+occurrences%2C+the+summed+counted+duration+and+its+split+\u0026amp;theme=432f40b01025e6009f4d3383\u0026amp;signature=7f5275a865e1f26c2e5616d6b8b636c1ca17421f0335d60450093fea460d338e\">\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-recurring-requests-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-recurring-requests-dry-run.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://absentify.com/docs/de/api-reference/requests/preview-recurring-requests-dry-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-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-recurring-requests-dry-run#webpage\",\"url\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run\",\"name\":\"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. 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. 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. 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. 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. 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. 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. 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.343Z\",\"isPartOf\":{\"@id\":\"https://absentify.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-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 recurring requests (dry run)\",\"item\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run#apireference\",\"headline\":\"Preview recurring requests (dry run)\",\"name\":\"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. 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. 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. 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. 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. 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. 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. 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-recurring-requests-dry-run\",\"mainEntityOfPage\":{\"@id\":\"https://absentify.com/docs/en/api-reference/requests/preview-recurring-requests-dry-run#webpage\"},\"dateModified\":\"2026-11-03T10:10:29.343Z\",\"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","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)","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"},{"title":"Preview recurring requests (dry run)","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","description":"Approve a pending request on behalf of the user who created the API token. The API automatically finds the next pending approval and approves it. This acts on the request approvers only and never on a change request: to decide a change of an approved request use `POST /requests/{id}/changes/{changeId}/approve`.","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-recurring-requests-dry-run"}]}]},"basePath":"","title":"Preview recurring requests (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"]}