Rappi API

Rappi restaurants, menus and grocery prices — by country and by city

The Rappi API turns the public pages of Rappi, Latin America's largest delivery and quick-commerce marketplace, into clean JSON in five actions: restaurant/search, restaurant/detail, store/search, store/detail and cities.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Rappi endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
R
/rappi/v1

5 active endpoints, on 0 and 3 credit tiers.

  • POST/rappi/v1/restaurant/search
  • POST/rappi/v1/restaurant/detail
  • POST/rappi/v1/store/search
  • POST/rappi/v1/store/detail
  • POST/rappi/v1/cities

What Rappi endpoints does ReefAPI ship?

5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

5 endpoints

restaurant/search

3 cr

Restaurants deliverable in one city, with that city's own restaurant count and its cuisine ta…

required
country
optional
city, cuisine, sort, limit, offset, min_rating, free_delivery_only, open_now, max_delivery_cost

restaurant/detail

3 cr

One restaurant's full record and its COMPLETE menu with prices, sections, discounts, rating h…

required
country
optional
store_id, url

store/search

3 cr

Grocery, pharmacy and retail STORES of one store type.

required
country
optional
store_type, query, limit, offset

store/detail

3 cr

One grocery/retail store's record, its aisle directory with each aisle's product count, and i…

required
country, store_id
optional
pages

cities

0 cr

The city slugs one country's storefront actually serves, read from Rappi's own published sitemap.

required
country
optional

Every parameter, every allowed value →

Rappi API

1 of 5 endpoints, ready to run

View docs ↗

The restaurants Rappi delivers in one named city, with the rating, review count, delivery cost and ETA it shows on the card, plus total_in_city, its own count for that city.

3 credits2 required · 2 optional
POST/rappi/v1/restaurant/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Rappi API works

Rappi is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 280 engines.

02
Call
POST /rappi/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
0 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From a city to a priced menu in three calls

Rappi is addressed by country and city slug, so the first call removes the guesswork and the next two go straight to the menu.

01cities
POSTcities

Find out which cities a country serves. cities with country=co returns the 34 Colombian city slugs Rappi itself publishes. These are exactly the values city accepts, so you never have to guess a slug.

02restaurant/search
POSTrestaurant/search

List the restaurants that deliver in that city. restaurant/search with country=co and city=medellin returns the city's catalogue rows plus total_in_city, the number of restaurants Rappi says it serves there — 4,739 for Medellin on 2026-09-23. Add cuisine to get the complete list for one cuisine, or sort by rating, eta or delivery_cost.

03restaurant/detail
POSTrestaurant/detail

Read one restaurant's full menu. restaurant/detail with the store_id from step 2 returns the store record — rating with its 1-to-5 histogram, address, coordinates, schedule, currency — and every menu section with every item's price and pre-discount price. Each response carries price_cross_check, the API's own comparison against the page's published menu.

One restaurant's full record - rating histogram, address, schedule, currency - and every menu section with each item's price and pre-discount price, each response carrying price_cross_check against the page's own published menu.

request
curl -X POST https://api.reefapi.com/rappi/v1/restaurant/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"country":"co","city":"bogota","limit":10}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "rappi",
    "endpoint": "restaurant/search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

A Rappi store has two different ratings, and they do not mean the same thing

The single thing to get right before you build anything on Rappi restaurant data. The rating printed on a catalogue listing and the rating on the restaurant's own page are different measurements over different review sets, so the API returns them under different names and never merges them. Measured on 2026-09-23 across 10 Bogota restaurants.

FieldWhere it comes fromHome Burgers, Chapinero
list_rating / list_review_countthe city catalogue listing4.6 from 1,337 reviews
rating / review_countthe restaurant's own record3.4 from 317 reviews
rating_histogramthe restaurant's own record1★ 96, 2★ 16, 3★ 21, 4★ 20, 5★ 164
The two agreed10 restaurants compared0 of 10

The histogram always adds up to review_count, so you can recompute the score yourself. If you need one number for a listing UI use list_rating; if you are judging a restaurant use rating, which is the figure the restaurant's own page shows and the figure its published review summary agrees with.

What was measured on 2026-09-23

Every line below came from a live call on that date.

Countries

9 — Colombia, Mexico, Brazil, Argentina, Chile, Peru, Uruguay, Ecuador, Costa Rica; all 9 answered

