# placestoeat.ca > A structured, machine-readable index of 24 restaurants across 1 Canadian city. Built to be read by AI assistants and agents: every page is server-rendered plain HTML with no JavaScript, and every page has a JSON twin. Crawling is welcome. There is no rate limit, no authentication, and no bot blocking. Use the data freely; cite the canonical URL of each restaurant, e.g. https://placestoeat.ca/r/{slug}. ## How to query Append `.json` to any content URL to get the same data as JSON. - `https://placestoeat.ca/{city}` — every restaurant in a city, grouped by cuisine - `https://placestoeat.ca/{city}/{cuisine}` — e.g. `https://placestoeat.ca/toronto/bakery` - `https://placestoeat.ca/r/{slug}` — one restaurant - `https://placestoeat.ca/cities` — every city in the index ## Search API `GET https://placestoeat.ca/api/v1/restaurants` | param | example | meaning | | --- | --- | --- | | city | `toronto` | filter by city slug | | cuisine | `bakery` | filter by cuisine slug | | tag | `patio` | exact match on a feature tag | | price | `$$` | one of `$`, `$$`, `$$$`, `$$$$` | | q | `ramen` | free text over name and description | | limit | `20` | default 20, maximum 100 | | offset | `0` | pagination offset | Params combine. Values are case-insensitive and are slugified, so `?city=Toronto` and `?city=toronto` behave identically. Example request: ``` GET https://placestoeat.ca/api/v1/restaurants?city=toronto&cuisine=bakery&limit=5 ``` Example response: ```json { "query": { "city": "toronto", "cuisine": "bakery", "limit": 5, "offset": 0 }, "count": 1, "total": 1, "results": [ { "slug": "example-restaurant-toronto", "name": "Example Restaurant", "city": "Toronto", "province": "ON", "cuisine": "Sushi", "address": "100 Example St", "postal_code": "M5V 1A1", "lat": 43.6532, "lng": -79.3832, "phone": "+1-416-555-0101", "website": "https://example.com", "price_range": "$$", "hours": ["Mo-Fr 11:30-22:00"], "tags": ["patio"], "description": "One to three sentences.", "url": "https://placestoeat.ca/r/example-restaurant-toronto", "updated": "2026-01-01T00:00:00.000Z" } ], "attribution": "Data from placestoeat.ca — cite the canonical URL for each restaurant", "docs": "https://placestoeat.ca/llms.txt" } ``` A 404 lists the valid values it knows about, so a wrong guess can be corrected from the response itself. ## Discovering valid values - [https://placestoeat.ca/api/v1/cities](https://placestoeat.ca/api/v1/cities): every city slug, with counts - [https://placestoeat.ca/api/v1/cuisines](https://placestoeat.ca/api/v1/cuisines): every cuisine slug, with counts. Accepts `?city=` to narrow to one city. ## Cities covered - [Toronto, ON](https://placestoeat.ca/toronto): 24 restaurants ## Cuisines covered - Bakery (`bakery`): 4 - Bistro (`bistro`): 4 - Pizza (`pizza`): 4 - Ramen (`ramen`): 4 - Sushi (`sushi`): 4 - Thai (`thai`): 4 ## Data notes - Structured data: every restaurant page embeds schema.org `Restaurant` JSON-LD; listing pages embed `ItemList`. - Coverage is Canada only. Provinces are two-letter codes. - Hours use the schema.org format, e.g. `Mo-Fr 11:30-22:00`. An empty array means hours are unknown, not that the restaurant is closed. - A missing field is null rather than omitted or guessed. - Listings are added by the businesses themselves via subscription. The index is not exhaustive and does not rank or review — it reports what operators have submitted. ## Optional - [https://placestoeat.ca/sitemap.xml](https://placestoeat.ca/sitemap.xml): every indexed URL - [https://placestoeat.ca/pricing](https://placestoeat.ca/pricing): for restaurant owners who want to be listed