Mercadona Scraper - Prices, Unit Price & Postal Code avatar

Mercadona Scraper - Prices, Unit Price & Postal Code

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Mercadona Scraper - Prices, Unit Price & Postal Code

Mercadona Scraper - Prices, Unit Price & Postal Code

Scrape Mercadona products by delivery-area postal code. Search by keyword or category, or paste product and category URLs. Get local availability, current price, site-calculated price per kg, litre or unit, plus original price and discount when an item is on sale.

Pricing

from $1.00 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

12 days ago

Last modified

Share

Mercadona Scraper: Prices, Unit Price and Was-Price by Postal Code

Mercadona Scraper pulls product data from tienda.mercadona.es, Spain's largest supermarket chain. Every run starts from a Spanish postal code, because Mercadona's catalogue, availability and prices are zoned by delivery warehouse. Search by keyword, browse a real category, or paste product and category links directly. Every record carries the current price, the real per-kg/L/unit reference price the site itself computes, and a genuine was-price with discount whenever one actually exists, plus brand, EAN, origin and the full image gallery on request. Export to JSON, CSV or Excel, pull it through the API, or pipe results into your apps.

Why This Scraper?

  • Zoned by real delivery area. Give it a Spanish postal code and it resolves the same delivery warehouse the live site would use for that address, so catalogue, availability and prices match what a shopper there actually sees. A postal code with no delivery zone stops the run with a clear error, instead of a quietly empty dataset.
  • Real per-unit price, not computed after the fact. Mercadona's own catalogue returns a per-kg/L/unit reference price alongside the package price, captured as is, never derived from a guessed pack size.
  • Was-price captured only when it's real. Mercadona is a low-price retailer with very few promotions, so most products simply carry no was-price at all. This scraper checks the site's own previous-price field per item and only ever sets a was-price and discount when that field is genuinely populated and higher than the current price.
  • Own-brand aware. Hacendado, Deliplus, Bosque Verde and every other brand come through as the site's own structured brand field, once product detail is fetched, not guessed from the product name.
  • A keyword or a category browse, not both at once. A keyword goes straight to the site's own search index across your whole delivery zone. Leave it empty to walk the real category tree instead, and use Category to scope that walk to one aisle or group.
  • Three ways in. Keyword search or category browsing, both with brand, price and discount filters and a sort order, or paste any product or category link directly.
  • Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector, alongside the dataset.

Use Cases

  • Grocery price tracking: monitor price, unit price and discount changes for chosen aisles or brands over time, by delivery zone.
  • Own-brand and private-label research: track Hacendado, Deliplus and Bosque Verde pricing and availability across categories.
  • Retail and category management: benchmark unit pricing (per kg or L) and pack sizes across a whole aisle.
  • Shopping assistants and price-comparison tools: look up a pasted product link on demand for the current price and availability in a shopper's own postal code.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
productId / slug"7823456" / "sample-product-hacendado"
name"Sample Product Hacendado"
brand"Hacendado" (needs fetchDetails)
category / categoryPath"Sample Subcategory" / ["Sample Group", "Sample Aisle", "Sample Subcategory"]
packaging"Botella"
url / imageproduct page link / card image URL
price / currency1.85 / "EUR"
unitPrice / unitPriceFormat11.08 / "kg"
packageSize / packageSizeFormat0.167 / "kg"
previousPrice / discountAmount / discountPercent2.2 / 0.35 / 15.9
isOnSpecialtrue
isPack / hasUnitSelectorfalse / true
onlineAvailabletrue
isWater / requiresAgeCheckfalse / false
maxQuantityPerOrder12
isNewArrivalfalse
ean / origin"8412345678904" / "España" (needs fetchDetails)
suppliers["Sample Supplier S.L."] (needs fetchDetails)
description / ingredients / allergenslegal description text, ingredients text, allergens text (needs fetchDetails)
imagesfull-resolution photo gallery (needs fetchDetails)
reviews[] (Mercadona has no product review system, on every record)

A pasted product link, a Brand filter, or the Fetch full product detail toggle also add legalName, usageInstructions, storageInstructions, mandatoryMentions, dangerMentions, isBulk and isVariableWeight, all pulled from the same product-detail page.

How to Use

  1. Pick a mode: search (keyword and/or category browse for a delivery zone) or url (paste product or category links).
  2. Set Postal code to a real Spanish postal code. It decides your delivery zone, catalogue, availability and prices, in every mode.
  3. In search mode, either give a keyword, which searches the whole delivery zone directly, or leave it empty and set Category to walk one real aisle or group (leave both empty to browse the whole catalogue). Add brand, price and specials filters and a sort order as needed.
  4. Set Max products total (and Max categories per search, for a category browse) to control run size and cost, then click Start.

