How to Scrape Resy Restaurant Data and Availability
Resy is a major restaurant reservation platform, which makes it a rich public source of restaurant data: venue, cuisine, rating, price tier, neighborhood, and live table availability across cities. This guide covers what a listing holds, where the data lives, the challenges of collecting it cleanly, and how to turn it into a feed for restaurant lead-gen or availability monitoring. The worked example uses a real Resy venue.
What data a Resy venue holds
Each venue carries its profile and its demand signal. On a real venue it read: Zephyr Southern Brasserie, American cuisine, a price tier of 1, a rating of 4.57 from 491 ratings, in Downtown Atlanta. Alongside the static profile, Resy exposes live availability, the open reservation slots for a given date and party size. The venue name, cuisine, rating, price tier, and neighborhood are the fields that matter for restaurant intelligence, and the availability is what powers demand and monitoring use cases.
Where the data actually lives
Resy has a clean public JSON API, api.resy.com, and its own frontend reads from it. A venue-listing endpoint returns a venues array where each venue carries the name, the cuisine type, the rating and total ratings, a price range, and the location and neighborhood. Availability comes from a separate call scoped to a date, party size, and time. Reading that JSON is straightforward and low-friction, which makes the location and query scoping, rather than anti-bot, the main thing to get right.
Skip the build, get the feed
Send us your Resy target and we will scrape a real sample and send it back, no signup.
Get a free sampleThe practical challenges
Everything is scoped to a location, and availability is additionally scoped to a date, party size, and time window, so there is no single call that returns everything and you query each city and each date you care about. Resy operates mostly in US cities, so a search from outside its footprint returns few or no venues. The API expects the right configuration and tokens its frontend sends, and the schema changes over time, so a scraper needs maintenance to stay current.
Turning it into a feed
For restaurant intelligence you want one row per venue, captured per city, keeping the name, cuisine, rating, price tier, and neighborhood, and for demand work you layer availability on top, checking the slots for the dates and party sizes you care about on a schedule. Store each run with a date so you can track new venues, rating movement, and how availability tightens around peak nights.
Build it yourself or have it delivered
For one city, a careful script against the API can get you a sample. The work grows once you need many cities and ongoing availability checks, with the location and date scoping and the query configuration to maintain. A done-for-you feed is usually cheaper than the upkeep once you track more than a city or two. You tell us the cities and whether you need availability, and we deliver a clean feed and keep it running.
Where the fields live, and the availability call
Resy splits its data across two calls. A venue-listing endpoint returns a venues array where each entry has a venue object carrying name, type (the cuisine), rating and total_ratings, price_range (the tier), and a location object with the neighborhood and city. That is the static profile. Live availability comes from a separate call scoped to a day, a party_size, and a time window, which returns the open reservation slots for a venue, so demand and monitoring use cases join the venue profile to the availability response. Everything is location-scoped, and because Resy operates mostly in US cities, a query outside its footprint returns few venues. The venue id ties the two calls together and is the dedupe key.
Step by step: reading a Resy venue
Resy has a clean public JSON API that its own frontend reads, so a venue comes back as a structured object. Here it is on a real venue in Atlanta. The point to hold onto is that everything is scoped to a location, and availability to a date and party size.
import requests
# Resy's frontend reads venues from its public JSON API, scoped to a location.
url = "https://api.resy.com/3/venues/book_tonight"
params = {"location": "atl", "day": "2026-09-28", "party_size": 2}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
data = requests.get(url, params=params, headers=headers).json()
for v in data["results"]["venues"]:
ven = v["venue"]
print(ven["name"], ven["type"], ven["rating"], ven["location"]["neighborhood"])| Restaurant | Zephyr Southern Brasserie |
|---|---|
| Cuisine | American |
| Rating | 4.57 (491 ratings) |
| Price tier | 1 |
| Neighborhood | Downtown Atlanta |
| Source | Resy public API |
A sample of the clean data we deliver for one product.
The API is clean and low-friction. The work is that everything is scoped: venues to a location, availability to a date, party size, and time, so there is no single call that returns everything and you query each city and date you care about. Resy is mostly US-only, so a search outside its footprint comes back thin, and the API expects the configuration its frontend sends. We run that for you and deliver a clean venue feed, with live availability layered on where you need it.
Fields worth capturing from Resy
- Restaurant name
- Cuisine
- Rating
- Number of ratings
- Price tier
- Neighborhood
- City
- Availability slots
- Venue ID
Frequently asked questions
Want a Resy feed without the build?
Send us the products or pages you need, and we will deliver a clean feed and maintain it. Start with a free sample.
Get a Free Sample