Skip to main content
Start with the quickstart environment variables. Obtain a token with dealerships:read scheduling:read appointments:create as described in Authentication. These examples use cURL and jq in the same shell.
The API origin in these examples is production. The final request creates a real appointment. Use approved customer data and dealership access, and do not submit the synthetic example customer.

1. Discover departments

The response includes items and a selectionMode: selectable, configured, or not-exposed. Do not assume every scheduler exposes a department picker. When a department is selectable, use an ID from items. Otherwise, omit departmentId and use the configured scheduling context. If the API requires a selection, inspect the error’s code and details.

2. Discover services for the vehicle

Create a shared request context. The customer below is synthetic; replace it with the customer’s approved details. Supply a VIN, or supply year, make, and model. Include trim and mileage when needed.
Set DEPARTMENT_ID to your selected department ID before building CONTEXT, or leave it empty when you omit the selection. Customer identity is required during discovery only when the scheduler needs it; this recipe supplies it consistently. The response includes the resolved vehicle, department, timezone, and service items. Choose a service ID from items. Prices and available durations are estimates, not a guaranteed quote. Check commentsAllowed, commentsRequired, and commentsDefault for your service. Supply service comments at booking if required and no suitable default exists.

3. Discover advisors and transport

Choose a future date in the dealership’s timezone. startDate and endDate are inclusive local dates, with at most seven dates in one discovery request. This example uses one date; startDate defaults to today when omitted.
Use IDs from the returned items, not display names. The advisor choice any represents Any Advisor. Omitting advisorId in availability means any eligible advisor; omitting transportId selects a safe drop-off default.

4. Find an available time

Choose a slot from items. appointmentAt is a UTC instant; appointmentAtLocal includes the dealership-local offset. Preserve the selected instant, the slot’s advisorId, and the response’s transport.id for booking. Do not strip the timezone offset. If no slots are returned, try another valid date or scheduling selection. If you change the vehicle, department, services, advisor, or transport, repeat the relevant discovery before booking.
Availability is an observation, not a hold. A slot can become unavailable before you book it.

5. Submit the booking

Set these values from the availability response. Do not substitute a made-up appointment time.
This payload uses service defaults for comments. If your chosen service requires customer input, add comments to its entry in services before submitting. Omitted or null service comments use the default; an empty string clears optional comments. Appointment-level comments are a separate field. Review the payload and confirm the customer, vehicle, services, and time before executing:
A successful request returns 201 with appointment details. See the booking reference for the full schema. Save the returned id for reading, updating, or canceling. If the selected slot is no longer available, refresh availability and ask the customer to choose again. For a timeout or BOOKING_OUTCOME_UNKNOWN, do not blindly submit again. Follow Errors and safe retries.

Optional: look up a saved customer

POST /public/v1/customers/search accepts a complete phone number, email address, or VIN in search and requires customers:read plus Dealership-Id. It searches authorized Spark records only; it does not query or import scheduler records. Results contain customer IDs and saved vehicle IDs. Booking also accepts customerId and vehicleId; use the booking reference for those fields. This guide uses inline details instead. Do not assume arbitrary combinations of saved IDs and inline details are interchangeable.