Resy Restaurant Availability Scraper
Pricing
from $1.00 / 1,000 availability checkeds
Resy Restaurant Availability Scraper
Scrape Resy restaurants: search by name and city for the full venue record — address, phone, website, cuisine, price, ratings, photos, Google Place ID — plus every open table for a date and party size, or a calendar of when a booked-out place opens up. Unofficial.
Pricing
from $1.00 / 1,000 availability checkeds
Rating
0.0
(0)
Developer
Simple Actors
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape restaurant data from Resy. Search by name and city to get the full venue record — address, coordinates, phone, website, cuisine, price tier, ratings, photos, restaurant group, Google Place ID — then read every open table for a date and party size, or a day-by-day calendar of when a booked-out restaurant actually has something.
$1.00 per 1,000 results, with Apify platform usage included — no monthly fee, and nothing to pay for a run that legitimately finds nothing. A result is one restaurant, with every field below.
Unofficial. Not affiliated with, endorsed by, or sponsored by Resy.
What you can do with it
- Build a restaurant dataset — cuisine, price tier, rating and rating count, neighborhood, coordinates, phone, website and photos for every venue matching a name or a city.
- Find a table on a specific date for a specific party size, with the exact seating times, seating areas, turn times and deposit rules.
- Answer "when can I get in?" — the booking calendar marks every day in a window as available, sold out or closed, so one run finds the openings at a restaurant that is booked for weeks.
- Monitor availability — run it daily per venue and date to track how far ahead tables disappear, or to catch a cancellation.
- Enrich your own records — every item carries the Google Place ID and the Resy venue ID, so your list lines up with Resy's without fuzzy name matching.
- Map a restaurant group — each item names its hospitality group and lists the Resy IDs of every sibling restaurant.
Two ways in
Search by name. query plus city finds restaurants across Resy's 2,000+
markets — US, Mexico, Spain, Italy, Japan, Canada and more. Resy ranks matches
across the country with your city first, so Carbone in Miami returns the Miami
location, then New York, Dallas and Las Vegas. Set radiusKm to keep results
inside one city.
{ "city": "Miami", "query": "Carbone", "maxItems": 5 }
Read specific venues. startUrls takes Resy venue URLs and reads each one
directly. When it is set, the search inputs are ignored.
{ "startUrls": [{ "url": "https://resy.com/cities/new-york-ny/venues/carbone" }] }
Either way, add availability, the calendar, or both:
{"city": "New York","query": "pizza","maxItems": 10,"includeAvailability": true,"date": "2026-08-22","partySize": 2,"includeCalendar": true,"calendarDays": 30}
What you get
One dataset item per restaurant. A plain venue read carries 79 fields;
switching on availability and the calendar adds 15 more for 94 in total.
Those 15 are left out rather than set to null when you do not ask for them, so
slots or calendar being absent means you did not request that layer. Every
field is listed below, so you can tell before running it whether the data you
need is in here.
{"id": 6194,"name": "Carbone","canonicalUrl": "https://resy.com/cities/new-york-ny/venues/carbone","address": "181 Thompson Street","crossStreet": "Bleecker Street","neighborhood": "Greenwich Village","locality": "New York","region": "NY","postalCode": "10012","country": "United States","latitude": 40.7279891,"longitude": -74.0002311,"timeZone": "EST5EDT","phone": "+12122543000","website": "http://carbonenewyork.com/","menuUrl": "https://carbonenewyork.com/?menu=dinner","googlePlaceId": "ChIJmSvG_ZFZwokRTOFeiLXzkmA","foursquareId": "504b2a9ee4b006c435a465d3","cuisine": ["Italian"],"priceRange": 4,"averageSpend": "$150","rating": 4.74814,"ratingCount": 33328,"minPartySize": 1,"maxPartySize": 14,"images": ["https://image.resy.com/3/003/2/6194/eb7e05…/jpg/640x360"],"about": "Carbone is Chef Mario Carbone's homage to the great Italian American restaurants…","whyWeLikeIt": "Carbone puts on the ritz of times gone by…","needToKnow": "Reservations can be made up to 30 days in advance… a deposit of $50 per person…","collections": ["Top Rated", "Global Dining Access"],"venueGroup": "Major Food Group","venueGroupVenueIds": [6249, 7457, 8656, 10389],"socialLinks": [{ "name": "instagram", "value": "majorfoodgroup" }],"isGlobalDiningAccess": true,"isResyCreditEligible": true,"scrapedAt": "2026-08-19T02:43:16.478Z"}
With includeAvailability, each item also carries its open tables:
{"availabilityDate": "2026-08-22","partySize": 2,"slotCount": 24,"earliestSlot": "2026-08-22 16:00:00","latestSlot": "2026-08-22 21:45:00","slotTypes": ["Dining Room"],"slots": [{"startTime": "2026-08-22 16:00:00","endTime": "2026-08-22 17:30:00","type": "Dining Room","turnTimeSeconds": 5400,"minSize": 1,"maxSize": 2,"quantity": 13,"isPaid": true,"cancellationFee": 10,"cancelCutOffTime": "15:00:00","token": "rgs://resy/69262/3772090/2/2026-08-22/…"}]}
With includeCalendar, it carries the booking window:
{"calendarStart": "2026-08-19","calendarEnd": "2026-09-18","calendarLastBookableDate": "2026-12-25","availableDates": ["2026-08-21", "2026-09-02"],"availableDateCount": 2,"calendar": [{ "date": "2026-08-19", "reservation": "sold-out", "event": "not available", "walkIn": "available" },{ "date": "2026-08-21", "reservation": "available", "event": "not available", "walkIn": "available" }]}
Set includeRaw to attach Resy's untouched JSON under raw when you need a
detail that has no named field.
The dataset ships four views: Venues (one row per restaurant), Open tables (one row per bookable seating), Booking calendar (one row per day per restaurant) and Contact & identifiers.
Every field
Identity and links
| Field | What it is |
|---|---|
id | Resy's internal numeric venue ID — the key every other Resy endpoint takes. |
name | Restaurant name as Resy lists it. |
url | Resy page for the venue. |
canonicalUrl | Canonical Resy venue URL — stable, safe to use as a key. |
urlSlug | The venue's slug in its Resy URL. |
deepLink | Link that opens the venue in the Resy mobile app. |
Where it is
| Field | What it is |
|---|---|
address | Street address. |
address2 | Second address line, when the venue publishes one. |
crossStreet | Nearest cross street. |
crossStreet2 | Second cross street, when published. |
neighborhood | Neighborhood Resy places the venue in. |
locality | City the venue is in. |
region | State or region code. |
postalCode | ZIP or postal code. |
country | Country name. |
countryCode | ISO 3166 country code. |
latitude | Venue latitude. |
longitude | Venue longitude. |
timeZone | Venue time zone. Slot times are local to it, with no offset attached. |
locationName | The Resy market the venue belongs to. |
locationCode | Resy's short code for that market. |
locationSlug | Resy's URL slug for that market — the value the venue endpoint needs. |
Matching it to your own records
| Field | What it is |
|---|---|
googlePlaceId | Google Place ID for the venue — the reliable way to match it against your own records. |
foursquareId | Foursquare venue ID, when Resy has one. |
fbPixelId | Facebook pixel the venue runs, when published. |
Contact
| Field | What it is |
|---|---|
phone | Reservations phone number in E.164 form. |
website | The restaurant's own site. |
menuUrl | Link to the menu, when the venue publishes one. |
Cuisine and price
| Field | What it is |
|---|---|
type | Resy's primary cuisine label. |
cuisine | Every cuisine tag Resy applies. Falls back to the primary cuisine in URL mode. |
priceRange | Resy's price tier, 1 (cheapest) to 4 (most expensive). |
averageSpend | Typical spend per person, formatted by Resy. |
averageSpendAmount | Typical spend per person as a number. |
currencyCode | ISO currency code for the prices below. |
currencySymbol | Symbol Resy shows for that currency. |
Ratings
| Field | What it is |
|---|---|
rating | Resy diner rating out of ratingScale. |
ratingCount | How many diner ratings that average is built on. |
ratingScale | Top of the rating scale, normally 5. |
ratings | Every rating Resy shows, including critics' scores on their own scales. |
Party size
| Field | What it is |
|---|---|
minPartySize | Smallest party Resy will take online. |
maxPartySize | Largest party Resy will take online at this venue. |
largePartyMessage | What the venue says to do about parties over the online limit. |
Photos
| Field | What it is |
|---|---|
images | Venue photos published by Resy, largest listing size. |
heroImage | First image — the one Resy leads with. |
mapImage | Pre-rendered static map of the venue's block. |
What the venue and Resy say about it
| Field | What it is |
|---|---|
about | The venue's own description of itself. |
whyWeLikeIt | Resy's editorial note on the restaurant. |
needToKnow | House rules: deposits, dress code, cancellation policy. |
tagline | Short editorial tagline, when set. |
fromTheVenue | A note written by the restaurant, when set. |
metaDescription | The description Resy puts in the page's meta tags. |
keywords | Search keywords Resy tags the venue with. |
collections | Resy editorial lists the venue appears on. |
awards | Awards Resy records for the venue. |
announcementHeadline | Headline of any banner the venue is running. |
announcementBody | Body text of that banner. |
announcementLinks | Links in the banner — gift cards, delivery, and the like. |
Restaurant group and socials
| Field | What it is |
|---|---|
venueGroup | The hospitality group that operates the venue. |
venueGroupId | Resy's ID for that group. |
venueGroupVenueIds | Resy IDs of the group's other restaurants — feed them back in to map a whole group. |
socialLinks | The venue's social accounts. |
Programmes, policies and booking rules
| Field | What it is |
|---|---|
isActive | Whether the venue is currently live on Resy. |
isGlobalDiningAccess | Whether Amex Global Dining Access tables exist here. |
isGlobalDiningAccessOnly | Whether every table is reserved for Global Dining Access cardholders. |
isResySelect | Whether the venue is in Resy's Select programme. |
isResyCreditEligible | Whether Amex dining credits apply here. |
isTockInventory | Whether the tables come from Tock rather than Resy. Search mode only. |
inventoryTypeId | Resy's inventory type for the venue. |
waitlistAvailable | Whether Resy is running a waitlist for this venue. Only Resy's availability endpoint reports it, so this is answered truthfully in availability mode and false elsewhere. |
requiresReservationTransfers | Whether the venue requires reservation transfers. |
allowMultipleReservations | Whether one guest may hold several bookings. |
allowBypassPaymentMethod | Whether a card on file can be skipped. |
enableResyPay | Whether the venue takes payment through Resy. |
hospitalityIncluded | Whether gratuity is included. |
taxIncluded | Whether quoted prices include tax. |
hasExperiences | Whether the venue sells ticketed experiences. |
transactionProcessor | Processor the venue books through. |
reopenDate | Date Resy records the venue as (re)opening. |
Open tables — with includeAvailability
| Field | What it is |
|---|---|
availabilityDate | The date the slots below were read for. Availability mode only. |
partySize | The party size the slots were read for. Availability mode only. |
slotCount | Number of bookable tables found. Availability mode only. |
slots | Every bookable table for the requested date and party size. Availability mode only; a venue with none is left out unless Keep unavailable venues is on. |
earliestSlot | First bookable seating time that day. |
latestSlot | Last bookable seating time that day. |
slotTypes | Distinct seating areas or services with tables open. |
notifyAvailable | Whether Resy offers its notify list for this date — the fallback when nothing is bookable. |
notifyWindows | The time windows Resy will take notify requests for. |
Booking calendar — with includeCalendar
| Field | What it is |
|---|---|
calendarStart | First day of the calendar window. Calendar mode only. |
calendarEnd | Last day requested. Calendar mode only. |
calendarLastBookableDate | The furthest date this venue takes bookings for. |
calendar | Day-by-day booking status across the window. Calendar mode only. |
availableDates | Dates in the window with tables open for the party size — the short answer to 'when can I get in?'. |
availableDateCount | How many dates in the window are open. |
Run metadata
| Field | What it is |
|---|---|
scrapedAt | When this row was read, ISO 8601 UTC. Availability moves by the minute. |
Availability semantics
By default, a restaurant with no open tables is left out of the results, so
an availability run returns exactly what is bookable. Switch on
keepUnavailable to keep every venue with slotCount: 0 instead — useful when
you want the full list with a booked/not-booked flag.
Party size matters: a table for two and a table for eight are different
questions, and both availability and the calendar are read for partySize.
What an empty result means
An empty dataset is an answer, not a failure. In search mode it means the restaurant is not on Resy; in availability mode it means nothing is bookable for that date and party size.
That holds because a broken lookup — a challenge page, a terminal 4xx, retries
exhausted — fails the run rather than finishing with nothing. So you can
trust emptiness, and treat a failed run as a retryable error. To tell "booked
solid" from "left Resy", run the same URL without includeAvailability.
Call it from the API
curl -s "https://api.apify.com/v2/acts/simple.actors~resy-availability/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"city": "New York", "query": "Balthazar", "maxItems": 2}'
Swap the input for
{"startUrls": [{"url": "…"}], "includeAvailability": true, "date": "2026-08-25", "partySize": 2}Settings
proxy— defaults to Apify datacenter proxy. If Resy starts blocking datacenter IPs, switch to{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}; the payloads are tiny JSON, so residential bandwidth cost stays negligible.radiusKm— restrict search results to one city instead of ranking the whole country.geo/locationSlug— anchor a search on exact coordinates when a city name is not enough.apiKeyFallback— last-known Resy public frontend key, used only if reading the current one fails.- Runs are capped at 256 MB; platform usage is included in the per-result price.
The resy-shared key-value store
The actor reads Resy's public frontend API key off resy.com and caches it for 12
hours, along with Resy's city table, in a key-value store named resy-shared,
so repeated runs don't re-fetch either. This store is created in your own
account on first run — that's expected, and it holds nothing but that cache.
Note
This actor is not affiliated with, endorsed by, or sponsored by Resy. It calls Resy's public frontend API — the same endpoints resy.com's own web client uses — without a licensing agreement. Review Resy's terms before using it, and run it at a volume and rate you are comfortable defending.