Just Eat API endpoint
Returns Just Eat's full restaurant listing for a UK postcode -- every restaurant the site's own area page carries, ordered as Just Eat's default "best match" sort presents them (or by sort_by, if set), not a curated subset. Each restaurant carries its unique_name (the value the restaurant and menu endpoints take), name, image, rating, delivery time window, and open-now status. A postcode with no coverage returns an empty list rather than an error.
/justeat/searchUnlike a curated home feed, this is the site's full area listing -- confirmed live at 2,000+ restaurants for a central-London postcode -- ordered exactly as Just Eat's own default "best match" sort presents them. limit only trims the response; total_count always reports the full upstream listing size.
Query parameters:
postcode (required) — UK postcode to search near, e.g. SW1A 1AA.limit (optional, default 20, max 100) — restaurants to return.filter (optional, repeatable) — one of Just Eat's own area-page filter slugs, passed through as-is and OR'd together when repeated (e.g. filter=pizza&filter=chinese returns restaurants matching either cuisine, not both). Covers rating thresholds (one_star through five_star), boolean toggles (open_now, new, free_delivery, halal, vegan, ...), cuisine tiles (pizza, chinese, italian, ...), and, critically, Just Eat's own non-restaurant categories, reachable through this exact same parameter: groceries, alcohol, pharmacy, electronics, health-and-beauty, flowers, gifts, and more. There is no separate endpoint for these — filter=groceries on /justeat/search returns real grocery/convenience stores using the identical restaurant-card shape, and their unique_name works directly with /justeat/restaurant//justeat/restaurant/menu (see that endpoint's shop-type-store fallback). The valid slug set is specific to the postcode you are searching — Just Eat's own frontend never advertises a filter with zero local coverage there, so a rural postcode offers materially fewer slugs than central London. Call /justeat/search/filters with the same postcode for the current, complete, location-scoped list with live result counts, rather than relying on a fixed list here. An unrecognized slug is not rejected, it narrows to a smaller or empty result rather than erroring.sort_by (optional, default best_match) — result order, matching the area page's own Sort by control. Allowed values: best_match, review_rating, distance, delivery_time, minimum_order_value, delivery_fee. An unrecognized value returns a 400, unlike filter's pass-through behavior — this is a small, closed set read directly from the upstream's own sort control. filter and sort_by combine cleanly in one request.Response includes restaurants[] and total_count. Each restaurant has restaurant_id, name, unique_name (the value /justeat/restaurant and /justeat/restaurant/menu take), image_url, city, postal_code, is_open_now, and, when the upstream card includes it, rating, rating_count, delivery_eta_min_minutes, and delivery_eta_max_minutes.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| restaurant_id | 20 | |
| name | 20 | “Magic Wok” and 19 other values |
| unique_name | 20 | “magic-wok-new-finsbury-ec1v” and 19 other values |
| image_url | 20 | d30v2pzvrfyzpo.cloudfront.net |
| city | 20 | London in all 20 |
| postal_code | 20 | |
| rating | 19 | 4 to 5, median 5 |
| rating_count | 19 | 3 to 2,875, median 88 |
| delivery_eta_min_minutes | 20 | 10 to 45, median 15 |
| delivery_eta_max_minutes | 20 | 20 to 60, median 30 |
| is_open_now | 20 | true in 20 of 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| postcode | string | Yes | UK postcode to search near | SW1A 1AA | |
| limit | integer | No | Restaurants to return, clamped to 100 (default 20) | 20 | |
| filter | array<string> | No | Repeatable. Just Eat's own area-page filter slugs (e.g. open_now, or a cuisine tile's slug), passed through as-is and OR'd together. Also reaches non-restaurant categories -- groceries, alcohol, pharmacy, electronics, and more -- via the same mechanism, e.g. filter=groceries. The valid slug set is specific to the postcode you are searching -- call /justeat/search/filters with the same postcode for the current, complete, location-scoped list with live result counts. An unrecognized slug narrows to a smaller or empty result rather than erroring. Repeat this query parameter for multiple values. | pizza | |
| sort_by | string | No | Result order, matching the area page's own Sort by control. Default best_match. Allowed values: best_match, review_rating, distance, delivery_time, minimum_order_value, delivery_fee. | distance | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/justeat/search?postcode=SW1A+1AA&limit=10&sort_by=best_match" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurants": [
{
"restaurant_id": "120913",
"name": "McDonald's® - Victoria",
"unique_name": "mcdonalds-victorialondon",
"image_url": "https://d30v2pzvrfyzpo.cloudfront.net/uk/images/restaurants/120913.gif",
"city": "London",
"postal_code": "SW1E 5NA",
"rating": 4.5,
"rating_count": 4647,
"delivery_eta_min_minutes": 10,
"delivery_eta_max_minutes": 25,
"is_open_now": true
}
],
"total_count": 2173
}
}Request schema
No body schema
Response schema
#/definitions/justeat.searchResponseDoc
| 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 | justeat.SearchResponse | No | ||||
| data.restaurants | array | No | ||||
| data.restaurants[].city | string | No | ||||
| data.restaurants[].delivery_eta_max_minutes | integer | No | ||||
| data.restaurants[].delivery_eta_min_minutes | integer | No | ||||
| data.restaurants[].image_url | string | No | ||||
| data.restaurants[].is_open_now | boolean | No | ||||
| data.restaurants[].name | string | No | ||||
| data.restaurants[].postal_code | string | No | ||||
| data.restaurants[].rating | number | No | ||||
| data.restaurants[].rating_count | integer | No | ||||
| data.restaurants[].restaurant_id | string | No | ||||
| data.restaurants[].unique_name | string | No | ||||
| data.total_count | integer | No | ||||
| 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 |
| 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/justeat/search?postcode=SW1A+1AA&limit=10&sort_by=best_match" \
-H "x-api-key: $CRAWLORA_API_KEY"