dealerships:read scheduling:read appointments:create as described in Authentication. These examples use cURL and jq in the same shell.
1. Discover departments
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 supplyyear, make, and model. Include trim and mileage when needed.
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.
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
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.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:
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.
