Resy Availability Scraper & Table Alert Monitor avatar

Resy Availability Scraper & Table Alert Monitor

Pricing

from $0.001 / availability check

Go to Apify Store
Resy Availability Scraper & Table Alert Monitor

Resy Availability Scraper & Table Alert Monitor

Open Resy tables for any date, party size and time window: watch the restaurants you want and get a flag when a table opens, or list every Resy restaurant in a city with its open times, phone and address.

Pricing

from $0.001 / availability check

Rating

0.0

(0)

Developer

ScrapeBench

ScrapeBench

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Pain points

  • The tables at the restaurants people actually want open up at random times, and refreshing Resy by hand means missing them.
  • Checking several restaurants across several nights means repeating the same search for every restaurant and every date.
  • A monitor that cannot tell "no tables" from "no answer" sends false all-clears.
  • Comparing a city's or a neighborhood's restaurants in a spreadsheet means copying names, times, phones and addresses by hand.

What we solve

  • One row per restaurant per day with every open time for your party size and time window, plus a link to that day on Resy.
  • A date range costs one calendar call plus one call per day that has tables, so a 30-day watch of a booked-out restaurant stays fast and cheap.
  • "Flag new tables" marks only the tables that appeared since the watch's last run, so an alert fires on a change, not on every run.
  • A refused or unanswered request comes back as a free "blocked" row, never as "no tables", and is not charged.

Summary

Two jobs in one actor. Watch: list the Resy restaurants you care about (their Resy links or ids), a date or a range of up to 90 days, a party size and a time window, and get one row per restaurant per day saying whether a table is open, every open time with its seating area, party range, table length, deposit and cancellation terms, and a link straight to that day on Resy. For a range, Resy's own calendar is read once and only the days with tables are opened, so checking a month is a handful of calls. Switch on "flag new tables" and the actor remembers what was open on the watch's last run and marks the tables that appeared since, so a run scheduled every few minutes plus a webhook becomes an alert that fires only when something opens. Search: give a Resy city (New York, Los Angeles, Miami, London and about 2,000 more) or the latitude and longitude of a venue, a date and a party size, and get every Resy restaurant there with its open times that day, cuisine, price tier, rating, phone, street address, website, Instagram and Google place id. Booking stays with you: the actor reports tables and never books one.

Who it's for

  • Diners and concierge services waiting for a table at hard-to-book restaurants
  • Developers building reservation alerts, Discord or Telegram bots and AI dining agents
  • Event and conference planners looking for group dinners near a venue
  • Hotel concierges and travel planners booking dinners for guests
  • Hospitality analysts tracking how booked-up a city's restaurants are

How to use

This actor does two jobs. Run it, then collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API).

Get a list (export): no names, just filters; returns the whole matching list.

{
"mode": "search",
"locations": [
"New York"
],
"date": "2026-11-20",
"partySize": 2,
"timeFrom": "18:00",
"timeTo": "21:00",
"maxResults": 20
}

Watch restaurants for a table (lookup): put Watch specific restaurants for open tables over a range of dates in mode, venues, daysAhead, partySize, timeFrom, timeTo, onlyNew; Inputs below says how each is matched.

{
"mode": "watch",
"venues": [
"https://resy.com/cities/new-york-ny/venues/le-gratin"
],
"daysAhead": 14,
"partySize": 4,
"timeFrom": "19:00",
"timeTo": "21:30",
"onlyNew": true
}

See Inputs below for every available field.

What you get

One row per record:

