Vercel APIevals-dashdish.vercel.app ↗
Search Dashdish restaurants and retrieve full menu items with prices, sizes, ratings, and delivery details via two simple REST endpoints.
What is the Vercel API?
The Dashdish API exposes two endpoints — search_stores and get_store_menu — covering the full catalog of roughly 140 restaurants listed on Dashdish. search_stores returns store identifiers, delivery times, delivery fees, and average ratings. get_store_menu returns every published menu item for a given store, including item name, base price, a formatted price string, rating, and a three-tier size breakdown.
curl -X GET 'https://api.parse.bot/scraper/6cc99fad-c0d0-4e3c-b4b5-5baa4c276e5a/search_stores?query=Mashaallah' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace evals-dashdish-vercel-app-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Dashdish SDK — search restaurants, browse menus."""
from parse_apis.evals_dashdish_vercel_app_api import Dashdish, StoreNotFound
client = Dashdish()
# Search for stores by name and list the first few results.
for store in client.stores.list(query="Halal", limit=3):
print(store.name, store.average_rating, store.delivery_time)
# Drill into the first matching store's full menu.
store = client.stores.list(query="Mashaallah", limit=1).first()
if store is not None:
print(f"\nMenu for {store.name}:")
for item in store.menu_items.list(limit=5):
print(f" {item.name} {item.price_display} rating={item.rating}")
# Each item lists available sizes with calories and surcharge.
for sz in item.sizes:
print(f" {sz.size}: {sz.calories} cal, surcharge ${sz.surcharge:.2f}")
# Filter menu items by name substring.
biryani = store.menu_items.list(item_name="Biryani", limit=1).first()
if biryani is not None:
print(f"\nFound: {biryani.name} at {biryani.price_display}")
# Point lookup using a store_id discovered earlier.
if store is not None:
try:
refreshed = client.store(store_id=store.store_id)
print(f"\nDirect lookup: {refreshed.name}")
except StoreNotFound:
print("Store no longer available")
print("\nexercised: stores.list / menu_items.list / store (point lookup)")
Returns the restaurants/stores listed on the Dashdish home feed, one row per store, optionally narrowed by a case-insensitive substring match on the store name. The whole catalog (around 140 stores) is returned in one call with no pagination; omitting the query returns every store. Each row carries the store_id accepted by get_store_menu, the displayed distance, delivery time and delivery-fee line, and the displayed average rating (null when the store shows no rating). An empty stores array with total 0 means no store name contained the query.
| Param | Type | Description |
|---|---|---|
| query | string | Free-text store name filter, matched case-insensitively as a substring of the store name. Omitted = all stores. |
{
"type": "object",
"fields": {
"query": "the filter that was applied, or null",
"total": "number of stores returned after filtering",
"stores": "array of store rows: store_id (pass to get_store_menu), name, distance, delivery_time, delivery_fee, average_rating (number or null), num_ratings_display (e.g. '(20+)' or null), is_currently_available"
},
"sample": {
"data": {
"query": "Mashaallah",
"total": 1,
"stores": [
{
"name": "Mashaallah Halal Food Pakistani Food",
"distance": "1.0 mi",
"store_id": "card.store:store:24618495",
"delivery_fee": "$0 delivery fee, first order",
"delivery_time": "32 min",
"average_rating": 4,
"num_ratings_display": "(20+)",
"is_currently_available": true
}
]
},
"status": "success"
}
}About the Vercel API
Restaurant Search
search_stores returns the complete Dashdish store catalog in a single call — around 140 stores with no pagination. Each row in the stores array includes a store_id (in the form card.store:store:<digits>), name, distance, delivery_time, delivery_fee, and average_rating. Pass the optional query parameter to filter by a case-insensitive substring of the store name; omit it entirely to receive every store. The total field always reflects the filtered count.
Menu Items
get_store_menu takes a store_id from the previous call and returns all menu items published on that store's page. Each item in the items array carries name, price (numeric, base/regular price), price_display (formatted as $x.xx), rating, image_url, and a sizes array. The sizes array contains three entries per item — Small (the regular/base tier, is_regular: true), Medium, and Large — each with its own price. Use the optional item_name parameter to filter results to items whose names contain a given substring.
Response Structure Notes
average_rating in search_stores may be null for stores with no published ratings. store_name is returned alongside results in get_store_menu so callers can display the restaurant name without a separate lookup. Filtering in both endpoints is substring-based and case-insensitive, meaning a query of chicken will match "Chicken Biryani", "Crispy Chicken", and similar names.
The Vercel API is a managed, monitored endpoint for evals-dashdish.vercel.app — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when evals-dashdish.vercel.app changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official evals-dashdish.vercel.app API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a menu comparison tool that shows base prices and size-tier pricing across multiple Dashdish restaurants for a given dish name.
- Aggregate delivery fees and estimated delivery times across all ~140 stores to surface the fastest or cheapest options.
- Generate a searchable restaurant directory filtered by name substring and ranked by
average_rating. - Compile a dataset of menu item ratings per restaurant to identify highest-rated dishes across the catalog.
- Power a food-budget app that looks up
priceandsizesdata for specific items before checkout. - Monitor price changes over time by periodically calling
get_store_menuand comparing the numericpricefield. - Build a dietary search tool that filters menu items by name keyword (e.g., 'vegan', 'gluten') using the
item_nameparameter.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Dashdish have an official public developer API?+
What does `get_store_menu` return for item sizes, and how do the prices differ?+
sizes array contains three entries: Small (the base/regular tier, marked is_regular: true), Medium, and Large. Each size entry carries its own price, so the numeric price field at the item level reflects the Small/regular price. The size-tier prices let you see the full pricing ladder without a separate call.Does the API cover order placement, cart management, or user accounts?+
search_stores and menu data via get_store_menu — both read-only. Order placement, cart management, checkout, and user account data are not included. You can fork this API on Parse and revise it to add endpoints for those capabilities if the underlying data becomes accessible.Is there pagination when retrieving the full store catalog?+
search_stores returns the entire catalog — roughly 140 stores — in a single response. The total field in the response confirms how many stores matched the optional query filter.Does the API return cuisine type, opening hours, or geographic coordinates for stores?+
search_stores returns store_id, name, distance, delivery_time, delivery_fee, and average_rating — cuisine type, opening hours, and coordinates are not part of the response. You can fork this API on Parse and revise it to add those fields if they are available on individual store pages.