Browse the guides
API Reference
Every V1 endpoint, generated from the frozen OpenAPI document.
Base URL https://api.shopcommander.com/v1. Every operation needs Authorization: Bearer sc_live_…. Generated from openapi.json (version 1.0.0-rc.6); response shapes are described on the resource pages and pinned by the contract tests.
- appointments
- canned-jobs
- customers
- events
- inventory-items
- invoices
- jobs
- payments
- repair-orders
- shop
- tasks
- technicians
- vehicles
- webhook-endpoints
appointments
GET /v1/appointments
List Appointments
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
scheduled_date_from | string (date) | null | |
scheduled_date_to | string (date) | null | |
status | "requested" | "booked" | "arrived" | "fulfilled" | "cancelled" | "no_show" | null | |
customer | string | null | |
vehicle | string | null | |
technician | string | null | |
updated_after | string (date-time) | null | |
sort | string matching ^(created_at|updated_at)$ | null |
200 response · AppointmentList
| Field | Type | Notes |
|---|---|---|
data required | array of Appointment | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/appointments
Create Appointment
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
customer_id required | string | |
date required | string (date) | |
duration_minutes | integer; minimum 15, maximum 600, default 60 | |
notes | string; 0–5000 characters | null | |
reason | string; 0–255 characters | null | |
technician_id | string | null | |
time required | string matching ^(?:[01]\d|2[0-3]):[0-5]\d$ | |
utc_offset | string matching ^(?:[+-](?:0\d|1[0-3]):[0-5]\d|[+-]14:00)$ | null | |
vehicle_id | string | null |
201 response · Appointment
| Field | Type | Notes |
|---|---|---|
arrived_at required | string (date-time) | null | |
available_actions required | array of string; known values "cancel", "check_in" (other strings may appear) | |
cancelled_at required | string (date-time) | null | |
confirmed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
date required | string (date) | |
duration_minutes required | integer | |
id required | string | |
notes required | string | null | |
object required | "appointment" | |
reason required | string | null | |
repair_order_id required | string | null | |
starts_at required | string (date-time) | null | |
status required | string; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear) | |
status_reason required | string | null | |
technician_id required | string | null | |
time required | string matching ^\d{2}:\d{2}$ | |
timezone required | string | |
updated_at required | string (date-time) | |
vehicle_id required | string | null | |
version required | integer |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/appointments/availability
Availability
Query parameters
| Name | Type | Notes |
|---|---|---|
date | string (date) | null | |
start_date | string (date) | null | |
end_date | string (date) | null |
200 response · AvailabilityList
| Field | Type | Notes |
|---|---|---|
data required | array of Availability | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/appointments/{public_id}
Get Appointment
200 response · Appointment
| Field | Type | Notes |
|---|---|---|
arrived_at required | string (date-time) | null | |
available_actions required | array of string; known values "cancel", "check_in" (other strings may appear) | |
cancelled_at required | string (date-time) | null | |
confirmed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
date required | string (date) | |
duration_minutes required | integer | |
id required | string | |
notes required | string | null | |
object required | "appointment" | |
reason required | string | null | |
repair_order_id required | string | null | |
starts_at required | string (date-time) | null | |
status required | string; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear) | |
status_reason required | string | null | |
technician_id required | string | null | |
time required | string matching ^\d{2}:\d{2}$ | |
timezone required | string | |
updated_at required | string (date-time) | |
vehicle_id required | string | null | |
version required | integer |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PATCH /v1/appointments/{public_id}
Update Appointment
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
date | string (date) | |
duration_minutes | integer; minimum 15, maximum 600 | |
expected_version | integer; minimum 1 | null | |
notes | string; 0–5000 characters | null | |
reason | string; 0–255 characters | null | |
technician_id | string | null | |
time | string matching ^(?:[01]\d|2[0-3]):[0-5]\d$ | |
utc_offset | string matching ^(?:[+-](?:0\d|1[0-3]):[0-5]\d|[+-]14:00)$ | null |
200 response · Appointment
| Field | Type | Notes |
|---|---|---|
arrived_at required | string (date-time) | null | |
available_actions required | array of string; known values "cancel", "check_in" (other strings may appear) | |
cancelled_at required | string (date-time) | null | |
confirmed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
date required | string (date) | |
duration_minutes required | integer | |
id required | string | |
notes required | string | null | |
object required | "appointment" | |
reason required | string | null | |
repair_order_id required | string | null | |
starts_at required | string (date-time) | null | |
status required | string; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear) | |
status_reason required | string | null | |
technician_id required | string | null | |
time required | string matching ^\d{2}:\d{2}$ | |
timezone required | string | |
updated_at required | string (date-time) | |
vehicle_id required | string | null | |
version required | integer |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/appointments/{public_id}/cancel
Cancel Appointment
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body (optional)
| Field | Type | Notes |
|---|---|---|
reason | string; 0–255 characters | null |
200 response · Appointment
| Field | Type | Notes |
|---|---|---|
arrived_at required | string (date-time) | null | |
available_actions required | array of string; known values "cancel", "check_in" (other strings may appear) | |
cancelled_at required | string (date-time) | null | |
confirmed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
date required | string (date) | |
duration_minutes required | integer | |
id required | string | |
notes required | string | null | |
object required | "appointment" | |
reason required | string | null | |
repair_order_id required | string | null | |
starts_at required | string (date-time) | null | |
status required | string; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear) | |
status_reason required | string | null | |
technician_id required | string | null | |
time required | string matching ^\d{2}:\d{2}$ | |
timezone required | string | |
updated_at required | string (date-time) | |
vehicle_id required | string | null | |
version required | integer |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/appointments/{public_id}/check-in
Check In Appointment
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · Appointment
| Field | Type | Notes |
|---|---|---|
arrived_at required | string (date-time) | null | |
available_actions required | array of string; known values "cancel", "check_in" (other strings may appear) | |
cancelled_at required | string (date-time) | null | |
confirmed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
date required | string (date) | |
duration_minutes required | integer | |
id required | string | |
notes required | string | null | |
object required | "appointment" | |
reason required | string | null | |
repair_order_id required | string | null | |
starts_at required | string (date-time) | null | |
status required | string; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear) | |
status_reason required | string | null | |
technician_id required | string | null | |
time required | string matching ^\d{2}:\d{2}$ | |
timezone required | string | |
updated_at required | string (date-time) | |
vehicle_id required | string | null | |
version required | integer |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/appointments/{public_id}/repair-order
Convert To Repair Order
Conditionally visible response fields: pricing.read: /jobs/*/pricing, /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body (optional)
| Field | Type | Notes |
|---|---|---|
odometer_in | integer; minimum 0 | null |
200 response · RepairOrder
| Field | Type | Notes |
|---|---|---|
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_concern required | string | null | |
customer_id required | string | |
external_id required | string | null | |
id required | string | |
invoiced_at required | string (date-time) | null | |
is_comeback required | boolean | |
jobs | array of Job | null | |
number required | string | |
number_value required | integer | |
object required | "repair_order" | |
odometer_in required | integer | null | |
odometer_out required | integer | null | |
origin_appointment_id required | string | null | |
picked_up_at required | string (date-time) | null | |
pricing required | ROPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
promised_at required | string (date-time) | null | |
redacted_fields required | array of string | |
state required | string; known values "scheduled", "checked_in", "estimating", "awaiting_authorization", "authorized", "in_progress", "waiting_for_parts", "quality_check", "completed", "ready_for_pickup", "invoiced", "paid", "picked_up", "closed", "cancelled", "unknown" (other strings may appear) | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
vehicle_id required | string | |
version required | integer |
Responses: 200 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
canned-jobs
GET /v1/canned-jobs
List Canned Jobs
Conditionally visible response fields: inventory.cost.read: /data/*/parts/*/cost; pricing.read: /data/*/parts/*/pricing, /data/*/pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
q | string; 2–100 characters | null | |
category | string; 0–100 characters | null | |
active | boolean | null |
200 response · CannedJobList
| Field | Type | Notes |
|---|---|---|
data required | array of CannedJob | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/canned-jobs/{public_id}
Get Canned Job
Conditionally visible response fields: inventory.cost.read: /parts/*/cost; pricing.read: /parts/*/pricing, /pricing. These are not operation requirements.
200 response · CannedJob
| Field | Type | Notes |
|---|---|---|
active required | boolean | |
category required | string | null | |
created_at required | string (date-time) | |
default_hours required | string | null | |
description required | string | null | |
id required | string | |
name required | string | |
object required | "canned_job" | |
parts required | array of CannedPart | |
pricing required | object | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
customers
GET /v1/customers
List Customers
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
q | string; 2–100 characters | null | |
email | string; 0–255 characters | null | |
phone | string; 0–25 characters | null | |
external_id | string; 1–255 characters | null | |
updated_after | string (date-time) | null | |
lifecycle | string matching ^(active|archived|all)$; default "active" | |
sort | string matching ^(created_at|updated_at)$ | null |
200 response · CustomerList
| Field | Type | Notes |
|---|---|---|
data required | array of Customer | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/customers
Create Customer
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
address | string; 0–255 characters | null | |
city | string; 0–100 characters | null | |
company_name | string; 0–255 characters | null | |
email | string; 0–255 characters | null | |
first_name required | string; 1–100 characters | |
fleet_account | boolean; default false | |
last_name required | string; 1–100 characters | |
notes | string; 0–5000 characters | null | |
phone | string; 0–20 characters | null | |
phone_alt | string; 0–20 characters | null | |
postal_code | string; 0–20 characters | null | |
preferred_contact | string matching ^(sms|email|phone)$ | null | |
region | string; 0–50 characters | null | |
tags | array of string | null | |
tax_exempt | boolean; default false |
201 response · Customer
| Field | Type | Notes |
|---|---|---|
address required | Address | |
archived required | boolean | |
company_name required | string | null | |
consent required | Consent | |
created_at required | string (date-time) | |
email required | string | null | |
external_id required | string | null | |
first_name required | string | |
fleet_account required | boolean | |
id required | string | |
last_name required | string | |
merged_into required | string | null | |
notes required | string | null | |
object required | "customer" | |
phone required | string | null | |
phone_alt required | string | null | |
preferred_contact required | string; known values "sms", "email", "phone" (other strings may appear) | null | |
tags required | array of string | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
version required | integer |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/customers/{public_id}
Get Customer
200 response · Customer
| Field | Type | Notes |
|---|---|---|
address required | Address | |
archived required | boolean | |
company_name required | string | null | |
consent required | Consent | |
created_at required | string (date-time) | |
email required | string | null | |
external_id required | string | null | |
first_name required | string | |
fleet_account required | boolean | |
id required | string | |
last_name required | string | |
merged_into required | string | null | |
notes required | string | null | |
object required | "customer" | |
phone required | string | null | |
phone_alt required | string | null | |
preferred_contact required | string; known values "sms", "email", "phone" (other strings may appear) | null | |
tags required | array of string | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
version required | integer |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PATCH /v1/customers/{public_id}
Update Customer
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
address | string; 0–255 characters | null | |
city | string; 0–100 characters | null | |
company_name | string; 0–255 characters | null | |
email | string; 0–255 characters | null | |
expected_version | integer; minimum 1 | null | |
first_name | string; 1–100 characters | |
fleet_account | boolean | |
last_name | string; 1–100 characters | |
notes | string; 0–5000 characters | null | |
phone | string; 0–20 characters | null | |
phone_alt | string; 0–20 characters | null | |
postal_code | string; 0–20 characters | null | |
preferred_contact | string matching ^(sms|email|phone)$ | null | |
region | string; 0–50 characters | null | |
tags | array of string | |
tax_exempt | boolean |
200 response · Customer
| Field | Type | Notes |
|---|---|---|
address required | Address | |
archived required | boolean | |
company_name required | string | null | |
consent required | Consent | |
created_at required | string (date-time) | |
email required | string | null | |
external_id required | string | null | |
first_name required | string | |
fleet_account required | boolean | |
id required | string | |
last_name required | string | |
merged_into required | string | null | |
notes required | string | null | |
object required | "customer" | |
phone required | string | null | |
phone_alt required | string | null | |
preferred_contact required | string; known values "sms", "email", "phone" (other strings may appear) | null | |
tags required | array of string | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
version required | integer |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/customers/{public_id}/archive
Archive Customer
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body (optional)
| Field | Type | Notes |
|---|---|---|
reason | string; 0–500 characters | null |
200 response · Customer
| Field | Type | Notes |
|---|---|---|
address required | Address | |
archived required | boolean | |
company_name required | string | null | |
consent required | Consent | |
created_at required | string (date-time) | |
email required | string | null | |
external_id required | string | null | |
first_name required | string | |
fleet_account required | boolean | |
id required | string | |
last_name required | string | |
merged_into required | string | null | |
notes required | string | null | |
object required | "customer" | |
phone required | string | null | |
phone_alt required | string | null | |
preferred_contact required | string; known values "sms", "email", "phone" (other strings may appear) | null | |
tags required | array of string | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
version required | integer |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
DELETE /v1/customers/{public_id}/external-id
Delete Customer External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PUT /v1/customers/{public_id}/external-id
Put Customer External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
external_id required | string; 1–255 characters |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
events
GET /v1/events
List Events
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
type | "appointment.converted_to_repair_order" | "appointment.created" | "appointment.status_changed" | "appointment.updated" | "credit_note.issued" | "customer.archived" | "customer.created" | "customer.merged" | "customer.updated" | "invoice.posted" | "invoice.voided" | "job.created" | "job.status_changed" | "payment.recorded" | "payment.reversed" | "repair_order.created" | "repair_order.status_changed" | "repair_order.updated" | "task.completed" | "task.created" | "task.updated" | "vehicle.archived" | "vehicle.created" | "vehicle.merged" | "vehicle.updated" | "webhook_endpoint.disabled" | null |
200 response · EventList
| Field | Type | Notes |
|---|---|---|
data required | array of Event | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/events/{public_id}
Get Event
200 response · Event
| Field | Type | Notes |
|---|---|---|
api_version required | "v1" | |
created_at required | string (date-time) | |
data required | EventData | |
id required | string | |
object required | "event" | |
test required | boolean | |
type required | string; known values "customer.created", "customer.updated", "customer.archived", "customer.merged", "vehicle.created", "vehicle.updated", "vehicle.archived", "vehicle.merged", "appointment.created", "appointment.updated", "appointment.status_changed", "appointment.converted_to_repair_order", "repair_order.created", "repair_order.updated", "repair_order.status_changed", "job.created", "job.status_changed", "invoice.posted", "invoice.voided", "credit_note.issued", "payment.recorded", "payment.reversed", "task.created", "task.updated", "task.completed", "webhook_endpoint.disabled" (other strings may appear) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
inventory-items
GET /v1/inventory-items
List Inventory Items
Conditionally visible response fields: inventory.cost.read: /data/*/cost. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
q | string; 2–100 characters | null | |
part_number | string; 0–100 characters | null | |
product_family | "part" | "tire" | "battery" | "fluid_supply" | null | |
in_stock | boolean | null | |
active | boolean | null | |
tire_size | string; 0–20 characters | null | |
tire_width | integer; minimum 50, maximum 999 | null | |
tire_aspect_ratio | integer; minimum 10, maximum 99 | null | |
tire_rim_diameter | number; minimum 8, maximum 30 | null |
200 response · InventoryItemList
| Field | Type | Notes |
|---|---|---|
data required | array of InventoryItem | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/inventory-items/{public_id}
Get Inventory Item
Conditionally visible response fields: inventory.cost.read: /cost. These are not operation requirements.
200 response · InventoryItem
| Field | Type | Notes |
|---|---|---|
active required | boolean | |
brand required | string | null | |
category required | string | null | |
cost required | Cost | null | Visible with inventory.cost.read; otherwise null and recorded as /cost in redacted_fields. |
created_at required | string (date-time) | |
id required | string | |
location required | string | null | |
name required | string | null | |
object required | "inventory_item" | |
part_number required | string | null | |
pricing required | object | |
product_family required | string; known values "part", "tire", "battery", "fluid_supply" (other strings may appear) | |
quantity_available required | string | |
quantity_on_hand required | string | |
quantity_reserved required | string | |
redacted_fields required | array of string | |
tire | TireAttributes | null | |
uom required | string | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
invoices
GET /v1/invoices
List Invoices
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
status | string matching ^(posted|voided)$ | null | |
doc_type | string matching ^(invoice|credit_note)$ | null | |
customer | string | null | |
repair_order | string | null | |
number | integer; minimum 0 | null | |
business_date_from | string (date) | null | |
business_date_to | string (date) | null |
200 response · InvoiceList
| Field | Type | Notes |
|---|---|---|
data required | array of Invoice | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/invoices/{public_id}
Get Invoice
200 response · Invoice
| Field | Type | Notes |
|---|---|---|
business_date required | string (date) | |
created_at required | string (date-time) | |
credit_note_of required | string | null | |
currency required | string | |
customer_id required | string | |
doc_type required | string; known values "invoice", "credit_note" (other strings may appear) | |
id required | string | |
lines | array of InvoiceLine | null | |
number required | integer | |
object required | "invoice" | |
posted_at required | string (date-time) | |
repair_order_id required | string | |
status required | string; known values "posted", "voided" (other strings may appear) | |
taxes | array of InvoiceTax | null | |
totals required | InvoiceTotals | |
vehicle_id required | string | null | |
voided_at required | string (date-time) | null |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
jobs
GET /v1/jobs/{public_id}
Get Job
Conditionally visible response fields: pricing.read: /pricing. These are not operation requirements.
200 response · Job
| Field | Type | Notes |
|---|---|---|
available_actions required | array of string; known values "start", "complete", "unable_to_complete" (other strings may appear) | |
canned_job_id required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
decision_state required | string; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear) | |
description required | string | null | |
execution_state required | string; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear) | |
id required | string | |
kind required | string; known values "service", "fee", "discount", "no_charge" (other strings may appear) | |
labor_hours required | string | null | |
name required | string | |
object required | "job" | |
pricing required | JobPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string | |
repair_order_id required | string | |
started_at required | string (date-time) | null | |
taxable required | boolean | |
technician_id required | string | null | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/jobs/{public_id}/complete
Complete Job
Conditionally visible response fields: pricing.read: /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · Job
| Field | Type | Notes |
|---|---|---|
available_actions required | array of string; known values "start", "complete", "unable_to_complete" (other strings may appear) | |
canned_job_id required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
decision_state required | string; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear) | |
description required | string | null | |
execution_state required | string; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear) | |
id required | string | |
kind required | string; known values "service", "fee", "discount", "no_charge" (other strings may appear) | |
labor_hours required | string | null | |
name required | string | |
object required | "job" | |
pricing required | JobPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string | |
repair_order_id required | string | |
started_at required | string (date-time) | null | |
taxable required | boolean | |
technician_id required | string | null | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/jobs/{public_id}/labor
List Job Labor
Conditionally visible response fields: pricing.read: /data/*/pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null |
200 response · LaborList
| Field | Type | Notes |
|---|---|---|
data required | array of Labor | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/jobs/{public_id}/parts
List Job Parts
Conditionally visible response fields: inventory.cost.read: /data/*/cost; pricing.read: /data/*/pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null |
200 response · PartList
| Field | Type | Notes |
|---|---|---|
data required | array of Part | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/jobs/{public_id}/start
Start Job
Conditionally visible response fields: pricing.read: /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · Job
| Field | Type | Notes |
|---|---|---|
available_actions required | array of string; known values "start", "complete", "unable_to_complete" (other strings may appear) | |
canned_job_id required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
decision_state required | string; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear) | |
description required | string | null | |
execution_state required | string; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear) | |
id required | string | |
kind required | string; known values "service", "fee", "discount", "no_charge" (other strings may appear) | |
labor_hours required | string | null | |
name required | string | |
object required | "job" | |
pricing required | JobPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string | |
repair_order_id required | string | |
started_at required | string (date-time) | null | |
taxable required | boolean | |
technician_id required | string | null | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/jobs/{public_id}/unable-to-complete
Unable To Complete Job
Conditionally visible response fields: pricing.read: /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · Job
| Field | Type | Notes |
|---|---|---|
available_actions required | array of string; known values "start", "complete", "unable_to_complete" (other strings may appear) | |
canned_job_id required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
decision_state required | string; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear) | |
description required | string | null | |
execution_state required | string; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear) | |
id required | string | |
kind required | string; known values "service", "fee", "discount", "no_charge" (other strings may appear) | |
labor_hours required | string | null | |
name required | string | |
object required | "job" | |
pricing required | JobPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string | |
repair_order_id required | string | |
started_at required | string (date-time) | null | |
taxable required | boolean | |
technician_id required | string | null | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
payments
GET /v1/payments
List Payments
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
settlement_target | string matching ^(invoice|warranty_claim)$ | null | |
repair_order | string | null | |
invoice | string | null | |
business_date_from | string (date) | null | |
business_date_to | string (date) | null |
200 response · PaymentList
| Field | Type | Notes |
|---|---|---|
data required | array of Payment | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/payments/{public_id}
Get Payment
200 response · Payment
| Field | Type | Notes |
|---|---|---|
amount required | Money | |
business_date required | string (date) | |
created_at required | string (date-time) | |
event_type required | string | |
id required | string | |
invoice_id required | string | null | |
object required | "payment" | |
reference required | string | null | |
repair_order_id required | string | null | |
reversal_of required | string | null | |
reversed_at required | string (date-time) | null | |
settlement_target required | string; known values "invoice", "warranty_claim" (other strings may appear) | |
tender required | string | null |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
repair-orders
GET /v1/repair-orders
List Repair Orders
Conditionally visible response fields: pricing.read: /data/*/jobs/*/pricing, /data/*/pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
state | string matching ^(scheduled|checked_in|estimating|awaiting_authorization|authorized|in_progress|waiting_for_parts|quality_check|completed|ready_for_pickup|invoiced|paid|picked_up|closed|cancelled|unknown)$ | null | |
customer | string | null | |
vehicle | string | null | |
number | integer; minimum 0 | null | |
created_after | string (date-time) | null | |
created_before | string (date-time) | null | |
updated_after | string (date-time) | null | |
external_id | string; 1–255 characters | null | |
sort | string matching ^(created_at|updated_at)$ | null |
200 response · RepairOrderList
| Field | Type | Notes |
|---|---|---|
data required | array of RepairOrder | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/repair-orders
Create Repair Order
Conditionally visible response fields: pricing.read: /jobs/*/pricing, /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
customer_concern | string; 0–10000 characters | null | |
customer_id required | string | |
odometer_in | integer; minimum 0 | null | |
vehicle_id required | string |
201 response · RepairOrder
| Field | Type | Notes |
|---|---|---|
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_concern required | string | null | |
customer_id required | string | |
external_id required | string | null | |
id required | string | |
invoiced_at required | string (date-time) | null | |
is_comeback required | boolean | |
jobs | array of Job | null | |
number required | string | |
number_value required | integer | |
object required | "repair_order" | |
odometer_in required | integer | null | |
odometer_out required | integer | null | |
origin_appointment_id required | string | null | |
picked_up_at required | string (date-time) | null | |
pricing required | ROPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
promised_at required | string (date-time) | null | |
redacted_fields required | array of string | |
state required | string; known values "scheduled", "checked_in", "estimating", "awaiting_authorization", "authorized", "in_progress", "waiting_for_parts", "quality_check", "completed", "ready_for_pickup", "invoiced", "paid", "picked_up", "closed", "cancelled", "unknown" (other strings may appear) | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
vehicle_id required | string | |
version required | integer |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/repair-orders/{public_id}
Get Repair Order
Conditionally visible response fields: pricing.read: /jobs/*/pricing, /pricing. These are not operation requirements.
200 response · RepairOrder
| Field | Type | Notes |
|---|---|---|
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_concern required | string | null | |
customer_id required | string | |
external_id required | string | null | |
id required | string | |
invoiced_at required | string (date-time) | null | |
is_comeback required | boolean | |
jobs | array of Job | null | |
number required | string | |
number_value required | integer | |
object required | "repair_order" | |
odometer_in required | integer | null | |
odometer_out required | integer | null | |
origin_appointment_id required | string | null | |
picked_up_at required | string (date-time) | null | |
pricing required | ROPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
promised_at required | string (date-time) | null | |
redacted_fields required | array of string | |
state required | string; known values "scheduled", "checked_in", "estimating", "awaiting_authorization", "authorized", "in_progress", "waiting_for_parts", "quality_check", "completed", "ready_for_pickup", "invoiced", "paid", "picked_up", "closed", "cancelled", "unknown" (other strings may appear) | |
tax_exempt required | boolean | |
updated_at required | string (date-time) | |
vehicle_id required | string | |
version required | integer |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
DELETE /v1/repair-orders/{public_id}/external-id
Delete Repair Order External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PUT /v1/repair-orders/{public_id}/external-id
Put Repair Order External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
external_id required | string; 1–255 characters |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/repair-orders/{public_id}/jobs
List Jobs
Conditionally visible response fields: pricing.read: /data/*/pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null |
200 response · JobList
| Field | Type | Notes |
|---|---|---|
data required | array of Job | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/repair-orders/{public_id}/jobs
Add Job
Conditionally visible response fields: pricing.read: /pricing. These are not operation requirements.
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
canned_job_id | string | null | |
description | string; 0–10000 characters | null | |
labor_hours | number; minimum 0, maximum 1000 | string matching ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$ | null | |
name | string; 1–255 characters | null | |
technician_id | string | null |
201 response · Job
| Field | Type | Notes |
|---|---|---|
available_actions required | array of string; known values "start", "complete", "unable_to_complete" (other strings may appear) | |
canned_job_id required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
decision_state required | string; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear) | |
description required | string | null | |
execution_state required | string; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear) | |
id required | string | |
kind required | string; known values "service", "fee", "discount", "no_charge" (other strings may appear) | |
labor_hours required | string | null | |
name required | string | |
object required | "job" | |
pricing required | JobPricing | null | Visible with pricing.read; otherwise null and recorded as /pricing in redacted_fields. |
redacted_fields required | array of string | |
repair_order_id required | string | |
started_at required | string (date-time) | null | |
taxable required | boolean | |
technician_id required | string | null | |
updated_at required | string (date-time) |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
shop
GET /v1/shop
Get Shop
200 response · Shop
| Field | Type | Notes |
|---|---|---|
address required | Address | |
booking_slug required | string | null | |
business_hours required | object | |
capabilities required | object | |
created_at required | string (date-time) | |
currency required | string | |
email required | string | null | |
id required | string | |
legal_name required | string | null | |
locale required | string | null | |
name required | string | |
object required | "shop" | |
phone required | string | null | |
timezone required | string | |
updated_at required | string (date-time) | |
website required | string | null |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
tasks
GET /v1/tasks
List Tasks
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
status | "open" | "in_progress" | "done" | "blocked" | "waiting" | null | |
assignee | string | null | |
external_id | string; 1–255 characters | null | |
updated_after | string (date-time) | null | |
sort | string matching ^(created_at|updated_at)$ | null |
200 response · TaskList
| Field | Type | Notes |
|---|---|---|
data required | array of Task | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/tasks
Create Task
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
assigned_to | string | null | |
category | string; 0–100 characters | null | |
customer_id | string | null | |
description | string; 0–10000 characters | null | |
due_at | string (date-time) | null | |
priority | string matching ^(low|normal|high|urgent)$; default "normal" | |
repair_order_id | string | null | |
title required | string; 1–500 characters |
201 response · Task
| Field | Type | Notes |
|---|---|---|
assigned_to required | string | null | |
category required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
description required | string | null | |
due_at required | string (date-time) | null | |
external_id required | string | null | |
id required | string | |
number required | integer | |
object required | "task" | |
priority required | string; known values "low", "normal", "high", "urgent" (other strings may appear) | |
repair_order_id required | string | null | |
status required | string; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear) | |
tags required | array of string | |
title required | string | |
updated_at required | string (date-time) |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/tasks/{public_id}
Get Task
200 response · Task
| Field | Type | Notes |
|---|---|---|
assigned_to required | string | null | |
category required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
description required | string | null | |
due_at required | string (date-time) | null | |
external_id required | string | null | |
id required | string | |
number required | integer | |
object required | "task" | |
priority required | string; known values "low", "normal", "high", "urgent" (other strings may appear) | |
repair_order_id required | string | null | |
status required | string; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear) | |
tags required | array of string | |
title required | string | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PATCH /v1/tasks/{public_id}
Update Task
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
assigned_to | string | null | |
category | string; 0–100 characters | null | |
description | string; 0–10000 characters | null | |
due_at | string (date-time) | null | |
priority | string matching ^(low|normal|high|urgent)$ | |
status | string matching ^(open|in_progress|blocked|waiting)$ | |
title | string; 1–500 characters |
200 response · Task
| Field | Type | Notes |
|---|---|---|
assigned_to required | string | null | |
category required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
description required | string | null | |
due_at required | string (date-time) | null | |
external_id required | string | null | |
id required | string | |
number required | integer | |
object required | "task" | |
priority required | string; known values "low", "normal", "high", "urgent" (other strings may appear) | |
repair_order_id required | string | null | |
status required | string; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear) | |
tags required | array of string | |
title required | string | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/tasks/{public_id}/complete
Complete Task
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · Task
| Field | Type | Notes |
|---|---|---|
assigned_to required | string | null | |
category required | string | null | |
completed_at required | string (date-time) | null | |
created_at required | string (date-time) | |
customer_id required | string | null | |
description required | string | null | |
due_at required | string (date-time) | null | |
external_id required | string | null | |
id required | string | |
number required | integer | |
object required | "task" | |
priority required | string; known values "low", "normal", "high", "urgent" (other strings may appear) | |
repair_order_id required | string | null | |
status required | string; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear) | |
tags required | array of string | |
title required | string | |
updated_at required | string (date-time) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
DELETE /v1/tasks/{public_id}/external-id
Delete Task External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PUT /v1/tasks/{public_id}/external-id
Put Task External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
external_id required | string; 1–255 characters |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
technicians
GET /v1/technicians
List Technicians
Query parameters
| Name | Type | Notes |
|---|---|---|
active | boolean | null | |
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null |
200 response · TechnicianList
| Field | Type | Notes |
|---|---|---|
data required | array of Technician | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
vehicles
GET /v1/vehicles
List Vehicles
Query parameters
| Name | Type | Notes |
|---|---|---|
limit | integer | null | Page size (default 50; minimum 1; maximum 200). |
cursor | string | null | |
customer | string | null | |
vin | string; 0–17 characters | null | |
plate | string; 0–20 characters | null | |
unit_number | string; 0–50 characters | null | |
q | string; 2–100 characters | null | |
external_id | string; 1–255 characters | null | |
updated_after | string (date-time) | null | |
lifecycle | string matching ^(active|archived|all)$; default "active" | |
sort | string matching ^(created_at|updated_at)$ | null |
200 response · VehicleList
| Field | Type | Notes |
|---|---|---|
data required | array of Vehicle | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/vehicles
Create Vehicle
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
color | string; 0–50 characters | null | |
customer_id required | string | |
license_plate | string; 0–20 characters | null | |
make | string; 0–100 characters | null | |
model | string; 0–100 characters | null | |
notes | string; 0–5000 characters | null | |
odometer | integer; minimum 0 | null | |
plate_region | string; 0–10 characters | null | |
trim | string; 0–100 characters | null | |
unit_number | string; 0–50 characters | null | |
vehicle_type | string; 0–50 characters | null | |
vin | string; 0–17 characters | null | |
year | integer; minimum 1900, maximum 2100 | null |
201 response · Vehicle
| Field | Type | Notes |
|---|---|---|
archived required | boolean | |
color required | string | null | |
created_at required | string (date-time) | |
customer_id required | string | |
drive_type required | string | null | |
engine required | string | null | |
external_id required | string | null | |
fuel_type required | string | null | |
id required | string | |
license_plate required | string | null | |
make required | string | null | |
merged_into required | string | null | |
model required | string | null | |
notes required | string | null | |
object required | "vehicle" | |
odometer required | integer | null | |
plate_region required | string | null | |
submodel required | string | null | |
tire_size_front required | string | null | |
tire_size_rear required | string | null | |
transmission required | string | null | |
trim required | string | null | |
unit_number required | string | null | |
updated_at required | string (date-time) | |
vehicle_type required | string | null | |
version required | integer | |
vin required | string | null | |
year required | integer | null |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/vehicles/{public_id}
Get Vehicle
200 response · Vehicle
| Field | Type | Notes |
|---|---|---|
archived required | boolean | |
color required | string | null | |
created_at required | string (date-time) | |
customer_id required | string | |
drive_type required | string | null | |
engine required | string | null | |
external_id required | string | null | |
fuel_type required | string | null | |
id required | string | |
license_plate required | string | null | |
make required | string | null | |
merged_into required | string | null | |
model required | string | null | |
notes required | string | null | |
object required | "vehicle" | |
odometer required | integer | null | |
plate_region required | string | null | |
submodel required | string | null | |
tire_size_front required | string | null | |
tire_size_rear required | string | null | |
transmission required | string | null | |
trim required | string | null | |
unit_number required | string | null | |
updated_at required | string (date-time) | |
vehicle_type required | string | null | |
version required | integer | |
vin required | string | null | |
year required | integer | null |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PATCH /v1/vehicles/{public_id}
Update Vehicle
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
color | string; 0–50 characters | null | |
expected_version | integer; minimum 1 | null | |
license_plate | string; 0–20 characters | null | |
notes | string; 0–5000 characters | null | |
odometer | integer; minimum 0 | |
plate_region | string; 0–10 characters | null | |
unit_number | string; 0–50 characters | null |
200 response · Vehicle
| Field | Type | Notes |
|---|---|---|
archived required | boolean | |
color required | string | null | |
created_at required | string (date-time) | |
customer_id required | string | |
drive_type required | string | null | |
engine required | string | null | |
external_id required | string | null | |
fuel_type required | string | null | |
id required | string | |
license_plate required | string | null | |
make required | string | null | |
merged_into required | string | null | |
model required | string | null | |
notes required | string | null | |
object required | "vehicle" | |
odometer required | integer | null | |
plate_region required | string | null | |
submodel required | string | null | |
tire_size_front required | string | null | |
tire_size_rear required | string | null | |
transmission required | string | null | |
trim required | string | null | |
unit_number required | string | null | |
updated_at required | string (date-time) | |
vehicle_type required | string | null | |
version required | integer | |
vin required | string | null | |
year required | integer | null |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
DELETE /v1/vehicles/{public_id}/external-id
Delete Vehicle External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PUT /v1/vehicles/{public_id}/external-id
Put Vehicle External Id
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
external_id required | string; 1–255 characters |
200 response · ExternalReference
| Field | Type | Notes |
|---|---|---|
external_id required | string | null | |
object required | "external_reference" | |
object_type required | string; known values "customer", "vehicle", "repair_order", "task" (other strings may appear) |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
webhook-endpoints
GET /v1/webhook-endpoints
List Endpoints
200 response · WebhookEndpointList
| Field | Type | Notes |
|---|---|---|
data required | array of WebhookEndpoint | |
has_more required | boolean | |
next_cursor required | string | null | |
object required | "list" |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/webhook-endpoints
Create Endpoint
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
description | string; 0–255 characters | null | |
event_types required | object; at most 0 items | object; at least 1 items | object; at least 1 items, at most 1 items | Known event types, or '*' alone; an empty list subscribes to none. |
url required | string; 12–2000 characters |
201 response · WebhookEndpointWithSecret
| Field | Type | Notes |
|---|---|---|
api_version required | "v1" | |
created_at required | string (date-time) | |
description required | string | null | |
disabled_reason required | string | null | |
event_types required | array of string | |
id required | string | |
object required | "webhook_endpoint" | |
secret required | string matching ^whsec_[A-Za-z0-9_-]+$ | |
status required | string; known values "active", "disabled" (other strings may appear) | |
updated_at required | string (date-time) | |
url required | string |
Responses: 201 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
GET /v1/webhook-endpoints/{public_id}
Get Endpoint
200 response · WebhookEndpoint
| Field | Type | Notes |
|---|---|---|
api_version required | "v1" | |
created_at required | string (date-time) | |
description required | string | null | |
disabled_reason required | string | null | |
event_types required | array of string | |
id required | string | |
object required | "webhook_endpoint" | |
status required | string; known values "active", "disabled" (other strings may appear) | |
updated_at required | string (date-time) | |
url required | string |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
PATCH /v1/webhook-endpoints/{public_id}
Update Endpoint
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body
| Field | Type | Notes |
|---|---|---|
description | string; 0–255 characters | null | |
event_types | object; at most 0 items | object; at least 1 items | object; at least 1 items, at most 1 items | Known event types, or '*' alone; an empty list subscribes to none. |
status | string matching ^(active|disabled)$ | |
url | string; 12–2000 characters |
200 response · WebhookEndpoint
| Field | Type | Notes |
|---|---|---|
api_version required | "v1" | |
created_at required | string (date-time) | |
description required | string | null | |
disabled_reason required | string | null | |
event_types required | array of string | |
id required | string | |
object required | "webhook_endpoint" | |
status required | string; known values "active", "disabled" (other strings may appear) | |
updated_at required | string (date-time) | |
url required | string |
Responses: 200 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/webhook-endpoints/{public_id}/rotate-secret
Rotate Secret
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
200 response · WebhookEndpointWithSecret
| Field | Type | Notes |
|---|---|---|
api_version required | "v1" | |
created_at required | string (date-time) | |
description required | string | null | |
disabled_reason required | string | null | |
event_types required | array of string | |
id required | string | |
object required | "webhook_endpoint" | |
secret required | string matching ^whsec_[A-Za-z0-9_-]+$ | |
status required | string; known values "active", "disabled" (other strings may appear) | |
updated_at required | string (date-time) | |
url required | string |
Responses: 200 400 401 403 404 409 422 429 500 502 503 504 — errors use the error envelope.
POST /v1/webhook-endpoints/{public_id}/test
Send Test Event
Query parameters
| Name | Type | Notes |
|---|---|---|
Idempotency-Key required | string matching ^[\x21-\x7E]+$; 1–255 characters | A unique 1-255 character visible-ASCII command key. Same key and canonical body replays for 7 days; changed reuse is rejected for 30 days. |
Request body (optional)
| Field | Type | Notes |
|---|---|---|
event_type | "appointment.converted_to_repair_order" | "appointment.created" | "appointment.status_changed" | "appointment.updated" | "credit_note.issued" | "customer.archived" | "customer.created" | "customer.merged" | "customer.updated" | "invoice.posted" | "invoice.voided" | "job.created" | "job.status_changed" | "payment.recorded" | "payment.reversed" | "repair_order.created" | "repair_order.status_changed" | "repair_order.updated" | "task.completed" | "task.created" | "task.updated" | "vehicle.archived" | "vehicle.created" | "vehicle.merged" | "vehicle.updated" | "webhook_endpoint.disabled" |
202 response · QueuedEvent
| Field | Type | Notes |
|---|---|---|
id required | string | |
object required | "event" | |
status required | "queued" | |
test required | true |
Responses: 202 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.