Home Features Pricing App AI Advisor Docs Compare About Training Contact Log In Get an API key
Developersv1.0.0-rc.6
Browse the guides
Developers/Reference

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

GET /v1/appointments

List Appointments

Query parameters

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
scheduled_date_fromstring (date) | null
scheduled_date_tostring (date) | null
status"requested" | "booked" | "arrived" | "fulfilled" | "cancelled" | "no_show" | null
customerstring | null
vehiclestring | null
technicianstring | null
updated_afterstring (date-time) | null
sortstring matching ^(created_at|updated_at)$ | null

200 response · AppointmentList

FieldTypeNotes
data requiredarray of Appointment
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
customer_id requiredstring
date requiredstring (date)
duration_minutesinteger; minimum 15, maximum 600, default 60
notesstring; 0–5000 characters | null
reasonstring; 0–255 characters | null
technician_idstring | null
time requiredstring matching ^(?:[01]\d|2[0-3]):[0-5]\d$
utc_offsetstring matching ^(?:[+-](?:0\d|1[0-3]):[0-5]\d|[+-]14:00)$ | null
vehicle_idstring | null

201 response · Appointment

FieldTypeNotes
arrived_at requiredstring (date-time) | null
available_actions requiredarray of string; known values "cancel", "check_in" (other strings may appear)
cancelled_at requiredstring (date-time) | null
confirmed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
date requiredstring (date)
duration_minutes requiredinteger
id requiredstring
notes requiredstring | null
object required"appointment"
reason requiredstring | null
repair_order_id requiredstring | null
starts_at requiredstring (date-time) | null
status requiredstring; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear)
status_reason requiredstring | null
technician_id requiredstring | null
time requiredstring matching ^\d{2}:\d{2}$
timezone requiredstring
updated_at requiredstring (date-time)
vehicle_id requiredstring | null
version requiredinteger

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

NameTypeNotes
datestring (date) | null
start_datestring (date) | null
end_datestring (date) | null

200 response · AvailabilityList

FieldTypeNotes
data requiredarray of Availability
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
arrived_at requiredstring (date-time) | null
available_actions requiredarray of string; known values "cancel", "check_in" (other strings may appear)
cancelled_at requiredstring (date-time) | null
confirmed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
date requiredstring (date)
duration_minutes requiredinteger
id requiredstring
notes requiredstring | null
object required"appointment"
reason requiredstring | null
repair_order_id requiredstring | null
starts_at requiredstring (date-time) | null
status requiredstring; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear)
status_reason requiredstring | null
technician_id requiredstring | null
time requiredstring matching ^\d{2}:\d{2}$
timezone requiredstring
updated_at requiredstring (date-time)
vehicle_id requiredstring | null
version requiredinteger

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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
datestring (date)
duration_minutesinteger; minimum 15, maximum 600
expected_versioninteger; minimum 1 | null
notesstring; 0–5000 characters | null
reasonstring; 0–255 characters | null
technician_idstring | null
timestring matching ^(?:[01]\d|2[0-3]):[0-5]\d$
utc_offsetstring matching ^(?:[+-](?:0\d|1[0-3]):[0-5]\d|[+-]14:00)$ | null

200 response · Appointment

FieldTypeNotes
arrived_at requiredstring (date-time) | null
available_actions requiredarray of string; known values "cancel", "check_in" (other strings may appear)
cancelled_at requiredstring (date-time) | null
confirmed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
date requiredstring (date)
duration_minutes requiredinteger
id requiredstring
notes requiredstring | null
object required"appointment"
reason requiredstring | null
repair_order_id requiredstring | null
starts_at requiredstring (date-time) | null
status requiredstring; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear)
status_reason requiredstring | null
technician_id requiredstring | null
time requiredstring matching ^\d{2}:\d{2}$
timezone requiredstring
updated_at requiredstring (date-time)
vehicle_id requiredstring | null
version requiredinteger

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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)

FieldTypeNotes
reasonstring; 0–255 characters | null

200 response · Appointment