FieldDescription
nameThe restaurant's name on Resy
dateThe day checked
party_sizeGuests the tables are for
availableTrue when at least one table is open in your time window
slot_countNumber of open times in your window
first_slotEarliest open time, HH:MM
last_slotLatest open time, HH:MM
slotsEach open time: time, end time, seating area (Dining Room, Bar, Patio...), and in Watch mode the party range, table length in minutes, deposit and cancellation terms
new_slotsWith "flag new tables" on: the open times not seen on this watch's last run
has_new_slotsWith "flag new tables" on: true when a table opened since the last run
calendar_statusResy's status for the day in a date range: available, sold-out, closed, not_released
resy_urlOpens the restaurant on Resy for this date and party size
venue_idResy's own id for the restaurant
cuisineResy's cuisine label
price_rangeResy price tier, 1 ($) to 4 ($$$$)
ratingResy rating, 1 to 5
rating_countNumber of Resy ratings
neighborhoodNeighborhood
cityCity
regionState or region
countryCountry
latitudeLatitude
longitudeLongitude
phoneThe restaurant's phone number
max_party_sizeLargest party Resy books online (Search mode)
addressStreet address
postal_codeZIP or postal code
websiteThe restaurant's own website
menu_urlMenu link, where the restaurant gives one
instagramInstagram link
google_place_idGoogle Maps place id, to join with Google data
descriptionThe restaurant's own description on Resy
queryThe city, point or restaurant this row was found for
source_urlThe Resy page this row is about

Sample:

{
"venue_id": 60029,
"name": "Le Gratin",
"resy_url": "https://resy.com/cities/new-york-ny/venues/le-gratin?date=2026-11-10&seats=4",
"date": "2026-11-10",
"party_size": 4,
"available": true,
"slot_count": 11,
"first_slot": "19:00",
"last_slot": "21:30",
"slots": [
{
"time": "19:00",
"end_time": "21:15",
"seating": "Dining Room",
"min_party": 3,
"max_party": 4,
"table_minutes": 135,
"deposit_required": false,
"deposit_fee": null,
"cancellation_fee": null,
"cancel_cutoff_hours": null
}
],
"new_slots": [
{
"time": "19:00",
"end_time": "21:15",
"seating": "Dining Room",
"min_party": 3,
"max_party": 4,
"table_minutes": 135,
"deposit_required": false,
"deposit_fee": null,
"cancellation_fee": null,
"cancel_cutoff_hours": null
}
],
"has_new_slots": true,
"calendar_status": "available",
"cuisine": "French",
"price_range": 2,
"rating": 4.65,
"rating_count": 7721,
"neighborhood": "Lower Manhattan",
"city": "New York",
"region": "NY",
"country": "United States",
"latitude": 40.711596,
"longitude": -74.00685,
"phone": "+12125979020",
"address": "5 Beekman St",
"postal_code": "10038",
"website": "https://www.legratinnyc.com/",
"instagram": "https://www.instagram.com/legratinnyc/",
"google_place_id": "ChIJj4fN7HBbwokRCB5xca3KF1E",
"query": "https://resy.com/cities/new-york-ny/venues/le-gratin",
"source_url": "https://resy.com/cities/new-york-ny/venues/le-gratin?date=2026-11-10&seats=4"
}

Inputs

