---
title: "Create time off policy"
method: POST
path: "/v2/organizations/{organization_id}/time_off_policies"
tags: ["time_off_policies"]
---

# Create time off policy

`POST /v2/organizations/{organization_id}/time_off_policies`

## Request

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

Creates a new time off policy for the given organization.

`accrual_policy` fields by `accrual_type`:

`maximum_to_accrue` is required for `hours_worked`, `annual`, and `joined_date`.

- `none` — `starting_balance` (optional)
- `hours_worked` — `hours_per` (required), `hours_worked` (required), `maximum_to_accrue` (required)
- `annual` — `hours_per_year` (required), `maximum_to_accrue` (required)
- `joined_date` — `hours_per_year` (required), `maximum_to_accrue` (required)
- `monthly` — `accrual_period` (required: `month` or `year`), `accrual_day` (required: `first_day_of_month`, `monthly_anniversary`, or `last_day_of_month`), `prorate_on_start` (optional); plus `hours_per_month` (required when `accrual_period=month`) or `hours_per_year` (required when `accrual_period=year`)

When `membership_rules` are provided, they take precedence over `time_off_policy_user_ids`.
Additionally, `auto_add_new_users` defaults to `true` when `membership_rules` are provided.

Returns the created time off policy.

## Path parameters

- `organization_id` integer, required

## Request body

- PostV2OrganizationsOrganizationIdTimeOffPolicies: Create time off policy
  - `name` string, required: Policy name
  - `accrual_type` 'none' | 'annual' | 'monthly' | 'hours_worked' | 'joined_date', required
  - `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, required
  - `requires_approval` boolean, required
  - `balance_rolls_over_annually` boolean, required
  - `paid` boolean, required
  - `auto_add_new_users` boolean
  - `time_off_policy_user_ids` integer[]: User IDs to add as members
  - `membership_rules` object: Auto-membership rules
    - `countries` string[]: ISO 3166-1 alpha-2 country codes
    - `employment_types` string[]: Member employment type filter

## Response `201`

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/organizations/:organization_id/time_off_policies/post.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)
