---
title: "Update time off policy"
method: PUT
path: "/v2/time_off_policies/{time_off_policy_id}"
tags: ["time_off_policies"]
---

# Update time off policy

`PUT /v2/time_off_policies/{time_off_policy_id}`

## Request

- Base URL: `https://api.hubstaff.com`
- URL: `https://api.hubstaff.com/v2/time_off_policies/{time_off_policy_id}`
- 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_policies/:time_off_policy_id/put.ts> (a function with typed inputs; its response is checked against the schema)

Updates a time off policy. Only pass in the fields you want to change.

**Updatable fields:** `name`, `accrual_policy`, `allow_negative_balances`,
`requires_approval`, `balance_rolls_over_annually`, `paid`, `auto_add_new_users`,
and `time_off_policy_user_ids` (list-based policies only).

**Immutable after creation:** `accrual_type` and `membership_rules`.
Use `accrual_policy` to update the configuration within the existing accrual type.
For rules-based policies, member assignment cannot be modified via the API.

Returns the updated time off policy.

## Path parameters

- `time_off_policy_id` integer, required

## Request body

- PutV2TimeOffPoliciesTimeOffPolicyId: Update time off policy
  - `name` string: Policy name
  - `accrual_policy` object: Accrual configuration (depends on accrual_type)
    - `hours_per_year` number, float
    - `hours_worked` number, float
    - `hours_per` number, float
    - `maximum_to_accrue` number, float: Max accrual hours/year (required except none and monthly)
    - `hours_per_month` number, float
    - `accrual_period` 'month' | 'year'
    - `accrual_day` 'first_day_of_month' | 'monthly_anniversary' | 'last_day_of_month'
    - `prorate_on_start` boolean
    - `starting_balance` number, float
  - `allow_negative_balances` boolean
  - `requires_approval` boolean
  - `balance_rolls_over_annually` boolean
  - `paid` boolean
  - `auto_add_new_users` boolean
  - `time_off_policy_user_ids` integer[]: User IDs to set as members

## Response `200`

A time off policy

- object
  - `time_off_policy` TimeOffPolicy: TimeOffPolicy model
    - `id` integer, required: Time off policy ID
    - `organization_id` integer, required: Organization ID
    - `created_at` string, date-time, required: When the record was created
    - `updated_at` string, date-time, required: When the record was last updated
    - `name` string, required: Time off policy name
    - `created_by_id` integer: User ID who created the policy
    - `auto_add_new_users` boolean, required: Automatically add new members to this policy
    - `allow_negative_balances` boolean, required: Member can request time off before having the balance for it.
    - `requires_approval` boolean, required: When false time off requests are automatically approved.
    - `balance_rolls_over_annually` boolean, required: balance rolls over annually
    - `paid` boolean, required: When true members will be paid for time off taken.
    - `status` string, required: Policy status
    - `policy_type` 'none' | 'annual' | 'monthly' | 'hours_worked' | 'joined_date', required: Type of policy. Submitted as `accrual_type` when creating a policy
    - `policy_config` object, required: Accrual configuration. Submitted as `accrual_policy` when creating or updating a policy
      - `starting_balance` number, float: Starting balance (hours)
      - `hours_per` integer: Hours per at amount accrued
      - `hours_worked` integer: Hours worked at amount accrued
      - `maximum_to_accrue` integer: Maximum amount of time off that can be accrued per year. (hours)
      - `hours_per_year` integer: Hours per year
      - `hours_per_month` number, float: Hours per month
      - `accrual_period` 'month' | 'year': Accrual period. If set to "month", hours_per_month is required. If set to "year", hours_per_year is required
      - `accrual_day` 'first_day_of_month' | 'monthly_anniversary' | 'last_day_of_month': Day of the month when accrual happens
      - `prorate_on_start` boolean: Whether to prorate time based on start date
    - `membership_rules` object
      - `countries` unknown, required
      - `employment_types` unknown, required

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

## Changes

- **2026-11-06** `c6b90e4e4bdc`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/hubstaff/apis/hubstaff-v2-api/changes/v2/time_off_policies/:time_off_policy_id/put.md)

---

[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)
