Hubstaff Time Off API
Time off requests, policies, and balances.
Time off requests, policies, and balances.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/hubstaff-time-off-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.0.3
info:
title: Hubstaff Activities Time Off API
description: 'The Hubstaff API v2 provides programmatic read and write access to Hubstaff''s time tracking, timesheet, workforce management, and project management data - organizations, members, teams, projects, tasks, clients, activities (10-minute tracked time blocks with activity percentages), daily activity aggregates, time entries, timesheets and approvals, time off requests/policies/balances, attendance schedules and shifts, screenshots, app and URL usage, invoices, team payments, and webhooks.
Authentication uses OpenID Connect / OAuth 2.0 through Hubstaff Account (https://account.hubstaff.com). For server-side scripts, create a personal access token at https://developer.hubstaff.com/personal_access_tokens - the PAT acts as an OAuth refresh token (90-day expiry) that you exchange for short-lived access tokens at https://account.hubstaff.com/access_tokens. Send the access token as a Bearer token on every request.
Rate limit: authenticated users are allowed 1,000 requests per hour per application; individual requests time out after 30 seconds. All requests must use HTTPS. Collection endpoints use cursor pagination via page_start_id and page_limit. This document is a curated OpenAPI 3.0 rendering of the live Swagger 2.0 definition published at https://api.hubstaff.com/v2/docs, covering the primary resource areas; consult the live definition for the complete surface (insights, job sites, budgets, overtime policies, integrations, and more).'
version: '2.0'
contact:
name: Hubstaff Developer Portal
url: https://developer.hubstaff.com/
termsOfService: https://hubstaff.com/terms
servers:
- url: https://api.hubstaff.com
description: Hubstaff production API (paths include the /v2 prefix)
security:
- oauth2:
- hubstaff:read
- personalAccessToken: []
tags:
- name: Time Off
description: Time off requests, policies, and balances.
paths:
/v2/organizations/{organization_id}/time_off_requests:
get:
operationId: getV2OrganizationsOrganizationIdTimeOffRequests
tags:
- Time Off
summary: List organization time off requests
description: 'Returns a collection of time off requests for the given organization.
Results can be filtered by created[start]/[stop], starts_at[start]/[stop], approved_at[start]/[stop], and user_ids[].
Use include[] to sideload related users and time_off_policies.'
parameters:
- name: organization_id
in: path
required: true
schema:
type: integer
format: int32
- name: page_start_id
in: query
description: The page start ID.
schema:
type: integer
format: int32
default: 0
- name: page_limit
in: query
description: The default page size
schema:
type: integer
format: int32
default: null
- name: created[start]
in: query
description: Start time (ISO 8601)
schema:
type: string
format: date-time
- name: created[stop]
in: query
description: Stop time (ISO 8601, Exclusive)
schema:
type: string
format: date-time
- name: starts_at[start]
in: query
description: Start time (ISO 8601)
schema:
type: string
format: date-time
- name: starts_at[stop]
in: query
description: Stop time (ISO 8601, Exclusive)
schema:
type: string
format: date-time
- name: approved_at[start]
in: query
description: Approved start time (ISO 8601)
schema:
type: string
format: date-time
- name: approved_at[stop]
in: query
description: Approved stop time (ISO 8601, Exclusive)
schema:
type: string
format: date-time
- name: user_ids
in: query
description: List of user IDs
schema:
type: array
items:
type: integer
format: int32
- name: include
in: query
description: Specify related data to side load.
schema:
type: array
items:
type: string
enum:
- users
- time_off_policies
responses:
'200':
description: A list of time off requests
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
post:
operationId: postV2OrganizationsOrganizationIdTimeOffRequests
tags:
- Time Off
summary: Create time off request
description: 'Creates a new time off request.
Returns the created time off request with a balance_preview showing the policy balance impact.
time_off_request_days must include one entry for every date from starts_at to stops_at. Each entry requires a date and amount_used in seconds (typically 28800 for an 8-hour day). Set amount_used to 0 for excluded weekend or holiday days.
Set require_no_shift_overlap to true to reject the request if it overlaps with scheduled attendance shifts.
remove_shifts deletes overlapping attendance shifts only when the policy does not require approval (the request is auto-approved on creation). When the policy requires approval, this field is ignored — use the status endpoint to remove shifts at approval time instead.
Note: starts_at and stops_at are interpreted as wall-clock times in the target user''s configured timezone (any timezone offset in the value is ignored). When all_day is true, times are normalized to 09:00–17:00.'
parameters:
- name: organization_id
in: path
required: true
schema:
type: integer
format: int32
requestBody:
required: true
content:
application/json:
schema:
type: object
description: Request payload. See the live Hubstaff API reference (https://api.hubstaff.com/v2/docs) for the full schema.
responses:
'201':
description: A time off request
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
/v2/time_off_requests/{time_off_request_id}:
get:
operationId: getV2TimeOffRequestsTimeOffRequestId
tags:
- Time Off
summary: Get time off request
description: 'Returns the time off request with the given ID.
Includes time_off_request_days with per-day breakdown of dates, amounts, and holiday/paid status.
Also includes balance_preview showing the policy balance impact.'
parameters:
- name: time_off_request_id
in: path
description: Time off request ID
required: true
schema:
type: integer
format: int32
responses:
'200':
description: A time off request
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
put:
operationId: putV2TimeOffRequestsTimeOffRequestId
tags:
- Time Off
summary: Update time off request
description: 'Updates a time off request''s details (dates, message, days, policy).
This is a full replacement — all fields must be provided, including time_off_request_days with one entry per date (amount_used in seconds, typically 28800 for an 8-hour day).
Approved, paid, or partially paid requests cannot be edited.
If the request was denied, updating it automatically resubmits it (status → submitted).
If the policy does not require approval, the request is auto-approved on update.
Set require_no_shift_overlap to true to reject the update if it overlaps with scheduled attendance shifts.
remove_shifts deletes overlapping attendance shifts only when the policy does not require approval (the request is auto-approved on update). When the policy requires approval, this field is ignored — use the status endpoint to remove shifts at approval time instead.
Note: starts_at and stops_at are interpreted as wall-clock times in the user''s configured timezone (any timezone offset in the value is ignored). When all_day is true, times are normalized to 09:00–17:00.'
parameters:
- name: time_off_request_id
in: path
description: Time off request ID
required: true
schema:
type: integer
format: int32
requestBody:
required: true
content:
application/json:
schema:
type: object
description: Request payload. See the live Hubstaff API reference (https://api.hubstaff.com/v2/docs) for the full schema.
responses:
'200':
description: The updated time off request
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
delete:
operationId: deleteV2TimeOffRequestsTimeOffRequestId
tags:
- Time Off
summary: Delete time off request
description: 'Deletes the time off request.
Approved or paid time off requests cannot be deleted.'
parameters:
- name: time_off_request_id
in: path
description: Time off request ID
required: true
schema:
type: integer
format: int32
responses:
'204':
description: Deletion successful
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
/v2/organizations/{organization_id}/time_off_policies:
get:
operationId: getV2OrganizationsOrganizationIdTimeOffPolicies
tags:
- Time Off
summary: List organization time off policies
description: Returns a collection of time off policies for the given organization.
parameters:
- name: organization_id
in: path
required: true
schema:
type: integer
format: int32
- name: page_start_id
in: query
description: The page start ID.
schema:
type: integer
format: int32
default: 0
- name: page_limit
in: query
description: The default page size
schema:
type: integer
format: int32
default: null
- name: status
in: query
description: Policy status
schema:
type: string
enum:
- active
- archived
- all
default: active
responses:
'200':
description: A list of time off policies
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
/v2/organizations/{organization_id}/time_off_balances:
get:
operationId: getV2OrganizationsOrganizationIdTimeOffBalances
tags:
- Time Off
summary: List organization time off balances
description: 'Returns time off balances for the given organization.
Each entry represents one user''s balance for one time off policy in the requested year.
Use `year` to query balances for a specific year (defaults to current year in the organization''s timezone).
Use `include[]` to sideload related users and time_off_policies.'
parameters:
- name: organization_id
in: path
required: true
schema:
type: integer
format: int32
- name: page_start_id
in: query
description: The page start ID.
schema:
type: integer
format: int32
default: 0
- name: page_limit
in: query
description: The default page size
schema:
type: integer
format: int32
default: null
- name: search
in: query
description: User name search
schema:
type: string
- name: user_ids
in: query
description: Filter by user IDs
schema:
type: array
items:
type: integer
format: int32
- name: time_off_policy_ids
in: query
description: Filter by time off policy IDs
schema:
type: array
items:
type: integer
format: int32
- name: year
in: query
description: 'Balance year (default: current year in organization timezone)'
schema:
type: integer
format: int32
- name: include
in: query
description: Specify related data to side load.
schema:
type: array
items:
type: string
enum:
- users
- time_off_policies
responses:
'200':
description: A list of time off balances
'400':
description: Invalid parameters
'401':
description: Unauthorized
'403':
description: API access is only for organizations on an active plan
'404':
description: Could not find record
'429':
description: Rate limit exceeded
components:
securitySchemes:
oauth2:
type: oauth2
description: Hubstaff Account OpenID Connect / OAuth 2.0 authentication. Scopes are hubstaff:read and hubstaff:write.
flows:
authorizationCode:
authorizationUrl: https://account.hubstaff.com/authorizations/new
tokenUrl: https://account.hubstaff.com/access_tokens
scopes:
hubstaff:read: Read access to the Hubstaff API
hubstaff:write: Write access to the Hubstaff API
personalAccessToken:
type: http
scheme: bearer
description: Access token obtained by exchanging a personal access token (created at https://developer.hubstaff.com/personal_access_tokens) via the OAuth 2.0 refresh token grant at https://account.hubstaff.com/access_tokens. PATs expire after 90 days.
externalDocs:
description: Hubstaff API v2 reference (interactive)
url: https://developer.hubstaff.com/docs/hubstaff_v2