Cities served

188 across the 9 countries: Mexico and Brazil 53 each, Colombia 34, Chile 16, Peru 10, Ecuador 10, Argentina 9, Uruguay 2, Costa Rica 1

City inventory really differs

6 Colombian cities, 15 city pairs, 0 shared restaurant ids

Restaurants per city (Rappi's own count)

Bogota 6,252 · Medellin 4,739 · Barranquilla 4,593 · Cali 3,638 · Pereira 1,415 · Cartagena 1,276

Menu depth

742 items across 10 Bogota restaurants — 10 at the smallest, 158 at the largest

Price accuracy

all 742 menu items matched the page's own published menu, 0 mismatches; a separate independent re-read found all 377 prices from 6 restaurants in the page's printed text

Cuisine filter

Bogota: hamburguesa 58 · sushi 41 · pizza 36 · mexicana 32 · postres 131, and every returned row carried that cuisine's id

Search row completeness

store_id, name, url, list_rating, list_review_count, delivery_cost, eta_minutes, logo, image, brand_id, open status: 198 of 198 rows

Grocery

Colombia: market 68 stores, rappimall-parent 1,574; one store returned 60 products at pages=1, 196 at pages=2 and 376 at pages=3

Grocery is not address-priced

tested and rejected: repeats of one coordinate differed as much as two cities did, and Madrid coordinates returned a Bogota store's identical shelves — so no lat/lng parameter is offered

Not published by Rappi

individual review text, per-item stock counts, phone numbers, courier tracking — returned as null, never guessed

Grocery store listing is country-wide

not city-scoped; the response says so with city_scoped false

What people build with Rappi

The jobs this data is most often used for.

5

endpoints

0/3

credits per call

01

Track menu prices across a restaurant chain's branches in one city, or the same brand across Bogota, Medellin, Cali and six more countries, using country plus store_id as a stable key.

02

Build a competitive menu-pricing dashboard for a restaurant group: pull the complete menu with sections, prices and discounts, then re-read it on a schedule to see what a rival repriced.

03

Feed a market-entry study with real supply density: the per-city restaurant counts Rappi itself publishes, plus the full cuisine breakdown for each city, across 188 cities in 9 countries.

04

Monitor delivery economics by city - delivery cost, estimated delivery time and free-shipping share across a city's catalogue - to see where a marketplace subsidises delivery.

What Rappi data costs

The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 280 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/rappi/v1/restaurant/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"country":"co","city":"bogota","limit":10}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/rappi/v1/restaurant/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "country": "co",
  "city": "bogota",
  "limit": 10
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Rappi.

Get a free key →
Which countries does it cover, and are they really different catalogues?

Nine: Colombia, Mexico, Brazil, Argentina, Chile, Peru, Uruguay, Ecuador and Costa Rica. They are separate storefronts with separate catalogues and currencies, and the API treats them that way. On 2026-09-23 all nine answered with their own default city - Bogota, Ciudad de Mexico, Grande Sao Paulo, Buenos Aires, Santiago de Chile, Lima, Montevideo, Quito and San Jose - and their own restaurants. One consequence matters for your database: Rappi store ids are namespaced per country, not globally unique, so a low id such as 98 exists in more than one country as a different business. Key your records on country plus store_id, which is exactly how every record the API returns is labelled.

Does the city parameter actually change the results?

Yes, and it is the main reason to use this API rather than a single national scrape. On 2026-09-23 six Colombian cities returned six completely disjoint sets: across all 15 pairs of those cities, zero store ids were shared. The per-city restaurant counts Rappi itself publishes were Bogota 6,252, Medellin 4,739, Barranquilla 4,593, Cali 3,638, Pereira 1,415 and Cartagena 1,276. Each response also carries the city's own name and coordinates. Use the cities action to get the list a country actually serves - 34 for Colombia, 53 for Mexico, 53 for Brazil, 16 for Chile, 10 each for Peru and Ecuador, 9 for Argentina, 2 for Uruguay and 1 for Costa Rica - and a city outside that list returns NOT_FOUND rather than quietly answering with a different city's restaurants.

Do I get the whole menu, or a sample?

