> ## Documentation Index
> Fetch the complete documentation index at: https://absentify.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Create recurring requests

> Create multiple recurring requests based on a recurrence pattern. Note: half_day='morning'/'afternoon' requires a leave type with leave_unit 'half_days' — on a full-day-only 'days' leave type it is rejected. Employment period: the series is created all-or-nothing, so a single occurrence that starts before employment_start_date or ends after employment_end_date rejects the whole series with 400 rather than skipping that occurrence. An occurrence straddling either boundary is rejected too, never truncated. The comparison is on calendar days, so both boundary dates are themselves bookable and a null boundary means open ended on that side.



## OpenAPI

````yaml https://api.absentify.com/api/v1/openapi.json post /requests/recurring
openapi: 3.1.0
info:
  title: absentify CRUD API
  description: OpenAPI compliant REST API
  version: 1.0.0
servers:
  - url: https://api.absentify.com/api/v1
security: []
tags:
  - name: Departments
  - name: Leave types
  - name: Members
  - name: Requests
  - name: Public holidays
  - name: Workspace
  - name: Absences
  - name: Allowance Management
externalDocs:
  url: https://absentify.com/docs/en/api-reference
paths:
  /requests/recurring:
    post:
      tags:
        - Requests
      summary: Create recurring requests
      description: >-
        Create multiple recurring requests based on a recurrence pattern. Note:
        half_day='morning'/'afternoon' requires a leave type with leave_unit
        'half_days' — on a full-day-only 'days' leave type it is rejected.
        Employment period: the series is created all-or-nothing, so a single
        occurrence that starts before employment_start_date or ends after
        employment_end_date rejects the whole series with 400 rather than
        skipping that occurrence. An occurrence straddling either boundary is
        rejected too, never truncated. The comparison is on calendar days, so
        both boundary dates are themselves bookable and a null boundary means
        open ended on that side.
      operationId: request-createRecurringRequests
      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}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                requester_member_id:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                reason:
                  type: string
                repeat:
                  type: string
                  enum:
                    - daily
                    - weekly
                    - monthly
                interval:
                  type: integer
                  minimum: 1
                  maximum: 100
                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
                until:
                  anyOf:
                    - 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
                    - type: 'null'
                count:
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 365
                    - type: 'null'
                start_time:
                  type: object
                  properties:
                    hour:
                      type: integer
                      minimum: 0
                      maximum: 23
                    minute:
                      type: integer
                      minimum: 0
                      maximum: 59
                  required:
                    - hour
                    - minute
                end_time:
                  type: object
                  properties:
                    hour:
                      type: integer
                      minimum: 0
                      maximum: 23
                    minute:
                      type: integer
                      minimum: 0
                      maximum: 59
                  required:
                    - hour
                    - minute
                half_day:
                  type: string
                  enum:
                    - full_day
                    - morning
                    - afternoon
                weekDays:
                  anyOf:
                    - type: string
                    - type: 'null'
                day:
                  anyOf:
                    - anyOf:
                        - type: integer
                          minimum: 1
                          maximum: 31
                        - type: string
                    - type: 'null'
                month:
                  anyOf:
                    - type: integer
                      minimum: 1
                      maximum: 12
                    - type: 'null'
                pos:
                  anyOf:
                    - anyOf:
                        - type: integer
                          minimum: -1
                          maximum: 5
                        - type: string
                    - type: 'null'
                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
                files:
                  type: array
                  items:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                representative_member_ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                    pattern: >-
                      ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                ignoreMaximumAbsence:
                  type: boolean
                admin_approval_option:
                  type: string
                  enum:
                    - approve_request_immediately
                    - go_through_the_normal_approval_process
              required:
                - leave_type_id
                - requester_member_id
                - repeat
                - interval
                - from
                - until
                - count
                - weekDays
                - day
                - month
                - pos
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  created:
                    type: number
                  requestIds:
                    type: array
                    items:
                      type: string
                      format: uuid
                      pattern: >-
                        ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                  recurrenceId:
                    type: string
                required:
                  - created
                  - requestIds
                  - recurrenceId
                additionalProperties: false
        '400':
          description: Invalid input data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.BAD_REQUEST'
        '401':
          description: Authorization not provided
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.UNAUTHORIZED'
        '403':
          description: Insufficient access
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.FORBIDDEN'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.INTERNAL_SERVER_ERROR'
      security:
        - ApiKey: []
components:
  schemas:
    error.BAD_REQUEST:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Invalid input data
        code:
          type: string
          description: The error code
          example: BAD_REQUEST
        issues:
          description: An array of issues that were responsible for the error
          example: []
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
            additionalProperties: false
      required:
        - message
        - code
      additionalProperties: false
      title: Invalid input data error (400)
      description: The error information
      example:
        code: BAD_REQUEST
        message: Invalid input data
        issues: []
    error.UNAUTHORIZED:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Authorization not provided
        code:
          type: string
          description: The error code
          example: UNAUTHORIZED
        issues:
          description: An array of issues that were responsible for the error
          example: []
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
            additionalProperties: false
      required:
        - message
        - code
      additionalProperties: false
      title: Authorization not provided error (401)
      description: The error information
      example:
        code: UNAUTHORIZED
        message: Authorization not provided
        issues: []
    error.FORBIDDEN:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Insufficient access
        code:
          type: string
          description: The error code
          example: FORBIDDEN
        issues:
          description: An array of issues that were responsible for the error
          example: []
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
            additionalProperties: false
      required:
        - message
        - code
      additionalProperties: false
      title: Insufficient access error (403)
      description: The error information
      example:
        code: FORBIDDEN
        message: Insufficient access
        issues: []
    error.INTERNAL_SERVER_ERROR:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Internal server error
        code:
          type: string
          description: The error code
          example: INTERNAL_SERVER_ERROR
        issues:
          description: An array of issues that were responsible for the error
          example: []
          type: array
          items:
            type: object
            properties:
              message:
                type: string
            required:
              - message
            additionalProperties: false
      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: []
  securitySchemes:
    ApiKey:
      type: apiKey
      name: X-API-KEY
      in: header

````