User Assignments & Allocations
The assignment object
| Attribute | Type | Description |
|---|---|---|
user |
object | An object containing the id and name of the user. |
holiday_calendar |
object | Assigned holiday calendar (id, name) or null if unassigned. |
work_schedule |
object | Assigned active work schedule (id, name) or null if unassigned or deactivated. |
effective_work_schedule |
object | Effective schedule applied to the user (name, weekly_hours). |
The allocation object
| Attribute | Type | Description |
|---|---|---|
id |
integer | Unique ID for the allocation record. |
year |
integer | Allocation year. |
user |
object | An object containing the id and name of the user. |
pto_type |
object | An object containing the id, name, color, and icon of the policy. |
accrual_type |
string | Accrual type override if customized, otherwise null. |
accrual_schedule |
string | Accrual schedule override if customized, otherwise null. |
accrual_first_payday |
date | First payday override for accruals if customized. |
accrual_leave_hours |
decimal | Leave hours per accrual period if customized. |
accrual_worked_hours |
decimal | Worked hours base if customized. |
accrual_max_hours_per_year |
decimal | Maximum accrued hours cap per year if customized. |
days_per_year |
decimal | Annual allowance override in days if customized. |
carryover_days |
decimal | Carryover days override if customized. |
requires_approval |
boolean | Approval requirement override if customized. |
effective_days_per_year |
decimal | Effective days credited for the year. |
effective_accrual_type |
string | Effective accrual mode applied to the user. |
effective_accrual_schedule |
string | Effective accrual interval applied to the user. |
effective_requires_approval |
boolean | Effective approval requirement applied to the user. |
created_at |
datetime | Date and time the allocation was created. Use the ISO 8601 Format. |
updated_at |
datetime | Date and time the allocation was last updated. Use the ISO 8601 Format. |
Required permissions
The PTO API is currently being rolled out gradually. Requests from unavailable accounts return 403 Forbidden.
Only administrators can access, assign, or customize user holiday calendars, work schedules, and PTO allocations. Insufficient permissions will result in a 403 Forbidden status code.
List user assignments
Returns a list of users alongside their assigned holiday calendars, assigned work schedules, and effective working hours.
GET /v2/pto/assignments
| Parameter | Type | Description |
|---|---|---|
user_id |
integer | Filter by a single user ID. |
user_ids |
array of integers | Filter by multiple user IDs. |
Example Request:
curl "https://api.harvestapp.com/v2/pto/assignments?user_id=1782959" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Harvest-Account-Id: $ACCOUNT_ID" \
-H "User-Agent: MyApp ([email protected])"
Example Response:
{
"assignments": [
{
"user": {
"id": 1782959,
"name": "Kim Allen"
},
"holiday_calendar": {
"id": 12,
"name": "US Holidays"
},
"work_schedule": {
"id": 8,
"name": "Standard Full Time"
},
"effective_work_schedule": {
"name": "Standard Full Time",
"weekly_hours": 40.0
}
}
]
}Update user assignments
Assigns or unassigns a holiday calendar and work schedule for a specific user. Returns an assignment object and a 200 OK response code.
PATCH /v2/pto/assignments/{USER_ID}
| Parameter | Type | Description |
|---|---|---|
holiday_calendar_id |
integer | ID of the holiday calendar to assign, or null to unassign. |
work_schedule_id |
integer | ID of the work schedule to assign, or null to unassign (reverting to company default). |
Example Request:
curl -X PATCH "https://api.harvestapp.com/v2/pto/assignments/1782959" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Harvest-Account-Id: $ACCOUNT_ID" \
-H "Content-Type: application/json" \
-H "User-Agent: MyApp ([email protected])" \
-d '{"holiday_calendar_id": 12, "work_schedule_id": 8}'
Example Response:
{
"user": {
"id": 1782959,
"name": "Kim Allen"
},
"holiday_calendar": {
"id": 12,
"name": "US Holidays"
},
"work_schedule": {
"id": 8,
"name": "Standard Full Time"
},
"effective_work_schedule": {
"name": "Standard Full Time",
"weekly_hours": 40.0
}
}List user allocations
Returns a list of customized and yearly time off allocations across users.
The response contains an object with a pto_allocations property that contains an array of up to per_page allocations.
GET /v2/pto/allocations
| Parameter | Type | Description |
|---|---|---|
year |
integer | The allocation year (defaults to current year). |
user_ids |
array of integers | Filter allocations by user IDs. |
pto_type_ids |
array of integers | Filter allocations by time off policy IDs. |
page |
integer | The page number to use in pagination. (Default: 1) |
per_page |
integer | The number of records to return per page. Can range between 1 and 2000. (Default: 2000) |
Example Request:
curl "https://api.harvestapp.com/v2/pto/allocations?year=2026&user_ids[]=1782959" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Harvest-Account-Id: $ACCOUNT_ID" \
-H "User-Agent: MyApp ([email protected])"
Example Response:
{
"pto_allocations": [
{
"id": 780,
"year": 2026,
"accrual_type": null,
"accrual_schedule": null,
"accrual_first_payday": null,
"accrual_leave_hours": null,
"accrual_worked_hours": null,
"accrual_max_hours_per_year": null,
"days_per_year": 28.0,
"carryover_days": 2.0,
"requires_approval": false,
"effective_days_per_year": 28.0,
"effective_accrual_type": "fixed",
"effective_accrual_schedule": "monthly",
"effective_requires_approval": false,
"user": {
"id": 1782959,
"name": "Kim Allen"
},
"pto_type": {
"id": 101,
"name": "Vacation",
"color": "blue",
"icon": "vacation"
},
"created_at": "2026-09-03T12:00:00Z",
"updated_at": "2026-09-03T12:00:00Z"
}
],
"per_page": 2000,
"total_pages": 1,
"total_entries": 1,
"next_page": null,
"previous_page": null,
"page": 1,
"links": {
"first": "https://api.harvestapp.com/v2/pto/allocations?page=1&per_page=2000",
"next": null,
"previous": null,
"last": "https://api.harvestapp.com/v2/pto/allocations?page=1&per_page=2000"
}
}Update or reset a user allocation
Updates or resets per-user yearly allocation overrides. Returns an allocation object and a 200 OK response code when customized overrides are present or saved. When an allocation is reset to defaults (either by passing reset_to_default: true or when the submitted values match the policy defaults), the allocation override record is removed and a reset confirmation object is returned instead.
PATCH /v2/pto/allocations
| Parameter | Type | Description |
|---|---|---|
user_id |
integer | Required. The target user ID. |
pto_type_id |
integer | Required. The policy ID. |
year |
integer | The allocation year (defaults to current year). |
accrual_type |
string | Override accrual mode (fixed, accrued, unlimited). |
accrual_schedule |
string | Override accrual interval (monthly, biweekly, semimonthly, hourly). |
accrual_first_payday |
date | Anchor date when accrual_schedule is overridden to biweekly. |
accrual_leave_hours |
decimal | Leave hours earned per period when accrual_schedule is overridden to hourly. |
accrual_worked_hours |
decimal | Base worked hours required to earn leave when accrual_schedule is overridden to hourly. |
accrual_max_hours_per_year |
decimal | Annual cap on accrued leave hours when accrual_schedule is overridden to hourly. |
days_per_year |
decimal | Override annual allowance days. |
carryover_days |
decimal | Override carryover days for this year. |
requires_approval |
boolean | Override approval requirement. |
reset_to_default |
boolean | Pass true to delete customized overrides and revert to policy defaults. |
Example Request:
curl -X PATCH "https://api.harvestapp.com/v2/pto/allocations" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Harvest-Account-Id: $ACCOUNT_ID" \
-H "Content-Type: application/json" \
-H "User-Agent: MyApp ([email protected])" \
-d '{"user_id": 1782959, "pto_type_id": 101, "year": 2026, "days_per_year": 28.0}'
Example Response:
{
"id": 780,
"year": 2026,
"accrual_type": null,
"accrual_schedule": null,
"accrual_first_payday": null,
"accrual_leave_hours": null,
"accrual_worked_hours": null,
"accrual_max_hours_per_year": null,
"days_per_year": 28.0,
"carryover_days": 2.0,
"requires_approval": false,
"effective_days_per_year": 28.0,
"effective_accrual_type": "fixed",
"effective_accrual_schedule": "monthly",
"effective_requires_approval": false,
"user": {
"id": 1782959,
"name": "Kim Allen"
},
"pto_type": {
"id": 101,
"name": "Vacation",
"color": "blue",
"icon": "vacation"
},
"created_at": "2026-09-03T12:00:00Z",
"updated_at": "2026-09-03T12:05:00Z"
}Example Request (Reset to default):
curl -X PATCH "https://api.harvestapp.com/v2/pto/allocations" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Harvest-Account-Id: $ACCOUNT_ID" \
-H "Content-Type: application/json" \
-H "User-Agent: MyApp ([email protected])" \
-d '{"user_id": 1782959, "pto_type_id": 101, "year": 2026, "reset_to_default": true}'
Example Response (Reset to default):
{
"user": {
"id": 1782959,
"name": "Kim Allen"
},
"pto_type": {
"id": 101,
"name": "Vacation",
"color": "blue",
"icon": "vacation"
},
"year": 2026,
"customized": false,
"message": "Allocation reset to type defaults"
}