← Health board

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.

—insufficient data

Verification

Not yet in the weekly verification report.

Output fields

Authoritative field set from the dataset schema.

FieldType
venue_idinteger|null
namestring|null
resy_urlstring|null
datestring|null
party_sizeinteger|null
availableboolean|null
slot_countinteger|null
first_slotstring|null
last_slotstring|null
slotsarray|null
new_slotsarray|null
has_new_slotsboolean|null
calendar_statusstring|null
cuisinestring|null
price_rangeinteger|null
ratingnumber|null
rating_countinteger|null
neighborhoodstring|null
citystring|null
regionstring|null
countrystring|null
latitudenumber|null
longitudenumber|null
phonestring|null
max_party_sizeinteger|null
addressstring|null
postal_codestring|null
websitestring|null
menu_urlstring|null
instagramstring|null
google_place_idstring|null
descriptionstring|null
querystring|null
noticestring|null
notice_typestring|null
source_urlstring|null

Sample row

{
  "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

FieldTypeReqDefaultDescription
mode string no "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.
locations array no ["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.
location string no — One city or "latitude,longitude", for saved tasks and API calls that send a single value. Use the list above for several.
venues array no [] One per line: the restaurant's Resy link (https://resy.com/cities/new-york-ny/venues/le-gratin) or its Resy venue id.
venue string no — One Resy link or venue id, for saved tasks and API calls that send a single value.
date string no — YYYY-MM-DD. Empty means today. With "Until date" it is the first day of a range.
dates array no [] Extra days to check, YYYY-MM-DD, one per line. Past dates are skipped with a free note.
dateTo string no — 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.
daysAhead integer no — 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.
partySize integer no 2 Number 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.
timeFrom string no — HH:MM, 24-hour (18:00). Only tables from this time on. Empty means any time.
timeTo string no — HH:MM, 24-hour (21:30). Only tables up to this time. Empty means any time.
onlyNew boolean no false Remembers 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.
queries array no [] 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.
query string no — One cuisine or name, for saved tasks and API calls that send a single value.
priceRanges array no [] Keep only these Resy price tiers: 1 ($), 2 ($$), 3 ($$$), 4 ($$$$). Empty keeps all.
minRating string no — Keep only restaurants Resy rates at least this (for example 4.5). Empty keeps all.
onlyAvailable boolean no false Drop restaurants with no table for your date and party size.
radiusKm integer no — How far from the point to look. Empty means the whole city for a city, 3 km for "latitude,longitude".
maxResults integer no 20 Cap for EACH city and date. Resy lists a few thousand restaurants in New York; nearest first from the point or city centre.
includeDetails boolean no true On 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.
proxyConfiguration object no {"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 result (availability-check) — no charge for empty runs.
Example: 1000 availability checks at $0.001/result ≈ $1.00.

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.

Guides & use cases

Related actors