FieldTypeNotes
arrived_at requiredstring (date-time) | null
available_actions requiredarray of string; known values "cancel", "check_in" (other strings may appear)
cancelled_at requiredstring (date-time) | null
confirmed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
date requiredstring (date)
duration_minutes requiredinteger
id requiredstring
notes requiredstring | null
object required"appointment"
reason requiredstring | null
repair_order_id requiredstring | null
starts_at requiredstring (date-time) | null
status requiredstring; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear)
status_reason requiredstring | null
technician_id requiredstring | null
time requiredstring matching ^\d{2}:\d{2}$
timezone requiredstring
updated_at requiredstring (date-time)
vehicle_id requiredstring | null
version requiredinteger

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
arrived_at requiredstring (date-time) | null
available_actions requiredarray of string; known values "cancel", "check_in" (other strings may appear)
cancelled_at requiredstring (date-time) | null
confirmed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
date requiredstring (date)
duration_minutes requiredinteger
id requiredstring
notes requiredstring | null
object required"appointment"
reason requiredstring | null
repair_order_id requiredstring | null
starts_at requiredstring (date-time) | null
status requiredstring; known values "requested", "booked", "arrived", "fulfilled", "cancelled", "no_show" (other strings may appear)
status_reason requiredstring | null
technician_id requiredstring | null
time requiredstring matching ^\d{2}:\d{2}$
timezone requiredstring
updated_at requiredstring (date-time)
vehicle_id requiredstring | null
version requiredinteger

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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)

FieldTypeNotes
odometer_ininteger; minimum 0 | null

200 response · RepairOrder

FieldTypeNotes
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_concern requiredstring | null
customer_id requiredstring
external_id requiredstring | null
id requiredstring
invoiced_at requiredstring (date-time) | null
is_comeback requiredboolean
jobsarray of Job | null
number requiredstring
number_value requiredinteger
object required"repair_order"
odometer_in requiredinteger | null
odometer_out requiredinteger | null
origin_appointment_id requiredstring | null
picked_up_at requiredstring (date-time) | null
pricing requiredROPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
promised_at requiredstring (date-time) | null
redacted_fields requiredarray of string
state requiredstring; 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 requiredboolean
updated_at requiredstring (date-time)
vehicle_id requiredstring
version requiredinteger

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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
qstring; 2–100 characters | null
categorystring; 0–100 characters | null
activeboolean | null

200 response · CannedJobList

FieldTypeNotes
data requiredarray of CannedJob
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
active requiredboolean
category requiredstring | null
created_at requiredstring (date-time)
default_hours requiredstring | null
description requiredstring | null
id requiredstring
name requiredstring
object required"canned_job"
parts requiredarray of CannedPart
pricing requiredobject | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
qstring; 2–100 characters | null
emailstring; 0–255 characters | null
phonestring; 0–25 characters | null
external_idstring; 1–255 characters | null
updated_afterstring (date-time) | null
lifecyclestring matching ^(active|archived|all)$; default "active"
sortstring matching ^(created_at|updated_at)$ | null

200 response · CustomerList

FieldTypeNotes
data requiredarray of Customer
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
addressstring; 0–255 characters | null
citystring; 0–100 characters | null
company_namestring; 0–255 characters | null
emailstring; 0–255 characters | null
first_name requiredstring; 1–100 characters
fleet_accountboolean; default false
last_name requiredstring; 1–100 characters
notesstring; 0–5000 characters | null
phonestring; 0–20 characters | null
phone_altstring; 0–20 characters | null
postal_codestring; 0–20 characters | null
preferred_contactstring matching ^(sms|email|phone)$ | null
regionstring; 0–50 characters | null
tagsarray of string | null
tax_exemptboolean; default false

201 response · Customer

FieldTypeNotes
address requiredAddress
archived requiredboolean
company_name requiredstring | null
consent requiredConsent
created_at requiredstring (date-time)
email requiredstring | null
external_id requiredstring | null
first_name requiredstring
fleet_account requiredboolean
id requiredstring
last_name requiredstring
merged_into requiredstring | null
notes requiredstring | null
object required"customer"
phone requiredstring | null
phone_alt requiredstring | null
preferred_contact requiredstring; known values "sms", "email", "phone" (other strings may appear) | null
tags requiredarray of string
tax_exempt requiredboolean
updated_at requiredstring (date-time)
version requiredinteger

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

