Resy Restaurant Availability Scraper avatar

Resy Restaurant Availability Scraper

Pricing

from $1.00 / 1,000 availability checkeds

Go to Apify Store
Resy Restaurant Availability Scraper

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

Simple Actors

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

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

FieldWhat it is
idResy's internal numeric venue ID — the key every other Resy endpoint takes.
nameRestaurant name as Resy lists it.
urlResy page for the venue.
canonicalUrlCanonical Resy venue URL — stable, safe to use as a key.
urlSlugThe venue's slug in its Resy URL.
deepLinkLink that opens the venue in the Resy mobile app.

Where it is

FieldWhat it is
addressStreet address.
address2Second address line, when the venue publishes one.
crossStreetNearest cross street.
crossStreet2Second cross street, when published.
neighborhoodNeighborhood Resy places the venue in.
localityCity the venue is in.
regionState or region code.
postalCodeZIP or postal code.
countryCountry name.
countryCodeISO 3166 country code.
latitudeVenue latitude.
longitudeVenue longitude.
timeZoneVenue time zone. Slot times are local to it, with no offset attached.
locationNameThe Resy market the venue belongs to.
locationCodeResy's short code for that market.
locationSlugResy's URL slug for that market — the value the venue endpoint needs.

Matching it to your own records

FieldWhat it is
googlePlaceIdGoogle Place ID for the venue — the reliable way to match it against your own records.
foursquareIdFoursquare venue ID, when Resy has one.
fbPixelIdFacebook pixel the venue runs, when published.

Contact

FieldWhat it is
phoneReservations phone number in E.164 form.
websiteThe restaurant's own site.
menuUrlLink to the menu, when the venue publishes one.

Cuisine and price

FieldWhat it is
typeResy's primary cuisine label.
cuisineEvery cuisine tag Resy applies. Falls back to the primary cuisine in URL mode.
priceRangeResy's price tier, 1 (cheapest) to 4 (most expensive).
averageSpendTypical spend per person, formatted by Resy.
averageSpendAmountTypical spend per person as a number.
currencyCodeISO currency code for the prices below.
currencySymbolSymbol Resy shows for that currency.

Ratings

FieldWhat it is
ratingResy diner rating out of ratingScale.
ratingCountHow many diner ratings that average is built on.
ratingScaleTop of the rating scale, normally 5.
ratingsEvery rating Resy shows, including critics' scores on their own scales.

Party size

FieldWhat it is
minPartySizeSmallest party Resy will take online.
maxPartySizeLargest party Resy will take online at this venue.
largePartyMessageWhat the venue says to do about parties over the online limit.

Photos

FieldWhat it is
imagesVenue photos published by Resy, largest listing size.
heroImageFirst image — the one Resy leads with.
mapImagePre-rendered static map of the venue's block.

What the venue and Resy say about it

FieldWhat it is
aboutThe venue's own description of itself.
whyWeLikeItResy's editorial note on the restaurant.
needToKnowHouse rules: deposits, dress code, cancellation policy.
taglineShort editorial tagline, when set.
fromTheVenueA note written by the restaurant, when set.
metaDescriptionThe description Resy puts in the page's meta tags.
keywordsSearch keywords Resy tags the venue with.
collectionsResy editorial lists the venue appears on.
awardsAwards Resy records for the venue.
announcementHeadlineHeadline of any banner the venue is running.
announcementBodyBody text of that banner.
announcementLinksLinks in the banner — gift cards, delivery, and the like.

Restaurant group and socials

FieldWhat it is
venueGroupThe hospitality group that operates the venue.
venueGroupIdResy's ID for that group.
venueGroupVenueIdsResy IDs of the group's other restaurants — feed them back in to map a whole group.
socialLinksThe venue's social accounts.

Programmes, policies and booking rules

FieldWhat it is
isActiveWhether the venue is currently live on Resy.
isGlobalDiningAccessWhether Amex Global Dining Access tables exist here.
isGlobalDiningAccessOnlyWhether every table is reserved for Global Dining Access cardholders.
isResySelectWhether the venue is in Resy's Select programme.
isResyCreditEligibleWhether Amex dining credits apply here.
isTockInventoryWhether the tables come from Tock rather than Resy. Search mode only.
inventoryTypeIdResy's inventory type for the venue.
waitlistAvailableWhether 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.
requiresReservationTransfersWhether the venue requires reservation transfers.
allowMultipleReservationsWhether one guest may hold several bookings.
allowBypassPaymentMethodWhether a card on file can be skipped.
enableResyPayWhether the venue takes payment through Resy.
hospitalityIncludedWhether gratuity is included.
taxIncludedWhether quoted prices include tax.
hasExperiencesWhether the venue sells ticketed experiences.
transactionProcessorProcessor the venue books through.
reopenDateDate Resy records the venue as (re)opening.

Open tables — with includeAvailability

FieldWhat it is
availabilityDateThe date the slots below were read for. Availability mode only.
partySizeThe party size the slots were read for. Availability mode only.
slotCountNumber of bookable tables found. Availability mode only.
slotsEvery 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.
earliestSlotFirst bookable seating time that day.
latestSlotLast bookable seating time that day.
slotTypesDistinct seating areas or services with tables open.
notifyAvailableWhether Resy offers its notify list for this date — the fallback when nothing is bookable.
notifyWindowsThe time windows Resy will take notify requests for.

Booking calendar — with includeCalendar

FieldWhat it is
calendarStartFirst day of the calendar window. Calendar mode only.
calendarEndLast day requested. Calendar mode only.
calendarLastBookableDateThe furthest date this venue takes bookings for.
calendarDay-by-day booking status across the window. Calendar mode only.
availableDatesDates in the window with tables open for the party size — the short answer to 'when can I get in?'.
availableDateCountHow many dates in the window are open.

Run metadata

FieldWhat it is
scrapedAtWhen 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}
to read open tables instead.

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.