Sonic API endpoint
Returns the bookable order-ahead windows for one Sonic Drive-In restaurant, grouped by service channel and local date. Each window has a UTC start_time and end_time. Also returns the store's timezone, how long each window lasts (slot_duration_minutes), the prep/handoff buffer before the first bookable window (lead_time_minutes), and service_types -- every channel the store supports, which is a superset of the channels that currently have windows. fulfillment selects the request method and accepts exactly `PICKUP` or `DELIVERY`; note the per-window service_type is a separate, finer vocabulary and can be `ORDER_AHEAD`, `CURBSIDE_PICKUP`, `DRIVE_THROUGH`, `STORE`, `PICKUP` or `DELIVERY`. A closed or fully-booked restaurant returns an empty channels array with total_slots 0, not an error. An unknown store_id returns 404.
/sonic/availabilityQuery parameters:
store_id (required) — a Sonic store number, e.g. 4521. Store numbers come from /sonic/nearby's store_id.fulfillment (optional) — the fulfillment method to request. One of PICKUP or DELIVERY. Defaults to PICKUP.An unknown store_id returns 404. An invalid fulfillment returns 400.
A closed or fully-booked restaurant is a success, not an error: channels is [] and total_slots is 0. service_types is still populated in that case, since it describes what the store supports rather than what is currently bookable.
Response includes store_id, fulfillment, timezone, slot_duration_minutes, lead_time_minutes, service_types[], channels[], total_slots, source_url, and fetched_at.
lead_time_minutes is the store's prep/handoff buffer before the first bookable window. Upstream names this differently per method (a pickup buffer versus a delivery buffer); both are surfaced under this one field.
Each entry in channels[] has a service_type and days[]; each day has a date, a count, and slots[] of start_time/end_time. Channels are sorted by service_type and days by date, so the same upstream payload always serializes identically.
service_type is a finer vocabulary than the fulfillment request parameter and is one of ORDER_AHEAD, CURBSIDE_PICKUP, DRIVE_THROUGH, STORE, PICKUP, or DELIVERY. A single PICKUP request commonly returns several channels, because a store offers the same window through more than one of them.
| Field | In the sample | Value in the sample |
|---|---|---|
| store_id | Has a value | |
| fulfillment | Has a value | “PICKUP” |
| timezone | Has a value | “America/Denver” |
| slot_duration_minutes | Has a value | 5 |
| lead_time_minutes | Has a value | 5 |
| service_types | Has a value | 4 entries |
| channels | Has a value | 3 entries |
| total_slots | Has a value | 360 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| store_id | string | Yes | Sonic store number, e.g. from /sonic/nearby | 4521 | |
| fulfillment | string | No | PICKUP | Fulfillment method: PICKUP or DELIVERY. Defaults to PICKUP. Allowed values: PICKUP, DELIVERY. | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sonic/availability?store_id=4521&fulfillment=PICKUP" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_id": "4521",
"fulfillment": "PICKUP",
"timezone": "America/Denver",
"slot_duration_minutes": 5,
"lead_time_minutes": 5,
"service_types": [
"ORDER_AHEAD",
"CURBSIDE_PICKUP",
"DELIVERY",
"DRIVE_THROUGH"
],
"channels": [
{
"service_type": "CURBSIDE_PICKUP",
"days": [
{
"date": "2026-09-05",
"count": 2,
"slots": [
{
"start_time": "2026-09-05T16:45:00Z",
"end_time": "2026-09-05T16:50:00Z"
},
{
"start_time": "2026-09-05T16:50:00Z",
"end_time": "2026-09-05T16:55:00Z"
}
]
}
]
}
],
"total_slots": 2,
"source_url": "https://api-idp.sonicdrivein.com/snc/digital-exp-api/v2/locations/4521/fulfillment/PICKUP/slots",
"fetched_at": "2026-09-05T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/sonic.availabilityResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | sonic.AvailabilityResponse | No | ||||
| data.channels | array | No | ||||
| data.channels[].days | array | No | ||||
| data.channels[].days[].count | integer | No | 96 | |||
| data.channels[].days[].date | string | No | 2026-09-05 | |||
| data.channels[].days[].slots | array | No | ||||
| data.channels[].days[].slots[].end_time | string | No | 2026-09-05T16:50:00Z | |||
| data.channels[].days[].slots[].start_time | string | No | 2026-09-05T16:45:00Z | |||
| data.channels[].service_type | string | No | ORDER_AHEAD | ServiceType is Sonic's own channel name, e.g. "ORDER_AHEAD", "CURBSIDE_PICKUP", "DRIVE_THROUGH", "DELIVERY". | ||
| data.fetched_at | string | No | ||||
| data.fulfillment | string | No | PICKUP | |||
| data.lead_time_minutes | integer | No | 5 | LeadTimeMinutes is the store's prep/handoff buffer before the first bookable slot -- the upstream reports it as pickupBuffer on a PICKUP query and deliveryBuffer on a DELIVERY one; both are surfaced here under one name. | ||
| data.service_types | array | No | ServiceTypes is every channel the store supports, which is a superset of the channels that have slots in this response. | |||
| data.slot_duration_minutes | integer | No | 5 | SlotDurationMinutes is how long each window lasts. | ||
| data.source_url | string | No | ||||
| data.store_id | string | No | 4521 | |||
| data.timezone | string | No | America/Denver | |||
| data.total_slots | integer | No | 288 | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/sonic/availability?store_id=4521&fulfillment=PICKUP" \
-H "x-api-key: $CRAWLORA_API_KEY"