Remote Time and Attendance API

Manage time-off requests, leave policies, leave balances, and timesheets. Approve/decline/cancel flows for managers; submit and self-serve flows for employees. Every state change is also emitted via webhook events.

Remote Time and Attendance API is one of 9 APIs that Remote publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 2 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 1 JSON Schema definition.

Tagged areas include Time Off, Leave, Timesheets, and HRIS. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, sample payloads, 2 Naftiko capability specs, and 1 JSON Schema.

OpenAPI Specification

remote-time-attendance-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Remote Time and Attendance API
  description: |
    Manage time off, leave policies, leave balances, and timesheets for
    employees on Remote.com. The API exposes both manager-driven and
    employee-driven flows and surfaces every state change via webhooks
    (requested, approved, declined, cancellation_requested, started,
    taken, etc.).
  version: '2026-05-22'
  contact:
    name: Remote API Support
    url: https://support.remote.com/
  x-logo:
    url: https://remote.com/favicon.ico

servers:
  - url: https://gateway.remote.com/v1
    description: Production
  - url: https://gateway.remote-sandbox.com/v1
    description: Sandbox

security:
  - BearerAuth: []

tags:
  - name: Time Off
    description: Time-off requests and approvals
  - name: Leave Policies
    description: Per-country leave policy definitions
  - name: Leave Balances
    description: Per-employee leave balances
  - name: Timesheets
    description: Hourly and salaried timesheets

paths:
  /timeoff:
    get:
      summary: List Time Off Requests
      operationId: listTimeOffRequests
      tags: [Time Off]
      parameters:
        - { name: employment_id, in: query, schema: { type: string, format: uuid } }
        - { name: status, in: query, schema: { $ref: '#/components/schemas/TimeOffStatus' } }
        - { name: starts_after, in: query, schema: { type: string, format: date } }
        - { name: ends_before, in: query, schema: { type: string, format: date } }
      responses:
        '200':
          description: Time-off requests.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffList' }
    post:
      summary: Create A Time Off Request
      operationId: createTimeOffRequest
      tags: [Time Off]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/TimeOffCreateRequest' }
      responses:
        '201':
          description: Created.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }

  /timeoff/{timeoff_id}:
    parameters:
      - { name: timeoff_id, in: path, required: true, schema: { type: string, format: uuid } }
    get:
      summary: Show A Time Off Request
      operationId: showTimeOffRequest
      tags: [Time Off]
      responses:
        '200':
          description: Request.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }
    patch:
      summary: Update A Time Off Request
      operationId: updateTimeOffRequest
      tags: [Time Off]
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/TimeOffCreateRequest' }
      responses:
        '200':
          description: Updated.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }

  /timeoff/{timeoff_id}/approve:
    parameters:
      - { name: timeoff_id, in: path, required: true, schema: { type: string, format: uuid } }
    post:
      summary: Approve A Time Off Request
      operationId: approveTimeOffRequest
      tags: [Time Off]
      responses:
        '200':
          description: Approved.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }

  /timeoff/{timeoff_id}/decline:
    parameters:
      - { name: timeoff_id, in: path, required: true, schema: { type: string, format: uuid } }
    post:
      summary: Decline A Time Off Request
      operationId: declineTimeOffRequest
      tags: [Time Off]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [reason]
              properties:
                reason: { type: string }
      responses:
        '200':
          description: Declined.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }

  /timeoff/{timeoff_id}/cancel:
    parameters:
      - { name: timeoff_id, in: path, required: true, schema: { type: string, format: uuid } }
    post:
      summary: Cancel A Time Off Request
      operationId: cancelTimeOffRequest
      tags: [Time Off]
      responses:
        '200':
          description: Canceled.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimeOffEnvelope' }

  /leave_policies:
    get:
      summary: List Leave Policies
      operationId: listLeavePolicies
      tags: [Leave Policies]
      parameters:
        - { name: country_code, in: query, schema: { type: string } }
      responses:
        '200':
          description: Leave policies.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/LeavePolicyList' }

  /leave_policies/{leave_policy_id}:
    parameters:
      - { name: leave_policy_id, in: path, required: true, schema: { type: string, format: uuid } }
    get:
      summary: Show A Leave Policy
      operationId: showLeavePolicy
      tags: [Leave Policies]
      responses:
        '200':
          description: Leave policy.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/LeavePolicyEnvelope' }

  /leave_balances:
    get:
      summary: List Leave Balances
      operationId: listLeaveBalances
      tags: [Leave Balances]
      parameters:
        - { name: employment_id, in: query, required: true, schema: { type: string, format: uuid } }
      responses:
        '200':
          description: Leave balances for the employment.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      leave_balances:
                        type: array
                        items:
                          type: object
                          properties:
                            leave_type: { type: string }
                            remaining_days: { type: number }
                            used_days: { type: number }
                            accrued_days: { type: number }
                            unit:
                              type: string
                              enum: [days, hours]

  /timesheets:
    get:
      summary: List Timesheets
      operationId: listTimesheets
      tags: [Timesheets]
      parameters:
        - { name: employment_id, in: query, schema: { type: string, format: uuid } }
        - { name: status, in: query, schema: { type: string, enum: [draft, submitted, approved, sent_back] } }
        - { name: period_start, in: query, schema: { type: string, format: date } }
      responses:
        '200':
          description: Timesheets.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimesheetList' }

  /timesheets/{timesheet_id}:
    parameters:
      - { name: timesheet_id, in: path, required: true, schema: { type: string, format: uuid } }
    get:
      summary: Show A Timesheet
      operationId: showTimesheet
      tags: [Timesheets]
      responses:
        '200':
          description: Timesheet.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimesheetEnvelope' }

  /timesheets/{timesheet_id}/approve:
    parameters:
      - { name: timesheet_id, in: path, required: true, schema: { type: string, format: uuid } }
    post:
      summary: Approve A Timesheet
      operationId: approveTimesheet
      tags: [Timesheets]
      responses:
        '200':
          description: Approved.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimesheetEnvelope' }

  /timesheets/{timesheet_id}/send_back:
    parameters:
      - { name: timesheet_id, in: path, required: true, schema: { type: string, format: uuid } }
    post:
      summary: Send A Timesheet Back For Revision
      operationId: sendTimesheetBack
      tags: [Timesheets]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [reason]
              properties:
                reason: { type: string }
      responses:
        '200':
          description: Sent back.
          content:
            application/json:
              schema: { $ref: '#/components/schemas/TimesheetEnvelope' }

