
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Export restaurants from Resy (resy.com) for any Resy city, keyword or cuisine, or from pasted Resy links. Get address, phone, website, Instagram and other social links, rating, price range, average spend, restaurant group, descriptions, photos and Google Place ID, plus optional live reservation slots for a date and party size. No login needed.
Export restaurants from Resy for any of its 2,100+ cities: name, cuisine, address, phone, website, Instagram, rating, price range, average spend, restaurant group, descriptions and photos. Add live reservation slots for any date and party size to see who has tables open. No login, no Resy account and no browser: it reads the same data resy.com shows to every visitor, so 20 restaurants take a few seconds.
New York, Miami, Mexico City) or paste Resy links to city, search or restaurant pages.pizza, rooftop, omakase) and Filters (cuisine, neighborhood, price range, minimum rating).| Field | What it does |
|---|---|
cities | Resy cities by name, code or slug (New York, ny, los-angeles-ca). |
startUrls | Resy city, search or restaurant links. |
query | Keyword or restaurant name to search within each city. |
maxItems | Restaurants to save in total (default 20, 0 = no limit). |
maxItemsPerSearch | Cap per city or cuisine search, to spread a long city list evenly. |
cuisines | Resy cuisine names, e.g. Italian, Sushi, New American. |
neighborhoods | Keep restaurants in these neighborhoods. |
priceRanges | 1 ($) to 4 ($$$$). |
minRating | Minimum Resy rating, e.g. 4.5. |
radiusMiles | Search radius around the city center (default: Resy's own area for the city). |
includeDetails | Read each restaurant page for full details (default on). |
includeAvailability, date, partySize, onlyAvailable | Live reservation slots. |
{
"cities": ["New York"],
"cuisines": ["Italian"],
"priceRanges": ["3", "4"],
"includeAvailability": true,
"date": "2026-11-14",
"partySize": 4,
"maxItems": 50
}
Each restaurant is one row. The Restaurants view shows the main columns, the Reservation slots view lists one row per open slot.
| Field | Example |
|---|---|
name, type, cuisine | Le Gratin, French |
neighborhood, address, crossStreet, locality, region, postalCode, country | Lower Manhattan, 5 Beekman St, New York, NY, 10038 |
latitude, longitude | 40.7116, -74.0068 |
phone, website, menuUrl | +12125979020, https://www.legratinnyc.com/ |
instagram, facebook, twitter, socialLinks | social profiles |
rating, ratingCount | 4.63, 6581 |
priceRange, averageSpend, averageSpendAmount, currencyCode | 2, $85, 85, USD |
minPartySize, maxPartySize, largePartyMessage | party rules |
description, about, needToKnow, metaDescription, keywords | texts from the Resy page |
collections, venueGroup, awards, isGlobalDiningAccess | Resy lists and restaurant group |
images | photo links |
googlePlaceId, foursquareId | ids to join with other data |
waitlistAvailable, waitlistLabel, reopenDate, announcement, timeZone | status fields |
slots, slotCount, availabilityDate, partySize | with reservation slots on |
id, url, canonicalUrl, location, locationCode, scrapedAt | identifiers |
Example row (trimmed):
{
"id": 87134,
"name": "Brooklyn Chop House - Downtown FIDI",
"url": "https://resy.com/cities/new-york-ny/brooklyn-chop-house-downtown-fidi",
"type": "Steakhouse",
"cuisine": ["Steakhouse"],
"neighborhood": "Financial District",
"address": "150 Nassau St",
"locality": "New York",
"region": "NY",
"postalCode": "10038",
"country": "United States",
"latitude": 40.71164941860875,
"longitude": -74.00596236132077,
"phone": "+12126191200",
"website": "https://www.brooklynchophouse.com",
"instagram": "https://www.instagram.com/brooklynchophouse/",
"rating": 4.125,
"ratingCount": 80,
"priceRange": 3,
"currencyCode": "USD",
"maxPartySize": 6,
"description": "Only in New York does a chop house serve LSD. In this case, that stands for lobster, steak, and Peking duck — all combined into one decadent feast...",
"venueGroup": "Brooklyn Chop House - Downtown FIDI",
"googlePlaceId": "ChIJfzUD4QJbwokRAZ0n7-0CxuM",
"images": ["https://image.resy.com/3/003/2/87134/7da5980387c5dd3ff7baac67f6eca33487cd2a63/jpg/640x360"],
"location": "New York",
"availabilityDate": "2026-10-21",
"partySize": 2,
"slots": [
{"startTime": "2026-10-21 14:45:00", "endTime": "2026-10-21 16:15:00", "type": "Dining Room", "configId": 1829819, "hasAddOns": false, "shiftDay": "2026-10-21"}
],
"slotCount": 5
}
You pay $4.50 per 1,000 restaurants ($0.0045 each), the same with or without details and reservation slots. Platform usage (compute and datacenter proxy traffic) is billed on top and is tiny: about half a cent per 1,000 detailed restaurants in our test runs. Example: 1,000 restaurants with full details ≈ $4.51 in total. Searches that find nothing cost nothing per result, and a run never charges more than the maximum you set.
Is it legal to scrape Resy? The actor only reads public restaurant pages that anyone can open without an account. Check Resy's terms and your local rules (GDPR, CCPA, anti-spam laws) for how you use the data.
Do I need a Resy account, login or proxy? No. No account or login is used. The default datacenter proxy works; the run switches to US residential exits by itself if it is ever refused.
How many restaurants can I get? New York alone has about 2,600 Resy restaurants within Resy's city area. One Resy search returns at most 9,975 restaurants, so split very large searches by cuisine or keyword. Several cities in one run are fine.
Why is a field empty? Restaurants fill their Resy pages themselves: some publish no website, Instagram or menu link. With details turned off, address, website, social links and descriptions are left out on purpose.
How does availability work? Turn on reservation slots, pick a date (default: today in the restaurant's city) and party size. Each row gets the bookable slots with start and end time and seating type. With Only restaurants with open slots on, fully booked restaurants are skipped.
Can I schedule it or use the API? Yes. Schedule runs to track availability or new openings, and call the actor through the Scrapely API, webhooks or integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
citiesarrayOptionalCities
Resy cities to list restaurants for, one per line: a name, Resy city code or link slug, e.g. 'New York', 'Los Angeles', 'Miami', 'Mexico City', 'Toronto', 'ny', 'chicago-il'. Use the English name or the name Resy shows. Every city is its own search.
startUrlsarrayOptionalResy links
Optional. City pages (https://resy.com/cities/new-york-ny), search pages (https://resy.com/cities/new-york-ny/search?query=pizza) and restaurant pages (https://resy.com/cities/new-york-ny/venues/carbone).
querystringOptionalKeyword
Optional. Restaurant name or keyword to search within each city, e.g. 'pizza', 'rooftop', 'omakase'.
maxItemsintegerOptionaldefault 20Maximum restaurants
How many restaurants to save in total across all cities and links. 0 = no limit. One Resy search returns at most 9,975 restaurants.
maxItemsPerSearchintegerOptionalMaximum per city
Optional. At most this many restaurants from each city, city link or cuisine search, so a long city list is spread evenly. 0 or empty = no per-city cap.
Optional. Narrow each city search.
cuisinesarrayOptionalCuisines
Only these cuisines, as Resy names them, e.g. 'Italian', 'Japanese', 'Sushi', 'New American', 'Steakhouse', 'Mexican', 'Cocktail Bar', 'Wine Bar', 'BBQ'. Each cuisine is its own search; restaurants found twice are saved once.
neighborhoodsarrayOptionalNeighborhoods
Only restaurants whose neighborhood contains one of these words, e.g. 'West Village', 'Williamsburg', 'Silver Lake'.
priceRangesarrayOptionalPrice range
Only restaurants in these price ranges.
minRatingnumberOptionalMinimum rating
Only restaurants with at least this Resy rating (0 to 5), e.g. 4.5.
radiusMilesintegerOptionalSearch radius (miles)
Distance from the city center to search. Leave empty to use the area Resy uses for the city (e.g. 10 miles for New York, 19 for Los Angeles).
What each row includes.
includeDetailsbooleanOptionaldefault trueFull restaurant details
Read each restaurant's page for the address, website, social links, average spend, restaurant group, descriptions, Google Place ID and more. Turn off for a faster list with name, cuisine, neighborhood, rating, price, phone, coordinates and photos.
includeAvailabilitybooleanOptionaldefault falseInclude reservation slots
Add the bookable time slots for the date and party size below to each restaurant.
datestringOptionalReservation date
Date to check (YYYY-MM-DD). Empty = today in the restaurant's city. Only used with reservation slots.
partySizeintegerOptionaldefault 2Party size
Number of guests (1 to 20). Only used with reservation slots.
onlyAvailablebooleanOptionaldefault trueOnly restaurants with open slots
With reservation slots on, skip restaurants that have no open slot for that date and party size.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxies work for Resy. The run switches to US residential exits by itself if the datacenter exits are refused.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | number | null | Resy restaurant id |
| name | string | null | Restaurant name |
| url | string | null | Resy page |
| canonicalUrl | string | null | |
| urlSlug | string | null | |
| type | string | null | Main cuisine |
| cuisine | array | null | |
| neighborhood | string | null | |
| address | string | null | |
| address2 | string | null | |
| crossStreet | string | null | |
| locality | string | null | |
| region | string | null | |
| postalCode | string | null | |
| country | string | null | |
| countryCode | string | null | |
| latitude | number | null | |
| longitude | number | null | |
| phone | string | null | |
| website | string | null | |
| menuUrl | string | null | |
| string | null | ||
| string | null | ||
| string | null | ||
| socialLinks | array | null | |
| rating | number | null | Resy rating, 0 to 5 |
| ratingCount | number | null | |
| priceRange | number | null | 1 ($) to 4 ($$$$) |
| averageSpend | string | null | |
| averageSpendAmount | number | null | |
| currencyCode | string | null | |
| currencySymbol | string | null | |
| minPartySize | number | null | |
| maxPartySize | number | null | |
| largePartyMessage | string | null | |
| description | string | null | |
| about | string | null | |
| needToKnow | string | null | |
| tagline | string | null | |
| metaDescription | string | null | |
| keywords | array | null | |
| collections | array | null | |
| venueGroup | string | null | |
| awards | array | null | |
| images | array | null | |
| googlePlaceId | string | null | |
| foursquareId | string | null | |
| isGlobalDiningAccess | boolean | null | |
| waitlistAvailable | number | null | |
| waitlistLabel | string | null | |
| reopenDate | string | null | |
| announcement | string | null | |
| timeZone | string | null | |
| location | string | null | Resy city |
| locationCode | string | null | |
| scrapedAt | string | null | |
| availabilityDate | string | null | |
| partySize | number | null | |
| slots | array | null | Bookable reservation slots |
| slotCount | number | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Restaurant | One restaurant saved from Resy, with details and reservation slots when requested. | $0.0045 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/resy-scraper').call({
"cities": [
"New York"
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/resy-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/resy-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.