FieldRequiredTypeDefaultDescription
modenostring"search"Search: every Resy restaurant in a city or near a point, with its open tables for the date. Watch: the Resy restaurants you list, checked for open tables on your dates; schedule it to get an alert when a table opens.
locationsnoarray["New York"]One per line: a Resy city (New York, San Francisco, Miami, London; or Resy's code like ny), or "latitude,longitude" for the area around a venue or hotel (for example 37.7842,-122.4016 for Moscone Center). Each is searched on its own.
locationnostring—One city or "latitude,longitude", for saved tasks and API calls that send a single value. Use the list above for several.
venuesnoarray[]One per line: the restaurant's Resy link (https://resy.com/cities/new-york-ny/venues/le-gratin) or its Resy venue id.
venuenostring—One Resy link or venue id, for saved tasks and API calls that send a single value.
datenostring—YYYY-MM-DD. Empty means today. With "Until date" it is the first day of a range.
datesnoarray[]Extra days to check, YYYY-MM-DD, one per line. Past dates are skipped with a free note.
dateTonostring—YYYY-MM-DD. Check every day from Date to this one (up to 90 days). In Watch mode Resy's calendar is read once and only days with tables are opened, so a long range stays fast.
daysAheadnointeger—Check every day from today for this many days (up to 90), instead of fixed dates. Best for a scheduled watch: the dates move with the calendar, so a saved task never goes stale.
partySizenointeger2Number of guests (1 to 20). Only tables for this many are returned; for a group dinner, Search also drops restaurants with no table that size.
timeFromnostring—HH:MM, 24-hour (18:00). Only tables from this time on. Empty means any time.
timeTonostring—HH:MM, 24-hour (21:30). Only tables up to this time. Empty means any time.
onlyNewnobooleanfalseRemembers what was open on this watch's last run and fills new_slots and has_new_slots, so a scheduled run plus a webhook alerts only when a table opens. The first run counts every open table as new.
queriesnoarray[]Optional, one per line: text Resy matches against cuisine and name (sushi, italian, steakhouse, a restaurant group). Each is searched and a restaurant found twice is returned once. Empty means every restaurant.
querynostring—One cuisine or name, for saved tasks and API calls that send a single value.
priceRangesnoarray[]Keep only these Resy price tiers: 1 ($), 2 ($$), 3 ($$$), 4 ($$$$). Empty keeps all.
minRatingnostring—Keep only restaurants Resy rates at least this (for example 4.5). Empty keeps all.
onlyAvailablenobooleanfalseDrop restaurants with no table for your date and party size.
radiusKmnointeger—How far from the point to look. Empty means the whole city for a city, 3 km for "latitude,longitude".
maxResultsnointeger20Cap for EACH city and date. Resy lists a few thousand restaurants in New York; nearest first from the point or city centre.
includeDetailsnobooleantrueOn by default: reads each restaurant's Resy page for its street address, ZIP code, website, menu link, Instagram, Google place id and description. No extra charge; turn off for a faster run. Watch rows always have them.
proxyConfigurationnoobject{"useApifyProxy": false}Off by default. If a run comes back with a 'blocked' row, turn on a proxy (residential works). Included in the price.

Pricing (Pay Per Event)

You pay per result (availability-check) — no charge for empty runs. Example: 1000 availability checks at $0.001/result ≈ $1.00.

Search mode is charged per restaurant returned instead: $0.003 per restaurant with its open tables for the date (event "Restaurant"), phone, address and website included. In Watch mode a date range is one row per restaurant per day, so watching 3 restaurants for 7 days is 21 checks ($0.021) per run. Compute and proxy are included; you pay only these events.

Use cases

  • Table alerts: watch a list of restaurants every few minutes for Friday and Saturday, 19:00 to 21:30, for 2, and send a message the moment has_new_slots is true.
  • Group dinners: every Resy restaurant within 3 km of the event venue with a table for 10 on the conference nights, with phone and address to call ahead.
  • Trip planning: which restaurants in a city have tables for 4 on each night of a stay, filtered by price tier and rating.
  • Market tracking: the share of a neighborhood's restaurants still open on a Saturday night, week by week.

Why this actor

  • Watches a whole date range with one calendar call plus one per open day, so frequent polling stays fast.
  • A free "blocked" row when Resy does not answer, so a monitor never reads a failed check as "nothing open".
  • Every row carries the restaurant's phone, street address and website along with the tables, with no second actor needed.

Limitations & updates

Availability is what Resy shows at the moment of the run and changes by the minute; a table can be gone by the time you open the link. Only restaurants that take reservations on Resy are covered (not OpenTable, Tock or walk-ins). In Search mode the party range, table length and payment terms of each time are not given by Resy's search, so those slot fields are filled in Watch mode only. Resy's search lists restaurants nearest the city centre or your point first, and Maximum restaurants caps each city and date. The actor reports availability and never books.

FAQ

How do I get an alert when a table opens?

Use Watch mode: add the restaurants' Resy links, "Next N days" (or fixed dates), party size and time window, and switch on "Flag tables that are new since the last run". Save it as a task and schedule it (every 5 to 15 minutes is common), then add a webhook or an n8n/Make/Zapier step that fires when a row has has_new_slots = true. The first run counts every open table as new; after that only tables that appeared since the previous run are flagged.

Does it book the table?

No. Every row has resy_url, which opens that restaurant on Resy for the date and party size, so you or your own tools book it. The actor never logs in and never books.

How is a date range checked?

In Watch mode the actor reads the restaurant's Resy calendar for the whole range in one call. Days the calendar shows as sold out or closed come back as rows with available = false and the day's status, without opening them. Only the days with tables are opened for their times. Days past what the restaurant has released yet come back as not_released.

Which cities can I search?

Any city Resy lists: about 2,000, from New York, Los Angeles, Miami and Chicago to London. Type the city's name (New York) or Resy's code (ny). For the area around a specific place, such as a conference venue or hotel, give "latitude,longitude" and a radius in km (3 km by default). Measured 2026-11-04: Resy lists 2,595 restaurants within New York's 10-mile area, and 73 within 3 km of Moscone Center in San Francisco.

Can it find tables for a large group?

Yes. Set the party size (up to 20). Search mode then returns only restaurants Resy can seat that many at, with their open times. Measured 2026-11-04: within 3 km of Moscone Center in San Francisco, Resy matched 30 restaurants for a party of 10 on Friday 13 November 2026 (73 for a party of 2).

What is in each table (slot)?

The time, end time and seating area (Dining Room, Bar, Patio...). Watch mode adds the party range the table takes, how long the table is held in minutes, whether a deposit is required and its amount, the cancellation fee and the cancellation cut-off in hours. Rows never carry Resy's booking token.

How fast is it?

Measured 2026-11-04, run outside Apify through one proxy: Search returned 60 New York restaurants with their 18:00 to 21:00 tables and their addresses in 8 seconds. Watch checked 2 restaurants for 7 days each (14 checks) in under 6 seconds.

How am I charged?

Watch mode: $0.001 per restaurant per date checked, whether or not a table is open, because the check is the answer. Search mode: $0.003 per restaurant returned with its tables for the date, with phone, address and website included. Free rows (a refused request, a skipped past date, a link that is not a Resy restaurant) are never charged.

What if Resy does not answer?

Each request is retried. If Resy still refuses or does not answer, the restaurants checked so far are delivered and a free row with notice_type "blocked" names the ones that were not, so a monitor never reads a failed check as "no tables". Turning on a proxy (residential works) is the fix if it keeps happening.

Which actor to choose

Works with:

  • Google Hotels Scraper: Prices, Rates, Phone & Email by City/ZIP — You are planning a trip or an event and also need hotels near the venue, priced for your dates.
  • Restaurant, Cafe & Bar Scraper: Email, Phone & Address — You want every restaurant in an area from Google Maps, including those not on Resy, with emails.

Guides & use cases

Written up on scrapebench.dev — the bench that runs and verifies this actor against the live source every night:

More actors, coverage and nightly verification results: scrapebench.dev

Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the MCP tab on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

"Which Resy restaurants in New York have a table for 2 between 6pm and 9pm on 20 November 2026?"

Start with Maximum restaurants at 20 to see the rows, then switch to Watch mode with the restaurants you like to keep an eye on them. Runs started this way bill exactly like any other run.

Data & lawful use

This actor collects publicly available information that Resy (Resy Network, Inc., part of American Express) publishes for public lookup — licence records, business listings and the contact details professionals list there. Some of it identifies individuals (sole proprietors, licence holders, agents), so treat any names, phone numbers and emails in your results as personal data.

When you run this actor, you decide what is collected and what it is used for, so you are the controller of that data and we act only as your processor (Apify Standard Actor Contract). You need a lawful basis for your use, must honour opt-out and deletion requests, and must follow the marketing rules that apply to you (CAN-SPAM, TCPA, GDPR, CCPA and similar). Don't use the output for unsolicited bulk messaging, for screening covered by the FCRA, or for anything the source's own terms forbid.

Your results are stored in your own Apify account. We don't keep a copy of your results and don't sell or share them.

Disclaimer

This is an independent tool. It is not affiliated with, endorsed by or sponsored by Resy (Resy Network, Inc., part of American Express). Names and marks are used only to describe the data source. Records are provided as published by the source and may be out of date or incomplete. For anything consequential (hiring, a permit, a legal decision), confirm the record with the issuing agency. You are responsible for making sure your use complies with applicable law and the source's terms.

Need help?

Open an issue on this actor's Issues tab and we'll respond there. Bug reports, missing fields and feature requests are all welcome. Guides and examples: scrapebench.dev.

If you are a person named in this data and want your record removed from our copy, email apify-help@scrapebench.dev; the source agency remains the official record.

Your run may be used to improve our services. If something looks off, or you want this actor to fit your use better, please share your run data with us: Apify Console → Settings → Security → Share run data with developers. It lets us see exactly what went wrong and keep improving the actor.