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.
Verification
Not yet in the weekly verification report.
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
venue_id | integer|null |
name | string|null |
resy_url | string|null |
date | string|null |
party_size | integer|null |
available | boolean|null |
slot_count | integer|null |
first_slot | string|null |
last_slot | string|null |
slots | array|null |
new_slots | array|null |
has_new_slots | boolean|null |
calendar_status | string|null |
cuisine | string|null |
price_range | integer|null |
rating | number|null |
rating_count | integer|null |
neighborhood | string|null |
city | string|null |
region | string|null |
country | string|null |
latitude | number|null |
longitude | number|null |
phone | string|null |
max_party_size | integer|null |
address | string|null |
postal_code | string|null |
website | string|null |
menu_url | string|null |
instagram | string|null |
google_place_id | string|null |
description | string|null |
query | string|null |
notice | string|null |
notice_type | string|null |
source_url | string|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
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
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