Mercadona API & Scraper
The Mercadona API turns tienda.mercadona.es, the online shop of Spain's largest supermarket chain, into clean JSON in six actions: search, product/detail, category, categories, deals and warehouse/lookup.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
Mercadona prices and stocks its online shop by delivery area, so every call takes a Spanish postal code (default: Mercadona's own default area, Valencia) and every answer names the area it was priced for. The Canary Islands are priced differently: a 5 L bottle of Hacendado olive oil was 17.25 EUR in Valencia, Madrid and Barcelona and 16.25 EUR in Las Palmas on 2026-09-16. A postal code Mercadona does not deliver to is rejected rather than silently priced for another area. Every product comes back with its shelf price, the previous price and saving when Mercadona has just lowered it, the unit price per kg, litre, 100 g, unit, dozen, wash or metre, the pack size, the VAT rate included in the price, availability, order limit and category path. Fresh counter items sold by weight return the price of the minimum quantity (0.15 kg of frozen prawns: 1.94 EUR at 12.95 EUR per kg) and pieces of approximate weight are flagged as estimates. product/detail adds the EAN, every image, legal name, ingredients, allergens, storage and usage instructions, origin, suppliers, alcohol by volume, hazard statements and colour variants. deals returns Mercadona's complete price-drop list (170 products on 2026-09-16) or its new-products list, and category returns every product of a category with no cap. Verification on 2026-09-16: 24 of 24 searches, 63 of 63 product reads and 20 of 20 category reads succeeded, 45/45 controlled cases passed, 7/7 products matched an independent read of the source on title, price, previous price, availability and EAN, and search rows agreed with product records on 8 of 8 products. Prices are EUR. No Mercadona account needed - one ReefAPI key and the standard { ok, data, meta, error } envelope.
Which Mercadona price is which
Mercadona has no multi-buy offers and no loyalty card, but its prices still come in several shapes: a price drop with the previous price, counter products sold by weight, and pieces of approximate weight. The API keeps each shape explicit. Measured on 2026-09-16, Valencia area unless stated.
| Mercadona product | price | Price fields | Unit price |
|---|---|---|---|
| Leche semidesnatada Hacendado, 6 briks x 1 L | 5.04 EUR | no price drop, tax_percent 4 | 0.84 EUR per L |
| Aceite de oliva 0,4º Hacendado, 5 L | 17.25 EUR (16.25 EUR in Las Palmas) | original_price 17.75, save_amount 0.50 (Valencia) | 3.45 EUR per L (3.25 in Las Palmas) |
| Sangría Rosé Casón Histórico, 1.5 L | 1.00 EUR | original_price 1.70, discount_percent 41 | 0.67 EUR per L |
| Gambón congelado (counter, sold by weight) | 1.94 EUR for 0.15 kg | sold_by weight, price_per_quantity 0.15 kg | 12.95 EUR per kg |
| Mini pelotas de cerdo y vacuno, approx. 330 g | 4.13 EUR (estimate) | price_is_estimate true | 12.50 EUR per kg |
original_price is set only when Mercadona shows a previous price above the current one. For counter products sold by weight, price is the price of the minimum quantity you can order, and the per-kg unit price is the real shelf price. For pieces of approximate weight, price is Mercadona's estimate for one piece and price_is_estimate is true.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/mercadona/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "leche"
}
}{
"ok": true,
"meta": {
"api": "mercadona",
"endpoint": "search",
"mode": "live",
"latency_ms": 1505.6,
"record_count": 50,
"bytes": 268929,
"cache_hit": false,
"pagination": {
"page": 1,
"has_more": true,
"page_size": 50,
"total": 60
}
},
"data": {
"results": [
{
"product_id": "10381",
"title": "Leche semidesnatada Hacendado",
"brand": "Hacendado",
"ean": "8402001002090",
"packaging": null,
"main_feature": null,
"category": {
"id": "343",
"name": "Leche semidesnatada",
"level": 2
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://tienda.mercadona.es/product/10381/leche-semidesnatada-hacendado-pack-6",
"slug": "leche-semidesnatada-hacendado-pack-6",
"image": "https://prod-mercadona.imgix.net/images/c15010ddd0e6fc881e5ef94446d43bef.jpg?fit=crop&h=300&w=300",
"price": 5.04,
"price_display": "5,04 €",
"currency": "EUR",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"price_dropped": false,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"member_unit_price": null,
"unit_price": 0.84,
"unit_price_unit": "L",
"unit_price_measure": "litre",
"unit_price_display": "0,84 €/L",
"sold_by": "unit",
"price_per_quantity": null,
"price_per_quantity_unit": null,
"order_increment": null,
"price_is_estimate": false,
"size": "6 briks x 1 L",
"size_value": 6,
"size_unit": "L",
"pack_units": 6,
"pack_unit_name": "briks",
"drained_weight": null,
"tax_percent": 4,
"is_new_price": false,
"availability": "in_stock",
"in_stock": true,
"status": null,
"unavailable_from": null,
"unavailable_weekdays": [],
"max_order_quantity": 999,
"age_restricted": false,
"is_water": false,
"is_new_arrival": null,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
},
{
"product_id": "10379",
"title": "Leche entera Hacendado",
"brand": "Hacendado",
"ean": "8402001002076",
"packaging": "Pack-6",
"main_feature": null,
"category": {
"id": "342",
"name": "Leche entera",
"level": 2
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://tienda.mercadona.es/product/10379/leche-entera-hacendado-pack-6",
"slug": "leche-entera-hacendado-pack-6",
"image": "https://prod-mercadona.imgix.net/images/e471e628a91aef1a7d6473da2cb904c6.jpg?fit=crop&h=300&w=300",
"price": 5.76,
"price_display": "5,76 €",
"currency": "EUR",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"price_dropped": false,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"member_unit_price": null,
"unit_price": 0.96,
"unit_price_unit": "L",
"unit_price_measure": "litre",
"unit_price_display": "0,96 €/L",
"sold_by": "unit",
"price_per_quantity": null,
"price_per_quantity_unit": null,
"order_increment": null,
"price_is_estimate": false,
"size": "6 briks x 1 L",
"size_value": 6,
"size_unit": "L",
"pack_units": 6,
"pack_unit_name": "briks",
"drained_weight": null,
"tax_percent": 4,
"is_new_price": false,
"availability": "in_stock",
"in_stock": true,
"status": null,
"unavailable_from": null,
"unavailable_weekdays": [],
"max_order_quantity": 999,
"age_restricted": false,
"is_water": false,
"is_new_arrival": null,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
},
{
"product_id": "10721",
"title": "Leche semidesnatada sin lactosa Hacendado",
"brand": "Hacendado",
"ean": "8480000104717",
"packaging": null,
"main_feature": null,
"category": {
"id": "343",
"name": "Leche semidesnatada",
"level": 2
},
"breadcrumb": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"level": "[trimmed-depth]"
}
],
"category_paths": [
[
"[trimmed-depth]",
"[trimmed-depth]",
"[trimmed-depth]"
]
],
"url": "https://tienda.mercadona.es/product/10721/leche-semidesnatada-sin-lactosa-hacendado-pack-6",
"slug": "leche-semidesnatada-sin-lactosa-hacendado-pack-6",
"image": "https://prod-mercadona.imgix.net/images/6b02e742d27be2ee2db0994bc431fe99.jpg?fit=crop&h=300&w=300",
"price": 5.64,
"price_display": "5,64 €",
"currency": "EUR",
"original_price": null,
"original_price_display": null,
"discount_percent": null,
"save_amount": null,
"price_dropped": false,
"member_price": null,
"member_price_display": null,
"member_discount_percent": null,
"member_program": null,
"member_unit_price": null,
"unit_price": 0.94,
"unit_price_unit": "L",
"unit_price_measure": "litre",
"unit_price_display": "0,94 €/L",
"sold_by": "unit",
"price_per_quantity": null,
"price_per_quantity_unit": null,
"order_increment": null,
"price_is_estimate": false,
"size": "6 briks x 1 L",
"size_value": 6,
"size_unit": "L",
"pack_units": 6,
"pack_unit_name": "briks",
"drained_weight": null,
"tax_percent": 4,
"is_new_price": false,
"availability": "in_stock",
"in_stock": true,
"status": null,
"unavailable_from": null,
"unavailable_weekdays": [],
"max_order_quantity": 999,
"age_restricted": false,
"is_water": false,
"is_new_arrival": null,
"rating": null,
"review_count": null,
"rating_scale": null,
"sponsored": false
}
],
"count": 50,
"total_results": 60,
"page": 1,
"page_size": 50,
"page_count": 2,
"filters_available": {
"brands": [
{
"name": "Hacendado",
"count": 40
},
{
"name": "Asturiana",
"count": 12
},
{
"name": "+Proteínas",
"count": 3
}
],
"categories": [
{
"id": "6",
"name": "Huevos, leche y mantequilla",
"level": 0,
"count": 56
},
{
"id": "10",
"name": "Zumos",
"level": 0,
"count": 3
},
{
"id": "9",
"name": "Azúcar, caramelos y chocolate",
"level": 0,
"count": 1
}
]
},
"sort_applied": "mercadona",
"area": {
"postal_code": null,
"warehouse": "vlc1",
"source": "default"
},
"lang": "es",
"query": "leche",
"search_provider": "mercadona",
"fallback_results_dropped": 0,
"keyword_index_hits": null,
"fallback_results": []
}
}What the Mercadona API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Mercadona's online shop by keyword, priced for a Spanish postal code. Each product comes with its shelf price, the previous price when it just dropped, the unit price per kg / litre / unit, the pack size, VAT rate, EAN, brand, category path and availability. Filter by brand or category and sort by price, unit price or price drop. Mercadona returns at most 60 products per query. | Pricing teams call search to search Mercadona's online shop by keyword, priced for a Spanish postal code. | query, postal_code, warehouse, lang, page, ... |
| product/detail | The full Mercadona product record by `product_id` (or product URL), priced for a postal code: title, brand, EAN, every image, shelf price, previous price and saving, unit price, pack size, VAT rate, availability and order limit, legal name, ingredients, allergens, storage and usage instructions, origin, suppliers, alcohol by volume, hazard statements and colour variants. | Marketplace operators call product/detail to get the full Mercadona product record by `product_id` (or product URL), priced for a postal code. | product_id, postal_code, warehouse, lang, max_rotations |
| category | Every product of one Mercadona category (ids from `categories`), with its sub-categories, priced for a postal code. Same rows as search; filter by sub-category, sort by price or unit price. | Catalog enrichment teams call category to get every product of one Mercadona category (ids from `categories`), with its sub-categories, pri…. | category_id, subcategory_id, postal_code, warehouse, lang, ... |
| categories | Mercadona's full online category tree — every department and its categories with ids to pass to `category`. | Retail analysts call categories to get mercadona's full online category tree. | postal_code, warehouse, lang, max_rotations |
| deals | Mercadona's complete price-drop list ('Bajadas de precio': every product whose price just went down, with the previous price) or its new-products list ('Novedades'), for a postal code. Filter by department, sort by price or by the size of the drop. | Pricing teams call deals to get mercadona's complete price-drop list ('Bajadas de precio'. | type, category_id, postal_code, warehouse, lang, ... |
| warehouse/lookup | Check whether Mercadona's online shop delivers to a Spanish postal code and which warehouse (price area) serves it. | Marketplace operators call warehouse/lookup to check whether Mercadona's online shop delivers to a Spanish postal code and which warehouse (…. | postal_code, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/mercadona/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"leche"}'import requests
r = requests.post(
"https://api.reefapi.com/mercadona/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "leche"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/mercadona/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "leche"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.mercadona.search with {"query":"leche"}.Who uses this API and why
- Spanish grocery price trackers record Mercadona prices per delivery area, with the Canary Islands priced separately and price drops kept apart from the shelf price.
- FMCG brands and analysts follow Mercadona's complete price-drop list and new-products list with deals.
- Price-comparison apps compare unit prices per kg, litre or 100 g, with weighed counter products and approximate-weight pieces clearly marked.
- Food and allergen apps pull EANs, ingredients, allergens and storage instructions with product/detail.
Questions developers ask before integrating
Why do I need a postal code?
Because Mercadona prices and stocks its online shop by delivery area. Pass postal_code and the answer is priced for the area that serves it; area.warehouse names that area. Without one you get Mercadona's own default area (Valencia). Most mainland areas share prices, but the Canary Islands differ: on 2026-09-16, 17 of 35 products in the oil, vinegar and salt category had a different price in Las Palmas. warehouse/lookup tells you whether Mercadona delivers to a postal code at all - 29001 (Málaga) was not served on 2026-09-16, and such a code is rejected instead of being priced for somewhere else.
Does Mercadona have a member or loyalty price?
No. Mercadona runs no loyalty scheme and publishes no member price, so member_price, member_program and member_unit_price are always null. They are kept so the fields line up with other grocery APIs, such as Migros, where a loyalty price does exist.
How do I find products whose price just dropped?
Call deals with type price_drops. It returns Mercadona's complete price-drop list - 170 products on 2026-09-16 - and every row carries original_price above price, with discount_percent and save_amount. sort discount_desc puts the biggest drops first; category_id narrows it to one department (16 products in Bodega that day). On search and category rows the same fields are filled whenever a product is on a price drop.
How many results does a search return?
Up to 60 - that is Mercadona's own limit for a search. The whole list comes back at once, so the brand and category filters and the price, unit-price and price-drop sorts apply to all of it, and page and page_size page through it. Measured for leche: 60 results, 14 with brands Puleva and Asturiana, 55 inside the milk category. For a complete list, use category, which returns every product of a category.
What happens when I search for something Mercadona does not sell?
You get an empty result. Mercadona's search suggests loosely related products instead - two perfumes for zapatillas nike on 2026-09-16 - so the API drops them and counts them in fallback_results_dropped; include_fallback_results=true returns them separately, never in results. Real synonyms are kept: espaguetis returns Mercadona's Spaghetti. Across 66 everyday queries, including misspellings such as lehce and choclate, only donuts (answered with two Berlina pastries) was emptied.
Why is the price of a fish-counter product so low?
Because it is the price of the minimum quantity. Counter products sold by weight return sold_by weight, price_per_quantity (for example 0.15 kg) and the per-kg unit price; frozen prawns were 1.94 EUR for 0.15 kg at 12.95 EUR per kg. Some of these products have ids with a dot, such as 81661.2 - keep ids as strings.
Which languages are supported?
Spanish (default), English, Catalan and Valencian names, plus Basque category names. Search in the language you choose: milk with lang en returns English product names.
What does Mercadona NOT publish?
No member price, no ratings or reviews, no nutrition table (only ingredients and allergens) and no stock counts - availability is in stock, out of stock or not sold in this area. On 63 sampled products across 20 departments, EAN, price, unit price, size and images were filled on 63 of 63; ingredients on 42 of 63 and allergens on 27 of 63, because non-food products and products without a declared allergen have none; brand on 60 of 63 (counter fish is unbranded). Brand and EAN appear on search rows and product records, not on category or deals rows.
What is the Mercadona API?
Mercadona API is a ReefAPI endpoint group for spanish supermarket prices by postal code: price drops, unit prices, vat, ean, ingredients and allergens. It returns live JSON through POST requests under /mercadona/v1.
Is the Mercadona API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Mercadona calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Mercadona login or account?
No login to Mercadona 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 Mercadona data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Mercadona API use?
Mercadona actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Mercadona from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call mercadona actions with the same key, credit pool and JSON envelope used by normal REST requests.