Keyword search across the whole delivery zone:

{
"mode": "search",
"postalCode": "28001",
"searchTerm": "aceite de oliva",
"maxItems": 20
}

Browse one real aisle, Hacendado only, currently on special, sorted by price:

{
"mode": "search",
"postalCode": "28001",
"category": "Aceite, vinagre y sal",
"brands": ["Hacendado"],
"specialsOnly": true,
"sortBy": "PRICE_ASC",
"maxItems": 50
}

Paste a product link (full detail, brand, EAN, ingredients, image gallery, is always fetched for it):

{
"mode": "url",
"postalCode": "28001",
"urls": ["https://tienda.mercadona.es/product/4241/aceite-oliva-04o-hacendado-garrafa"]
}

Paste a category link and walk the whole aisle:

{
"mode": "url",
"postalCode": "28001",
"urls": ["https://tienda.mercadona.es/categories/112"],
"maxItems": 100
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/mercadona-es-scraper").call(run_input={
"mode": "search",
"postalCode": "28001",
"searchTerm": "aceite de oliva",
"maxItems": 20,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["name"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/mercadona-es-scraper').call({
mode: 'search',
postalCode: '28001',
searchTerm: 'aceite de oliva',
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Keyword search versus category browse

A keyword (searchTerm) queries the site's own per-warehouse search index directly, across your whole delivery zone, and Category is not applied to that search. Results are then narrowed to products whose name actually contains your keyword, so the site's own tolerance for typos, plurals or word order is not carried through. Category only takes effect when no keyword is given (a plain category browse), or automatically, as a fallback, on the rare run where the search index itself is temporarily unreachable, in which case the run walks Category (or the whole catalogue, if Category is also empty) and matches the keyword against product names there instead. Setting both a keyword and a category does not scope the keyword search to that category.

Filters, price band and sort order

searchTerm, specialsOnly, minPrice, maxPrice, brands and sortBy apply in search mode, and in url mode when the pasted link is a category link. A pasted product link always ignores all of them and is returned as is. sortBy sorts within whichever category or search page is being collected; combine it with a single Category for a fully sorted result. Mercadona also has no product review system, so reviews is always an empty array on every record, a real absence on the site itself, not a scraping gap.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use through Model Context Protocol (MCP) connectors. Authorize a connector once under Apify, Settings, Integrations, then select it in the mcpConnectors field. Each connector receives a condensed, human-readable summary per product (name plus key fields), while the complete record always stays in the Apify dataset. For Notion, also set notionParentPageUrl to the page the item pages should be created under, and use maxNotifyListings to cap how many items are exported per connector per run. Supported connectors: Notion, Linear, Airtable and Apify. Leave the field empty to skip, it never changes the dataset output.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch browses by keyword and/or category for your delivery zone; url scrapes pasted product or category links.
postalCodestring28001Spanish postal code that resolves your Mercadona delivery zone; scopes catalogue, availability and prices in every mode. Required; a code with no delivery zone stops the run.
categorystringnone (prefilled with Aceite, vinagre y sal)A real Mercadona category or group name/id, search mode only. Ignored in url mode, and not applied whenever a keyword is set, unless the search index itself is unreachable; empty browses every aisle.
urlsarraynone (prefilled with one sample product link)Product or category links to scrape, url mode only.
searchTermstringnone (prefilled with aceite de oliva)Keyword. In search mode it queries the site's own search index across the whole delivery zone, then keeps only hits whose name actually contains it; Category is not applied to it. In url mode it keeps only products in a pasted category link whose name contains the keyword; a pasted product link always ignores it.
specialsOnlybooleanfalseKeep only products carrying a genuine was-price higher than the current price. Applies in search mode and to a pasted category link; a pasted product link ignores it.
brandsarraynone (prefilled empty)Exact brand names to keep. Automatically turns on full product-detail fetching so brand can be checked (stops checking further candidates once enough matches are found), applies the same as specialsOnly.
minPricenumbernoneOnly return products priced at or above this amount, in euros. Applies the same as specialsOnly.
maxPricenumbernoneOnly return products priced at or below this amount, in euros. Applies the same as specialsOnly.
sortBystringRELEVANCERELEVANCE (catalogue order in a category browse, the search index's own relevance order for a keyword search), PRICE_ASC or PRICE_DESC. Sorts within whichever category or search page is being collected.
fetchDetailsbooleanfalseAdds brand, EAN, origin, suppliers, full description, ingredients/allergens, storage/usage instructions and the full image gallery, billed once per product enriched. Always on for a pasted product link and whenever Brands is set, regardless of this toggle.
maxPagesintegernone (unlimited)In a category browse, stop after walking this many aisles; in a keyword search, stop after this many result pages (40 products each). Leave empty for no limit. Ignored for a single pasted product link.
maxItemsinteger20Hard cap on total products returned across the run. 0 means unlimited.
proxyobject{"useApifyProxy": true}Connection settings for the run.
mcpConnectorsarraynoneOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstringnoneNotion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items exported to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"productId": "7823456",
"slug": "sample-product-hacendado",
"name": "Sample Product Hacendado",
"brand": "Hacendado",
"category": "Sample Subcategory",
"categoryPath": ["Sample Group", "Sample Aisle", "Sample Subcategory"],
"packaging": "Botella",
"url": "https://tienda.mercadona.es/product/7823456/sample-product-hacendado",
"image": "https://prod-mercadona.imgix.net/images/sample-card.jpg",
"price": 1.85,
"currency": "EUR",
"previousPrice": 2.2,
"discountAmount": 0.35,
"discountPercent": 15.9,
"isOnSpecial": true,
"unitPrice": 11.08,
"unitPriceFormat": "kg",
"packageSize": 0.167,
"packageSizeFormat": "kg",
"isPack": false,
"hasUnitSelector": true,
"onlineAvailable": true,
"isWater": false,
"requiresAgeCheck": false,
"maxQuantityPerOrder": 12,
"isNewArrival": false,
"ean": "8412345678904",
"origin": "España",
"suppliers": ["Sample Supplier S.L."],
"description": "Sample legal product description as shown on the site.",
"ingredients": "Sample ingredients text.",
"allergens": "Sample allergens text.",
"images": ["https://prod-mercadona.imgix.net/images/sample-zoom.jpg"],
"isBulk": false,
"isVariableWeight": false,
"reviews": []
}

Plan Requirement

The default connection works out of the box, and the run automatically retries with a different connection when one is refused. A residential connection is optional and only worth turning on for very large or sustained runs.

FAQ

How much does it cost?

You pay per product returned, plus one detail-enrichment charge for every product whose full detail page is fetched and actually returned. That enrichment charge always applies to a pasted product link, and to every product returned under a Brand filter (products checked against the filter and rejected are not charged), on top of turning on Fetch full product detail yourself. A small one-time charge also applies when the run starts. The Pricing tab shows the current rates. Use Max products total to cap the cost of any run.

This actor collects only publicly available catalogue and price data. You are responsible for how you use it: follow Mercadona's terms and the laws that apply to you, and get legal advice before any commercial redistribution.

Why did my run fail instead of returning an empty dataset?

Only one failure ends the run outright: if your postal code cannot be resolved to a delivery zone at all, whether because the code is invalid or the very first connection to the site is refused, the run stops with a clear error, so that is never confused with a genuine no-results search. If the site starts refusing requests later in the run, for example while walking categories or fetching product detail, the run finishes successfully with whatever it already collected, which can be smaller than expected, or empty, on a heavily blocked run.

Does setting both a keyword and a category narrow the search to that category?

No. A keyword goes straight to the site's own search index across your whole delivery zone, and Category is not applied to it. Leave the keyword empty and set Category to walk one real aisle or group instead. Category is only used together with a keyword automatically, as a fallback, if the search index itself is temporarily unreachable.

Can I track prices on a schedule?

Yes, schedule the actor from the Schedules tab. This actor has no built-in change-tracking mode: each run returns a full snapshot of whatever you asked for, not just what changed. Compare productId and price across runs yourself to spot new arrivals, price changes or discontinued products.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more grocery data?

Pair this actor with these related scrapers from the same team:

🥦 Lidl.es Products, Weekly Offers, Prices & Reviews Scraper
Scrape Lidl.es grocery and non-food products across weekly offers, tools, home, garden...
🥦 Auchan France Scraper
Scrape Auchan.fr products: grocery, drinks, household and general merchandise. Real price...
🍷 Carrefour Spain Scraper
Scrape Carrefour Spain (carrefour.es) products. Search by keyword, browse a category, or...
🥦 REWE.de Scraper
Scrape REWE Germany (rewe.de) grocery products: current price, was-price and discount...
🥦 E.Leclerc Scraper
Scrape E.Leclerc France (e.leclerc) grocery and retail products. Search by keyword or...
🥦 FoodHero Scraper
Scrape FoodHero surplus grocery deals across Canada by area, store or offer ID. Extract...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.