Shop Commander · Developers

Requests & Responses

Typed ids, decimal-string money, UTC instants, wall-clock appointment times, and the object/list envelopes.

Objects

Every resource has id and object. Ids are typed and opaque: a prefix names the resource type, so a vehicle id in a customer slot is rejected as invalid_id before any lookup.

Prefix Resource Prefix Resource
shop_ shop inv_ invoice / credit note
cus_ customer pay_ payment
veh_ vehicle item_ inventory item
appt_ appointment cj_ canned job
ro_ repair order tech_ technician
job_ job (line item) task_ task
part_ / lab_ part / labor entry whe_ / evt_ webhook endpoint / event

Ids are stable for the life of the record. Never parse them.

Money

Amounts are decimal strings"129.99", never floats — with the currency named alongside ("currency": "CAD"). The shop's currency comes from GET /v1/shop; every monetary object repeats it. Do the maths in decimal types.

Dates and times

Requests

Response envelopes

A single resource is returned bare. Lists use:

{ "object": "list", "data": [ … ], "has_more": true, "next_cursor": "eyJ…" }

Errors use one shape everywhere — see Errors.

Headers on every response

Header Meaning
X-Request-Id req_… — quote it when contacting support; the shop can trace it in its activity log
RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset Current budget — see Rate limits
Cache-Control: no-store Responses are never cacheable

Sensitive fields

Fields the integration's scopes do not cover are redacted, not omitted: a customer read without customers.read is not possible at all; RO/job/part/labor/canned-job sale pricing needs pricing.read; and acquisition cost needs inventory.cost.read. A denied field is null and its JSON pointer appears in redacted_fields. Treat that null as "not visible to you", not zero.

Consistency rules you can rely on