Resy Scraper – Restaurant Data & Availability avatar

Resy Scraper – Restaurant Data & Availability

Pricing

from $1.00 / 1,000 availability checkeds

Go to Apify Store
Resy Scraper – Restaurant Data & Availability

Resy Scraper – Restaurant Data & Availability

Scrape Resy restaurants: search by name and city for the full venue record — address, phone, website, cuisine, price tier, ratings, photos, Google Place ID — plus every open table for a date and party size, or a calendar of when a booked-out restaurant opens up. Unofficial.

Pricing

from $1.00 / 1,000 availability checkeds

Rating

5.0

(1)

Developer

Simple Actors

Simple Actors

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 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. Built for restaurant datasets, reservation monitoring, hospitality research and cancellation watching.

$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.

Features

  • Global venue search — across Resy's 2,000+ markets: US, Mexico, Spain, Italy, Japan, Canada and more.
  • Full restaurant record — name, address, coordinates, phone, website, cuisine, price tier, rating and rating count, neighborhood, photos.
  • Open tables for a date and party size — every seating time with its seating area, turn time and deposit rules.
  • A booking calendar — every day in a window marked available, sold out or closed, so one run finds the openings at a restaurant booked for weeks.
  • Google Place ID and Resy venue ID on every item — your list lines up with Resy's without fuzzy name matching.
  • Restaurant groups mapped — each item names its hospitality group and lists the Resy IDs of every sibling restaurant.
  • Two ways in — search by name and city, or read specific Resy venue URLs.
  • Search radius controlradiusKm keeps results inside one city instead of ranking the whole country.
  • Party size respected throughout — a table for two and a table for eight are different questions, and both availability and the calendar honour it.
  • Empty means something — an empty dataset is a verdict ("not on Resy", "booked solid"), never a silent failure.

Input

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
}
FieldTypeDefaultWhat it does
querystringCarboneRequired. Restaurant name or term to search for.
citystringNew YorkWhich Resy market to search first.
radiusKmintegerKeep results inside one city instead of ranking nationally.
maxItemsinteger3How many venues to return.
startUrlsarrayResy venue URLs to read directly. When set, the search inputs are ignored.
includeAvailabilitybooleanfalseRead open tables. Requires date.
datestringThe date to check, YYYY-MM-DD.
partySizeinteger2How many people the table is for.
keepUnavailablebooleanfalseKeep venues with slotCount: 0 instead of dropping them.
includeCalendarbooleanfalseRead the day-by-day booking calendar.
calendarStartDatestringtodayFirst day of the calendar window.
calendarDaysinteger30How many days the window covers.
calendarEndDatestringLast day, as an alternative to calendarDays.
locationSlugstringResy's own city slug, when a city name is not enough.
geoobjectAnchor the search on exact coordinates.
includeRawbooleanfalseAttach Resy's untouched payloads.
apiKeyFallbackstring(built in)Last-known Resy public frontend key, used only if reading the current one fails.
proxyobjectApify datacenterSwitch to residential if Resy starts refusing datacenter IPs.

Output

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.

How to use

From Apify Console

  1. Open the Actor and click Try for free / Start.
  2. Put the restaurant name into Search query and the city into City — or paste Resy venue URLs into Venue URLs to skip the search entirely.
  3. Set Max items to how many venues you want back.
  4. To check tables, switch on Include availability and set Date (YYYY-MM-DD) and Party size. The date is required — without it you get a single explanatory row instead of results.
  5. To answer "when can I get in?", switch on Include booking calendar and set Calendar length (days).
  6. Click Start, then open the Dataset tab and export as JSON, CSV or Excel.

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.

Watching a booked-out restaurant for cancellations, with the JavaScript client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('simple.actors/resy-availability').call({
startUrls: [{ url: 'https://resy.com/cities/new-york-ny/venues/carbone' }],
includeAvailability: true,
date: '2026-09-14',
partySize: 2,
keepUnavailable: true, // keep the venue even at slotCount: 0
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
if (items[0]?.slotCount > 0) console.log('A table opened up:', items[0].slots);

Use cases

  • 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.

Usage notes

Simple, transparent pay-per-result pricing — no subscriptions.

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.

An input problem is a row, not a failed run. Asking for availability without a date cannot be answered, but it is not a broken lookup either — so the run finishes SUCCEEDED with a single row carrying error and errorDescription, and the same reason in its status message. That row is never charged. So before reading an empty-looking dataset as a verdict, check whether its only row has an error key.

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.

FAQ

Is scraping Resy legal? This Actor calls Resy's public frontend API — the same endpoints resy.com's own web client uses — without a licensing agreement. Check the platform's ToS and your own obligations before using it, and run it at a volume and rate you are comfortable defending.

Do I need a Resy account, login or API key? No. It reads Resy's public frontend key off resy.com itself and caches it, so there is nothing for you to supply.

Can it book a table for me? No. It reads what is bookable and returns the seating times, areas, turn times and deposit rules — it does not place reservations.

How do I find out when a fully booked restaurant has something? Switch on includeCalendar and set calendarDays. The calendar marks every day in the window as available, sold out or closed, so a single run finds the openings at a restaurant that is booked for weeks.

Why did my availability run return nothing? Most likely nothing is bookable for that date and party size — that is a real answer, and by default venues with no open tables are dropped. Set keepUnavailable: true to keep them with slotCount: 0. To tell "booked solid" from "left Resy", run the same URL without includeAvailability.

Does party size change the answer? Yes. A table for two and a table for eight are different questions, and both availability and the calendar are read for partySize.

Why does a resy-shared key-value store appear in my account? That is expected. Resy's public frontend key and its city table are cached there for 12 hours so repeated runs do not re-fetch either. It holds nothing else.

Can I search a specific city rather than the whole country? Yes — set radiusKm. By default Resy ranks matches nationally with your city first, so Carbone in Miami returns Miami, then New York, Dallas and Las Vegas.

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.