Rappi Scraper - Restaurants, Menus & Stores
Pricing
from $2.20 / 1,000 results
Rappi Scraper - Restaurants, Menus & Stores
Collect Rappi restaurants, menus, store products and brand locations across nine Latin American markets. Pay per delivered row plus a start fee; export JSON, CSV or Excel.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
12
Total users
9
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Rappi Scraper
Extract Rappi restaurants, menus and stores across nine Latin American markets as rows you can export.
- Restaurant names, ratings, delivery fees and estimated delivery times.
- Optional menu items, topping options and store products as separate rows.
- Search results, brand locations and country, city, category and store-type discovery.
- Merchant addresses and coordinates when available, with reasons for missing contact fields.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a start fee.
What does Rappi Scraper do?
Rappi Scraper collects public marketplace data from Rappi country sites. It accepts Mexico (mx), Colombia (co), Argentina (ar), Brazil (br), Chile (cl), Peru (pe), Ecuador (ec), Uruguay (uy) and Costa Rica (cr). Availability varies by market and location. This Actor is unofficial and is not affiliated with Rappi.
- Lists:
restaurants,nearMe,category,searchandhomefind restaurants. - Details:
restaurantreads one restaurant;brandlists chain locations. - Stores:
storescollects shops in avertical, such asmarket. - Discovery:
discoverCountries,discoverCities,discoverCategoriesanddiscoverVerticalsreturn reference rows. - URLs:
startUrlsaccepts several supported Rappi links. - Optional rows:
includeMenuItems,includeToppingsandincludeProductsare off by default. Every added row is billed at the same rate as a restaurant row.
What data can you extract from Rappi?
Each row represents one entity. Fields vary by page; missing values can be empty or omitted. Child rows carry their parent store identity and available location fields, rather than hiding products inside a restaurant row.
Restaurant rows: restaurant
| Field | Description | Example |
|---|---|---|
rowType | Entity type | restaurant |
id | Entity identifier | 1923804381 |
storeId | Rappi restaurant identifier | 1923804381 |
name | Restaurant name | Example Restaurant |
url | Rappi listing link | https://www.rappi.com.mx/restaurantes/1923804381 |
country | Market code | mx |
brandId | Chain identifier, when present | 706 |
rating | Published rating | 4.5 |
eta | Estimated delivery time | 25–35 min |
deliveryCost | Published delivery fee | 25 |
hasFreeShipping | Free-delivery indication | true |
menuItemCount | Available menu count | 12 |
address | Merchant address object | {"locality":"Ciudad de México"} |
geo | Merchant coordinates | {"lat":19.426,"lng":-99.164} |
org | Merchant organization | {"name":"Example Restaurant"} |
phones | Published merchant phones | [] |
emails | Published merchant emails | [] |
leadAbsences | Reasons contact fields are missing | {"phones":"本站无"} |
The reason 本站无 means not published on the inspected page; 未验证 means unverified. Neither proves that the merchant has no contact details. person and web hold named contacts and merchant-owned links when available. Rappi's own contact details are not merchant contacts.
Store rows: store
| Field | Description | Example |
|---|---|---|
rowType | Shop entity | store |
storeId | Shop identifier | 12345 |
name | Shop name | Example Market |
url | Shop listing link | https://www.rappi.com.mx/tiendas/tipo/market |
Menu rows: menuItem
| Field | Description | Example |
|---|---|---|
rowType | Menu entity | menuItem |
productId | Menu product identifier | 123 |
name | Dish name | Pizza Margarita |
price | Published item price | 129 |
storeName | Parent restaurant | Example Restaurant |
Product rows: product
| Field | Description | Example |
|---|---|---|
rowType | Shop product entity | product |
productId | Product identifier | 456 |
name | Product name | Mineral water |
priceText | Price as displayed | $25.00 |
Topping rows: topping
| Field | Description | Example |
|---|---|---|
rowType | Topping option entity | topping |
optionId | Option identifier | 789 |
productId | Associated menu product | 123 |
name | Option name | Extra cheese |
Country rows: country
| Field | Description | Example |
|---|---|---|
rowType | Country reference | country |
country | Supported market code | mx |
url | Market website | https://www.rappi.com.mx/ |
City rows: city
| Field | Description | Example |
|---|---|---|
rowType | City reference | city |
citySlug | Supported city value | guadalajara |
name | City label | Guadalajara |
Category rows: category
| Field | Description | Example |
|---|---|---|
rowType | Category reference | category |
slug | Category value | pizza |
name | Category label | Pizza |
Store-type rows: vertical
| Field | Description | Example |
|---|---|---|
rowType | Store-type reference | vertical |
slug | Value for vertical | market |
name | Store-type label | market |
How to scrape Rappi
- Open Rappi Scraper in Apify Console.
- Leave
modeonauto; fill one target, such asquery. - Choose
countryand setmaxResultsto3. - Click Start and wait for completion.
- Open the dataset and download rows or read them through the API.
Empty input starts a Mexico pizza search capped at three rows. This example uses normal pricing. Filling one target selects its mode automatically. If targets conflict, precedence is startUrls, storeUrl, brandUrl, storeId, brandId, categorySlug, query, then citySlug.
Restaurant list: restaurants
Fill citySlug, or explicitly select restaurants for the market's default location.
Nearby restaurants: nearMe
Select nearMe and provide delivery lat and lng.
Category: category
Fill categorySlug, such as pizza, and optionally citySlug.
Restaurant detail: restaurant
Fill storeId or storeUrl. Enable includeMenuItems for menu rows. For menu rows from lists or search, use enrichMenus.
Stores: stores
Select stores and a vertical. Enable includeProducts for product rows.
Search: search
Fill query. Use Spanish search terms for Spanish-speaking markets or Portuguese for Brazil.
Home feed: home
Select home for restaurant and category entries; restaurant listings may be used when the feed is unavailable.
Brand locations: brand
Fill brandId or brandUrl; a chain's delivery page is not an individual restaurant menu.
Countries: discoverCountries
Select this mode for supported market references, not live availability guarantees.
Cities: discoverCities
Select this mode and country for the supported city list.
Categories: discoverCategories
Select this mode and country for available cuisine categories.
Store types: discoverVerticals
Select this mode and country for store types. Reference values may be returned when none are listed.
Multiple links: startUrls
Paste restaurant, category, search, brand or store-list URLs into startUrls.
What to fill in
| Field | What to enter | Default |
|---|---|---|
mode | Automatic selection or a mode above | auto |
country | Supported country code | mx |
query | One search phrase | Form example: pizza |
startUrls | List of Rappi URLs | Empty |
storeId, storeUrl | Restaurant ID or URL | Empty |
brandId, brandUrl | Brand ID or delivery URL | Empty |
storeSlug, brandSlug | Optional URL slug | Empty |
citySlug | Supported city slug | Market default location |
categorySlug | Cuisine/category slug | Empty |
vertical | Store type | market |
lat, lng | Delivery coordinates | Market default coordinates |
maxResults | Rows per input, 1–5000 | 70; form prefill 3 |
includeMenuItems | Add menu rows | false |
includeToppings | Add toppings; requires includeMenuItems | false |
includeProducts | Add store-product rows | false |
enrichDetails | Request available merchant address details | true |
enrichMenus | Add menu enrichment to lists | false |
maxEnrich | Stores to enrich, 0–50 | 5 |
cleanMenu | Remove promotional/fee entries | true |
freeDelivery | Keep free-delivery listings | Unset |
minRating | Minimum known rating; unrated rows remain | Unset |
openNow | Exclude listings marked closed | Unset |
turbo | Accepted for compatibility; does not enforce faster delivery | Unset |
filters | Filter keys, e.g. discounts, new | Empty |
maxPages | Legacy page setting; row collection follows maxResults | 1 |
cursor | Returned nextCursor object; normally leave empty | Empty |
proxyCountry | Advanced country override; normally leave empty | Selected country |
Examples, one per mode:
Restaurants
{"mode":"restaurants","country":"mx","citySlug":"guadalajara","maxResults":3}
Nearby
{"mode":"nearMe","country":"mx","lat":19.425877,"lng":-99.164086,"maxResults":3}
Category
{"categorySlug":"pizza","country":"mx","maxResults":3}
Restaurant and menu
{"storeId":"1923804381","country":"mx","includeMenuItems":true,"maxResults":3}
Stores and products
{"mode":"stores","country":"mx","vertical":"market","includeProducts":true,"maxResults":3}
Search
{"query":"açaí","country":"br","maxResults":3}
Home
{"mode":"home","country":"mx","maxResults":3}
Brand
{"brandId":"706","brandSlug":"mcdonalds","country":"mx","maxResults":3}
Countries
{"mode":"discoverCountries","maxResults":3}
Cities
{"mode":"discoverCities","country":"br","maxResults":3}
Categories
{"mode":"discoverCategories","country":"mx","maxResults":3}
Store types
{"mode":"discoverVerticals","country":"mx","maxResults":3}
URLs
{"startUrls":["https://www.rappi.com.mx/restaurantes/1923804381"],"maxResults":3}
maxItemsandlimitare aliases formaxResults.- Unknown fields are ignored with a note; close misspellings can be corrected automatically.
- Invalid targets or country values fail before row delivery with
INVALID_INPUT: <field> — <how to fix>. No result rows are charged; the start fee still applies. INPUT_REPORTin the default key-value store records filled, inferred, corrected and ignored fields.- Legacy modes such as
list,menuandchainremain accepted. Explicitrestaurantwithout a target usesstoreId1923804381; explicitsearchwithout a query usespizza.
Output example
Illustrative restaurant row; values vary with the source:
{"rowType": "restaurant","id": "1923804381","storeId": "1923804381","name": "Example Restaurant","country": "mx","url": "https://www.rappi.com.mx/restaurantes/1923804381","rating": 4.5,"eta": "25–35 min","deliveryCost": 25,"phones": [],"emails": []}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY reports delivered rows; INPUT_ECHO shows interpreted input and ERROR_SUMMARY describes failures.
Why use this Rappi scraper?
- Comparable rows: join menu products to their restaurant using
storeId. - Pay per delivered row: unavailable pages do not become billable result rows.
- Saved results: rows already written remain available after a stop; unfinished collection is not guaranteed to be delivered.
- Visible gaps: missing merchant details remain empty rather than invented.
- Several inputs: submit multiple links with
startUrls. - No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Rappi?
The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. Default memory is 1024 MB, so one start event costs $0.005. Platform usage is included in these prices.
| Apify plan | Start at 1024 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
maxResults applies to each input, defaults to 70, and larger requests are collected in parts of 70. All row types share that input's allowance. Menu items, toppings and products are not free extras. Free-plan users have a limit of 200 rows per run and 10 total runs of this Actor.
The whole run stops at Maximum cost per run, named maxTotalChargeUsd in the API. Example: three URLs delivering 50 rows each produce 150 rows. On the Free plan, one start at 1024 MB plus 150 × $0.003 costs $0.455.
What happens when the run timeout is too short
When collection needs longer than your selected timeout, the run can pause with status ABORTED and the message: "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." This pause is not a collection failure.
When results are ready, the same run resumes, reports "Resumed: delivering N rows.", writes to the same dataset and finishes as SUCCEEDED. Already delivered rows are skipped, so they are not delivered or charged twice. This can happen at most three times per run. Keep the default timeout of 3600 seconds to reduce pauses.
The synchronous endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return an empty dataset during a pause. For longer requests, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server to Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/rappi-scraper
Sign in with Apify using OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool returns run and dataset IDs; read the rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/rappi-scraper with APIFY_TOKEN.
Example prompt: "Find three Rappi pizza restaurants in Mexico using query and maxResults=3; return their names and listing URLs."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/rappi-scraper").call(run_input={"query": "pizza", "country": "mx", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/rappi-scraper').call({query: 'pizza', country: 'mx', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send input JSON to POST https://api.apify.com/v2/acts/lentic_clockss~rappi-scraper/runs with your token in the Authorization: Bearer header. After success, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json. If a waiting SDK call returns during a pause, follow the asynchronous workflow above.
Integrations
Use the Actor's Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Apify Schedules can run saved inputs regularly.
En español
Este Actor recopila restaurantes, tiendas y menús públicos de Rappi en nueve mercados latinoamericanos. Para empezar, escribe una búsqueda en query, elige country y limita maxResults a tres filas. Si tienes un enlace, utiliza storeUrl o startUrls; el modo se selecciona automáticamente. Activa includeMenuItems solo si necesitas los platos como filas adicionales. Los productos y las opciones de ingredientes también cuentan para el límite y se cobran por fila, igual que los restaurantes. Hay además un cargo de inicio. La disponibilidad cambia según la ciudad y el comercio. Los teléfonos y correos no están garantizados: revisa leadAbsences cuando falten datos. Puedes descargar los resultados en CSV, Excel o JSON.
FAQ
Is it legal to scrape Rappi?
This Actor is intended for public data. You are responsible for Rappi's terms and applicable data-protection law. Processing personal data requires a lawful basis; public availability alone does not establish one.
Why did my run end as ABORTED?
Check the status message. A queued automatic-resume message means a temporary pause; a manual abort is different and does not promise automatic completion.
How many results can I get?
Request up to 5000 rows per input. Actual delivery depends on availability, optional rows and your spending limit. Free-plan caps still apply.
Why are some fields empty?
Pages expose different details. Missing ratings, unavailable menus and failed detail enrichment can leave gaps. Contact fields are not guaranteed.
Can I collect an entire restaurant menu?
Enable includeMenuItems, but no more than 25 child rows per store are emitted. Menu items and toppings share that cap and the input's maxResults.
What is the difference between a brand and a restaurant?
A delivery-brand link lists chain locations. A restaurant link identifies one store and its menu. Use brandId for the former and storeId for the latter.
Does this include other food-delivery platforms?
No. This Actor handles Rappi country sites only. Use the dedicated products below for other platforms.
Limitations
- Nine markets are configured; not every mode or merchant is available in every market.
- City discovery is a supported-location list, not a complete directory of every served address. Unknown city slugs can fall back to the market default.
- Unrated restaurants can remain under
minRating; missing opening status can remain underopenNow. Other filters depend on available source flags. - No guarantee of merchant phones, emails, named contacts or websites; inspect missing-field reasons.
- No login-only RappiPrime prices, checkout actions, travel bookings or RappiCard data.
- Optional menu and product collection can take longer and return fewer rows than requested.
Related scrapers
More food delivery and grocery scrapers from the same publisher:
- Grab Scraper
- iFood Scraper
- PedidosYa Scraper
- Uber Eats Scraper
- Deliveroo Scraper
- Foodora Scraper
- Foodpanda Scraper
- DoorDash Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.