Skip to content
Get started

List serviced jobs

GET/serviced-jobs

Returns a paginated list of completed jobs for the authenticated company. By default only completed jobs are returned (only_completed defaults to true). Results are ordered by created_at (newest first).

The service_date is taken from the first visit's start time. total_received and total_outstanding are in dollars.

Note: When service_date_range_start or service_date_range_end are provided, filtering is applied against the first visit's start time. Because this is evaluated after the database query, pagination totals reflect the filtered count.

Query ParametersExpand Collapse
limit: optional number

Number of results per page (max 1000)

minimum1
maximum1000
only_completed: optional boolean

When true (default), only return jobs with status Completed. Set to false to include all non-archived, non-quote jobs.

page: optional number

Page number (1-based)

minimum1
service_date_range_end: optional string

Return jobs whose first visit starts on or before this date (ISO 8601)

formatdate-time
service_date_range_start: optional string

Return jobs whose first visit starts on or after this date (ISO 8601)

formatdate-time
Header ParametersExpand Collapse
"rotor-api-version": "1.1.0"
ReturnsExpand Collapse
data: optional array of object { id, customer, service_date, 4 more }
id: optional string
customer: optional object { id, company_name, first_name, last_name }
id: optional string
company_name: optional string
first_name: optional string
last_name: optional string
service_date: optional string

Start time of the first visit

formatdate-time
service_plan_id: optional string

ID of the associated service plan (job series), if applicable

formatuuid
technicians: optional array of object { email, name, user_id }

Technicians assigned to this job (from assigned_to and crew assignments)

email: optional string
name: optional string
user_id: optional string
total_outstanding: optional number

Remaining balance due (in dollars)

total_received: optional number

Net amount paid (invoices minus refunds, in dollars)

Whether more pages are available

Total number of matching records

status: optional string

List serviced jobs

curl https://api.getrotor.com/open-api/serviced-jobs \
    -H "x-api-key: $ROTOR_API_KEY"
{
  "data": [
    {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer": {
        "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
        "company_name": "company_name",
        "first_name": "first_name",
        "last_name": "last_name"
      },
      "service_date": "2026-06-15T08:00:00Z",
      "service_plan_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "technicians": [
        {
          "email": "dev@stainless.com",
          "name": "John Doe",
          "user_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
        }
      ],
      "total_outstanding": 0,
      "total_received": 150
    }
  ],
  "pagination": {
    "has_more": true,
    "limit": 50,
    "page": 1,
    "total": 142
  },
  "status": "success"
}
{
  "status": "error",
  "message": "Authentication required. Provide x-api-key header.",
  "error_code": "AUTHENTICATION_REQUIRED"
}
{
  "status": "error",
  "message": "Forbidden: required scope 'leads:read' not granted for this API key",
  "error_code": "INSUFFICIENT_SCOPE"
}
{
  "status": "error",
  "message": "Daily API key request limit of 1000 exceeded",
  "error_code": "RATE_LIMIT_EXCEEDED"
}
{
  "status": "error",
  "message": "Internal server error"
}
Returns Examples
{
  "data": [
    {
      "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "customer": {
        "id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
        "company_name": "company_name",
        "first_name": "first_name",
        "last_name": "last_name"
      },
      "service_date": "2026-06-15T08:00:00Z",
      "service_plan_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
      "technicians": [
        {
          "email": "dev@stainless.com",
          "name": "John Doe",
          "user_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e"
        }
      ],
      "total_outstanding": 0,
      "total_received": 150
    }
  ],
  "pagination": {
    "has_more": true,
    "limit": 50,
    "page": 1,
    "total": 142
  },
  "status": "success"
}
{
  "status": "error",
  "message": "Authentication required. Provide x-api-key header.",
  "error_code": "AUTHENTICATION_REQUIRED"
}
{
  "status": "error",
  "message": "Forbidden: required scope 'leads:read' not granted for this API key",
  "error_code": "INSUFFICIENT_SCOPE"
}
{
  "status": "error",
  "message": "Daily API key request limit of 1000 exceeded",
  "error_code": "RATE_LIMIT_EXCEEDED"
}
{
  "status": "error",
  "message": "Internal server error"
}