> For the complete documentation index, see [llms.txt](https://docs.january.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.january.ai/rest-api/restaurants.md).

# Restaurants

Find restaurants and menu items near a location.

## Search restaurants near a location

> Search restaurants matching \`query\` around (\`latitude\`, \`longitude\`), ranked by proximity. When the name matches no restaurant, results may be menu items (\`type: "menu\_item"\`). \`radius\` and result distances are in meters.

```json
{"openapi":"3.0.0","info":{"title":"January AI - Nutrition Intelligence APIs","version":"1.2"},"tags":[{"name":"restaurants","description":"Find restaurants and menu items near a location."}],"servers":[{"url":"https://partners.january.ai"}],"security":[{"api-key":[]}],"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Your API key (sk-…), minted through the developer portal."}},"schemas":{"RestaurantSearchResponseDto":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of matches; may exceed the number of items returned."},"items":{"type":"array","items":{"$ref":"#/components/schemas/RestaurantResultDto"}}},"required":["total_count","items"]},"RestaurantResultDto":{"type":"object","properties":{"type":{"type":"string","enum":["restaurant","menu_item"],"description":"When coordinates are provided and the name matches no restaurant, results may be menu items instead."},"id":{"type":"string"},"name":{"type":"string"},"is_chain":{"type":"boolean"},"distance":{"type":"number","description":"Distance from (latitude, longitude) in meters; present only when coordinates were provided."},"city":{"type":"string"},"address1":{"type":"string"},"address2":{"type":"string"}},"required":["type","id","name"]},"ApiErrorDto":{"type":"object","properties":{"message":{"type":"string","description":"A developer-facing explanation of what went wrong and how to fix it."},"code":{"type":"string","description":"A stable machine-readable identifier for the class of failure — build retry logic on this, never on message wording. Current values: invalid_request, unauthorized, forbidden, not_found, not_implemented, payload_too_large, rate_limited, internal_error, upstream_error, service_unavailable, upstream_timeout. Only rate_limited, internal_error, upstream_error, service_unavailable, and upstream_timeout are safe to retry (with backoff) — not_implemented is permanent until the feature ships. New codes may be added over time; treat an unknown code according to its HTTP status class."},"docs_url":{"type":"string","description":"Link to the developer documentation."}},"required":["message","code","docs_url"]}}},"paths":{"/v1.2/restaurants":{"get":{"operationId":"searchRestaurants","summary":"Search restaurants near a location","description":"Search restaurants matching `query` around (`latitude`, `longitude`), ranked by proximity. When the name matches no restaurant, results may be menu items (`type: \"menu_item\"`). `radius` and result distances are in meters.","parameters":[{"name":"x-end-user-id","in":"header","description":"Optional: your stable ID for the end user this request acts on behalf of. Opaque to January.","required":false,"schema":{"type":"string"}},{"name":"radius","required":false,"in":"query","description":"Search radius in meters around (latitude, longitude), e.g. 5000 = 5 kilometers. Default 8000 meters (about 5 miles); maximum 17000 (about 10.5 miles).","schema":{"minimum":1,"maximum":17000,"default":8000,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return.","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"query","required":true,"in":"query","description":"Restaurant name to search for.","schema":{"maxLength":256,"type":"string"}},{"name":"latitude","required":true,"in":"query","description":"Latitude of the search location, e.g. 37.7749 (San Francisco).","schema":{"minimum":-90,"maximum":90,"type":"number"}},{"name":"longitude","required":true,"in":"query","description":"Longitude of the search location, e.g. -122.4194 (San Francisco).","schema":{"minimum":-180,"maximum":180,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestaurantSearchResponseDto"}}}},"400":{"description":"A parameter is missing or invalid; the message names the parameter and the accepted values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"The Authorization header is missing or the API key is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"429":{"description":"Either a rate limit was exceeded (`code: rate_limited`) or the monthly credit allowance is spent (`code: credit_limit_exceeded`). When Retry-After is present, wait that many seconds; a per-day allowance resets 24 hours after the first request in its window. Credit exhaustion carries no Retry-After and retrying does not help — the allowance returns at the start of the next calendar month. Call `GET /v1.2/credits` for the balance and reset date.","headers":{"Retry-After":{"description":"Seconds to wait before retrying; present when the window is known.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"default":{"description":"Any other error: the HTTP status plus { message, code, docs_url }. Retry only rate_limited and the transient 5xx codes — never not_implemented.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"tags":["restaurants"]}}}}
```

## Search menu items near a location

> Search dishes across restaurants near (\`latitude\`, \`longitude\`). Returns menu items with their nutrition values. \`radius\` and result distances are in meters, e.g. radius=5000 for 5 kilometers.

```json
{"openapi":"3.0.0","info":{"title":"January AI - Nutrition Intelligence APIs","version":"1.2"},"tags":[{"name":"restaurants","description":"Find restaurants and menu items near a location."}],"servers":[{"url":"https://partners.january.ai"}],"security":[{"api-key":[]}],"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Your API key (sk-…), minted through the developer portal."}},"schemas":{"MenuSearchResponseDto":{"type":"object","properties":{"total_count":{"type":"number","description":"Total number of matches; may exceed the number of items returned."},"items":{"type":"array","items":{"$ref":"#/components/schemas/MenuItemDto"}}},"required":["total_count","items"]},"MenuItemDto":{"type":"object","properties":{"type":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"restaurant_name":{"type":"string"},"is_chain":{"type":"boolean"},"nutrients":{"description":"Per-dish nutrition in the shared nutrient vocabulary. Keys are omitted when the menu source has no value.","allOf":[{"$ref":"#/components/schemas/NutrientsDto"}]},"glycemic_index":{"type":"number","description":"Glycemic index."},"glycemic_load":{"type":"number","description":"Glycemic load."},"image_url":{"type":"string","description":"URL of a picture of the dish, when the source has one."},"distance":{"type":"number","description":"Distance from (latitude, longitude) in meters."},"servings":{"type":"array","items":{"$ref":"#/components/schemas/FoodServingDto"}}},"required":["type","id","name","restaurant_name","servings"]},"NutrientsDto":{"type":"object","properties":{"calories":{"$ref":"#/components/schemas/NutrientAmountDto"},"protein":{"$ref":"#/components/schemas/NutrientAmountDto"},"carbohydrates":{"$ref":"#/components/schemas/NutrientAmountDto"},"net_carbohydrates":{"$ref":"#/components/schemas/NutrientAmountDto"},"total_fat":{"$ref":"#/components/schemas/NutrientAmountDto"},"trans_fat":{"$ref":"#/components/schemas/NutrientAmountDto"},"saturated_fat":{"$ref":"#/components/schemas/NutrientAmountDto"},"fiber":{"$ref":"#/components/schemas/NutrientAmountDto"},"total_sugars":{"$ref":"#/components/schemas/NutrientAmountDto"},"added_sugars":{"$ref":"#/components/schemas/NutrientAmountDto"},"cholesterol":{"$ref":"#/components/schemas/NutrientAmountDto"},"calcium":{"$ref":"#/components/schemas/NutrientAmountDto"},"iron":{"$ref":"#/components/schemas/NutrientAmountDto"},"potassium":{"$ref":"#/components/schemas/NutrientAmountDto"},"sodium":{"$ref":"#/components/schemas/NutrientAmountDto"},"vitamin_d":{"$ref":"#/components/schemas/NutrientAmountDto"}}},"NutrientAmountDto":{"type":"object","properties":{"value":{"type":"number"},"unit":{"type":"string","description":"Canonical across the API: g, mg, kcal, IU."}},"required":["value","unit"]},"FoodServingDto":{"type":"object","properties":{"id":{"type":"number"},"quantity":{"type":"number"},"unit":{"type":"string"},"scaling_factor":{"type":"number","description":"Multiplier applied to the food's nutrition values for this serving."},"weight_grams":{"type":"number","nullable":true},"is_primary":{"type":"boolean","description":"Whether this is the default serving for the food."}},"required":["id","quantity","unit","scaling_factor","weight_grams","is_primary"]},"ApiErrorDto":{"type":"object","properties":{"message":{"type":"string","description":"A developer-facing explanation of what went wrong and how to fix it."},"code":{"type":"string","description":"A stable machine-readable identifier for the class of failure — build retry logic on this, never on message wording. Current values: invalid_request, unauthorized, forbidden, not_found, not_implemented, payload_too_large, rate_limited, internal_error, upstream_error, service_unavailable, upstream_timeout. Only rate_limited, internal_error, upstream_error, service_unavailable, and upstream_timeout are safe to retry (with backoff) — not_implemented is permanent until the feature ships. New codes may be added over time; treat an unknown code according to its HTTP status class."},"docs_url":{"type":"string","description":"Link to the developer documentation."}},"required":["message","code","docs_url"]}}},"paths":{"/v1.2/restaurants/menu-items":{"get":{"operationId":"searchMenuItems","summary":"Search menu items near a location","description":"Search dishes across restaurants near (`latitude`, `longitude`). Returns menu items with their nutrition values. `radius` and result distances are in meters, e.g. radius=5000 for 5 kilometers.","parameters":[{"name":"x-end-user-id","in":"header","description":"Optional: your stable ID for the end user this request acts on behalf of. Opaque to January.","required":false,"schema":{"type":"string"}},{"name":"radius","required":false,"in":"query","description":"Search radius in meters around (latitude, longitude), e.g. 5000 = 5 kilometers. Default 8000 meters (about 5 miles); maximum 17000 (about 10.5 miles).","schema":{"minimum":1,"maximum":17000,"default":8000,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of results to return.","schema":{"minimum":1,"maximum":100,"default":10,"type":"number"}},{"name":"query","required":true,"in":"query","description":"Dish or restaurant name to search for.","schema":{"maxLength":256,"type":"string"}},{"name":"latitude","required":true,"in":"query","description":"Latitude of the search location, e.g. 37.7749 (San Francisco).","schema":{"minimum":-90,"maximum":90,"type":"number"}},{"name":"longitude","required":true,"in":"query","description":"Longitude of the search location, e.g. -122.4194 (San Francisco).","schema":{"minimum":-180,"maximum":180,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MenuSearchResponseDto"}}}},"400":{"description":"A parameter is missing or invalid; the message names the parameter and the accepted values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"401":{"description":"The Authorization header is missing or the API key is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"429":{"description":"Either a rate limit was exceeded (`code: rate_limited`) or the monthly credit allowance is spent (`code: credit_limit_exceeded`). When Retry-After is present, wait that many seconds; a per-day allowance resets 24 hours after the first request in its window. Credit exhaustion carries no Retry-After and retrying does not help — the allowance returns at the start of the next calendar month. Call `GET /v1.2/credits` for the balance and reset date.","headers":{"Retry-After":{"description":"Seconds to wait before retrying; present when the window is known.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}},"default":{"description":"Any other error: the HTTP status plus { message, code, docs_url }. Retry only rate_limited and the transient 5xx codes — never not_implemented.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorDto"}}}}},"tags":["restaurants"]}}}}
```
