---
title: "Change a request"
method: POST
path: "/requests/{id}/changes"
tags: ["Requests"]
---

# Change a request

`POST /requests/{id}/changes`

Change the reason or the period of a request on behalf of the user who created the API token.

Pending requests can change dates and reason. Approved requests can only change the reason. A new period on a pending request restarts the approval; a reason change never does. The leave type must allow changes (`allow_request_changes`); if it does not, the call is rejected with 403, like a request that has already started or that the caller may not change. A non-admin passing `admin_approval_option: approve_request_immediately` gets 403 too.

Send `start` and `end` together to change the period. Send `reason` to change the reason, or `null` to clear it. The response is the recorded change with its `status`.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `reason` string, nullable
  - `start` string — Start/end of the request in ISO 8601. For day-based leave types (`leave_unit: days`) send the date at midnight UTC (e.g. `2026-06-01T00:00:00Z`) and use `start_at` / `end_at` to set half-days. For hour-based leave types include the exact time of day (e.g. `2026-06-01T09:00:00Z`); `start_at` / `end_at` are then ignored.
  - `end` string — Start/end of the request in ISO 8601. For day-based leave types (`leave_unit: days`) send the date at midnight UTC (e.g. `2026-06-01T00:00:00Z`) and use `start_at` / `end_at` to set half-days. For hour-based leave types include the exact time of day (e.g. `2026-06-01T09:00:00Z`); `start_at` / `end_at` are then ignored.
  - `start_at` 'morning' | 'afternoon' — For day-based leave types: whether the absence starts in the `morning` (the whole first day counts) or `afternoon` (only the second half of the first day). Ignored for hour-based leave types.
  - `end_at` 'lunchtime' | 'end_of_day' — For day-based leave types: whether the absence ends at `lunchtime` (only the first half of the last day) or `end_of_day` (the whole last day counts). Ignored for hour-based leave types.
  - `admin_approval_option` 'approve_request_immediately' | 'go_through_the_normal_approval_process'

## Response `200`

Successful response

- object
  - `id` integer, required
  - `revision` integer, required
  - `kind` 'reason' | 'shortened' | 'extended' | 'moved' | 'leave_type', required
  - `status` 'pending' | 'approved' | 'declined' | 'withdrawn' | 'applied', required
  - `previous` object, required — The request as it was before this change.
    - `start` string, required
    - `end` string, required
    - `start_at` 'morning' | 'afternoon', required — For day-based leave types: whether the absence starts in the `morning` (the whole first day counts) or `afternoon` (only the second half of the first day). Ignored for hour-based leave types.
    - `end_at` 'lunchtime' | 'end_of_day', required — For day-based leave types: whether the absence ends at `lunchtime` (only the first half of the last day) or `end_of_day` (the whole last day counts). Ignored for hour-based leave types.
    - `leave_type` object, required
      - `id` string, required
      - `name` string, nullable, required
    - `duration` number, required
    - `workday_absence_duration` number, required
    - `reason` string, nullable, required
  - `proposed` object, required — The request as this change wants it. For `applied` and `approved` changes this is what is in force.
    - `start` string, required
    - `end` string, required
    - `start_at` 'morning' | 'afternoon', required — For day-based leave types: whether the absence starts in the `morning` (the whole first day counts) or `afternoon` (only the second half of the first day). Ignored for hour-based leave types.
    - `end_at` 'lunchtime' | 'end_of_day', required — For day-based leave types: whether the absence ends at `lunchtime` (only the first half of the last day) or `end_of_day` (the whole last day counts). Ignored for hour-based leave types.
    - `leave_type` object, required
      - `id` string, required
      - `name` string, nullable, required
    - `duration` number, required
    - `workday_absence_duration` number, required
    - `reason` string, nullable, required
  - `changed_by` object, nullable, required
    - `id` string, required
    - `name` string, nullable, required
  - `decided_by` object, nullable, required
    - `id` string, required
    - `name` string, nullable, required
  - `created_at` string, required
  - `decided_at` string, nullable, required
  - `decision_reason` string, nullable, required

## Other responses

- `400` — Invalid input data
- `401` — Authorization not provided
- `403` — Insufficient access
- `500` — Internal server error

## Changes

- **2026-10-05** `d09a007f839d` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/absentify/apis/absentify-crud-api/changes/requests/:id/changes/post.md)

---

[API](https://skmtc.dev/absentify/apis/absentify-crud-api.md) · [All operations](https://skmtc.dev/absentify/apis/absentify-crud-api/llms.txt) · [OpenAPI document](https://skmtc.dev/absentify/apis/absentify-crud-api/revisions/d09a007f839d?raw)
