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

Scrape TheFork restaurants: ratings, prices, address, phone, menus, reviews and photos from city, search and restaurant pages across Europe.
Turn TheFork (LaFourchette) city pages, searches and restaurant pages into clean restaurant data: ratings, average price, address with coordinates, phone, opening hours, menus with dish prices, reviews, photos, deals and awards. Works for every TheFork country (France, Italy, Spain, Germany, Netherlands, Switzerland, Belgium, Austria, Portugal, Sweden, UK) with no login and no browser, and 20 restaurants arrive in well under a minute.
Barcelona or Lyon 2e, then filter by price, rating, cuisine, deals and sort order.https://www.thefork.com/restaurants/paris-c415144, a neighbourhood or cuisine page, a search URL or single restaurant pages), or type a city or address under Search locations.| Field | What it does |
|---|---|
startUrls | TheFork restaurant, city, neighbourhood, cuisine or search URLs from any TheFork country site |
searchLocations | Cities, neighbourhoods or addresses to search, e.g. Barcelona, Milano, Lyon 2e |
maxRestaurants | Restaurants to save in total (default 20, 0 = no limit) |
sort, cuisineTagIds, minPrice, maxPrice, minRating, maxRating, bestRated, promotionsOnly | Search order and filters |
searchRadiusKm | Radius around a typed address (cities use their own boundaries) |
maxReviews, reviewLanguage | Newest reviews per restaurant (default 20) and their language |
maxPhotos | Diner photos per restaurant (default 20) |
language | Output language for cuisines, tags and links |
proxy | Proxy settings (residential exits in France by default) |
{
"startUrls": ["https://www.thefork.com/restaurants/paris-c415144"],
"searchLocations": ["Barcelona"],
"maxRestaurants": 50,
"minRating": 9,
"maxPrice": 40,
"maxReviews": 20,
"reviewLanguage": "all",
"language": "en"
}
One row per restaurant. Reviews, photos and menus are nested lists; the Reviews table view shows one row per review.
| Field | Description |
|---|---|
name, url, id, legacy_id, cuisine | Identity and main cuisine |
avg_price, avg_price_currency | Average price per person |
thefork_rating, thefork_review_count, food_rating, service_rating, ambience_rating, review_count, tripadvisor_rating | Ratings |
phone, street, zip_code, locality, country, latitude, longitude | Contact and location |
legal_website, legal_email, legal_register_name, legal_register_number | Trader details the restaurant publishes |
opening_hours, bookable_intervals, vacation, is_bookable | Opening and booking times |
best_promotion_percentage, marketing_offer, menus, available_menus | Deals and menus with dish prices |
tags, highlighted_tags, feature_categories, payment_accepted, food_requirements | Features and tags |
most_mentioned_dishes, language_stats, michelin, tf_awards_year, is_insider, top_chart_rank | Insights and awards |
restaurant_photos, header_photos, customer_photos, customer_photos_total | Photos |
reviews | Newest reviews: rating, meal date, text, reviewer, restaurant reply, photos |
Sample from a test run (trimmed; the reviewer is replaced by a fictional person):
{
"id": "c79fac7e-58c8-4092-85bb-50fe85aefde4",
"legacy_id": 835950,
"name": "L'Osteria Paris Chatelet",
"url": "https://www.thefork.com/restaurant/l-osteria-paris-chatelet-r835950",
"cuisine": "Italian",
"avg_price": 22,
"avg_price_currency": "EUR",
"thefork_rating": 9.1,
"thefork_review_count": 5065,
"tripadvisor_rating": 3.9,
"food_rating": 9.3,
"service_rating": 9,
"ambience_rating": 9.1,
"review_count": 2432,
"rate_distinction": "Excellent",
"phone": "+33142501503",
"street": "27 Rue Aubry le Boucher",
"zip_code": "75004",
"locality": "Paris",
"country": "France",
"latitude": 48.8603493,
"longitude": 2.3497995,
"is_bookable": true,
"best_promotion_percentage": 50,
"marketing_offer": {"title": "TheFork Festival", "discount_percentage": null},
"vacation": "1st of January; 1st of May",
"transport": "Châtelet, Les Halles, Rambuteau, Etienne Marcel",
"payment_accepted": ["Apple Pay", "Credit Card", "Mastercard", "TheFork Pay", "Visa", "Voucher"],
"highlighted_tags": ["YUMS x2", "PAY", "Gift cards", "Italian", "With friends"],
"feature_categories": [
{"name": "Features", "category": "ESSENTIALS", "features": ["Air-conditioning", "Dog-Friendly", "Wheelchair Accessible", "Wifi"]}
],
"most_mentioned_dishes": [{"name": "Pasta", "review_count": 50}, {"name": "Pizzas", "review_count": 49}],
"legal_register_name": "RCS Paris",
"legal_website": "https://losteria.net/",
"main_photo_url": "https://cdn.thefork.com/tf-lab/image/upload/restaurant/c79fac7e-58c8-4092-85bb-50fe85aefde4/1a5778d7-fa3e-40b8-818f-56942a072aaf.jpg",
"customer_photos_total": 808,
"menus": [
{"name": "À la carte", "menu_type": "A_LA_CARTE", "price_currency": "EUR", "updated_ts": "2025-01-28T15:36:41.227Z",
"sections": [{"name": "Antipasti", "items": [
{"name": "Crema di pomodoro", "description": "(Soupe italienne à la tomate, crème, basilic)", "price": 7.25, "is_main_dish": false},
{"name": "Bruschetta - piccola (2 tranches)", "description": "(Tomates fraîches, ail, basilic)", "price": 5.25, "is_main_dish": false}
]}]}
],
"reviews": [
{"id": "f72d293d-b080-4d41-b77e-696b6f306bef", "rating_value": 10, "meal_date": "2026-10-20T10:00:00.000Z",
"review_body": "Excellent accueil et pizzas énormes.\nJe recommande sans hésitation",
"reviewer_first_name": "Jane", "reviewer_last_name": "D.", "reviewer_username": "Jane D.", "reviewer_review_count": 39,
"restaurant_reply_body": null, "photos": [], "likes": 0}
],
"reviews_scraped": 20,
"scraped_at": "2026-10-21T07:26:49Z"
}
You pay per restaurant saved:
Example: 1,000 restaurants with 20 reviews each cost $4.50 in result fees. Platform usage (compute and proxy traffic) is billed on top and is small: in our tests 1,000 restaurants took about 2.5 minutes and about $0.04 of platform usage (15 MB of residential proxy traffic). Restaurants that are not found or fail are not charged.
Is it legal to scrape TheFork? The scraper collects only information that TheFork shows publicly to any visitor. You are responsible for how you use the data, especially reviewer names and any personal data under GDPR. Check TheFork's terms and your local laws for your use case.
Do I need a TheFork account, cookies or a proxy of my own? No. No login is needed. The run uses residential proxy exits in France by default because TheFork's bot protection refuses most datacenter addresses. If you pick datacenter and it is refused, the run switches to residential by itself.
How many restaurants can I get?
Every restaurant a search matches: TheFork lists over 3,000 restaurants for Paris alone. Set Max restaurants to 0 for no limit.
Why are some fields empty?
Restaurants fill their profiles differently. Opening hours, description, chef, parking, legal details or Tripadvisor scores are missing when the restaurant has not published them. Those fields are then null or an empty list.
Can I scrape all reviews of one restaurant? Yes. Paste the restaurant URL and set Max reviews as high as you need. Reviews beyond 100 per restaurant cost $2.99 per 1,000.
Can I schedule it or use it through the API? Yes. Save your input as a task, schedule it daily or weekly, and read the results through the API 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.
startUrlsarrayOptionalTheFork URLs
TheFork restaurant pages, city pages (e.g. /restaurants/paris-c415144), neighbourhood or cuisine pages, or search URLs, from any TheFork country site (thefork.com, .fr, .it, .es, .de, .nl, .ch, .be, .at, .pt, .se, .co.uk). Mix them freely.
searchLocationsarrayOptionalSearch locations
Alternatively, type a city, neighbourhood or address (e.g. Barcelona, Lyon 2e, Milano). Each location is looked up like on the site and its restaurants are scraped. Can be combined with URLs.
maxRestaurantsintegerOptionaldefault 20Max restaurants
How many restaurants to save in total across all inputs. 0 means no limit (every restaurant the searches match).
Filters apply to city, neighbourhood and search pages and to search locations. Single restaurant URLs are always scraped.
sortenumOptionaldefault "popularity"Sort by
Order of the search results (which restaurants come first when you set a limit).
cuisineTagIdsarrayOptionalCuisines
Only restaurants tagged with these cuisines. Leave empty for all cuisines.
minPriceintegerOptionalMin average price
Lowest average price per person, in the local currency (usually euros). Empty means no minimum.
maxPriceintegerOptionalMax average price
Highest average price per person, in the local currency. Empty means no maximum.
minRatingnumberOptionalMin rating
Lowest TheFork rating (10-point scale). Empty means no minimum.
maxRatingnumberOptionalMax rating
Highest TheFork rating (10-point scale). Empty means no maximum.
bestRatedbooleanOptionaldefault falseBest rated only
Only restaurants TheFork marks as best rated (9+).
promotionsOnlybooleanOptionaldefault falsePromotions only
Only restaurants with an active discount or deal.
searchRadiusKmintegerOptionaldefault 10Search radius (km)
Radius around an address or point typed in Search locations. Cities and neighbourhoods use their own boundaries and ignore it.
How much detail each restaurant gets.
maxReviewsintegerOptionaldefault 20Max reviews per restaurant
Newest reviews to include for each restaurant. 0 skips reviews. The first 100 reviews per restaurant are included in the restaurant price; reviews beyond 100 are charged separately.
reviewLanguageenumOptionaldefault "all"Review language
Only reviews written in this language, or all languages.
maxPhotosintegerOptionaldefault 20Max customer photos per restaurant
Diner photos to include per restaurant. 0 skips them. The restaurant's own photos are always included.
languageenumOptionaldefault "en"Output language
Language of cuisine names, tags, features and restaurant links in the results.
proxyobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy configuration
Proxy used to reach TheFork. The site's bot protection refuses most datacenter addresses, so residential exits in France are the default (they work for every TheFork country). If you pick datacenter and the site refuses it, the run switches to residential by itself.
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 |
|---|---|---|
| name | any | Name |
| url | any | URL |
| cuisine | any | Cuisine |
| avg_price | any | Avg price |
| avg_price_currency | any | Currency |
| thefork_rating | any | Rating |
| thefork_review_count | any | Ratings |
| locality | any | City |
| country | any | Country |
| formatted_address | any | Address |
| phone | any | Phone |
| is_bookable | any | Bookable |
| best_promotion_percentage | any | Best discount % |
| main_photo_url | any | Photo |
| reviews_scraped | any | Reviews saved |
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 |
|---|---|---|
| Extra review | One review beyond the first 100 of a restaurant (only when Max reviews is above 100). | $0.003 |
| Restaurant | One restaurant saved with ratings, prices, contact details, menus, photos and up to 100 reviews. | $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/thefork-scraper').call({
"startUrls": [
"https://www.thefork.com/restaurants/paris-c415144"
],
"maxRestaurants": 20,
"maxReviews": 20,
"proxy": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
],
"scrapelyProxyCountry": "FR"
}
})
// 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/thefork-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/thefork-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Type a city instead of a URL: the 10 most popular Barcelona restaurants with Spanish cuisine names and links.
Paris city page filtered to a rating of 9 or more and an average price up to 40 €, best rated first.
Two restaurant URLs from different TheFork country sites, with 10 reviews each and French output.
Restaurants in Milan that currently offer a discount, with Italian output.
One Barcelona restaurant with its 120 newest reviews (reviews beyond 100 are charged as extra reviews).
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.