{"openapi":"3.1.0","info":{"title":"Dim Sum Near Me public directory API","version":"1.0.0","description":"Anonymous, read-only access. Directory snapshot, not live availability. Dataset generation time is not a verification date. Confirm hours, prices, menus, and dietary needs with the restaurant. Missing values mean unknown. Cite the listing URL. Pages default to 20 items, maximum 50. REST and MCP share a site-wide budget of 600 origin requests per minute; cached responses may be served without reaching the origin."},"servers":[{"url":"https://dimsumnearme.net"}],"security":[],"paths":{"/api/v1/site":{"get":{"operationId":"get_site","description":"Get this directory's identity, coverage counts, and snapshot generation time.","parameters":[],"responses":{"200":{"description":"Site-scoped directory snapshot.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"siteId":{"type":"string"},"datasetGeneratedAt":{"type":"string"},"notice":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string"},"restaurantCount":{"type":"number"},"cityCount":{"type":"number"},"cuisineCount":{"type":"number"}},"required":["id","name","description","url","restaurantCount","cityCount","cuisineCount"],"additionalProperties":false}},"required":["siteId","datasetGeneratedAt","notice","data"],"additionalProperties":false}}},"headers":{"ETag":{"schema":{"type":"string"},"description":"Use If-None-Match for conditional requests."}}},"304":{"description":"Representation has not changed."},"400":{"description":"Invalid or duplicate parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"404":{"description":"Endpoint or restaurant not found on this site.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"414":{"description":"Request URL exceeds 4096 characters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"429":{"description":"Site-wide rate limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/api/v1/restaurants":{"get":{"operationId":"search_restaurants","description":"Search restaurants within this site. Use canonical city and cuisine slugs from the list tools. Results are paginated snapshots, not live availability. Fetch a result's slug for details.","parameters":[{"name":"page","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"pageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}},{"name":"q","in":"query","required":false,"schema":{"description":"Text in restaurant name, city, cuisine, or category.","type":"string","minLength":1,"maxLength":200}},{"name":"city","in":"query","required":false,"schema":{"description":"Exact canonical slug from list_cities.","type":"string","minLength":1,"maxLength":200}},{"name":"cuisine","in":"query","required":false,"schema":{"description":"Exact slug from list_cuisines.","type":"string","minLength":1,"maxLength":200}},{"name":"region","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"minRating","in":"query","required":false,"schema":{"type":"number","minimum":0,"maximum":5}},{"name":"vegan","in":"query","required":false,"schema":{"description":"True requires an explicit vegan label; false applies no filter.","type":"boolean"}},{"name":"glutenFree","in":"query","required":false,"schema":{"description":"True requires an explicit gluten-free label; false applies no filter.","type":"boolean"}},{"name":"wheelchair","in":"query","required":false,"schema":{"description":"True requires wheelchair access marked yes; false applies no filter.","type":"boolean"}},{"name":"sort","in":"query","required":false,"schema":{"default":"name","type":"string","enum":["name","rating","reviews"]}}],"responses":{"200":{"description":"Site-scoped directory snapshot.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"siteId":{"type":"string"},"datasetGeneratedAt":{"type":"string"},"notice":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"cuisine":{"type":["string","null"]},"city":{"type":["string","null"]},"citySlug":{"type":["string","null"]},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"address":{"type":["string","null"]},"rating":{"type":["number","null"]},"reviewCount":{"type":["number","null"]}},"required":["slug","name","url","cuisine","city","citySlug","region","country","address","rating","reviewCount"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false}},"required":["siteId","datasetGeneratedAt","notice","data","pagination"],"additionalProperties":false}}},"headers":{"ETag":{"schema":{"type":"string"},"description":"Use If-None-Match for conditional requests."}}},"304":{"description":"Representation has not changed."},"400":{"description":"Invalid or duplicate parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"404":{"description":"Endpoint or restaurant not found on this site.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"414":{"description":"Request URL exceeds 4096 characters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"429":{"description":"Site-wide rate limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/api/v1/restaurants/{slug}":{"get":{"operationId":"get_restaurant","description":"Get one restaurant from this site with practical details and independently paginated menu, photos and review excerpts. Excerpts are not all reviews. Missing values mean unknown; confirm time-sensitive details with the restaurant.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"menuPage","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"menuPageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}},{"name":"galleryPage","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"galleryPageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}},{"name":"reviewPage","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"reviewPageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"description":"Site-scoped directory snapshot.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"siteId":{"type":"string"},"datasetGeneratedAt":{"type":"string"},"notice":{"type":"string"},"data":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"cuisine":{"type":["string","null"]},"city":{"type":["string","null"]},"citySlug":{"type":["string","null"]},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"address":{"type":["string","null"]},"rating":{"type":["number","null"]},"reviewCount":{"type":["number","null"]},"phone":{"type":["string","null"]},"website":{"type":["string","null"]},"mapsUrl":{"type":["string","null"]},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]},"hours":{"type":"array","items":{"type":"object","properties":{"day":{"type":["string","null"]},"value":{"type":["string","null"]}},"required":["day","value"],"additionalProperties":false}},"hoursSummary":{"type":["string","null"]},"imageUrl":{"type":["string","null"]},"gallery":{"type":"array","items":{"type":"object","properties":{"imageUrl":{"type":"string"},"category":{"type":["string","null"]},"caption":{"type":["string","null"]},"attribution":{"type":["string","null"]}},"required":["imageUrl","category","caption","attribution"],"additionalProperties":false}},"galleryPagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false},"status":{"anyOf":[{"type":"object","properties":{"value":{"type":"string","enum":["operational","temporarily_closed","permanently_closed","relocated","reopened"]}},"required":["value"],"additionalProperties":false},{"type":"null"}]},"menuCoverage":{"anyOf":[{"type":"object","properties":{"status":{"type":"string","enum":["unavailable","partial","full"]},"itemCount":{"type":"number"},"channel":{"type":"string","enum":["dine_in","takeout","delivery","online_ordering","official_menu"]}},"required":["status","itemCount"],"additionalProperties":false},{"type":"null"}]},"practicalFacts":{"anyOf":[{"type":"object","properties":{"priceRange":{"type":"object","properties":{"display":{"type":"string"},"currency":{"type":"string"}},"required":["display"],"additionalProperties":false},"serviceOptions":{"type":"array","items":{"type":"string"}},"reservation":{"type":"string","enum":["accepted","not_available"]},"parking":{"type":"array","items":{"type":"string"}},"payments":{"type":"array","items":{"type":"string"}},"seating":{"type":"array","items":{"type":"string"}},"atmosphere":{"type":"array","items":{"type":"string"}},"children":{"type":"array","items":{"type":"string"}},"highlights":{"type":"array","items":{"type":"string"}},"popularFor":{"type":"array","items":{"type":"string"}},"offerings":{"type":"array","items":{"type":"string"}},"diningOptions":{"type":"array","items":{"type":"string"}},"accessibility":{"type":"array","items":{"type":"string"}},"amenities":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},{"type":"null"}]},"dimSumFacts":{"anyOf":[{"type":"object","properties":{"serviceWindows":{"type":"array","items":{"type":"object","properties":{"days":{"type":"array","items":{"type":"string"}},"hours":{"type":"string"}},"required":["days","hours"],"additionalProperties":false}},"serviceFormats":{"type":"array","items":{"type":"string","enum":["cart_service","order_sheet","table_service","counter_service","takeaway"]}}},"additionalProperties":false},{"type":"null"}]},"timezone":{"type":["string","null"]},"reviewHighlights":{"type":"array","items":{"type":"object","properties":{"author":{"type":["string","null"]},"rating":{"type":["number","null"]},"quote":{"type":"string"},"topic":{"type":["string","null"]},"date":{"type":["string","null"]}},"required":["author","rating","quote","topic","date"],"additionalProperties":false}},"reviewPagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false},"dietary":{"type":"object","properties":{"vegan":{"type":["boolean","null"]},"vegetarian":{"type":["boolean","null"]},"glutenFree":{"type":["boolean","null"]},"halal":{"type":["boolean","null"]},"kosher":{"type":["boolean","null"]},"dairyFree":{"type":["boolean","null"]}},"required":["vegan","vegetarian","glutenFree","halal","kosher","dairyFree"],"additionalProperties":false},"accessibility":{"type":"object","properties":{"wheelchair":{"anyOf":[{"type":"string","enum":["yes","limited","no"]},{"type":"null"}]},"wheelchairToilet":{"type":["boolean","null"]},"toilet":{"type":["boolean","null"]}},"required":["wheelchair","wheelchairToilet","toilet"],"additionalProperties":false},"services":{"anyOf":[{"type":"object","properties":{"outdoorSeating":{"type":"boolean"},"delivery":{"type":"boolean"},"takeaway":{"type":"boolean"},"driveThrough":{"type":"boolean"},"dogs":{"type":"boolean"},"smoking":{"type":"string"}},"additionalProperties":false},{"type":"null"}]},"payments":{"type":"array","items":{"type":"string"}},"priceLevel":{"type":["number","null"]},"menu":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"category":{"type":["string","null"]},"description":{"type":["string","null"]},"price":{"type":["number","null"]},"currency":{"type":["string","null"]},"imageUrl":{"type":["string","null"]}},"required":["name","category","description","price","currency","imageUrl"],"additionalProperties":false}},"menuPagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false},"ordering":{"anyOf":[{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string"},"available":{"type":["boolean","null"]},"delivery":{"type":["boolean","null"]},"takeout":{"type":["boolean","null"]},"reservable":{"type":["boolean","null"]},"menuChannel":{"anyOf":[{"type":"string","enum":["dine_in","takeout","delivery","online_ordering","official_menu"]},{"type":"null"}]}},"required":["label","url","available","delivery","takeout","reservable","menuChannel"],"additionalProperties":false},{"type":"null"}]}},"required":["slug","name","url","cuisine","city","citySlug","region","country","address","rating","reviewCount","phone","website","mapsUrl","latitude","longitude","hours","hoursSummary","imageUrl","gallery","galleryPagination","status","menuCoverage","practicalFacts","dimSumFacts","timezone","reviewHighlights","reviewPagination","dietary","accessibility","services","payments","priceLevel","menu","menuPagination","ordering"],"additionalProperties":false}},"required":["siteId","datasetGeneratedAt","notice","data"],"additionalProperties":false}}},"headers":{"ETag":{"schema":{"type":"string"},"description":"Use If-None-Match for conditional requests."}}},"304":{"description":"Representation has not changed."},"400":{"description":"Invalid or duplicate parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"404":{"description":"Endpoint or restaurant not found on this site.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"414":{"description":"Request URL exceeds 4096 characters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"429":{"description":"Site-wide rate limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/api/v1/cities":{"get":{"operationId":"list_cities","description":"List this site's canonical city slugs, regions, countries, and restaurant counts. Pass the slug to search_restaurants; follow pagination to see all locations.","parameters":[{"name":"page","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"pageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"description":"Site-scoped directory snapshot.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"siteId":{"type":"string"},"datasetGeneratedAt":{"type":"string"},"notice":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"city":{"type":"string"},"region":{"type":["string","null"]},"country":{"type":["string","null"]},"count":{"type":"number"},"url":{"type":"string"}},"required":["slug","city","region","country","count","url"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false}},"required":["siteId","datasetGeneratedAt","notice","data","pagination"],"additionalProperties":false}}},"headers":{"ETag":{"schema":{"type":"string"},"description":"Use If-None-Match for conditional requests."}}},"304":{"description":"Representation has not changed."},"400":{"description":"Invalid or duplicate parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"404":{"description":"Endpoint or restaurant not found on this site.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"414":{"description":"Request URL exceeds 4096 characters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"429":{"description":"Site-wide rate limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}},"/api/v1/cuisines":{"get":{"operationId":"list_cuisines","description":"List this site's cuisine slugs and restaurant counts. Pass a slug to search_restaurants; follow pagination to see all cuisines.","parameters":[{"name":"page","in":"query","required":false,"schema":{"default":1,"type":"integer","minimum":1,"maximum":10000}},{"name":"pageSize","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"description":"Site-scoped directory snapshot.","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"siteId":{"type":"string"},"datasetGeneratedAt":{"type":"string"},"notice":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"cuisine":{"type":"string"},"count":{"type":"number"},"url":{"type":"string"}},"required":["slug","cuisine","count","url"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"pageSize":{"type":"number"},"total":{"type":"number"},"nextPage":{"type":["number","null"]}},"required":["page","pageSize","total","nextPage"],"additionalProperties":false}},"required":["siteId","datasetGeneratedAt","notice","data","pagination"],"additionalProperties":false}}},"headers":{"ETag":{"schema":{"type":"string"},"description":"Use If-None-Match for conditional requests."}}},"304":{"description":"Representation has not changed."},"400":{"description":"Invalid or duplicate parameters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"404":{"description":"Endpoint or restaurant not found on this site.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"414":{"description":"Request URL exceeds 4096 characters.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}}},"429":{"description":"Site-wide rate limit reached.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"status":{"type":"integer"},"message":{"type":"string"}},"required":["status","message"]}},"required":["error"]}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}}}}}}