Read and write your shop's customers, vehicles, repair orders, estimates, inspections, invoices, payments, parts and inventory — and get signed webhooks when anything changes. JSON over HTTPS, OpenAPI 3.
Base URL https://api.autosyncshopmanager.com/api/v1 · Version 3.1.1 · Updated Oct 24, 2026
Sign in to your shop → Settings → API & webhooks. Pick scopes; the secret is shown once.
Open API settings →curl https://api.autosyncshopmanager.com/api/v1/me \ -H "Authorization: Bearer as_xxxxxxxx_…"
Register a webhook endpoint and verify the X-AutoSync-Signature header on every delivery.
Base URL: https://api.autosyncshopmanager.com/api/v1. Every request is scoped to the organization that owns the credential — records of other organizations always return 404.
API keys — create one under Settings → API & webhooks in AutoSync with only the scopes you need:
curl https://api.autosyncshopmanager.com/api/v1/customers?per_page=10 \ -H "Authorization: Bearer as_xxxxxxxx_…"
OAuth 2.0 client credentials — exchange an OAuth client's ID and secret for a 1-hour access token:
curl -X POST https://api.autosyncshopmanager.com/oauth/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=client_credentials -d "scope=customers:read repair_orders:read"
# → {"access_token":"oat_…","token_type":"Bearer","expires_in":3600,"scope":"customers:read repair_orders:read"}
{"data": [...], "meta": {"page", "per_page", "total", "pages", "has_more"}}. Paginate with ?page= and ?per_page= (max 100); sync incrementally with ?updated_since=2026-01-31T00:00:00Z; search with ?q=.{"data": {...}}. Create returns 201. Updates use PATCH (or PUT) and change only the fields you send.customer.created) and are audited with actor “API”.| Status | Meaning |
|---|---|
| 401 | Missing, invalid, revoked or expired key/token |
| 402 | The organization's plan does not include API access (or the account is restricted) |
| 403 | The credential lacks the required scope |
| 404 | Not found — including records that belong to another organization |
| 422 | Validation failed — error.errors maps fields to messages |
| 429 | Rate limit (per-minute) or daily plan quota reached |
{"error": {"status": 422, "message": "Email must be a valid email address.", "errors": {"email": "Email must be a valid email address."}}, "request_id": "9f2c…"}
Each API key has a per-minute limit (default 120/min, configurable per key); responses include X-RateLimit-Limit and X-RateLimit-Remaining. Your plan also sets a daily request cap. Exceeding either returns 429.
AutoSync POSTs JSON to your endpoint for subscribed events: ping, customer.created, customer.updated, vehicle.created, appointment.created, appointment.updated, estimate.created, estimate.sent, estimate.viewed, estimate.approved, estimate.declined, repair_order.created, repair_order.updated, repair_order.status_changed, repair_order.closed, inspection.completed, payment.created, invoice.created, inventory.updated.
Each request carries X-AutoSync-Event, X-AutoSync-Delivery and X-AutoSync-Signature: t=<unix>,v1=<hex> where v1 = HMAC-SHA256(secret, t + "." + raw_body). Respond with any 2xx within 10 seconds; failures retry with exponential backoff up to 8 times.
// PHP
[$t, $v1] = [null, null];
foreach (explode(',', $_SERVER['HTTP_X_AUTOSYNC_SIGNATURE'] ?? '') as $part) {
[$k, $v] = array_pad(explode('=', $part, 2), 2, '');
if ($k === 't') $t = $v; elseif ($k === 'v1') $v1 = $v;
}
$body = file_get_contents('php://input');
$ok = $t && abs(time() - (int) $t) < 300
&& hash_equals(hash_hmac('sha256', $t . '.' . $body, getenv('AUTOSYNC_WEBHOOK_SECRET')), (string) $v1);
// Node.js
const [t, v1] = ['t', 'v1'].map(k => (req.headers['x-autosync-signature'] || '').split(',').find(p => p.startsWith(k + '='))?.slice(k.length + 1));
const expected = crypto.createHmac('sha256', process.env.AUTOSYNC_WEBHOOK_SECRET).update(`${t}.${rawBody}`).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1 || ''.padEnd(64)));
curl https://api.autosyncshopmanager.com/api/v1/me \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
Requires scope customers:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchemail string — Exact email matchcurl https://api.autosyncshopmanager.com/api/v1/customers \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
customers:readRequires scope customers:write. Emits the customer.created webhook event.
curl -X POST https://api.autosyncshopmanager.com/api/v1/customers \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name":"Ann","last_name":"Lee","mobile":"3305550100"}'
customers:writeRequires scope customers:read.
curl https://api.autosyncshopmanager.com/api/v1/customers/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
customers:readRequires scope customers:write. Emits the customer.updated webhook event.
curl -X PATCH https://api.autosyncshopmanager.com/api/v1/customers/123 \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name":"Ann","last_name":"Lee","mobile":"3305550100"}'
customers:writeRequires scope vehicles:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchcustomer_id integer — Filter by customervin string — Exact VINcurl https://api.autosyncshopmanager.com/api/v1/vehicles \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
vehicles:readRequires scope vehicles:write. Emits the vehicle.created webhook event.
curl -X POST https://api.autosyncshopmanager.com/api/v1/vehicles \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"customer_id":123,"year":2019,"make":"Ford","model":"F-150","vin":"1FTEW1E53KFA00001"}'
vehicles:writeRequires scope vehicles:read.
curl https://api.autosyncshopmanager.com/api/v1/vehicles/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
vehicles:readRequires scope vehicles:write.
curl -X PATCH https://api.autosyncshopmanager.com/api/v1/vehicles/123 \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"customer_id":123,"year":2019,"make":"Ford","model":"F-150","vin":"1FTEW1E53KFA00001"}'
vehicles:writeRequires scope appointments:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchcustomer_id integer — Filter by customerlocation_id integer — Filter by locationstatus string — Status keyfrom string — Starts at/after (ISO 8601)to string — Starts before (ISO 8601)curl https://api.autosyncshopmanager.com/api/v1/appointments \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
appointments:readRequires scope appointments:write. Emits the appointment.created webhook event.
curl -X POST https://api.autosyncshopmanager.com/api/v1/appointments \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"customer_id":123,"starts_at":"2026-10-01T14:00:00Z","duration_minutes":60,"title":"Oil change"}'
appointments:writeRequires scope appointments:read.
curl https://api.autosyncshopmanager.com/api/v1/appointments/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
appointments:readRequires scope appointments:write. Emits the appointment.updated webhook event.
curl -X PATCH https://api.autosyncshopmanager.com/api/v1/appointments/123 \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"customer_id":123,"starts_at":"2026-10-01T14:00:00Z","duration_minutes":60,"title":"Oil change"}'
appointments:writeRequires scope repair_orders:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchstatus string — Workflow status keystate string — open | closedcustomer_id integer — Filter by customervehicle_id integer — Filter by vehiclelocation_id integer — Filter by locationcurl https://api.autosyncshopmanager.com/api/v1/repair_orders \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
repair_orders:readRequires scope repair_orders:write. Emits the repair_order.created webhook event.
curl -X POST https://api.autosyncshopmanager.com/api/v1/repair_orders \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"customer_id":123,"vehicle_id":456,"customer_concern":"Brake noise","mileage_in":84210}'
repair_orders:writecurl https://api.autosyncshopmanager.com/api/v1/repair_orders/statuses \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
repair_orders:readRequires scope repair_orders:read.
curl https://api.autosyncshopmanager.com/api/v1/repair_orders/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
repair_orders:readRequires scope repair_orders:write. Emits the repair_order.updated webhook event.
curl -X PATCH https://api.autosyncshopmanager.com/api/v1/repair_orders/123 \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status":"in_progress"}'
repair_orders:writeRequires scope estimates:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchrepair_order_id integer — Filter by repair orderstatus string — Estimate statuscurl https://api.autosyncshopmanager.com/api/v1/estimates \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
estimates:readRequires scope estimates:read.
curl https://api.autosyncshopmanager.com/api/v1/estimates/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
estimates:readRequires scope inspections:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchrepair_order_id integer — Filter by repair ordervehicle_id integer — Filter by vehiclestatus string — Statuscurl https://api.autosyncshopmanager.com/api/v1/inspections \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
inspections:readRequires scope inspections:read.
curl https://api.autosyncshopmanager.com/api/v1/inspections/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
inspections:readRequires scope invoices:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchcustomer_id integer — Filter by customerrepair_order_id integer — Filter by repair orderstatus string — Statuscurl https://api.autosyncshopmanager.com/api/v1/invoices \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
invoices:readRequires scope invoices:read.
curl https://api.autosyncshopmanager.com/api/v1/invoices/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
invoices:readRequires scope payments:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchinvoice_id integer — Filter by invoicerepair_order_id integer — Filter by repair ordermethod string — Payment methodcurl https://api.autosyncshopmanager.com/api/v1/payments \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
payments:readRequires scope payments:read.
curl https://api.autosyncshopmanager.com/api/v1/payments/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
payments:readRequires scope parts:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchpart_number string — Exact part numbercurl https://api.autosyncshopmanager.com/api/v1/parts \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
parts:readRequires scope parts:write.
curl -X POST https://api.autosyncshopmanager.com/api/v1/parts \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"part_number":"BP-1234","description":"Front brake pads","retail_cents":8999}'
parts:writeRequires scope parts:read.
curl https://api.autosyncshopmanager.com/api/v1/parts/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
parts:readRequires scope parts:write.
curl -X PATCH https://api.autosyncshopmanager.com/api/v1/parts/123 \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"part_number":"BP-1234","description":"Front brake pads","retail_cents":8999}'
parts:writeRequires scope inventory:read.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchlocation_id integer — Locationpart_id integer — Partlow_stock boolean — Only at/below minimumcurl https://api.autosyncshopmanager.com/api/v1/inventory \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
inventory:readRequires scope webhooks:manage.
page integerper_page integerupdated_since string — ISO 8601; only records changed at/after this timeq string — Free-text searchcurl https://api.autosyncshopmanager.com/api/v1/webhook_endpoints \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
webhooks:manageRequires scope webhooks:manage.
curl -X POST https://api.autosyncshopmanager.com/api/v1/webhook_endpoints \
-H "Authorization: Bearer $AUTOSYNC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/autosync","events":["repair_order.created","payment.created"]}'
webhooks:managecurl -X DELETE https://api.autosyncshopmanager.com/api/v1/webhook_endpoints/123 \ -H "Authorization: Bearer $AUTOSYNC_API_KEY"
webhooks:manage