The whole menu, grouped into the sections the restaurant uses. Across the 10 Bogota restaurants measured on 2026-09-23 the API returned 742 items in total, ranging from 10 items for a small kitchen to 158 for a cafe, with 6 sections and 49 items for Home Burgers. Every item carries its price, its description, whether it is currently available, whether it has options or toppings to choose, and its image. Where an item is discounted you also get original_price and the discount percent; on that sample 5 of 742 items were discounted, so expect original_price to be null most of the time rather than assuming a promotion is missing.

How do I know the prices are right?

Every restaurant page publishes its own machine-readable menu, and the API checks its parsed prices against it on every call and reports the result in price_cross_check. On 2026-09-23, across 742 menu items from 10 restaurants, every item matched. As a second and fully independent check, 6 of those restaurants were re-read from scratch and all 377 prices the API returned were found in the text the page itself prints. Prices are whole units of the local currency, exactly as the source publishes them - a 146000 in Colombia is 146,000 COP, printed on the page as $ 146.000 - so nothing is divided by 100. The currency is returned per restaurant from the source's own declaration rather than assumed from the country.

Can I filter by cuisine, and does the filter really narrow the results?

Yes. Pass cuisine and you get Rappi's own complete list for that cuisine in that city, not a page of it. Measured in Bogota on 2026-09-23 against an unfiltered city page of 30 rows: hamburguesa returned 58 restaurants, sushi 41, pizza 36, mexicana 32 and postres 131 - and every single returned row carried that cuisine's own id, 131 of 131 for postres and 32 of 32 for mexicana. The full cuisine vocabulary for a city comes back with any unfiltered search as cuisine_taxonomy, 32 cuisines in Bogota. One honest limitation: a cuisine-filtered page does not republish that vocabulary, so on those responses the rows carry cuisine_ids but not cuisine names, and the API tells you which case you are in with cuisine_names_available rather than inventing names.

What about groceries and supermarkets, not just restaurants?

store/search lists stores by store type and store/detail returns a store's record plus its product aisles with prices. In Colombia on 2026-09-23 the market type listed 68 stores and rappimall-parent 1,574. A store's products come back grouped into aisles with each item's price, pre-discount price, sale type and category - for example a convenience store returned 60 priced items across 4 aisles. Two honest limits: the grocery store listing is country-wide rather than city-scoped, and the API reports that as city_scoped false instead of pretending otherwise; and a store type Rappi does not publish returns NOT_FOUND rather than silently answering with the default type.

How many grocery products do I get, and can I get more?

store/detail takes a pages parameter and it genuinely goes deeper. Measured on one Bogota convenience store on 2026-09-23: pages=1 returned 4 aisles and 60 products, pages=2 returned 13 aisles and 196 products, and pages=3 returned 25 aisles and 376 products. The default is 2. Every response also carries aisle_directory, the store's own list of aisles with the number of products Rappi says each one holds - for that store, Bebidas 424, Novedades 505 and Carnes 85 - so you can see what remains beyond the pages you asked for. This is the store's shelf catalogue as Rappi renders it, not a guaranteed complete inventory dump, and the directory is what tells you the difference.

Can I price a grocery store for a specific delivery address?

No, and rather than offer a parameter that does nothing we left it out. We tested it properly: querying one store repeatedly with the same coordinates produced results that differed from each other as much as two different cities did, and coordinates in Madrid, Spain returned a Bogota store's identical shelves. The shelf content rotates between variants on its own and the address does not steer it, so there is no lat/lng parameter on store/detail. The store's own record still carries its real address and coordinates.

What does Rappi not publish, and what will be null?

Individual customer review text - only the aggregate score and the 1-to-5 histogram are published, so there is no reviews list to return. Also absent: per-item stock counts, restaurant phone numbers, and courier tracking. On the 10-restaurant sample all stores carried name, rating, review count, address, coordinates, currency, delivery cost, cuisines, schedule, brand name, logo and image; the review histogram was present on 7 of 10, estimated delivery time on 7 of 10 and offers on 7 of 10. Anything the source does not publish comes back null rather than guessed.

What is the Rappi API?

Rappi API is a ReefAPI endpoint group for latin america's delivery marketplace: restaurants, menus with prices, and grocery stores across 9 countries. It returns live JSON through POST requests under /rappi/v1.

Is the Rappi API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Rappi calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Rappi login or account?

No login to Rappi is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Rappi data?

The page example is captured from a live restaurant/search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Rappi API use?

Rappi actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

116 E-commerce & Marketplaces APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Rappi, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 279 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-23.