# Resy Restaurants & Table Availability (`aitorsm/resy-restaurants`) Actor

Search Resy restaurants by city, date and party size with open reservation slots and sold-out status, check venue availability calendars, and export venue details. No login, never books.

- **URL**: https://apify.com/aitorsm/resy-restaurants.md
- **Developed by:** [Aitor Sanchez-Mansilla](https://apify.com/aitorsm) (community)
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 restaurants

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Resy Restaurants & Table Availability

**Search Resy restaurants in any city for a date and party size and get every open reservation slot, sold-out status, cuisine, price range, rating and address. Check availability calendars for specific restaurants over the next 30 days, or export full venue details.** Live Resy data, no Resy account needed, and it never books anything.

Who uses it:

- **Restaurant-tech and hospitality analysts**: which restaurants are sold out on Friday night is a direct demand signal. Track it daily per city, cuisine or neighborhood.
- **Reservation-alert and concierge tools**: poll a list of hard-to-book venues and react when a table appears.
- **Market research**: restaurant supply by city, cuisine and price range, with ratings and rating counts.
- **AI agents**: run the Actor through Apify's generic MCP integration and read the dataset for results.

### Three modes

| Mode | You give | You get (one result per…) |
|---|---|---|
| **Search** (default) | A city (74 Resy markets in the dropdown) or any latitude/longitude, a date, party size, optional name/keyword and cuisine | …restaurant: name, cuisine, neighborhood, address, price range 1–4, rating, open slots with seating type, sold-out status |
| **Availability** | Resy venue URLs or ids, a start date, 1–30 days, party size | …venue per day: status `available` / `sold_out` / `closed` / `not_released`, every open slot with seating type and deposit terms |
| **Venues** | Resy venue URLs or ids | …venue: description, phone, website, Instagram/Facebook, full address, coordinates, images, Resy collections, party-size limits, restaurant group, Google place id |

Venue URLs look like `https://resy.com/cities/new-york-ny/venues/carbone`. The older `https://resy.com/cities/ny/carbone` form and the numeric `venueId` from search results work too.

### Search: example result

Real row from a test run (Los Angeles, query "sushi", party of 2; `availableSlots` shortened to 3 of 46):

```json
{
  "venueId": 93240,
  "name": "Sushi Palace",
  "url": "https://resy.com/cities/los-angeles-ca/venues/sushi-palace",
  "cuisine": "Sushi",
  "neighborhood": "Los Angeles",
  "address": "6535 Melrose Avenue, Los Angeles, CA 90038",
  "website": "https://sushipalacehollywood.toast.site/",
  "locality": "Los Angeles",
  "region": "CA",
  "country": "United States",
  "lat": 34.08387751871499,
  "lng": -118.3382487187793,
  "priceRange": 1,
  "rating": 4.42,
  "ratingCount": 33,
  "phone": "+13109363366",
  "description": null,
  "imageUrl": "https://image.resy.com/3/003/2/93240/fb604d24b8ab05791780c28e812dd86252256434/jpg/640x360",
  "maxPartySize": 12,
  "availabilityStatus": "available",
  "soldOut": false,
  "slotsCount": 46,
  "availableSlots": [
    {
      "time": "17:00",
      "endTime": "18:30",
      "type": "Booth"
    },
    {
      "time": "17:00",
      "endTime": "18:30",
      "type": "Dining Room"
    },
    {
      "time": "17:15",
      "endTime": "18:45",
      "type": "Booth"
    }
  ],
  "date": "2026-10-03",
  "partySize": 2,
  "city": "los-angeles-ca",
  "scrapedAt": "2026-09-26T11:55:07.849Z"
}
```

`availabilityStatus` tells a sold-out restaurant from one that is closed that day or has not opened bookings for that date yet:

| Value | Meaning |
|---|---|
| `available` | Tables are open for this party size (see `availableSlots`) |
| `sold_out` | The restaurant takes reservations that day, all gone (`soldOut: true`) |
| `closed` | Closed that day |
| `not_released` | The date is beyond the restaurant's booking window (e.g. bookings open 14 days ahead) |
| `unknown` | Resy returned no calendar for that venue and day |

Results come nearest to the city center first. `radiusKm` (default 35) sets how far the search reaches; latitude/longitude let you search anywhere Resy operates, not just the 74 listed cities.

### Availability: example results

One row per venue per day. Real rows from a test run (Carbone and Le Gratin, New York, party of 2; `slots` shortened):

```json
{
  "venueId": 60029,
  "name": "Le Gratin",
  "url": "https://resy.com/cities/new-york-ny/venues/le-gratin",
  "neighborhood": "Lower Manhattan",
  "city": "new-york-ny",
  "timeZone": "EST5EDT",
  "date": "2026-09-26",
  "partySize": 2,
  "status": "available",
  "soldOut": false,
  "walkIn": "available",
  "slotsCount": 29,
  "slots": [
    {
      "time": "11:30",
      "endTime": "13:15",
      "type": "Dining Room",
      "paid": false,
      "depositFee": null,
      "cancellationFee": null
    },
    {
      "time": "11:45",
      "endTime": "13:30",
      "type": "Dining Room",
      "paid": false,
      "depositFee": null,
      "cancellationFee": null
    },
    {
      "time": "12:00",
      "endTime": "13:45",
      "type": "Dining Room",
      "paid": false,
      "depositFee": null,
      "cancellationFee": null
    }
  ],
  "firstSlot": "11:30",
  "lastSlot": "22:15",
  "scrapedAt": "2026-09-26T11:55:24.260Z"
}
```

Carbone on the same day: `{"name": "Carbone", "date": "2026-09-26", "partySize": 2, "status": "sold_out", "soldOut": true, "walkIn": "available", "slotsCount": 0}`. Le Gratin two days later returned `"status": "closed"`.

Turn on **Include booking policy** to add, for the first open slot of each day, the cancellation policy text, deposit/reservation charge, service charge and refund cut-off time.

### Venues: example result

```json
{
  "venueId": 60444,
  "name": "Sushi Nakazawa LA",
  "url": "https://resy.com/cities/los-angeles-ca/venues/sushi-nakazawa-la",
  "cuisine": "Sushi",
  "priceRange": 4,
  "rating": 4.82,
  "ratingCount": 421,
  "description": "Chef Daisuke Nakazawa's Omakase menu features different fish and shellfish globally, with a focus on Japanese waters. Highlighting seasonali…",
  "whyWeLikeIt": "There’s always room for one more top-notch sushi experience in this town. At the omakase counter, you’ll understand what chef Daisuke Nakaza…",
  "needToKnow": "Reservations are currently released 14 days in advance of any given day. Reservations are released daily, with exceptions for closed days. \n…",
  "phone": "+13109533221",
  "website": "http://www.SushiNakazawa.com",
  "instagram": "https://www.instagram.com/sushinakazawa",
  "address": "145 S Robertson Blvd, Los Angeles, CA 90048",
  "neighborhood": "West Hollywood",
  "crossStreets": "3rd & Robertson",
  "lat": 34.0739409,
  "lng": -118.3839211,
  "city": "los-angeles-ca",
  "timeZone": "PST8PDT",
  "images": [
    "https://image.resy.com/3/003/2/60444/443afee7a9f26018ac4acd0790f6c04d87cce300/jpg",
    "https://image.resy.com/3/003/2/60444/8a038f99e3263dd297dfd54f87e8eb5218b5255a/jpg"
  ],
  "collections": [
    "Top Rated",
    "Global Dining Access",
    "Events"
  ],
  "minPartySize": 1,
  "maxPartySize": 4,
  "reopenDate": "2022-05-12",
  "venueGroup": "Bedford Street Hospitality",
  "googlePlaceId": "ChIJdTX1bGa5woARI6yPeZK_4r0",
  "isActive": true,
  "scrapedAt": "2026-09-26T11:55:27.445Z"
}
```

Opening hours are not available, so there is no hours field; the open slots in search and availability show when the restaurant seats guests.

### Input example

```json
{
  "mode": "search",
  "city": "new-york-ny",
  "date": "2026-10-03",
  "partySize": "2",
  "cuisine": "Italian",
  "maxResults": 100
}
```

Leave `date` empty for 7 days from today (search) or today (availability). `partySize` is a dropdown from 1 to 8; the real-time API below also accepts a number.

### Pricing

Pay per result: **$3 per 1,000 results** ($0.003 per restaurant, venue-day or venue row), down to $0.0015 on higher Apify plans. There is no start fee. Inputs that are not Resy venues and venues that no longer exist are skipped and cost nothing. The run respects your **Max total charge**: it stops fetching when the budget is used and delivers only what was charged. The reason is in the `RUN_SUMMARY` record (`stopReason: "completed"` or `"charge_limit_reached"`).

### Real-time API and AI agents (Standby)

The Actor also runs as a live web server for HTTP clients:

- `GET /search?city=chicago-il&date=2026-10-03&partySize=4&cuisine=Italian&limit=20`
- `GET /availability?venue=https://resy.com/cities/new-york-ny/venues/carbone&date=2026-10-03&days=3&partySize=2`
- `GET /venue?venue=6194`

For AI agents, use Apify's MCP integration to run this Actor with batch input, then read the run's dataset for full results. For immediate availability checks, use the HTTP `/availability` endpoint.

Rows returned are written to the run's dataset and charged at the same per-result price. Invalid input returns HTTP 400 with a JSON error; a used-up spending limit returns 402 with the rows that were charged.

### FAQ

**Do I need a Resy account?** No. You get the same public information resy.com shows to any visitor who is not logged in.

**Can it book a table?** No, and it never will. It only returns availability. The booking-policy lookup never creates a reservation.

**How fresh is it?** Live: every run and every API call returns availability as of that moment. No personal data about diners is collected.

**How fast is it?** A search of 100 restaurants takes about a minute. Availability takes a little longer per venue when it has many open days.

**Why does a restaurant show 0 slots but `soldOut: false`?** It is `closed` that day or the date is `not_released` yet (outside its booking window). Only `sold_out` means the tables are gone.

**Which cities?** The dropdown has the 25 featured Resy markets and the larger regional ones (74 in total, US plus Toronto, Montreal, Vancouver, Mexico City, Madrid, Barcelona, Lisbon, Berlin, Athens, Hong Kong, Tokyo). For anywhere else, use latitude and longitude.

# Actor input Schema

## `mode` (type: `string`):

search = restaurants in a city on a date with their open tables. availability = open slots and sold-out / closed status for specific venues over a range of days. venues = full details (address, phone, website, social, images, collections) for specific venues.

## `city` (type: `string`):

Resy market to search. For any other place, fill in latitude and longitude below instead.

## `date` (type: `string`):

Search: the day to check (empty = 7 days from today). Availability: the first day of the range (empty = today). Format YYYY-MM-DD.

## `partySize` (type: `string`):

Number of guests. Search and availability only.

## `query` (type: `string`):

Optional. Restaurant name or keyword such as "sushi", "omakase" or "Carbone".

## `cuisine` (type: `string`):

Optional exact Resy cuisine, e.g. Italian, Japanese, Sushi, French, New American, Mexican, Steakhouse, Seafood, Korean, Cocktail Bar.

## `maxResults` (type: `integer`):

Maximum restaurants to return. Nearest to the city center first. Each restaurant is one result.

## `venues` (type: `array`):

Resy venue pages such as https://resy.com/cities/new-york-ny/venues/carbone, or numeric venue ids (the venueId field of search results).

## `days` (type: `integer`):

Consecutive days from the date above, 1 to 30. One result per venue per day.

## `includeBookingPolicy` (type: `boolean`):

Add the cancellation policy, deposit and cut-off times of the first open slot of each day. One extra lookup per day; the price per result is the same.

## `latitude` (type: `number`):

Search around this point instead of the city center. Use with longitude.

## `longitude` (type: `number`):

Search around this point instead of the city center. Use with latitude.

## `radiusKm` (type: `number`):

How far from the center to search. Default 35 km.

## Actor input object example

```json
{
  "mode": "search",
  "city": "new-york-ny",
  "partySize": "2",
  "maxResults": 50,
  "venues": [
    "https://resy.com/cities/new-york-ny/venues/carbone",
    "https://resy.com/cities/los-angeles-ca/venues/sushi-nakazawa-la"
  ],
  "days": 7,
  "includeBookingPolicy": false,
  "radiusKm": 35
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `availability` (type: `string`):

No description

## `venues` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "city": "new-york-ny",
    "partySize": "2",
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("aitorsm/resy-restaurants").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "city": "new-york-ny",
    "partySize": "2",
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("aitorsm/resy-restaurants").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "city": "new-york-ny",
  "partySize": "2",
  "maxResults": 50
}' |
apify call aitorsm/resy-restaurants --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aitorsm/resy-restaurants"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/h4Ni4YcdpfUmefBst/builds/EoWgLWzHhG9wQsHVD/openapi.json
