# Resy API Scraper (`rl1987/resy-api-scraper`) Actor

Scrape Resy restaurant data: search venues by city/cuisine/neighborhood, full venue detail (rating, price, contact, images, geo), and public reservation availability (open slots by day). Read-only public data, no account, no booking.

- **URL**: https://apify.com/rl1987/resy-api-scraper.md
- **Developed by:** [R.L.](https://apify.com/rl1987) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 venue records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Resy Scraper

Scrape public restaurant data from [Resy](https://resy.com) — venue search, full venue
detail, and open reservation availability — straight from Resy's own mobile API. **Read-only
public data only: no account, no login, no booking, no payment.**

The actor impersonates the Resy Android app using its build-time public API key, so every
request looks exactly like the app's own traffic.

### Modes

| Mode | What it returns | Key inputs |
|------|-----------------|-----------|
| **Search venues** | Restaurants for a market, optionally filtered by cuisine / neighborhood / keyword. | `location` (city dropdown), `query`, `cuisine`, `neighborhood`, `maxItems`; set **Only venues with open slots** + `day`/`partySize` to attach live availability |
| **Venue detail (by ID)** | Full record for one or more venues. | `venueIds` |
| **Availability calendar (by ID)** | Open-reservation days for one or more venues. | `venueIds`, `partySize`, `startDate`, `endDate` |
| **Find available (by location)** | Venues with open slots near a point on a date. | `lat`, `long`, `day`, `partySize` |

### Output

One row per venue (or per day for the availability calendar). Venue fields:

`venue_id`, `name`, `url_slug`, `resy_url`, `cuisine`, `price_range_id`, `rating`,
`rating_count`, `locality`, `neighborhood`, `region`, `country`, `location_code`,
`location_name`, `latitude`, `longitude`, `phone`, `max_party_size`, `currency_code`,
`images`, `collections`, `available_slot_count`, `available_slots`.

With **Fetch full venue details** (or Venue detail mode), rows also carry: `description`,
`why_we_like_it`, `about`, `need_to_know`, `tagline`, `instagram`, `social`, `venue_group`,
`awards`, `web_url`, `address`, `website`, `menu_url`, `min_party_size`.

Availability-calendar rows: `venue_id`, `date`, `reservation`, `event`, `walk_in`.

### Notes

- Resy's public API is **not bot-gated**; a proxy is optional, though a US IP is recommended.
- `location` is a dropdown of Resy markets (New York, LA, Chicago, Miami, and ~40 more); `cuisine` offers Resy's common cuisines as suggestions but also accepts free text.
- `venue_id` is Resy's own numeric id (the `venue_id` field from a search) — feed it into the
  detail and calendar modes.
- Booking, guest lists, and per-slot booking tokens require a logged-in Resy account and are
  intentionally **out of scope**.

### Pricing (pay-per-event)

| Event | When | Price |
|-------|------|-------|
| **Venue record** | per venue returned (search or venue detail) | $0.0005 |
| **Venue details** | additionally per venue when full details are fetched (Venue detail mode, or search with *Fetch full venue details*) | $0.0005 |
| **Availability day** | per day returned by the Availability calendar mode | $0.0005 |

***

Built on the [apify-api-scraper-template](https://github.com/rl1987/apify-api-scraper-template).

# Actor input Schema

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

What to scrape. 'Search venues' returns restaurants for a city/cuisine/keyword (optionally only those with open slots on a date); 'Venue detail' fetches full records for given venue IDs; 'Availability calendar' returns open-reservation days for given venue IDs.

## `location` (type: `string`):

Search mode: the Resy market to search. Pick a city; use the Neighborhood field to narrow within it.

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

Search mode: free-text keyword or restaurant name (optional; leave blank to browse the whole location).

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

Search mode: filter by cuisine (optional). Pick from Resy's cuisine list; for anything not listed, use the free-text Search query field.

## `neighborhood` (type: `string`):

Search mode: filter by neighborhood, e.g. 'Chelsea', 'Midtown East' (optional).

## `maxItems` (type: `integer`):

Search mode: roughly how many venues to return (0 = a sensible default of 40). Resy search pages are 20 venues.

## `availability` (type: `boolean`):

Search mode: attach live open reservation slots and keep only venues that have availability on the chosen day/party size.

## `includeVenueDetails` (type: `boolean`):

Search mode: for each result, also fetch the full venue record (address, website, menu URL, min party size, richer rating) and merge it into the row. Adds one request per venue.

## `day` (type: `string`):

Search (with availability) mode: reservation date. Absolute (YYYY-MM-DD) or relative ('3 days'). Defaults to today.

## `partySize` (type: `integer`):

Number of seats for availability lookups (search-with-availability, availability calendar, find).

## `venueIds` (type: `array`):

Venue detail / Availability calendar modes: one or more numeric Resy venue IDs (the 'venue\_id' field returned by a search).

## `startDate` (type: `string`):

Availability calendar mode: first day. Absolute or relative. Defaults to today.

## `endDate` (type: `string`):

Availability calendar mode: last day. Absolute or relative. Defaults to 30 days from today.

## `maxConcurrency` (type: `integer`):

Max requests processed in parallel.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked failed.

## `maxSessionRotations` (type: `integer`):

Retries for a blocked/rate-limited status, each with a fresh session/proxy.

## `proxyConfiguration` (type: `object`):

Optional. Resy's public API is not bot-gated; a proxy is not required but a US IP is recommended.

## Actor input object example

```json
{
  "mode": "search",
  "location": "ny",
  "maxItems": 40,
  "availability": false,
  "includeVenueDetails": false,
  "partySize": 2,
  "venueIds": [],
  "maxConcurrency": 5,
  "maxRequestRetries": 5,
  "maxSessionRotations": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "query": "",
    "neighborhood": "",
    "venueIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("rl1987/resy-api-scraper").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 = {
    "query": "",
    "neighborhood": "",
    "venueIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("rl1987/resy-api-scraper").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 '{
  "query": "",
  "neighborhood": "",
  "venueIds": []
}' |
apify call rl1987/resy-api-scraper --silent --output-dataset

```

## MCP server setup

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

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/JoiXyK2CP8KcOfWcH/builds/JhJ9Rfe6pmVzyeLOH/openapi.json
