Object Overview

The PTO Request Object

A PTO request represents a paid time off request submitted by or on behalf of an employee. Each request is tied to a specific PTO policy, covers a date range, and progresses through statuses (pending, approved, denied, or canceled).

PTO endpoints require a premium plan.


Returned by

EndpointShape
GET /pto/requestsList of PTO requests
POST /pto/requestsCreated PTO request
POST /pto/requests/:pto_request_id/approveUpdated PTO request
POST /pto/requests/:pto_request_id/denyUpdated PTO request

Field Reference

Core fields

FieldTypeDescription
pto_request_idintegerUnique PTO request identifier.
employee_idintegerThe employee this request belongs to.
company_idintegerThe company this request belongs to.
policy_idinteger | nullThe PTO policy this request was filed under.
pto_typestringThe type of PTO (e.g. "vacation", "sick", "holiday", "pto"). Derived from the policy.
statusstringCurrent request status. See Statuses below.
messagestring | nullOptional message or reason from the employee.

Date fields

All date fields are normalized to YYYY-MM-DD format (date-only, no timestamp).

FieldTypeDescription
pto_startstring | nullStart date of the requested time off.
pto_endstring | nullEnd date of the requested time off.
created_atstring | nullDate the request was created.
approved_atstring | nullDate the request was approved. Null if not yet approved.

Breakdown

FieldTypeDescription
pto_dates_and_hoursarrayPer-day breakdown of PTO hours. Each entry has date (string, YYYY-MM-DD) and hours (number).

Nested objects

FieldTypeDescription
employeeobjectEmployee summary: employee_id, first_name, last_name, nickname.
policyobject | nullPolicy summary: policy_id, name, policy_type, is_unlimited.

Statuses

ValueDescription
"pending"Awaiting approval.
"approved"Approved by a manager or admin.
"denied"Denied by a manager or admin.
"canceled"Canceled by the employee or system.

Example

{
  "pto_request_id": 7001,
  "employee_id": 42,
  "company_id": 11,
  "policy_id": 5,
  "pto_type": "vacation",
  "pto_start": "2026-03-20",
  "pto_end": "2026-03-22",
  "created_at": "2026-03-17",
  "status": "pending",
  "approved_at": null,
  "message": "Family trip",
  "pto_dates_and_hours": [
    { "date": "2026-03-20", "hours": 8 },
    { "date": "2026-03-21", "hours": 8 },
    { "date": "2026-03-22", "hours": 4 }
  ],
  "employee": {
    "employee_id": 42,
    "first_name": "Avery",
    "last_name": "Taylor",
    "nickname": "Ave"
  },
  "policy": {
    "policy_id": 5,
    "name": "Vacation",
    "policy_type": "vacation",
    "is_unlimited": false
  }
}

The PTO Balance Object

A PTO balance object shows an employee's accrued, used, pending, and available PTO hours broken down by policy. The balance is computed server-side from accrual records and approved/pending PTO requests.

PTO endpoints require a premium plan.


Returned by

EndpointShape
GET /pto/balancesList of employee balance objects
GET /pto/balances/:employee_idSingle employee balance object

Field Reference

Employee summary fields

FieldTypeDescription
employee_idintegerUnique employee identifier.
first_namestringEmployee's first name.
last_namestringEmployee's last name.
nicknamestring | nullPreferred name / display name.

Balance array

FieldTypeDescription
balancesarrayList of per-policy balance entries. See Policy Balance.

Nested Objects

Policy Balance

FieldTypeDescription
policy_idintegerPTO policy identifier.
policy_namestring | nullPolicy name (e.g. "Vacation", "Sick Leave").
policy_typestring | nullPolicy type (e.g. "vacation", "sick", "holiday").
is_unlimitedbooleanWhether this policy has unlimited PTO.
accrued_hoursnumberTotal hours accrued to date.
used_hoursnumberTotal hours used (from approved requests).
pending_hoursnumberTotal hours in pending (not yet approved) requests.
available_hoursnumber | nullAvailable balance: accrued_hours - used_hours. Null for unlimited policies.
as_ofstringDate this balance was computed (YYYY-MM-DD).

Example

{
  "employee_id": 42,
  "first_name": "Avery",
  "last_name": "Taylor",
  "nickname": "Ave",
  "balances": [
    {
      "policy_id": 5,
      "policy_name": "Vacation",
      "policy_type": "vacation",
      "is_unlimited": false,
      "accrued_hours": 56,
      "used_hours": 16,
      "pending_hours": 8,
      "available_hours": 40,
      "as_of": "2026-03-17"
    },
    {
      "policy_id": 8,
      "policy_name": "Sick Leave",
      "policy_type": "sick",
      "is_unlimited": true,
      "accrued_hours": 0,
      "used_hours": 4,
      "pending_hours": 0,
      "available_hours": null,
      "as_of": "2026-03-17"
    }
  ]
}