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

# Submit a new leave request for the caller.



## OpenAPI

````yaml /api-reference/portal.v1.json post /api/v1/portal/employee/leave-requests
openapi: 3.0.3
info:
  title: Swiss HR Easy — Employee Portal API
  version: 1.0.0
  description: >-
    Versioned contract for the employee self-service portal endpoints consumed
    by the mobile app. Generated from Zod schemas — do not edit by hand (run
    `npm run gen:openapi`).
servers:
  - url: https://{tenantHost}
    description: >-
      Per-tenant deployment host. Swiss HR Easy is single-tenant, so each
      customer install serves this contract from its own host.
security: []
tags:
  - name: profile
    description: Employee profile overview and entitlements.
  - name: leave
    description: Employee leave balances and requests.
  - name: time
    description: Employee time tracking and weekly summaries.
  - name: sick-leave
    description: Employee sick-leave reports and summaries.
  - name: payslips
    description: Employee payslips and deduction breakdowns.
  - name: compensation
    description: The caller's compensation role, salary band and placement rationale.
  - name: auth
    description: Current-session retrieval and logout for the mobile app.
  - name: holidays
    description: >-
      The days behind the vacation day count that cost less than a full day:
      public holidays, school holidays, and Betriebsferien days the caller was
      approved to work through.
paths:
  /api/v1/portal/employee/leave-requests:
    post:
      tags:
        - leave
      summary: Submit a new leave request for the caller.
      operationId: createLeaveRequest
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LeaveRequestInput'
      responses:
        '201':
          description: The newly created leave request.
          content:
            application/json:
              schema:
                type: object
                required:
                  - success
                  - data
                additionalProperties: false
                properties:
                  success:
                    type: boolean
                    enum:
                      - true
                  data:
                    $ref: '#/components/schemas/LeaveRequestDTO'
        '400':
          description: The request body failed validation.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '401':
          description: The caller is not authenticated.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '404':
          description: No employee record is linked to the caller's account.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
        '409':
          description: An overlapping leave request already exists for the period.
          content:
            application/json:
              schema:
                type: object
                required:
                  - error
                properties:
                  error:
                    type: string
components:
  schemas:
    LeaveRequestInput:
      type: object
      properties:
        leaveType:
          type: string
          enum:
            - VACATION
            - UNPAID
            - MATERNITY
            - PATERNITY
            - MILITARY
            - EDUCATION
            - MOVING
            - MARRIAGE
            - BEREAVEMENT
            - OTHER
        startDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        endDate:
          type: string
          format: date
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
        totalDays:
          type: number
          minimum: 0.5
        halfDayStart:
          nullable: true
          type: boolean
        halfDayEnd:
          nullable: true
          type: boolean
        reason:
          nullable: true
          type: string
      required:
        - leaveType
        - startDate
        - endDate
        - totalDays
    LeaveRequestDTO:
      type: object
      properties:
        id:
          type: string
        leaveType:
          type: string
          enum:
            - VACATION
            - UNPAID
            - MATERNITY
            - PATERNITY
            - MILITARY
            - EDUCATION
            - MOVING
            - MARRIAGE
            - BEREAVEMENT
            - OTHER
        status:
          type: string
          enum:
            - DRAFT
            - SUBMITTED
            - APPROVED
            - REJECTED
            - CANCELLED
        startDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
        endDate:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
        totalDays:
          type: number
        halfDayStart:
          type: boolean
        halfDayEnd:
          type: boolean
        reason:
          nullable: true
          type: string
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
      required:
        - id
        - leaveType
        - status
        - startDate
        - endDate
        - totalDays
        - halfDayStart
        - halfDayEnd
        - reason
        - createdAt
      additionalProperties: false

````