FieldTypeNotes
address requiredAddress
archived requiredboolean
company_name requiredstring | null
consent requiredConsent
created_at requiredstring (date-time)
email requiredstring | null
external_id requiredstring | null
first_name requiredstring
fleet_account requiredboolean
id requiredstring
last_name requiredstring
merged_into requiredstring | null
notes requiredstring | null
object required"customer"
phone requiredstring | null
phone_alt requiredstring | null
preferred_contact requiredstring; known values "sms", "email", "phone" (other strings may appear) | null
tags requiredarray of string
tax_exempt requiredboolean
updated_at requiredstring (date-time)
version requiredinteger

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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
addressstring; 0–255 characters | null
citystring; 0–100 characters | null
company_namestring; 0–255 characters | null
emailstring; 0–255 characters | null
expected_versioninteger; minimum 1 | null
first_namestring; 1–100 characters
fleet_accountboolean
last_namestring; 1–100 characters
notesstring; 0–5000 characters | null
phonestring; 0–20 characters | null
phone_altstring; 0–20 characters | null
postal_codestring; 0–20 characters | null
preferred_contactstring matching ^(sms|email|phone)$ | null
regionstring; 0–50 characters | null
tagsarray of string
tax_exemptboolean

200 response · Customer

FieldTypeNotes
address requiredAddress
archived requiredboolean
company_name requiredstring | null
consent requiredConsent
created_at requiredstring (date-time)
email requiredstring | null
external_id requiredstring | null
first_name requiredstring
fleet_account requiredboolean
id requiredstring
last_name requiredstring
merged_into requiredstring | null
notes requiredstring | null
object required"customer"
phone requiredstring | null
phone_alt requiredstring | null
preferred_contact requiredstring; known values "sms", "email", "phone" (other strings may appear) | null
tags requiredarray of string
tax_exempt requiredboolean
updated_at requiredstring (date-time)
version requiredinteger

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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)

FieldTypeNotes
reasonstring; 0–500 characters | null

200 response · Customer

FieldTypeNotes
address requiredAddress
archived requiredboolean
company_name requiredstring | null
consent requiredConsent
created_at requiredstring (date-time)
email requiredstring | null
external_id requiredstring | null
first_name requiredstring
fleet_account requiredboolean
id requiredstring
last_name requiredstring
merged_into requiredstring | null
notes requiredstring | null
object required"customer"
phone requiredstring | null
phone_alt requiredstring | null
preferred_contact requiredstring; known values "sms", "email", "phone" (other strings may appear) | null
tags requiredarray of string
tax_exempt requiredboolean
updated_at requiredstring (date-time)
version requiredinteger

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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring; 1–255 characters

200 response · ExternalReference

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | 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

FieldTypeNotes
data requiredarray of Event
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
api_version required"v1"
created_at requiredstring (date-time)
data requiredEventData
id requiredstring
object required"event"
test requiredboolean
type requiredstring; 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
qstring; 2–100 characters | null
part_numberstring; 0–100 characters | null
product_family"part" | "tire" | "battery" | "fluid_supply" | null
in_stockboolean | null
activeboolean | null
tire_sizestring; 0–20 characters | null
tire_widthinteger; minimum 50, maximum 999 | null
tire_aspect_ratiointeger; minimum 10, maximum 99 | null
tire_rim_diameternumber; minimum 8, maximum 30 | null

200 response · InventoryItemList

