# Rappi — Latin America delivery & quick-commerce (9 countries)

> Restaurants deliverable in one city, with that city's own restaurant count and its cuisine taxonomy. Pass `cuisine` to get the site's own complete list for that cuisine.
> ReefAPI engine `rappi` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/rappi/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /rappi/v1/restaurant/search — 3 credits
Restaurants deliverable in one city, with that city's own restaurant count and its cuisine taxonomy. Pass `cuisine` to get the site's own complete list for that cuisine.

**Parameters:**
- `country` (enum, required, default "co") — Rappi storefront. Each country is a separate catalogue and currency. [one of: co, mx, br, ar, cl, pe, uy, ec, cr]
- `city` (string, optional) — City slug, e.g. `bogota`, `medellin`, `sao-paulo`. Omit for the country's default city. Use the `cities` action for the live list.
- `cuisine` (string, optional) — Cuisine slug from `cuisine_taxonomy`, e.g. `hamburguesa`, `sushi`, `pizza`. Returns the site's complete list for that cuisine.
- `sort` (enum, optional) — Order the returned rows. [one of: rating, eta, delivery_cost, name, reviews]
- `limit` (integer, optional, default 30) — Rows to return (1-200).
- `offset` (integer, optional, default 0) — Rows to skip.
- `min_rating` (number, optional) — Keep rows whose catalogue rating is at least this.
- `free_delivery_only` (boolean, optional, default false) — Keep only rows Rappi flags as free shipping.
- `open_now` (boolean, optional, default false) — Keep only rows whose status is OPEN.
- `max_delivery_cost` (number, optional) — Keep rows whose delivery cost is at most this, in the local currency.

**Returns:** restaurants[] with store_id, name, url, cuisines, list_rating, list_review_count, delivery_cost, eta_minutes, plus the city record, total_in_city and the cuisine taxonomy.

**Example request body:**
```json
{
  "country": "co",
  "city": "bogota",
  "limit": 10
}
```

### POST /rappi/v1/restaurant/detail — 3 credits
One restaurant's full record and its COMPLETE menu with prices, sections, discounts, rating histogram, schedule and offers.

**Parameters:**
- `country` (enum, required, default "co") — Rappi storefront. [one of: co, mx, br, ar, cl, pe, uy, ec, cr]
- `store_id` (integer, optional) — Rappi restaurant id, as returned by restaurant/search. Ids are namespaced per country.
- `url` (string, optional) — A rappi.com restaurant URL instead of store_id.

**Returns:** store{…, rating, review_count, rating_histogram, lat, lng, address, currency} and menu{sections[]{items[]{price, original_price, …}}}.

**Example request body:**
```json
{
  "country": "co",
  "store_id": 900044812
}
```

### POST /rappi/v1/store/search — 3 credits
Grocery, pharmacy and retail STORES of one store type. This listing is country-wide: Rappi redirects the city form to the country URL (measured), so it is not city-scoped and says so.

**Parameters:**
- `country` (enum, required, default "co") — Rappi storefront. [one of: co, mx, br, ar, cl, pe, uy, ec, cr]
- `store_type` (string, optional, default "market") — Parent store type slug, e.g. `market`, `rappimall-parent`, `super-farma`, `express`, `turbox`.
- `query` (string, optional) — Keep only stores whose name contains this (accent-insensitive).
- `limit` (integer, optional, default 50) — Rows to return (1-200).
- `offset` (integer, optional, default 0) — Rows to skip.

**Returns:** stores[] with store_id, name, url, store_type, vertical, eta_minutes.

**Example request body:**
```json
{
  "country": "co"
}
```

### POST /rappi/v1/store/detail — 3 credits
One grocery/retail store's record, its aisle directory with each aisle's product count, and its products with prices. `pages` walks deeper into the aisles.

**Parameters:**
- `country` (enum, required, default "co") — Rappi storefront. [one of: co, mx, br, ar, cl, pe, uy, ec, cr]
- `store_id` (integer, required) — Rappi store id from store/search.
- `pages` (integer, optional, default 2) — How many aisle pages to read (1-4). Each page adds more aisles and their products; 1 returns the store's front shelves only.

**Returns:** store{…}, aisle_directory[]{name, product_count} and aisles[]{items[]{product_id, name, price, original_price, sale_type, …}}.

**Example request body:**
```json
{
  "country": "co",
  "store_id": 900044812
}
```

### POST /rappi/v1/cities — 0 credits
The city slugs one country's storefront actually serves, read from Rappi's own published sitemap. These are the values `city` accepts.

**Parameters:**
- `country` (enum, required, default "co") — Rappi storefront. [one of: co, mx, br, ar, cl, pe, uy, ec, cr]

**Returns:** cities[] with slug and url.

**Example request body:**
```json
{
  "country": "co"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=rappi
- Human docs page: https://reefapi.com/docs/rappi
- Overview page: https://reefapi.com/rappi-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