components:
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

  schemas:
    TimeOffStatus:
      type: string
      enum: [requested, approved, declined, cancellation_requested, canceled, started, taken]

    TimeOff:
      type: object
      properties:
        id: { type: string, format: uuid }
        employment_id: { type: string, format: uuid }
        leave_type: { type: string }
        leave_policy_id: { type: string, format: uuid }
        status: { $ref: '#/components/schemas/TimeOffStatus' }
        start_date: { type: string, format: date }
        end_date: { type: string, format: date }
        total_days: { type: number }
        note: { type: string }
        created_at: { type: string, format: date-time }

    TimeOffList:
      type: object
      properties:
        data:
          type: object
          properties:
            timeoff:
              type: array
              items: { $ref: '#/components/schemas/TimeOff' }

    TimeOffEnvelope:
      type: object
      properties:
        data:
          type: object
          properties:
            timeoff: { $ref: '#/components/schemas/TimeOff' }

    TimeOffCreateRequest:
      type: object
      required: [employment_id, leave_type, start_date, end_date]
      properties:
        employment_id: { type: string, format: uuid }
        leave_type: { type: string }
        leave_policy_id: { type: string, format: uuid }
        start_date: { type: string, format: date }
        end_date: { type: string, format: date }
        note: { type: string }

    LeavePolicy:
      type: object
      properties:
        id: { type: string, format: uuid }
        country_code: { type: string }
        leave_type: { type: string }
        accrual_method:
          type: string
          enum: [annual, monthly, per_period, statutory]
        annual_allowance: { type: number }
        unit:
          type: string
          enum: [days, hours]

    LeavePolicyList:
      type: object
      properties:
        data:
          type: object
          properties:
            leave_policies:
              type: array
              items: { $ref: '#/components/schemas/LeavePolicy' }

    LeavePolicyEnvelope:
      type: object
      properties:
        data:
          type: object
          properties:
            leave_policy: { $ref: '#/components/schemas/LeavePolicy' }

    Timesheet:
      type: object
      properties:
        id: { type: string, format: uuid }
        employment_id: { type: string, format: uuid }
        period_start: { type: string, format: date }
        period_end: { type: string, format: date }
        status:
          type: string
          enum: [draft, submitted, approved, sent_back]
        total_hours: { type: number }
        entries:
          type: array
          items:
            type: object
            properties:
              date: { type: string, format: date }
              hours: { type: number }
              notes: { type: string }

    TimesheetList:
      type: object
      properties:
        data:
          type: object
          properties:
            timesheets:
              type: array
              items: { $ref: '#/components/schemas/Timesheet' }

    TimesheetEnvelope:
      type: object
      properties:
        data:
          type: object
          properties:
            timesheet: { $ref: '#/components/schemas/Timesheet' }