# Rappi Scraper: Colombia Restaurants, Menus & Prices API (`scrapers_lat/rappi-scraper`) Actor

Scrape Rappi Colombia restaurants, stores and full menus. Extract store name, cuisine, rating, reviews, delivery time and fee, address, geo, promotions plus menu items with price, discount, description and image. Search by city, category or query. Export JSON, CSV, Excel.

- **URL**: https://apify.com/scrapers\_lat/rappi-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $6.15 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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

[![Rappi Scraper: Colombia Restaurants, Menus & Prices](https://scrapers.lat/banners/rappi-scraper.png)](https://console.apify.com/actors/NkcSOhfMFl8lo20xc/input)

## Rappi Scraper: Colombia Restaurants, Menus & Prices

The most complete **Rappi scraper** for Colombia. Extract restaurants and stores from Rappi with full **menus, prices and discounts**, ratings, delivery fees, promotions, opening hours and geo coordinates. A fast HTTP **Rappi API** alternative for **food delivery data** in Latin America, with filters for city, cuisine category, rating, free delivery, Rappi Prime and a free-text search query.

Ideal for restaurant price monitoring, menu and product catalogs, food delivery market research, competitor analysis and lead lists of restaurants in Bogota, Medellin, Cali and Barranquilla.

**📥 [Input](https://apify.com/scrapers_lat/rappi-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/rappi-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/rappi-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/rappi-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Colombia-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Keywords](#keywords)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Why this Rappi scraper](#why-this-rappi-scraper)
- [Use cases](#use-cases)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

This actor opens the Rappi restaurant listing for the Colombian city you choose, applies your optional search query, cuisine category, rating, free-delivery and Rappi Prime filters, paginates through the matching stores, and writes one normalized record per store to the dataset. When menu enrichment is on, each store is enriched with its full menu (products with name, price, discounted price, description and image), weekly opening hours, payment methods and geo coordinates.

Delivery fees and prices are returned in COP, coordinates are captured for every store, and promotions are returned as structured objects. You can also pass a single store URL or store ID to scrape just that restaurant.

Coverage is Colombia (`country: CO`) across Bogota, Medellin, Cali and Barranquilla, the markets Rappi serves most reliably over HTTP.

### Keywords

Rappi scraper, Rappi API, Rappi restaurants data, Rappi menu scraper, Rappi menu prices, food delivery data, food delivery scraper LatAm, Rappi Colombia, restaurant menu prices, delivery data, Rappi Bogota, Rappi Medellin, scraper de Rappi, datos de restaurantes Rappi, menus y precios de Rappi, datos de delivery, API de Rappi, restaurantes Rappi Colombia.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns stores in Bogota with full menus and hours.

```json
{
  "country": "CO",
  "city": "Bogotá",
  "maxStores": 10,
  "withDetails": true,
  "query": "sushi"
}
```

Set `withDetails` to `false` for faster listing-only runs without menus. Add `category` (for example `Hamburguesa`), `minRating`, `freeDeliveryOnly` or `primeOnly` to narrow the results. Only `country` is required.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `country` | enum | yes | `CO` | Rappi country to scrape. Currently `CO` (Colombia). Sets the domain, language and proxy country. |
| `city` | enum | no | `Bogotá` | City within Colombia: `Bogotá`, `Medellín`, `Cali`, or `Barranquilla`. |
| `query` | string | no | (empty) | Free-text search matched against each store name, brand and cuisine tags, for example `sushi`, `mcdonalds`, `vegano`. |
| `category` | string | no | (any) | Filter stores by cuisine category name, for example `Hamburguesa`, `Pizza`, `Sushi`, `Pollo`, `Saludable`, `Desayunos`. |
| `minRating` | number | no | (any) | Only return stores with a rating at or above this value (0 to 5), for example `4.5`. |
| `freeDeliveryOnly` | boolean | no | `false` | Only return stores with a $0 delivery fee. |
| `primeOnly` | boolean | no | `false` | Only return stores advertising a Rappi Prime / prime-exclusive offer. |
| `maxStores` | integer | no | `10` | Maximum number of stores to collect. |
| `withDetails` | boolean | no | `true` | Enrich each store with its full menu, hours, payment methods and geo. Paid plans only. |
| `startUrl` | string | no | (empty) | A single Rappi store page URL or a bare numeric store ID. When set, only that store is scraped. |

Filters combine with logical AND.

### Output reference

One dataset item per store. Types: `string`, `integer`, `number`, `boolean`, `object[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Store logo image URL. |
| `name` | string | Store display name. |
| `url` | string | Canonical store page URL on rappi.com.co. |
| `storeId` | string | Rappi store ID (unique per store). |
| `brandName` | string | Brand name of the store. |
| `brandId` | string | Brand ID. |
| `superStoreId` | string | Parent super-store ID. |
| `storeType` | string | Store type, for example `restaurant`. |
| `partnerType` | string | Partner type, for example `restaurant`. |
| `tier` | string | Store tier, for example `standard`. |
| `category` | string | Comma-separated cuisine category tags. |
| `rating` | number | Store rating, 0 to 5, or `null`. |
| `reviewCount` | integer | Number of customer reviews. |
| `rappiScore` | number | Internal Rappi quality score, or `null`. |
| `deliveryTime` | string | Human-readable delivery estimate, for example `29 min`. |
| `etaMinutes` | integer | Delivery estimate in minutes. |
| `deliveryFee` | integer | Delivery fee in COP. |
| `deliveryMethods` | string\[] | Available delivery methods, for example `["delivery", "pickup"]`. |
| `promoLabel` | string | Short promotion label shown on the card, or `null`. |
| `promotions` | object\[] | Structured promotions (type, label, title, value, prime flag, min amount, expiry). |
| `isMarketplace` | boolean | Whether the store is a Rappi marketplace store. |
| `isNew` | boolean | Whether the store is flagged as new. |
| `topPerformer` | boolean | Whether the store is flagged as a top performer. |
| `recommended` | boolean | Whether the store is recommended. |
| `hasVouchers` | boolean | Whether vouchers are available. |
| `hasBioPackaging` | boolean | Whether the store uses eco-friendly packaging. |
| `address` | string | Store address. |
| `detailAddress` | string | Detailed store address (from the store detail), or `null`. |
| `city` | string | City name. |
| `country` | string | Country name. |
| `status` | string | Store status, for example `OPEN`. |
| `isOpen` | boolean | Whether the store is currently open. |
| `openSoon` | boolean | Whether the store opens soon. |
| `openTimeToday` | string | Today opening time, or `null`. |
| `closeTimeToday` | string | Today closing time, or `null`. |
| `isExclusive` | boolean | Whether the store is a Rappi exclusive. |
| `backgroundImage` | string | Store banner image URL. |
| `currencyCode` | string | Currency of monetary fields. `COP` for Colombia. |
| `minimumOrderValue` | integer | Minimum order value in COP, or `null`. |
| `distanceMeters` | integer | Distance to the store in meters, or `null`. |
| `freeDelivery` | boolean | Whether delivery is currently free. |
| `storeLat` | number | Store latitude, or `null`. |
| `storeLng` | number | Store longitude, or `null`. |
| `serviceFeePercentage` | number | Service fee percentage, or `null`. |
| `hasPickup` | boolean | Whether in-store pickup is available. |
| `paymentMethods` | string\[] | Accepted payment methods, or `null`. |
| `dietaryRestrictions` | object\[] | Dietary restriction tags, or `null`. |
| `productCount` | integer | Number of products in the menu (with details on). |
| `hours` | object\[] | Weekly opening hours (day, open, close) with details on. |
| `menu` | object\[] | Full menu with details on. See fields below. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run a single item with a populated `error` is written. |

Each `menu` item has: `name`, `category`, `productId`, `productCategoryId`, `price`, `realPrice`, `minimumPrice`, `discountPercentage`, `hasDiscount`, `available`, `isPopular`, `unitsSold`, `hasModifiers`, `hasUpsell`, `dietaryTags`, `description`, `image`, and `modifiers` (option/topping groups with option SKUs and prices) when Rappi exposes them.

### Example output record

Real record from a live run (input `{"country":"CO","city":"Bogotá","query":"sushi","maxStores":2,"withDetails":true}`). The `menu` array is trimmed to 1 of 39 real items for readability; the live record contains the full menu.

```json
{
  "imageUrl": "https://images.rappi.com/restaurants_logo/900176455_1631558746119.png",
  "name": "Xibo - Avenida Chile",
  "url": "https://www.rappi.com.co/restaurantes/delivery/900176455-xibo",
  "storeId": "900176455",
  "brandName": "Xibo",
  "brandId": "8145",
  "superStoreId": "900176452",
  "storeType": "restaurant",
  "partnerType": "restaurant",
  "tier": "standard",
  "category": "Sushi, Pescados y Mariscos",
  "rating": 4.7,
  "reviewCount": 320,
  "rappiScore": 92,
  "deliveryTime": "45 min",
  "etaMinutes": 45,
  "deliveryFee": 4500,
  "deliveryMethods": ["delivery", "pickup"],
  "promoLabel": "Hasta 18% Off",
  "promotions": [
    {
      "type": "offer_by_product",
      "label": "Hasta 18% Off",
      "title": "Exclusivo Pro 18 % Off Bowl Pollo Naranja",
      "value": 18,
      "isPrimeExclusive": true,
      "minAmount": null,
      "expiresAt": "2027-06-13 00:00:00"
    }
  ],
  "address": "Cl 72 #10-34 Local 410A, Centro Comercial Avenida Chile, Bogotá",
  "city": "Bogotá",
  "country": "Colombia",
  "status": "OPEN",
  "isOpen": true,
  "openTimeToday": "00:00:00",
  "closeTimeToday": "23:59:00",
  "isExclusive": true,
  "currencyCode": "COP",
  "distanceMeters": 0,
  "freeDelivery": false,
  "storeLat": 4.6570332,
  "storeLng": -74.0576691,
  "hasPickup": true,
  "productCount": 39,
  "hours": [{ "day": "fri", "open": "00:00:00", "close": "23:59:00" }],
  "menu": [
    {
      "name": "Combo 20 bocados de Locura",
      "category": "Promos",
      "productId": "4908038",
      "productCategoryId": "336004",
      "price": 68600,
      "realPrice": 68600,
      "minimumPrice": null,
      "discountPercentage": 12,
      "hasDiscount": false,
      "available": true,
      "isPopular": true,
      "unitsSold": 140,
      "hasModifiers": true,
      "hasUpsell": false,
      "dietaryTags": null,
      "description": "5 bocados Camarón Dinamita + 5 bocados Salmón Apanado + 10 bocados California.",
      "image": "https://images.rappi.com/products/example.jpeg"
    }
  ],
  "observedAt": "2026-09-04T06:58:54.756Z",
  "error": null
}
```

### Why this Rappi scraper

- **Strict superset of other Rappi scrapers.** Accepts every input other actors take (country, city, search query, store URL or ID, category, max results) and returns every field they return plus extras.
- **Extra fields you will not find elsewhere:** structured promotions with expiry and Prime flags, menu modifier and topping groups with option SKUs and prices, `rappiScore`, `serviceFeePercentage`, `paymentMethods`, `hasPickup`, `hasBioPackaging`, `hasVouchers`, `superStoreId`, `openTimeToday` and `closeTimeToday`, plus product popularity (`isPopular`, `unitsSold`).
- **Real coordinates on every store**, even on fast listing-only runs.
- **Honest nulls.** Missing source values are returned as `null`, never invented.
- **Reliable HTTP transport** with a Colombia-matched residential proxy, no headless browser, no charge on failure.

### Use cases

- Track restaurant and product **menu prices and discounts** over time.
- Build a **food delivery dataset** of restaurants, cuisines, ratings and delivery fees.
- Monitor **promotions** and Rappi Prime exclusive offers across a city.
- Competitor menu and pricing analysis for restaurants and dark kitchens.
- Lead lists of restaurants with address, geo, delivery methods and contact-ready store pages.

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~rappi-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"country":"CO","city":"Bogotá","maxStores":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~rappi-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"country":"CO","city":"Medellín","query":"hamburguesa","minRating":4.5,"maxStores":50}'
```

Apify CLI:

```bash
apify call scrapers_lat/rappi-scraper \
  --input '{"country":"CO","startUrl":"https://www.rappi.com.co/restaurantes/delivery/900176455-xibo"}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=500&limit=500"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per store record returned (the `result` event). Menu enrichment adds a `details` event on top, charged only when the menu is actually fetched. See the [pricing tab](https://apify.com/scrapers_lat/rappi-scraper/pricing).
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 stores per run and return listing-only records. Menu enrichment (`withDetails`) is a paid add-on. Upgrade for full menus and higher `maxStores`.
- **Menu enrichment is slower.** With `withDetails` on, each store is fetched individually. Turn it off for faster listing-only runs.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The filter combination matched no stores in that city. Loosen the filters (remove `query` or `category`, lower `minRating`, or turn off `freeDeliveryOnly` / `primeOnly`). Zero-result runs are not charged.

**Which cities and countries are supported?**
Colombia (`country: CO`) across Bogota, Medellin, Cali and Barranquilla. These are the markets Rappi serves most reliably over HTTP.

**How do I scrape a single restaurant?**
Pass its store page URL or bare store ID in `startUrl`. Only that store is scraped, with its full menu when `withDetails` is on.

**Why are some prices or fields null?**
Not every store reports a minimum order value, distance, service fee or payment methods, and some menu items have no discount. Missing source values are returned as `null`, never invented.

**Can I get menus without opening hours, or vice versa?**
Both come together when `withDetails` is on. Set `withDetails` to `false` to return only listing-level fields.

**Is this an official Rappi tool?**
No. This actor is independent and has no affiliation with Rappi. It reads only data that is publicly available on rappi.com.co.

### Related scrapers

- [Adondevivir Peru Real Estate Scraper](https://apify.com/scrapers_lat/adondevivir-scraper): Peru property listings for sale and rent.
- [QuintoAndar Brazil Real Estate Scraper](https://apify.com/scrapers_lat/quintoandar-scraper): Brazil real-estate listings for rent and sale.
- [MercadoLibre Scraper](https://apify.com/scrapers_lat/mercadolibre-scraper): MercadoLibre product listings across Latin America.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

[![Rappi Scraper: Restaurantes, Menus y Precios de Colombia](https://scrapers.lat/banners/rappi-scraper.png)](https://console.apify.com/actors/NkcSOhfMFl8lo20xc/input)

## Rappi Scraper: Restaurantes, Menus y Precios de Colombia

El **scraper de Rappi** mas completo para Colombia. Extrae restaurantes y tiendas de Rappi con **menus, precios y descuentos** completos, calificaciones, costos de envio, promociones, horarios y coordenadas. Una alternativa rapida de **API de Rappi** para obtener **datos de delivery** en America Latina, con filtros por ciudad, categoria de cocina, calificacion, envio gratis, Rappi Prime y una busqueda de texto libre.

Ideal para el monitoreo de precios de restaurantes, catalogos de menus y productos, investigacion de mercado de delivery, analisis de competidores y listas de restaurantes en Bogota, Medellin, Cali y Barranquilla.

**📥 [Entrada](https://apify.com/scrapers_lat/rappi-scraper/input-schema) · 📤 [Salida](https://apify.com/scrapers_lat/rappi-scraper/output-schema) · 💰 [Precios](https://apify.com/scrapers_lat/rappi-scraper/pricing) · ▶️ [Ejemplos](https://apify.com/scrapers_lat/rappi-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Cobertura](https://img.shields.io/badge/Cobertura-Colombia-blue)
![Salida](https://img.shields.io/badge/Salida-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Facturacion](https://img.shields.io/badge/Facturacion-Pago%20por%20resultado-brightgreen)

### Tabla de contenido

- [Que hace](#que-hace)
- [Palabras clave](#palabras-clave)
- [Inicio rapido](#inicio-rapido)
- [Referencia de entrada](#referencia-de-entrada)
- [Referencia de salida](#referencia-de-salida)
- [Ejemplo de registro de salida](#ejemplo-de-registro-de-salida)
- [Por que este scraper de Rappi](#por-que-este-scraper-de-rappi)
- [Casos de uso](#casos-de-uso)
- [Ejecutar via API y CLI](#ejecutar-via-api-y-cli)
- [Obtener resultados](#obtener-resultados)
- [Facturacion y limites](#facturacion-y-limites)
- [Preguntas frecuentes](#preguntas-frecuentes)

### Que hace

Este actor abre el listado de restaurantes de Rappi para la ciudad de Colombia que elijas, aplica tu busqueda de texto y tus filtros opcionales de categoria de cocina, calificacion, envio gratis y Rappi Prime, recorre las tiendas que coinciden y escribe un registro normalizado por tienda en el dataset. Cuando el enriquecimiento de menu esta activo, cada tienda se enriquece con su menu completo (productos con nombre, precio, precio con descuento, descripcion e imagen), horarios semanales, metodos de pago y coordenadas.

Los costos de envio y los precios se devuelven en COP, se capturan coordenadas para cada tienda y las promociones se devuelven como objetos estructurados. Tambien puedes pasar la URL o el ID de una tienda para extraer solo ese restaurante.

La cobertura es Colombia (`country: CO`) en Bogota, Medellin, Cali y Barranquilla, los mercados que Rappi sirve de forma mas confiable por HTTP.

### Palabras clave

scraper de Rappi, API de Rappi, datos de restaurantes Rappi, scraper de menus de Rappi, precios de menu de Rappi, datos de delivery, scraper de delivery LatAm, Rappi Colombia, precios de menu de restaurante, datos de reparto, Rappi Bogota, Rappi Medellin, Rappi scraper, Rappi API, Rappi restaurants data, Rappi menu prices, food delivery data.

### Inicio rapido

Abre el actor, pega esto en la entrada y presiona Ejecutar. Devuelve tiendas en Bogota con menus y horarios completos.

```json
{
  "country": "CO",
  "city": "Bogotá",
  "maxStores": 10,
  "withDetails": true,
  "query": "sushi"
}
```

Pon `withDetails` en `false` para ejecuciones mas rapidas solo de listado, sin menus. Agrega `category` (por ejemplo `Hamburguesa`), `minRating`, `freeDeliveryOnly` o `primeOnly` para acotar los resultados. Solo `country` es obligatorio.

### Referencia de entrada

| Campo | Tipo | Obligatorio | Predeterminado | Descripcion |
|---|---|---|---|---|
| `country` | enum | si | `CO` | Pais de Rappi a extraer. Actualmente `CO` (Colombia). Define el dominio, el idioma y el pais del proxy. |
| `city` | enum | no | `Bogotá` | Ciudad dentro de Colombia: `Bogotá`, `Medellín`, `Cali` o `Barranquilla`. |
| `query` | string | no | (vacio) | Busqueda de texto libre contra el nombre, la marca y las etiquetas de cocina de cada tienda, por ejemplo `sushi`, `mcdonalds`, `vegano`. |
| `category` | string | no | (cualquiera) | Filtra tiendas por categoria de cocina, por ejemplo `Hamburguesa`, `Pizza`, `Sushi`, `Pollo`, `Saludable`, `Desayunos`. |
| `minRating` | number | no | (cualquiera) | Solo devuelve tiendas con una calificacion igual o superior a este valor (0 a 5), por ejemplo `4.5`. |
| `freeDeliveryOnly` | boolean | no | `false` | Solo devuelve tiendas con costo de envio de $0. |
| `primeOnly` | boolean | no | `false` | Solo devuelve tiendas que anuncian una oferta Rappi Prime o exclusiva de Prime. |
| `maxStores` | integer | no | `10` | Numero maximo de tiendas a recolectar. |
| `withDetails` | boolean | no | `true` | Enriquece cada tienda con su menu completo, horarios, metodos de pago y geo. Solo planes pagos. |
| `startUrl` | string | no | (vacio) | La URL de una tienda de Rappi o un ID numerico de tienda. Si se define, solo se extrae esa tienda. |

Los filtros se combinan con logica AND.

### Referencia de salida

Un elemento del dataset por tienda. Tipos: `string`, `integer`, `number`, `boolean`, `object[]`, o `null` cuando el valor de origen no existe.

| Campo | Tipo | Descripcion |
|---|---|---|
| `imageUrl` | string | URL del logo de la tienda. |
| `name` | string | Nombre de la tienda. |
| `url` | string | URL canonica de la tienda en rappi.com.co. |
| `storeId` | string | ID de tienda de Rappi (unico por tienda). |
| `brandName` | string | Nombre de la marca de la tienda. |
| `brandId` | string | ID de la marca. |
| `superStoreId` | string | ID de la super-tienda padre. |
| `storeType` | string | Tipo de tienda, por ejemplo `restaurant`. |
| `partnerType` | string | Tipo de socio, por ejemplo `restaurant`. |
| `tier` | string | Nivel de la tienda, por ejemplo `standard`. |
| `category` | string | Etiquetas de categoria de cocina separadas por comas. |
| `rating` | number | Calificacion de la tienda, 0 a 5, o `null`. |
| `reviewCount` | integer | Numero de resenas de clientes. |
| `rappiScore` | number | Puntaje interno de calidad de Rappi, o `null`. |
| `deliveryTime` | string | Estimacion de entrega legible, por ejemplo `29 min`. |
| `etaMinutes` | integer | Estimacion de entrega en minutos. |
| `deliveryFee` | integer | Costo de envio en COP. |
| `deliveryMethods` | string\[] | Metodos de entrega disponibles, por ejemplo `["delivery", "pickup"]`. |
| `promoLabel` | string | Etiqueta corta de promocion en la tarjeta, o `null`. |
| `promotions` | object\[] | Promociones estructuradas (tipo, etiqueta, titulo, valor, indicador Prime, monto minimo, vencimiento). |
| `isMarketplace` | boolean | Si la tienda es un marketplace de Rappi. |
| `isNew` | boolean | Si la tienda esta marcada como nueva. |
| `topPerformer` | boolean | Si la tienda esta marcada como destacada. |
| `recommended` | boolean | Si la tienda esta recomendada. |
| `hasVouchers` | boolean | Si hay cupones disponibles. |
| `hasBioPackaging` | boolean | Si la tienda usa empaque ecologico. |
| `address` | string | Direccion de la tienda. |
| `detailAddress` | string | Direccion detallada (desde el detalle de la tienda), o `null`. |
| `city` | string | Nombre de la ciudad. |
| `country` | string | Nombre del pais. |
| `status` | string | Estado de la tienda, por ejemplo `OPEN`. |
| `isOpen` | boolean | Si la tienda esta abierta actualmente. |
| `openSoon` | boolean | Si la tienda abre pronto. |
| `openTimeToday` | string | Hora de apertura de hoy, o `null`. |
| `closeTimeToday` | string | Hora de cierre de hoy, o `null`. |
| `isExclusive` | boolean | Si la tienda es exclusiva de Rappi. |
| `backgroundImage` | string | URL de la imagen de banner de la tienda. |
| `currencyCode` | string | Moneda de los campos monetarios. `COP` para Colombia. |
| `minimumOrderValue` | integer | Pedido minimo en COP, o `null`. |
| `distanceMeters` | integer | Distancia a la tienda en metros, o `null`. |
| `freeDelivery` | boolean | Si el envio es gratis actualmente. |
| `storeLat` | number | Latitud de la tienda, o `null`. |
| `storeLng` | number | Longitud de la tienda, o `null`. |
| `serviceFeePercentage` | number | Porcentaje de tarifa de servicio, o `null`. |
| `hasPickup` | boolean | Si hay recogida en tienda disponible. |
| `paymentMethods` | string\[] | Metodos de pago aceptados, o `null`. |
| `dietaryRestrictions` | object\[] | Etiquetas de restricciones dieteticas, o `null`. |
| `productCount` | integer | Numero de productos del menu (con detalles activados). |
| `hours` | object\[] | Horarios semanales (dia, apertura, cierre) con detalles activados. |
| `menu` | object\[] | Menu completo con detalles activados. Ver campos abajo. |
| `observedAt` | string | Marca de tiempo ISO 8601 de cuando se recolecto el registro. |
| `error` | string | `null` en exito. En una ejecucion fallida se escribe un unico elemento con `error`. |

Cada elemento de `menu` tiene: `name`, `category`, `productId`, `productCategoryId`, `price`, `realPrice`, `minimumPrice`, `discountPercentage`, `hasDiscount`, `available`, `isPopular`, `unitsSold`, `hasModifiers`, `hasUpsell`, `dietaryTags`, `description`, `image`, y `modifiers` (grupos de opciones o toppings con SKU y precios) cuando Rappi los expone.

### Ejemplo de registro de salida

Registro real de una ejecucion en vivo (entrada `{"country":"CO","city":"Bogotá","query":"sushi","maxStores":2,"withDetails":true}`). El arreglo `menu` esta recortado a 1 de 39 elementos reales para legibilidad; el registro en vivo contiene el menu completo.

```json
{
  "imageUrl": "https://images.rappi.com/restaurants_logo/900176455_1631558746119.png",
  "name": "Xibo - Avenida Chile",
  "url": "https://www.rappi.com.co/restaurantes/delivery/900176455-xibo",
  "storeId": "900176455",
  "brandName": "Xibo",
  "brandId": "8145",
  "superStoreId": "900176452",
  "storeType": "restaurant",
  "partnerType": "restaurant",
  "tier": "standard",
  "category": "Sushi, Pescados y Mariscos",
  "rating": 4.7,
  "reviewCount": 320,
  "rappiScore": 92,
  "deliveryTime": "45 min",
  "etaMinutes": 45,
  "deliveryFee": 4500,
  "deliveryMethods": ["delivery", "pickup"],
  "promoLabel": "Hasta 18% Off",
  "promotions": [
    {
      "type": "offer_by_product",
      "label": "Hasta 18% Off",
      "title": "Exclusivo Pro 18 % Off Bowl Pollo Naranja",
      "value": 18,
      "isPrimeExclusive": true,
      "minAmount": null,
      "expiresAt": "2027-06-13 00:00:00"
    }
  ],
  "address": "Cl 72 #10-34 Local 410A, Centro Comercial Avenida Chile, Bogotá",
  "city": "Bogotá",
  "country": "Colombia",
  "status": "OPEN",
  "isOpen": true,
  "openTimeToday": "00:00:00",
  "closeTimeToday": "23:59:00",
  "isExclusive": true,
  "currencyCode": "COP",
  "distanceMeters": 0,
  "freeDelivery": false,
  "storeLat": 4.6570332,
  "storeLng": -74.0576691,
  "hasPickup": true,
  "productCount": 39,
  "hours": [{ "day": "fri", "open": "00:00:00", "close": "23:59:00" }],
  "menu": [
    {
      "name": "Combo 20 bocados de Locura",
      "category": "Promos",
      "productId": "4908038",
      "productCategoryId": "336004",
      "price": 68600,
      "realPrice": 68600,
      "minimumPrice": null,
      "discountPercentage": 12,
      "hasDiscount": false,
      "available": true,
      "isPopular": true,
      "unitsSold": 140,
      "hasModifiers": true,
      "hasUpsell": false,
      "dietaryTags": null,
      "description": "5 bocados Camarón Dinamita + 5 bocados Salmón Apanado + 10 bocados California.",
      "image": "https://images.rappi.com/products/example.jpeg"
    }
  ],
  "observedAt": "2026-09-04T06:58:54.756Z",
  "error": null
}
```

### Por que este scraper de Rappi

- **Superconjunto estricto de otros scrapers de Rappi.** Acepta toda entrada que aceptan otros actores (pais, ciudad, busqueda, URL o ID de tienda, categoria, maximo de resultados) y devuelve todos sus campos mas extras.
- **Campos extra que no encontraras en otros:** promociones estructuradas con vencimiento e indicadores Prime, grupos de opciones y toppings del menu con SKU y precios, `rappiScore`, `serviceFeePercentage`, `paymentMethods`, `hasPickup`, `hasBioPackaging`, `hasVouchers`, `superStoreId`, `openTimeToday` y `closeTimeToday`, y popularidad de productos (`isPopular`, `unitsSold`).
- **Coordenadas reales en cada tienda**, incluso en ejecuciones rapidas solo de listado.
- **Nulos honestos.** Los valores de origen ausentes se devuelven como `null`, nunca inventados.
- **Transporte HTTP confiable** con un proxy residencial de Colombia, sin navegador headless y sin cobro por fallas.

### Casos de uso

- Seguir **precios y descuentos de menu** de restaurantes y productos en el tiempo.
- Construir un **dataset de delivery** de restaurantes, cocinas, calificaciones y costos de envio.
- Monitorear **promociones** y ofertas exclusivas de Rappi Prime en una ciudad.
- Analisis de menu y precios de competidores para restaurantes y dark kitchens.
- Listas de restaurantes con direccion, geo, metodos de entrega y paginas de tienda.

### Ejecutar via API y CLI

Inicia una ejecucion y espera a que termine, luego lee el dataset. Reemplaza `<TOKEN>` con tu token de API de Apify.

Ejecuta de forma sincrona y obten los elementos del dataset en una sola llamada:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~rappi-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"country":"CO","city":"Bogotá","maxStores":25,"withDetails":true}'
```

Inicia una ejecucion de forma asincrona:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~rappi-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"country":"CO","city":"Medellín","query":"hamburguesa","minRating":4.5,"maxStores":50}'
```

Apify CLI:

```bash
apify call scrapers_lat/rappi-scraper \
  --input '{"country":"CO","startUrl":"https://www.rappi.com.co/restaurantes/delivery/900176455-xibo"}'
```

### Obtener resultados

Cada ejecucion escribe en un dataset. Obten los elementos como JSON, CSV o Excel cambiando `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginar datasets grandes
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=500&limit=500"
```

`<DATASET_ID>` se devuelve como `defaultDatasetId` en el objeto de la ejecucion. Usa `offset` y `limit` para paginar resultados grandes. `clean=true` elimina campos vacios e internos.

### Facturacion y limites

- **Pago por resultado.** Se cobra por registro de tienda devuelto (el evento `result`). El enriquecimiento de menu agrega un evento `details` encima, cobrado solo cuando el menu se obtiene realmente. Ver la [pestana de precios](https://apify.com/scrapers_lat/rappi-scraper/pricing).
- **Sin cobro por fallas.** Si una ejecucion falla, el actor escribe un unico elemento con `error` y no cobra. Las ejecuciones vacias no cuestan nada.
- **Se respeta el limite de gasto.** Define `maxTotalChargeUsd` en la ejecucion; al alcanzarlo, el actor deja de emitir y cobrar mas resultados.
- **Planes gratuitos de Apify** estan limitados a 10 tiendas por ejecucion y devuelven registros solo de listado. El enriquecimiento de menu (`withDetails`) es un complemento pago. Mejora tu plan para menus completos y un `maxStores` mayor.
- **El enriquecimiento de menu es mas lento.** Con `withDetails` activo, cada tienda se obtiene individualmente. Desactivalo para ejecuciones mas rapidas solo de listado.

### Preguntas frecuentes

**Una ejecucion devolvio 0 registros. Por que?**
La combinacion de filtros no coincidio con ninguna tienda en esa ciudad. Relaja los filtros (quita `query` o `category`, baja `minRating`, o desactiva `freeDeliveryOnly` / `primeOnly`). Las ejecuciones sin resultados no se cobran.

**Que ciudades y paises se admiten?**
Colombia (`country: CO`) en Bogota, Medellin, Cali y Barranquilla. Son los mercados que Rappi sirve de forma mas confiable por HTTP.

**Como extraigo un solo restaurante?**
Pasa la URL de su pagina o el ID numerico de tienda en `startUrl`. Solo se extrae esa tienda, con su menu completo cuando `withDetails` esta activo.

**Por que algunos precios o campos son null?**
No toda tienda reporta pedido minimo, distancia, tarifa de servicio o metodos de pago, y algunos productos no tienen descuento. Los valores de origen ausentes se devuelven como `null`, nunca inventados.

**Puedo obtener menus sin horarios, o viceversa?**
Ambos vienen juntos cuando `withDetails` esta activo. Pon `withDetails` en `false` para devolver solo campos de listado.

**Es una herramienta oficial de Rappi?**
No. Este actor es independiente y no tiene afiliacion con Rappi. Solo lee datos disponibles publicamente en rappi.com.co.

### Mas scrapers en scrapers.lat

Creado y mantenido por [scrapers.lat](https://scrapers.lat), donde publicamos scrapers para plataformas publicas de Estados Unidos y America Latina: registros de empresas, datos gubernamentales, finanzas, comercio electronico y mas. Explora el catalogo o solicita un scraper a medida en [scrapers.lat](https://scrapers.lat).

> Herramienta independiente, sin afiliacion con Rappi. Accede solo a datos de tiendas y menus disponibles publicamente.

# Actor input Schema

## `maxStores` (type: `integer`):

Maximum number of stores to collect. Optional.

## `withDetails` (type: `boolean`):

When enabled, each store is enriched with its full menu (products with name, price, description, image) and opening hours. Slower.

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

Optional. Free-text search matched against each store's name, brand and cuisine tags (e.g. 'sushi', 'mcdonalds', 'vegano'). Combine with city/category to narrow results.

## `startUrl` (type: `string`):

Optional. A single Rappi restaurant/store page URL (e.g. https://www.rappi.com.co/restaurantes/delivery/121-empanaditas) or a bare numeric store ID. When set, only that store is scraped. Leave empty to scrape a city listing.

## `country` (type: `string`):

Rappi country to scrape. Determines the domain, language and proxy country.

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

City to scrape within Colombia.

## `freeDeliveryOnly` (type: `boolean`):

Optional. When enabled, only stores with a $0 delivery fee are returned.

## `primeOnly` (type: `boolean`):

Optional. When enabled, only stores advertising a Rappi Prime / prime-exclusive offer are returned.

## `minRating` (type: `number`):

Optional. Only return stores with a rating score at or above this value (e.g. 4.5).

## `category` (type: `string`):

Optional. Filter stores by cuisine category name, e.g. Hamburguesa, Pizza, Sushi, Pollo, Saludable, Desayunos. Matched against each store's category tags.

## Actor input object example

```json
{
  "maxStores": 10,
  "withDetails": true,
  "country": "CO",
  "city": "Bogotá",
  "freeDeliveryOnly": false,
  "primeOnly": false
}
```

# 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 = {
    "maxStores": 10,
    "query": "",
    "startUrl": "",
    "category": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/rappi-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 = {
    "maxStores": 10,
    "query": "",
    "startUrl": "",
    "category": "",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/rappi-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 '{
  "maxStores": 10,
  "query": "",
  "startUrl": "",
  "category": ""
}' |
apify call scrapers_lat/rappi-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/rappi-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/NkcSOhfMFl8lo20xc/builds/ajWTPeZGD6GFQCUoW/openapi.json
