OpenTable Real-Time Data
Pricing
from $3.00 / 1,000 results
OpenTable Real-Time Data
Get real-time OpenTable restaurant data for any city or cuisine: profiles, ratings, reviews, reservations, prices, contact details, websites, emails and socials. Perfect for lead generation, market research and AI workflows. Every result streams instantly to your dataset or webhook.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Turn OpenTable into a clean, structured restaurant database. Discover restaurants across any city and cuisine, pull full restaurant profiles, capture ratings, price bands, reservation volume, photos and coordinates, and enrich every listing with the restaurant's own website and contact email — all as clean, structured JSON streamed to your Apify dataset in real time.
Built for lead-gen agencies, restaurant-tech companies, market researchers, sales teams and AI workflows that need reliable OpenTable data without slow, high-maintenance tooling.
💡 Free plan / paid plan. This Actor is built for paid Apify plans. Free (non-paying) Apify accounts run in a restricted mode and receive only a small sample (2 results) — upgrade to a paid Apify plan to unlock full, unlimited output. The restriction is intentional (not a bug) and is repeated on the relevant input fields below.
Why this Actor
| OpenTable Real-Time Data | Typical OpenTable setup | |
|---|---|---|
| Speed | Fast collection, many markets at once | Often 5–20 s per restaurant |
| Memory | 1024 MB default — light, streaming output | 2–4 GB+, data accumulates in memory |
| Reliability | Managed Apify residential proxy + automatic recovery from temporary hiccups | Breaks on the first hiccup |
| Setup | Clean, organized input UI — run in seconds | Fragile scripts you maintain yourself |
| Output | One flat, LLM-ready JSON row per restaurant | Messy markup that still needs cleaning |
| Multi-market | Many keyword + market pairs per run | Usually one query at a time |
| Contact enrichment | Website and email discovery built in | Rarely included |
| Delivery | Dataset streaming + optional real-time webhook | Dataset only |
What you get — 30+ data points per restaurant
Every row is tagged with featureType and scrapedAt so you can filter, join and pipe it into any workflow.
| Group | Fields |
|---|---|
| Identity | restaurantId, name, url, type, diningStyle, description |
| Location | addressLine1, addressLine2, city, state, postCode, country, neighborhood, latitude, longitude |
| Pricing | priceBandId, priceBandName, priceRange ($–$$$$), currencySymbol |
| Reputation | rating, reviewCount, reservationCount, topReviewText |
| Food & venue | primaryCuisine, cuisine[], hasBar, hasCounter, hasHighTop, hasOutdoor, hasPrivateDining, hasEnhancedPrivateDining, hasTakeout, maxPartySize |
| Media & badges | photoUrl, imageUrls[], awards[] |
| Contact | phoneNumber, formattedPhoneNumber, website, websites[], email, emails[], socials[] |
| Booking & ordering | offers[], deliveryPartners[], orderOnlineUrl |
| Traceability | marketLabel, searchKeyword, searchIndex, sourceUrl, featureType, scrapedAt |
Features
🍽️ Restaurant Discovery — on by default
Discover restaurants by keyword + market. Add as many rows as you like — e.g. sushi in New York and italian in Chicago — and they all run in a single job.
- Search by cuisine, dish, restaurant name or dining style.
- Target any city or area — dozens of major markets are recognized out of the box, and any other city still works.
- Optional party size, date & time and price band filters.
- Control results per task and collection depth for very large runs.
- Every row streams to the dataset as it is collected — memory stays flat on long runs.
📍 Restaurant Details
Already have OpenTable restaurant URLs or numeric restaurant IDs? Paste them to receive a complete structured profile — name, description, dining style, full address, neighborhood, coordinates, price band, rating, review and reservation counts, cuisines, venue features, photos, phone, website, offers, delivery partners and online ordering.
🎯 Lead details
Enable Lead details to enrich every result with the restaurant's own website, contact email(s) and social profiles (Instagram, Facebook, TikTok, X, YouTube) — the switch that turns a bare listing into an actionable lead.
Results are never filtered out: every restaurant you asked for lands in the dataset, and contact fields are simply left empty when a business does not publish them. That means a run of 1,000 returns exactly 1,000 rows — predictable for pricing, budgets and downstream pipelines. Need only rows with emails? Filter the dataset afterward on the email field (or use the built-in Leads dataset view), or pipe the webhook into your CRM and filter there.
🔔 Webhooks (real-time delivery)
Every record is always written to the Apify dataset first. If you set a Webhook URL, each new record is also POSTed in real time to your CRM, Slack, Zapier, Make, Google Sheets or custom destination. Choose JSON (full record) or a Slack-friendly message. Delivery is best-effort — a failed webhook never stops the run.
💳 Billing
Billed per result via Apify pay-per-event. Runs respect your maximum cost per run and finish gracefully at the limit.
Use cases
- Restaurant lead generation — build outreach lists with phone, website and email for any city or cuisine.
- Multi-city prospecting — run dozens of keyword + market pairs in one job.
- Market mapping & density — compare how many restaurants, and at what price bands, exist per neighborhood.
- Competitive intelligence — track ratings, review counts and reservation volume across competitors.
- Cuisine gap analysis — find under-served cuisines and neighborhoods for expansion.
- Sales prospecting for restaurant-tech — POS, reservations, marketing, delivery and supply vendors.
- Price positioning studies — benchmark price bands by market and cuisine.
- Reputation monitoring — watch rating and review-count movement for a portfolio.
- Data enrichment — start from a URL or ID list and backfill full structured profiles.
- AI & LLM pipelines — JSON for RAG, scoring, outreach drafts and territory summaries.
- CRM & warehouse feeds — stream to your systems via webhook or the Apify API.
- Franchise & expansion research — size demand for a concept in a new metro or neighborhood.
- Supplier prospecting — find restaurants by cuisine, price band and location for B2B outreach.
Input reference
Enable only what you need. All features are independent.
| Input | Type | Default | Description |
|---|---|---|---|
| Restaurant Discovery | |||
enableSearch | boolean | true | Discover restaurants by keyword + market |
searchTasks | object[] | 2 example rows | Primary input: { keyword, location, maxItems?, partySize?, dateTime?, priceBands? } per row |
maxDepthPerTask | integer | 20 | Collection-depth safety ceiling per market |
| Restaurant Details | |||
enableRestaurantDetails | boolean | false | Extract full profiles for specific URLs / IDs |
restaurantUrls | string[] | — | OpenTable restaurant URLs |
restaurantIds | string[] | — | Numeric OpenTable restaurant IDs |
| Lead details | |||
enrichContacts | boolean | false | Add website, email(s) and social profiles to every restaurant. Results are never filtered — all rows are always returned |
| Output & limits | |||
maxItems | integer | 1000 | Global cap on dataset rows for the run (set higher for large runs) |
webhookUrl | string | — | Optional real-time POST URL — dataset is always written; webhook is additional |
webhookFormat | enum | json | json (full record) or slack (Slack message) |
| Connection | |||
proxyConfiguration | object | Apify residential | Apify proxy settings (on by default) |
Full schema: see .actor/input_schema.json or the Input tab on Apify Console.
Output reference
Each dataset row is one restaurant. Filter by featureType:
featureType | Description |
|---|---|
search | Restaurant from keyword discovery |
restaurant_details | Full profile from a restaurant URL or ID |
Traceability fields on discovery results:
marketLabel— e.g."sushi | New York, NY"searchKeyword— the keyword that produced this rowsearchIndex— 1-based position within the market
Export formats: JSON, CSV, Excel, RSS, or via the API.
Example record
{"featureType": "search","restaurantId": 1197892,"name": "Bad Habits","url": "https://www.opentable.com/r/bad-habits-astoria","description": "A lively neighborhood spot with a modern menu.","diningStyle": "Casual Dining","addressLine1": "32-03 Broadway","city": "Astoria","state": "NY","postCode": "11106","neighborhood": "Astoria","latitude": 40.7616752,"longitude": -73.9242925,"priceBandId": 2,"priceBandName": "$$","priceRange": "$$","currencySymbol": "$","rating": 4.5,"reviewCount": 171,"reservationCount": 1,"primaryCuisine": "Modern American","cuisine": ["Modern American", "Sushi", "Fusion"],"hasBar": true,"hasOutdoor": true,"maxPartySize": 8,"photoUrl": "https://resizer.otstatic.com/v3/photos/54327307-3?width=320&height=320","phoneNumber": "+13477385989","formattedPhoneNumber": "(347) 738-5989","website": "https://www.badhabitsastoria.com/","email": "info@example.com","emails": ["info@example.com"],"socials": ["https://www.instagram.com/badhabitsastoria"],"marketLabel": "sushi | New York, NY","searchKeyword": "sushi","searchIndex": 1,"sourceUrl": "https://www.opentable.com/r/bad-habits-astoria","scrapedAt": "2026-09-22T12:00:00.000Z"}
Note: some text fields (e.g.
description,diningStyle,primaryCuisine,cuisine,neighborhood) are returned in the language that OpenTable serves for that market's listing. Restaurant names, ratings, counts, coordinates, phone numbers and URLs are language-neutral.
Webhook delivery (optional)
Every record is always saved to the Apify dataset first. If you set webhookUrl in the Output & limits section, each new record is also POSTed in real time to your destination — useful for CRMs, Slack, Zapier, Make or custom pipelines.
| Setting | Description |
|---|---|
webhookUrl | Your destination URL (http/https). Leave empty to use the dataset only. |
webhookFormat | json — full record object. slack — compact Slack incoming-webhook message. |
Webhook delivery is best-effort: a failed webhook never stops the run or prevents dataset writes.
Example — discovery with Slack alerts
{"enableSearch": true,"searchTasks": [{ "keyword": "sushi", "location": "New York, NY", "maxItems": 10 }],"webhookUrl": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL","webhookFormat": "slack"}
Example — leads with emails + JSON webhook
{"enableSearch": true,"searchTasks": [{ "keyword": "italian", "location": "Chicago, IL", "maxItems": 100 }],"enrichContacts": true,"webhookUrl": "https://your-crm.example.com/api/leads","webhookFormat": "json"}
Quick start examples
Multi-market lead gen (default pattern)
{"enableSearch": true,"searchTasks": [{ "keyword": "sushi", "location": "New York, NY", "maxItems": 100 },{ "keyword": "sushi", "location": "Los Angeles, CA", "maxItems": 100 }],"enrichContacts": true}
High-end dining prospecting
{"enableSearch": true,"searchTasks": [{ "keyword": "steakhouse", "location": "Miami, FL", "maxItems": 60, "priceBands": ["3", "4"] }],"enrichContacts": true}
Enrich a URL / ID list
{"enableSearch": false,"enableRestaurantDetails": true,"restaurantUrls": ["https://www.opentable.com/r/bad-habits-astoria"],"restaurantIds": ["1197892"],"enrichContacts": true}
Dinner availability context (party of 4, Friday)
{"enableSearch": true,"searchTasks": [{ "keyword": "brunch", "location": "Austin, TX", "maxItems": 40, "partySize": 4, "dateTime": "2026-10-02T19:00" }]}
LLM & MCP integration
Output is JSON Lines–friendly structured data — ideal for ChatGPT, Claude, Gemini, LangChain, LlamaIndex and custom agents.
Recommended workflow
- Run the Actor with the features you need.
- Pull dataset items via the Apify API or export JSON/CSV.
- Pass records to your LLM with a system prompt, or index them into a vector store.
Apify MCP (Model Context Protocol)
Use the Apify MCP server so AI assistants can:
- Run this Actor with natural-language instructions
- Read dataset results directly in the chat
- Chain it with other Actors (enrich → score → CRM)
User: "Find 30 highly rated Italian restaurants in Chicago with emails and summarize each for outreach"→ MCP runs the Actor with searchTasks=[{ keyword: "italian", location: "Chicago, IL" }], enrichContacts=true→ MCP reads dataset items→ LLM summarizes and drafts emails
API quick start
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"enableSearch": true,"searchTasks": [{ "keyword": "sushi", "location": "New York, NY", "maxItems": 10 },{ "keyword": "italian", "location": "Chicago, IL", "maxItems": 10 }],"enrichContacts": true}'
Dataset items: GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
Proxy & performance
- Apify residential proxy is enabled by default — no extra setup required on Apify.
- Default memory: 1024 MB.
- Results are streamed to the dataset as they are collected, so long runs never pile up data in memory.
- Discovery and details both collect deeply and deduplicate restaurants automatically within a market.
FAQ
How many restaurants can I get in one run?
There is no hard limit — set maxItems high (e.g. 5,000+) and add as many keyword + market rows as you need.
Can I run many cities in one job?
Yes. Each searchTasks row is an independent keyword + market, and they all run in the same job.
Do I get emails for outreach?
Enable Lead details. When a restaurant publishes contact details, website, email, emails[] and socials[] are filled in.
Can I get only rows that have emails / websites / high ratings?
The Actor always returns every row it collects so run size stays predictable — filter afterward on the email, website or rating fields (export the built-in Leads dataset view, or filter in your CRM/Sheet). That keeps pricing and budgets tied to the exact number of rows you request.
Can I enrich a list I already have? Yes. Use Restaurant Details with your OpenTable URLs or numeric restaurant IDs.
Can I get results in my own systems in real time? Yes. Set a Webhook URL and choose JSON or Slack formatting.
Which format is the output? One flat JSON object per restaurant, plus CSV, Excel and RSS export options.
Are there fields that may be empty?
Some fields depend on what OpenTable lists for a given restaurant (for example, not every restaurant publishes an email). Empty fields are returned as null or [], never guessed.
Limitations & compliance
- Field availability depends on what OpenTable lists for a given restaurant.
- Some localized fields are returned in the language served for that market's listing.
- Contact discovery is best-effort — not every restaurant publishes an email.
- Not affiliated with OpenTable. Use responsibly and comply with applicable laws and OpenTable's Terms of Service.
- Always respect rate limits and local regulations when collecting business data.
Contact & custom work
Need something beyond this Actor? I build custom data products, pipelines, and full-stack web applications for startups and enterprises.
- Email: dubem115@gmail.com
- GitHub: github.com/DrunkCodes
Reach out for:
- Custom Apify Actors (any website or data source)
- Restaurant / local-market / lead-gen data projects at scale
- LLM & MCP integrations with your data stack
- Web apps, dashboards and automation tools
OpenTable Real-Time Data · by DrunkCodes