FieldTypeNotes
data requiredarray of InventoryItem
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
active requiredboolean
brand requiredstring | null
category requiredstring | null
cost requiredCost | nullVisible with inventory.cost.read; otherwise null and recorded as /cost in redacted_fields.
created_at requiredstring (date-time)
id requiredstring
location requiredstring | null
name requiredstring | null
object required"inventory_item"
part_number requiredstring | null
pricing requiredobject
product_family requiredstring; known values "part", "tire", "battery", "fluid_supply" (other strings may appear)
quantity_available requiredstring
quantity_on_hand requiredstring
quantity_reserved requiredstring
redacted_fields requiredarray of string
tireTireAttributes | null
uom requiredstring
updated_at requiredstring (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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
statusstring matching ^(posted|voided)$ | null
doc_typestring matching ^(invoice|credit_note)$ | null
customerstring | null
repair_orderstring | null
numberinteger; minimum 0 | null
business_date_fromstring (date) | null
business_date_tostring (date) | null

200 response · InvoiceList

FieldTypeNotes
data requiredarray of Invoice
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
business_date requiredstring (date)
created_at requiredstring (date-time)
credit_note_of requiredstring | null
currency requiredstring
customer_id requiredstring
doc_type requiredstring; known values "invoice", "credit_note" (other strings may appear)
id requiredstring
linesarray of InvoiceLine | null
number requiredinteger
object required"invoice"
posted_at requiredstring (date-time)
repair_order_id requiredstring
status requiredstring; known values "posted", "voided" (other strings may appear)
taxesarray of InvoiceTax | null
totals requiredInvoiceTotals
vehicle_id requiredstring | null
voided_at requiredstring (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

FieldTypeNotes
available_actions requiredarray of string; known values "start", "complete", "unable_to_complete" (other strings may appear)
canned_job_id requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
decision_state requiredstring; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear)
description requiredstring | null
execution_state requiredstring; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear)
id requiredstring
kind requiredstring; known values "service", "fee", "discount", "no_charge" (other strings may appear)
labor_hours requiredstring | null
name requiredstring
object required"job"
pricing requiredJobPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray of string
repair_order_id requiredstring
started_at requiredstring (date-time) | null
taxable requiredboolean
technician_id requiredstring | null
updated_at requiredstring (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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
available_actions requiredarray of string; known values "start", "complete", "unable_to_complete" (other strings may appear)
canned_job_id requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
decision_state requiredstring; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear)
description requiredstring | null
execution_state requiredstring; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear)
id requiredstring
kind requiredstring; known values "service", "fee", "discount", "no_charge" (other strings may appear)
labor_hours requiredstring | null
name requiredstring
object required"job"
pricing requiredJobPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray of string
repair_order_id requiredstring
started_at requiredstring (date-time) | null
taxable requiredboolean
technician_id requiredstring | null
updated_at requiredstring (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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null

200 response · LaborList

FieldTypeNotes
data requiredarray of Labor
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null

200 response · PartList

FieldTypeNotes
data requiredarray of Part
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
available_actions requiredarray of string; known values "start", "complete", "unable_to_complete" (other strings may appear)
canned_job_id requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
decision_state requiredstring; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear)
description requiredstring | null
execution_state requiredstring; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear)
id requiredstring
kind requiredstring; known values "service", "fee", "discount", "no_charge" (other strings may appear)
labor_hours requiredstring | null
name requiredstring
object required"job"
pricing requiredJobPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray of string
repair_order_id requiredstring
started_at requiredstring (date-time) | null
taxable requiredboolean
technician_id requiredstring | null
updated_at requiredstring (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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
available_actions requiredarray of string; known values "start", "complete", "unable_to_complete" (other strings may appear)
canned_job_id requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
decision_state requiredstring; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear)
description requiredstring | null
execution_state requiredstring; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear)
id requiredstring
kind requiredstring; known values "service", "fee", "discount", "no_charge" (other strings may appear)
labor_hours requiredstring | null
name requiredstring
object required"job"
pricing requiredJobPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray of string
repair_order_id requiredstring
started_at requiredstring (date-time) | null
taxable requiredboolean
technician_id requiredstring | null
updated_at requiredstring (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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
settlement_targetstring matching ^(invoice|warranty_claim)$ | null
repair_orderstring | null
invoicestring | null
business_date_fromstring (date) | null
business_date_tostring (date) | null

200 response · PaymentList

FieldTypeNotes
data requiredarray of Payment
has_more requiredboolean
next_cursor requiredstring | 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

FieldTypeNotes
amount requiredMoney
business_date requiredstring (date)
created_at requiredstring (date-time)
event_type requiredstring
id requiredstring
invoice_id requiredstring | null
object required"payment"
reference requiredstring | null
repair_order_id requiredstring | null
reversal_of requiredstring | null
reversed_at requiredstring (date-time) | null
settlement_target requiredstring; known values "invoice", "warranty_claim" (other strings may appear)
tender requiredstring | 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
statestring 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
customerstring | null
vehiclestring | null
numberinteger; minimum 0 | null
created_afterstring (date-time) | null
created_beforestring (date-time) | null
updated_afterstring (date-time) | null
external_idstring; 1–255 characters | null
sortstring matching ^(created_at|updated_at)$ | null

200 response · RepairOrderList

FieldTypeNotes
data requiredarray of RepairOrder
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
customer_concernstring; 0–10000 characters | null
customer_id requiredstring
odometer_ininteger; minimum 0 | null
vehicle_id requiredstring

201 response · RepairOrder

FieldTypeNotes
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_concern requiredstring | null
customer_id requiredstring
external_id requiredstring | null
id requiredstring
invoiced_at requiredstring (date-time) | null
is_comeback requiredboolean
jobsarray of Job | null
number requiredstring
number_value requiredinteger
object required"repair_order"
odometer_in requiredinteger | null
odometer_out requiredinteger | null
origin_appointment_id requiredstring | null
picked_up_at requiredstring (date-time) | null
pricing requiredROPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
promised_at requiredstring (date-time) | null
redacted_fields requiredarray of string
state requiredstring; 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 requiredboolean
updated_at requiredstring (date-time)
vehicle_id requiredstring
version requiredinteger

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

FieldTypeNotes
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_concern requiredstring | null
customer_id requiredstring
external_id requiredstring | null
id requiredstring
invoiced_at requiredstring (date-time) | null
is_comeback requiredboolean
jobsarray of Job | null
number requiredstring
number_value requiredinteger
object required"repair_order"
odometer_in requiredinteger | null
odometer_out requiredinteger | null
origin_appointment_id requiredstring | null
picked_up_at requiredstring (date-time) | null
pricing requiredROPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
promised_at requiredstring (date-time) | null
redacted_fields requiredarray of string
state requiredstring; 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 requiredboolean
updated_at requiredstring (date-time)
vehicle_id requiredstring
version requiredinteger

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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring; 1–255 characters

200 response · ExternalReference

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null

200 response · JobList

FieldTypeNotes
data requiredarray of Job
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
canned_job_idstring | null
descriptionstring; 0–10000 characters | null
labor_hoursnumber; minimum 0, maximum 1000 | string matching ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$ | null
namestring; 1–255 characters | null
technician_idstring | null

201 response · Job

FieldTypeNotes
available_actions requiredarray of string; known values "start", "complete", "unable_to_complete" (other strings may appear)
canned_job_id requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
decision_state requiredstring; known values "pending", "authorized", "declined", "deferred", "cancelled", "unknown" (other strings may appear)
description requiredstring | null
execution_state requiredstring; known values "not_started", "in_progress", "paused", "completed", "unable_to_complete", "unknown" (other strings may appear)
id requiredstring
kind requiredstring; known values "service", "fee", "discount", "no_charge" (other strings may appear)
labor_hours requiredstring | null
name requiredstring
object required"job"
pricing requiredJobPricing | nullVisible with pricing.read; otherwise null and recorded as /pricing in redacted_fields.
redacted_fields requiredarray of string
repair_order_id requiredstring
started_at requiredstring (date-time) | null
taxable requiredboolean
technician_id requiredstring | null
updated_at requiredstring (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

FieldTypeNotes
address requiredAddress
booking_slug requiredstring | null
business_hours requiredobject
capabilities requiredobject
created_at requiredstring (date-time)
currency requiredstring
email requiredstring | null
id requiredstring
legal_name requiredstring | null
locale requiredstring | null
name requiredstring
object required"shop"
phone requiredstring | null
timezone requiredstring
updated_at requiredstring (date-time)
website requiredstring | 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
status"open" | "in_progress" | "done" | "blocked" | "waiting" | null
assigneestring | null
external_idstring; 1–255 characters | null
updated_afterstring (date-time) | null
sortstring matching ^(created_at|updated_at)$ | null

200 response · TaskList

FieldTypeNotes
data requiredarray of Task
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
assigned_tostring | null
categorystring; 0–100 characters | null
customer_idstring | null
descriptionstring; 0–10000 characters | null
due_atstring (date-time) | null
prioritystring matching ^(low|normal|high|urgent)$; default "normal"
repair_order_idstring | null
title requiredstring; 1–500 characters

201 response · Task

FieldTypeNotes
assigned_to requiredstring | null
category requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
description requiredstring | null
due_at requiredstring (date-time) | null
external_id requiredstring | null
id requiredstring
number requiredinteger
object required"task"
priority requiredstring; known values "low", "normal", "high", "urgent" (other strings may appear)
repair_order_id requiredstring | null
status requiredstring; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear)
tags requiredarray of string
title requiredstring
updated_at requiredstring (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

FieldTypeNotes
assigned_to requiredstring | null
category requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
description requiredstring | null
due_at requiredstring (date-time) | null
external_id requiredstring | null
id requiredstring
number requiredinteger
object required"task"
priority requiredstring; known values "low", "normal", "high", "urgent" (other strings may appear)
repair_order_id requiredstring | null
status requiredstring; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear)
tags requiredarray of string
title requiredstring
updated_at requiredstring (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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
assigned_tostring | null
categorystring; 0–100 characters | null
descriptionstring; 0–10000 characters | null
due_atstring (date-time) | null
prioritystring matching ^(low|normal|high|urgent)$
statusstring matching ^(open|in_progress|blocked|waiting)$
titlestring; 1–500 characters

200 response · Task

FieldTypeNotes
assigned_to requiredstring | null
category requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
description requiredstring | null
due_at requiredstring (date-time) | null
external_id requiredstring | null
id requiredstring
number requiredinteger
object required"task"
priority requiredstring; known values "low", "normal", "high", "urgent" (other strings may appear)
repair_order_id requiredstring | null
status requiredstring; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear)
tags requiredarray of string
title requiredstring
updated_at requiredstring (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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
assigned_to requiredstring | null
category requiredstring | null
completed_at requiredstring (date-time) | null
created_at requiredstring (date-time)
customer_id requiredstring | null
description requiredstring | null
due_at requiredstring (date-time) | null
external_id requiredstring | null
id requiredstring
number requiredinteger
object required"task"
priority requiredstring; known values "low", "normal", "high", "urgent" (other strings may appear)
repair_order_id requiredstring | null
status requiredstring; known values "open", "in_progress", "done", "blocked", "waiting" (other strings may appear)
tags requiredarray of string
title requiredstring
updated_at requiredstring (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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring; 1–255 characters

200 response · ExternalReference

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
activeboolean | null
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null

200 response · TechnicianList

FieldTypeNotes
data requiredarray of Technician
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
limitinteger | nullPage size (default 50; minimum 1; maximum 200).
cursorstring | null
customerstring | null
vinstring; 0–17 characters | null
platestring; 0–20 characters | null
unit_numberstring; 0–50 characters | null
qstring; 2–100 characters | null
external_idstring; 1–255 characters | null
updated_afterstring (date-time) | null
lifecyclestring matching ^(active|archived|all)$; default "active"
sortstring matching ^(created_at|updated_at)$ | null

200 response · VehicleList

FieldTypeNotes
data requiredarray of Vehicle
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
colorstring; 0–50 characters | null
customer_id requiredstring
license_platestring; 0–20 characters | null
makestring; 0–100 characters | null
modelstring; 0–100 characters | null
notesstring; 0–5000 characters | null
odometerinteger; minimum 0 | null
plate_regionstring; 0–10 characters | null
trimstring; 0–100 characters | null
unit_numberstring; 0–50 characters | null
vehicle_typestring; 0–50 characters | null
vinstring; 0–17 characters | null
yearinteger; minimum 1900, maximum 2100 | null

201 response · Vehicle

FieldTypeNotes
archived requiredboolean
color requiredstring | null
created_at requiredstring (date-time)
customer_id requiredstring
drive_type requiredstring | null
engine requiredstring | null
external_id requiredstring | null
fuel_type requiredstring | null
id requiredstring
license_plate requiredstring | null
make requiredstring | null
merged_into requiredstring | null
model requiredstring | null
notes requiredstring | null
object required"vehicle"
odometer requiredinteger | null
plate_region requiredstring | null
submodel requiredstring | null
tire_size_front requiredstring | null
tire_size_rear requiredstring | null
transmission requiredstring | null
trim requiredstring | null
unit_number requiredstring | null
updated_at requiredstring (date-time)
vehicle_type requiredstring | null
version requiredinteger
vin requiredstring | null
year requiredinteger | 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

FieldTypeNotes
archived requiredboolean
color requiredstring | null
created_at requiredstring (date-time)
customer_id requiredstring
drive_type requiredstring | null
engine requiredstring | null
external_id requiredstring | null
fuel_type requiredstring | null
id requiredstring
license_plate requiredstring | null
make requiredstring | null
merged_into requiredstring | null
model requiredstring | null
notes requiredstring | null
object required"vehicle"
odometer requiredinteger | null
plate_region requiredstring | null
submodel requiredstring | null
tire_size_front requiredstring | null
tire_size_rear requiredstring | null
transmission requiredstring | null
trim requiredstring | null
unit_number requiredstring | null
updated_at requiredstring (date-time)
vehicle_type requiredstring | null
version requiredinteger
vin requiredstring | null
year requiredinteger | 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
colorstring; 0–50 characters | null
expected_versioninteger; minimum 1 | null
license_platestring; 0–20 characters | null
notesstring; 0–5000 characters | null
odometerinteger; minimum 0
plate_regionstring; 0–10 characters | null
unit_numberstring; 0–50 characters | null

200 response · Vehicle

FieldTypeNotes
archived requiredboolean
color requiredstring | null
created_at requiredstring (date-time)
customer_id requiredstring
drive_type requiredstring | null
engine requiredstring | null
external_id requiredstring | null
fuel_type requiredstring | null
id requiredstring
license_plate requiredstring | null
make requiredstring | null
merged_into requiredstring | null
model requiredstring | null
notes requiredstring | null
object required"vehicle"
odometer requiredinteger | null
plate_region requiredstring | null
submodel requiredstring | null
tire_size_front requiredstring | null
tire_size_rear requiredstring | null
transmission requiredstring | null
trim requiredstring | null
unit_number requiredstring | null
updated_at requiredstring (date-time)
vehicle_type requiredstring | null
version requiredinteger
vin requiredstring | null
year requiredinteger | 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
external_id requiredstring; 1–255 characters

200 response · ExternalReference

FieldTypeNotes
external_id requiredstring | null
object required"external_reference"
object_type requiredstring; 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

FieldTypeNotes
data requiredarray of WebhookEndpoint
has_more requiredboolean
next_cursor requiredstring | 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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
descriptionstring; 0–255 characters | null
event_types requiredobject; at most 0 items | object; at least 1 items | object; at least 1 items, at most 1 itemsKnown event types, or '*' alone; an empty list subscribes to none.
url requiredstring; 12–2000 characters

201 response · WebhookEndpointWithSecret

FieldTypeNotes
api_version required"v1"
created_at requiredstring (date-time)
description requiredstring | null
disabled_reason requiredstring | null
event_types requiredarray of string
id requiredstring
object required"webhook_endpoint"
secret requiredstring matching ^whsec_[A-Za-z0-9_-]+$
status requiredstring; known values "active", "disabled" (other strings may appear)
updated_at requiredstring (date-time)
url requiredstring

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

FieldTypeNotes
api_version required"v1"
created_at requiredstring (date-time)
description requiredstring | null
disabled_reason requiredstring | null
event_types requiredarray of string
id requiredstring
object required"webhook_endpoint"
status requiredstring; known values "active", "disabled" (other strings may appear)
updated_at requiredstring (date-time)
url requiredstring

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

NameTypeNotes
Idempotency-Keystring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
descriptionstring; 0–255 characters | null
event_typesobject; at most 0 items | object; at least 1 items | object; at least 1 items, at most 1 itemsKnown event types, or '*' alone; an empty list subscribes to none.
statusstring matching ^(active|disabled)$
urlstring; 12–2000 characters

200 response · WebhookEndpoint

FieldTypeNotes
api_version required"v1"
created_at requiredstring (date-time)
description requiredstring | null
disabled_reason requiredstring | null
event_types requiredarray of string
id requiredstring
object required"webhook_endpoint"
status requiredstring; known values "active", "disabled" (other strings may appear)
updated_at requiredstring (date-time)
url requiredstring

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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

FieldTypeNotes
api_version required"v1"
created_at requiredstring (date-time)
description requiredstring | null
disabled_reason requiredstring | null
event_types requiredarray of string
id requiredstring
object required"webhook_endpoint"
secret requiredstring matching ^whsec_[A-Za-z0-9_-]+$
status requiredstring; known values "active", "disabled" (other strings may appear)
updated_at requiredstring (date-time)
url requiredstring

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

NameTypeNotes
Idempotency-Key requiredstring matching ^[\x21-\x7E]+$; 1–255 charactersA 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)

FieldTypeNotes
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

FieldTypeNotes
id requiredstring
object required"event"
status required"queued"
test requiredtrue

Responses: 202 400 401 403 404 409 413 422 429 500 502 503 504 — errors use the error envelope.