---
title: "Update time off request status"
method: PUT
path: "/v2/time_off_requests/{time_off_request_id}/status"
tags: ["time_off_requests"]
---

# Update time off request status

`PUT /v2/time_off_requests/{time_off_request_id}/status`

## Request

- Base URL: `https://api.hubstaff.com`
- URL: `https://api.hubstaff.com/v2/time_off_requests/{time_off_request_id}/status`
- Auth: OAuth 2
  - Authorization code: `https://account.hubstaff.com/authorizations/new`
  - Token URL: `https://account.hubstaff.com/access_tokens` scopes: `hubstaff:read`, `hubstaff:write`
- TypeScript: <https://skmtc.dev/hubstaff/apis/hubstaff-v2-api/docs/v2/time_off_requests/:time_off_request_id/status/put.ts> (a function with typed inputs; its response is checked against the schema)

Approves or denies the time off request.

Allowed transitions: submitted → approved, submitted → denied, approved → denied, denied → approved.

Paid or partially paid time off requests cannot be modified through this endpoint.

When approving, use remove_shifts to automatically remove overlapping attendance shifts. This parameter is ignored when denying.

A response (reason) is required when denying a request.

## Path parameters

- `time_off_request_id` integer, required

## Request body

- PutV2TimeOffRequestsTimeOffRequestIdStatus: Update time off request status
  - `status` 'approved' | 'denied', required: New status
  - `response` string: Denial reason (required when denying)
  - `remove_shifts` boolean: Remove overlapping shifts (used when approving)

## Response `200`

The updated time off request with its balance preview

- TimeOffRequestWithBalancePreview: TimeOffRequestWithBalancePreview model
  - `time_off_request` TimeOffRequest, required: TimeOffRequest model
    - `id` integer, required: Time edit log ID
    - `user_id` integer, required: User ID
    - `time_off_policy_id` integer, required: Time off request ID
    - `status` string, required: Status
    - `all_day` boolean, required: Time off request for all day (User's time zone)
    - `starts_at` string, date-time, required: Time off request start time
    - `stops_at` string, date-time, required: Time off request stop time
    - `submitted_at` string, date-time: Time off request submission time
    - `approved_at` string, date-time: Time off request approving time
    - `denied_at` string, date-time: Time off request denial time
    - `paid` boolean, required: If the time off request has been paid
    - `amount_used` integer, required: Time off request amount used
    - `message` string: message
    - `response` string: response
    - `created_by_id` integer, required: User ID from creator
    - `approved_by_id` integer: Approving User ID
    - `denied_by_id` integer: Denying User ID
    - `team_payment_detail_id` integer: Team payment detail ID
    - `team_payment_id` integer: Team payment ID
    - `time_off_request_days` TimeOffRequestDay[], required: Individual work days covered by this time off request
      - `date` string, date, required: Date of the time off day
      - `amount_used` integer, required: Amount of time used in seconds for this day
      - `starts_at` string, date-time, required: Start time for this specific day
      - `stops_at` string, date-time, required: Stop time for this specific day
      - `holiday` boolean, required: Whether this day is a holiday
      - `paid` boolean, required: Whether this day has been paid
    - `attachment_original_filename` string: Original filename of the attachment, present only with an attachment
    - `attachment_url` string, uri: Attachment download URL, expires in 2 hours, present only with an attachment
    - `created_at` string, date-time, required: When the record was created
    - `updated_at` string, date-time, required: When the record was last updated
  - `balance_preview` TimeOffBalancePreview, required
    - `starting_balance` TimeOffBalanceAmount, required
      - `current` integer, required: Value for the year the request starts in
      - `next` integer: Value for the next year, only for two-year requests
    - `pending_approval` TimeOffBalanceAmount, required
      - `current` integer, required: Value for the year the request starts in
      - `next` integer: Value for the next year, only for two-year requests
    - `amount_left` TimeOffBalanceAmount, required
      - `current` integer, required: Value for the year the request starts in
      - `next` integer: Value for the next year, only for two-year requests
    - `amount_used` TimeOffBalanceAmount, required
      - `current` integer, required: Value for the year the request starts in
      - `next` integer: Value for the next year, only for two-year requests
    - `holiday_hours` TimeOffBalanceAmount, required
      - `current` integer, required: Value for the year the request starts in
      - `next` integer: Value for the next year, only for two-year requests

## Other responses

- `400`: Invalid parameters
- `401`: Unauthorized
- `403`: API access is only for organizations on an active plan
- `404`: Could not find record
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/hubstaff/apis/hubstaff-v2-api.md) - [All operations](https://skmtc.dev/hubstaff/apis/hubstaff-v2-api/llms.txt) - [OpenAPI document](https://skmtc.dev/hubstaff/apis/hubstaff-v2-api/revisions/c6b90e4e4bdc?raw)
