> ## 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.

# Update a member

> Update a member. Employment period: changing employment_start_date or employment_end_date so that absences currently inside the period would fall outside the new one is rejected with 400 (error code EMPLOYMENT_PERIOD_ABSENCES_AFFECTED, including the affected counts). Absences that already sat outside the stored period do not by themselves block a change, so existing absences never stand in the way of widening the period. The API never cancels absences; resolve them in the absentify UI, which asks for explicit confirmation before cancelling. Clearing employment_start_date (setting it to null) is rejected with 400 while the member has an ACTIVE assignment to an allowance rule that anchors its accrual year on the hire date (an assignment whose rule_end_date has already passed does not block it) — that rule has nothing to anchor on without the date, and the response names the rule. Either move the member to a rule with a fixed year start first, or keep the date. Setting or changing the date is unaffected, and a member who already has no date stays editable.



## OpenAPI

````yaml https://api.absentify.com/api/v1/openapi.json put /members/{id}
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
  - name: Out of office
externalDocs:
  url: https://absentify.com/docs/en/api-reference
paths:
  /members/{id}:
    put:
      tags:
        - Members
      summary: Update a member
      description: >-
        Update a member. Employment period: changing employment_start_date or
        employment_end_date so that absences currently inside the period would
        fall outside the new one is rejected with 400 (error code
        EMPLOYMENT_PERIOD_ABSENCES_AFFECTED, including the affected counts).
        Absences that already sat outside the stored period do not by themselves
        block a change, so existing absences never stand in the way of widening
        the period. The API never cancels absences; resolve them in the
        absentify UI, which asks for explicit confirmation before cancelling.
        Clearing employment_start_date (setting it to null) is rejected with 400
        while the member has an ACTIVE assignment to an allowance rule that
        anchors its accrual year on the hire date (an assignment whose
        rule_end_date has already passed does not block it) — that rule has
        nothing to anchor on without the date, and the response names the rule.
        Either move the member to a rule with a fixed year start first, or keep
        the date. Setting or changing the date is unaffected, and a member who
        already has no date stays editable.
      operationId: member-updateMember
      parameters:
        - in: path
          name: id
          schema:
            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})$
          required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_admin:
                  type: boolean
                department_ids:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      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})$
                    required:
                      - id
                employment_start_date:
                  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'
                employment_end_date:
                  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'
                public_holiday_id:
                  type: string
                birthday:
                  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'
                custom_id:
                  anyOf:
                    - type: string
                    - type: 'null'
                status:
                  type: string
                  enum:
                    - INACTIVE
                    - ACTIVE
                    - ARCHIVED
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                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})$
        '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'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error.NOT_FOUND'
        '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.NOT_FOUND:
      type: object
      properties:
        message:
          type: string
          description: The error message
          example: Not found
        code:
          type: string
          description: The error code
          example: NOT_FOUND
        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: Not found error (404)
      description: The error information
      example:
        code: NOT_FOUND
        message: Not found
        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

````