Grubhub API endpoint
Returns every future delivery or pickup time slot Grubhub will accept an order for, up to 7 days ahead. This is what powers the site's own "schedule my order" picker: `/grubhub/availability` tells you whether a restaurant is orderable right now plus one "next" time, while this returns the full future slot calendar a caller would need to build an actual date-and-time picker. Slots are grouped by date and given as full timestamps carrying the restaurant's real UTC offset for that instant, so a caller never has to resolve daylight-saving transitions themselves. Requesting `location_mode=DELIVERY` returns delivery slots only; `PICKUP` returns pickup slots only -- the upstream only computes one side per call.
/grubhub/timepickerThis is the future-looking complement to /api/v1/grubhub/availability: that endpoint tells you whether a restaurant is orderable right now, plus a single "next orderable" timestamp per channel, but nothing about the shape of availability further out. This endpoint returns the full calendar a caller would need to actually build a date-and-time picker of their own.
Slots are grouped by date, and each slot is a full timestamp carrying the restaurant's real UTC offset for that instant — Grubhub's own response is a local wall-clock grid (hour plus quarter-hour), so this endpoint resolves daylight-saving transitions using the restaurant's IANA time zone rather than leaving that to the caller.
A restaurant with no orderable slots at all for the requested mode (closed for that channel entirely, or genuinely booked solid through the window) returns an empty days array rather than an error — that is a legitimate answer, not a failure.
Query parameters:
restaurant_id (required) — Grubhub restaurant id, from /api/v1/grubhub/search or /api/v1/grubhub/restaurant.latitude / longitude (required) — diner location.location_mode (required) — DELIVERY or PICKUP.days (optional, default 7, max 7) — how many days ahead to fetch.Response includes restaurant_id, location_mode, earliest_order_send_time, time_zone, days[], source_url, and fetched_at. Each entry in days[] has date and times[], the latter a list of RFC3339 timestamps.
| Field | Filled in, of 8 checked | Values in the sample |
|---|---|---|
| date | 8 | 2026-10-13 to 2026-10-20 |
| times | 8 | median 53 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| restaurant_id | string | Yes | Grubhub restaurant id | 698307 | |
| latitude | number | Yes | Diner location latitude | 40.7128 | |
| longitude | number | Yes | Diner location longitude | -74.006 | |
| location_mode | string | Yes | Which slot grid to return Allowed values: DELIVERY, PICKUP. | DELIVERY | |
| days | integer | No | How many days ahead to fetch, 1-7 (default 7) | 7 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/grubhub/timepicker?restaurant_id=698307&latitude=40.7128&longitude=-74.006&location_mode=DELIVERY" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurant_id": "698307",
"location_mode": "DELIVERY",
"earliest_order_send_time": "2026-09-01T08:34:16.969Z",
"time_zone": "America/New_York",
"days": [
{
"date": "2026-09-01",
"times": [
"2026-09-01T10:45:00-04:00",
"2026-09-01T11:00:00-04:00",
"2026-09-01T11:15:00-04:00"
]
},
{
"date": "2026-09-02",
"times": [
"2026-09-02T00:00:00-04:00",
"2026-09-02T00:15:00-04:00"
]
}
],
"source_url": "https://api-gtm.grubhub.com/restaurants/v4/timepicker/698307?orderType=standard&locationMode=DELIVERY&location=POINT(-74.006%2040.7128)",
"fetched_at": "2026-09-01T08:34:17Z"
}
}Request schema
No body schema
Response schema
#/definitions/grubhub.timepickerResponseDoc
| 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 | grubhub.TimepickerResponse | No | ||||
| data.days | array | No | ||||
| data.days[].date | string | No | 2026-09-01 | |||
| data.days[].times | array | No | Times is every orderable slot on this date, as RFC3339 timestamps carrying the restaurant's real UTC offset for that instant -- Grubhub reports the grid in local wall-clock hours and quarter-hours, so this resolves DST rather than requiring the caller to. | |||
| data.earliest_order_send_time | string | No | EarliestOrderSendTime is the very next moment Grubhub will accept an order for this restaurant, ASAP or scheduled. | |||
| data.fetched_at | string | No | ||||
| data.location_mode | string | No | DELIVERY | |||
| data.restaurant_id | string | No | 698307 | |||
| data.source_url | string | No | ||||
| data.time_zone | string | No | America/New_York | |||
| 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/grubhub/timepicker?restaurant_id=698307&latitude=40.7128&longitude=-74.006&location_mode=DELIVERY" \
-H "x-api-key: $CRAWLORA_API_KEY"