Culvers API endpoint
Returns one Culver's restaurant's address, phone, coordinates, open/closed status, fulfillment hours, handoff options, online-order link, and today's flavor(s) of the day. slug comes from GET /culvers/directory.
/culvers/storeQuery parameters:
slug (required) — restaurant slug from /culvers/directory, e.g. ann-arbor-mi-lohr-rd.An unknown slug returns 404.
Response includes restaurant_id, restaurant_number, name, slug, phone_number, address, latitude, longitude, is_open_now, is_temporarily_closed, handoff_options[] (e.g. Pickup, Curbside), hours, channel_status, next_open_time, time_zone_offset, hours_overrides[], temporal_closures[], upcoming_events[], flavors_of_the_day[], online_order_url, source_url, and fetched_at.
hours breaks the published week down per fulfillment channel: dine_in, drive_thru, curbside, delivery, and late_night_drive_thru (each a list of {day_of_week, opens, closes, closed}, omitted when the restaurant does not publish that channel's hours). Dine-in and drive-thru are always present; delivery almost always is; late-night drive-thru appears only where a restaurant runs one.
channel_status is live availability, independent of the published hours above — a restaurant can be open now with its dining room closed. It carries dining_room_closed, lobby_closed, drive_thru_closed, and curbside_unavailable.
next_open_time is when the restaurant next opens; read it against time_zone_offset (the restaurant's UTC offset in hours).
hours_overrides[] lists one-off changes to a single date's hours, e.g. a holiday early close: business_date (YYYY-MM-DD), all_day_closure, opens/closes (24-hour local times, absent on an all-day closure), channels (the fulfillment scope, e.g. ALL), reason, and a customer-facing message.
temporal_closures[] lists bounded closure windows: starts_at/ends_at (local ISO-8601), fully_open, temporarily_closed, a nested channel_status, reason, and message.
upcoming_events[] lists community events the restaurant hosts: title, description, start_date/end_date (YYYY-MM-DD) and start_time/end_time as display strings (e.g. 5:00 PM). The times are given as published rather than folded into a timestamp, because the upstream date string uses a 12-hour clock.
Both hours_overrides[] and temporal_closures[] are usually empty and omitted.
flavors_of_the_day[] lists the featured Fresh Frozen Custard flavor(s) for the current or a nearby date, each with name, slug, description, date (YYYY-MM-DD), and image_url.
| Field | Filled in, of 7 checked | Values in the sample |
|---|---|---|
| day_of_week | 7 | “Sunday” and 6 other values |
| closed | 7 | true in 0 of 7 |
| opens | 7 | 10:00 AM in all 7 |
| closes | 7 | 10:00 PM in all 7 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| slug | string | Yes | Restaurant slug from /culvers/directory | ann-arbor-mi-lohr-rd | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/culvers/store?slug=ann-arbor-mi-lohr-rd" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurant_id": "974",
"restaurant_number": "1001",
"name": "Culver's of Ann Arbor, MI - Lohr Rd",
"slug": "ann-arbor-mi-lohr-rd",
"phone_number": "(734) 821-0060",
"address": {
"line1": "3015 Lohr Rd",
"city": "Ann Arbor",
"state": "MI",
"postal_code": "48108",
"country": "US"
},
"latitude": 42.242039,
"longitude": -83.764565,
"is_open_now": true,
"is_temporarily_closed": false,
"handoff_options": [
"Pickup",
"Curbside"
],
"hours": {
"dine_in": [
{
"day_of_week": "MONDAY",
"opens": "10:00",
"closes": "22:00"
}
]
},
"flavors_of_the_day": [
{
"name": "Mint Cookie",
"slug": "mint-cookie",
"date": "2026-09-04"
}
],
"online_order_url": "https://order.culvers.com/menu/ann-arbor-mi-lohr-rd",
"source_url": "https://www.culvers.com/restaurants/ann-arbor-mi-lohr-rd",
"fetched_at": "2026-09-04T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/culvers.storeResponseDoc
| 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 | culvers.StoreResponse | No | ||||
| data.address | culvers.StoreAddress | No | ||||
| data.address.city | string | No | Ann Arbor | |||
| data.address.country | string | No | US | |||
| data.address.line1 | string | No | 3015 Lohr Rd | |||
| data.address.postal_code | string | No | 48108 | |||
| data.address.state | string | No | MI | |||
| data.channel_status | object | No | ChannelStatus is live availability per fulfillment channel, separate from the published Hours above. | |||
| data.channel_status.curbside_unavailable | boolean | No | ||||
| data.channel_status.dining_room_closed | boolean | No | ||||
| data.channel_status.drive_thru_closed | boolean | No | ||||
| data.channel_status.lobby_closed | boolean | No | ||||
| data.fetched_at | string | No | ||||
| data.flavors_of_the_day | array | No | ||||
| data.flavors_of_the_day[].date | string | No | 2026-09-03 | Date is the calendar date (YYYY-MM-DD) this flavor is/was featured. | ||
| data.flavors_of_the_day[].description | string | No | ||||
| data.flavors_of_the_day[].image_url | string | No | ||||
| data.flavors_of_the_day[].name | string | No | Mint Cookie | |||
| data.flavors_of_the_day[].slug | string | No | mint-cookie | |||
| data.handoff_options | array | No | HandoffOptions are the fulfillment channels Culver's lists for this restaurant, e.g. "Pickup", "Curbside". | |||
| data.hours | culvers.StoreServiceHours | No | ||||
| data.hours.curbside | array | No | ||||
| data.hours.curbside[].closed | boolean | No | false | Closed is true when Culver's publishes the day with no open interval for this channel. | ||
| data.hours.curbside[].closes | string | No | 10:00 PM | |||
| data.hours.curbside[].day_of_week | string | No | Monday | |||
| data.hours.curbside[].opens | string | No | 10:00 AM | |||
| data.hours.delivery | array | No | ||||
| data.hours.delivery[].closed | boolean | No | false | Closed is true when Culver's publishes the day with no open interval for this channel. | ||
| data.hours.delivery[].closes | string | No | 10:00 PM | |||
| data.hours.delivery[].day_of_week | string | No | Monday | |||
| data.hours.delivery[].opens | string | No | 10:00 AM | |||
| data.hours.dine_in | array | No | ||||
| data.hours.dine_in[].closed | boolean | No | false | Closed is true when Culver's publishes the day with no open interval for this channel. | ||
| data.hours.dine_in[].closes | string | No | 10:00 PM | |||
| data.hours.dine_in[].day_of_week | string | No | Monday | |||
| data.hours.dine_in[].opens | string | No | 10:00 AM | |||
| data.hours.drive_thru | array | No | ||||
| data.hours.drive_thru[].closed | boolean | No | false | Closed is true when Culver's publishes the day with no open interval for this channel. | ||
| data.hours.drive_thru[].closes | string | No | 10:00 PM | |||
| data.hours.drive_thru[].day_of_week | string | No | Monday | |||
| data.hours.drive_thru[].opens | string | No | 10:00 AM | |||
| data.hours.late_night_drive_thru | array | No | ||||
| data.hours.late_night_drive_thru[].closed | boolean | No | false | Closed is true when Culver's publishes the day with no open interval for this channel. | ||
| data.hours.late_night_drive_thru[].closes | string | No | 10:00 PM | |||
| data.hours.late_night_drive_thru[].day_of_week | string | No | Monday | |||
| data.hours.late_night_drive_thru[].opens | string | No | 10:00 AM | |||
| data.hours_overrides | array | No | HoursOverrides are one-off changes to a specific date's hours (holiday early closes and the like); TemporalClosures are bounded closure windows. Both are usually empty. | |||
| data.hours_overrides[].all_day_closure | boolean | No | AllDayClosure is true when the restaurant is shut for the whole date rather than merely keeping different hours. | |||
| data.hours_overrides[].business_date | string | No | 2026-09-07 | BusinessDate is the affected date (YYYY-MM-DD). | ||
| data.hours_overrides[].channels | string | No | ALL | Channels is the fulfillment scope this override applies to, e.g. "ALL". | ||
| data.hours_overrides[].closes | string | No | 15:00:00 | |||
| data.hours_overrides[].message | string | No | Message is the customer-facing note Culver's shows for this override. | |||
| data.hours_overrides[].opens | string | No | 10:00:00 | Opens and Closes are 24-hour local times, empty on an all-day closure. | ||
| data.hours_overrides[].reason | string | No | Closed for a Holiday | |||
| data.is_open_now | boolean | No | ||||
| data.is_temporarily_closed | boolean | No | ||||
| data.latitude | number | No | 42.242039 | |||
| data.longitude | number | No | -83.764565 | |||
| data.name | string | No | Culver's of Ann Arbor, MI - Lohr Rd | |||
| data.next_open_time | string | No | 2026-09-06T10:00:00Z | NextOpenTime is when the restaurant next opens, as Culver's publishes it. TimeZoneOffset is the restaurant's UTC offset in hours, which is what NextOpenTime should be read against. | ||
| data.online_order_url | string | No | ||||
| data.phone_number | string | No | (734) 821-0060 | |||
| data.restaurant_id | string | No | 974 | |||
| data.restaurant_number | string | No | 1001 | |||
| data.slug | string | No | ann-arbor-mi-lohr-rd | |||
| data.source_url | string | No | ||||
| data.temporal_closures | array | No | ||||
| data.temporal_closures[].channel_status | culvers.StoreChannelStatus | No | ||||
| data.temporal_closures[].channel_status.curbside_unavailable | boolean | No | ||||
| data.temporal_closures[].channel_status.dining_room_closed | boolean | No | ||||
| data.temporal_closures[].channel_status.drive_thru_closed | boolean | No | ||||
| data.temporal_closures[].channel_status.lobby_closed | boolean | No | ||||
| data.temporal_closures[].ends_at | string | No | 2026-09-07T15:00:00 | |||
| data.temporal_closures[].fully_open | boolean | No | FullyOpen is Culver's own summary flag for the window. | |||
| data.temporal_closures[].message | string | No | Message is the customer-facing note Culver's shows for this closure. | |||
| data.temporal_closures[].reason | string | No | Closed for a Holiday | |||
| data.temporal_closures[].starts_at | string | No | 2026-09-07T10:00:00 | StartsAt and EndsAt are local ISO-8601 datetimes. | ||
| data.temporal_closures[].temporarily_closed | boolean | No | ||||
| data.time_zone_offset | integer | No | -5 | |||
| data.upcoming_events | array | No | UpcomingEvents are community events the restaurant is hosting. | |||
| data.upcoming_events[].description | string | No | ||||
| data.upcoming_events[].end_date | string | No | 2026-09-21 | |||
| data.upcoming_events[].end_time | string | No | 8:00 PM | |||
| data.upcoming_events[].start_date | string | No | 2026-09-21 | StartDate and EndDate are YYYY-MM-DD. | ||
| data.upcoming_events[].start_time | string | No | 5:00 PM | |||
| data.upcoming_events[].title | string | No | Lakeview Elementary PTO | |||
| 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/culvers/store?slug=ann-arbor-mi-lohr-rd" \
-H "x-api-key: $CRAWLORA_API_KEY"