Mercadona Scraper icon

Mercadona Scraper

Scrape Mercadona products by delivery-area postal code. Search by keyword or category, or paste product and category URLs. Get local availability,…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Mercadona Scraper at a glance

Mercadona Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, product, brand, category and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Ecommerce, Automation, Developer Tools
Region
Europe
Pricing
$1.80 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
24 options

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.

What Mercadona Scraper can do

  • 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.

Choose what to collect

These inputs let you configure Mercadona Scraper - Prices, Unit Price & Postal Code. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · required'search' browses the catalogue for your delivery zone by keyword and/or a real category (aisle) name. 'url' scrapes any product or category link you paste.

Choices: search, url

postalCodestring · requiredSpanish postal code Mercadona uses to pick your delivery zone. It scopes prices, availability and which products the zone's warehouse stocks, in every mode - so it changes the result set, not just the prices. Five digits, e.g. 28001 for Madrid. A code with no delivery zone stops the run rather than returning nothing.
languagestringLanguage of product names, categories and descriptions as the Mercadona site serves them. Default Spanish. Category names are matched in the chosen language; a numeric category id works in any language.

Choices: es, en, ca, eu, vai

categorystringA real Mercadona catalogue category or group, exactly as the site shows it (e.g. 'Aceite, vinagre y sal', or a whole group like 'Aceite, especias y salsas'). Leave empty to browse every category, aisle by aisle, bounded by Max pages/Max products. A numeric category id (e.g. 112) is also accepted. Ignored when a keyword is set in search mode (the keyword searches the whole delivery zone), except as a fallback if the search index is unreachable.
urlsarrayPaste Mercadona product pages (tienda.mercadona.es/product//...), category pages (tienda.mercadona.es/categories/) or site search pages (tienda.mercadona.es/search-results?query=). Filter fields above are ignored in this mode. If you leave this field untouched, the example links are scraped.
searchTermstringFree-text keyword, e.g. 'aceite de oliva' or 'leche'. In search mode the keyword queries the site's own search index across the whole delivery zone and keeps only hits whose name contains it; Category is NOT applied when a keyword is set (it is used only as a fallback if the search index is temporarily unreachable). In URL mode it narrows a pasted category link to products whose name contains it; a pasted product link ignores it.
querystringAlias of Search keyword, for callers migrating from other Mercadona scrapers. Used only when Search keyword is empty.
Show 17 more inputs
More input fields
InputWhat it controls
specialsOnlybooleanMercadona is a low-price retailer with few promotions, but a real was-price does appear on some items (verified live, e.g. a markdown from 2.65 EUR to 1.90 EUR) -- this narrows to only products currently carrying a genuine previous price higher than the current one. Off by default since most Mercadona products have no was-price at all.
brandsarrayOnly return products from these brands, e.g. 'Hacendado', 'Deliplus', 'Bosque Verde'. Brand is only present on the product-detail page, so setting this automatically enables product-detail fetching (billed via the detail-enrichment event) for every candidate product so it can be checked. Leave empty for all brands.
minPricenumberOnly return products priced at or above this amount, in euros.
maxPricenumberOnly return products priced at or below this amount, in euros.
sortBystringSorts the products collected in this run (the keyword search hits, or the aisles being walked). Sorting is applied within each aisle or result page that is collected. For one fully sorted aisle, set a specific Category and leave the keyword empty (Category is not applied when a keyword is set).

Choices: RELEVANCE, PRICE_ASC, PRICE_DESC

fetchDetailsbooleanAdds brand, EAN barcode, country of origin, suppliers, full legal description, ingredients/allergens, storage/usage instructions, and the full image gallery from the product page. Current price, unit price, was-price, and card image are already included without this toggle. Always on for a pasted product URL and automatically enabled whenever a Brand filter is set.
maxPagesintegerStop after walking this many category aisles (one 'page' = one real Mercadona aisle). Leave empty for no limit -- the run stops at Max products total. Ignored for a single pasted product URL.
maxItemsintegerHard cap on total products returned across the run. 0 = unlimited (still bounded by Max pages).
resumeFromRunIdstringPaste a previous run ID or dataset ID to continue a large catalogue pull without returning or charging for products already collected there. Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead.
incrementalModebooleanTurn this on for daily or recurring monitoring. The first run returns every matching product as NEW. Later runs normally return only NEW, UPDATED and REAPPEARED products, which is how a price cut or a stock change is spotted. Turn on Emit unchanged or Emit expired only when you also want those rows returned (and billed). State is kept separately for each search, filter and detail setup; use State key to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.
stateKeystringOptional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently configured runs. Leave empty to let the actor derive a key automatically from the search, filters and detail settings, so different searches never mix state with each other.
emitUnchangedbooleanOff by default. Turn on to also return products that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you want the full snapshot every run.
emitExpiredbooleanOff by default. Turn on to also return products that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, so never when Max products capped it or when Resume was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking.
ignoreFieldsForChangesarrayOutput field names that should NOT make a product count as UPDATED, for example image or description if changes to them are not relevant to you. Ignored fields are still returned in the output. None are ignored by default.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

productIdProduct ID (text)
nameProduct (text)
brandBrand (text)
categoryCategory (text)
pricePrice (number)
currencyCurrency (text)
unitPriceUnit price (€/kg, €/L...) (number)
unitPriceFormatUnit (text)
previousPriceWas price (number)
discountPercentDiscount % (number)
isOnSpecialOn special (boolean)
packagingPackaging (text)
Show 13 more fields
onlineAvailableAvailable (boolean)
urlURL (link)
imageImage (image)
eanEAN (text)
originOrigin (text)
suppliersSuppliers (array)
ingredientsIngredients (text)
allergensAllergens (text)
imagesImage gallery (array)
changeTypeChange (text)
changedFieldsChanged fields (array)
firstSeenAtFirst seen (text)
lastSeenAtLast seen (text)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "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,
  "published": 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": []
}

Ways to use this data

  • 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.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Mercadona Scraper return?

The documented output for Mercadona Scraper includes product id, product, brand, category, price, currency, unit price (€/kg, €/l...) and unit. Availability of each field depends on the source page and the selected mode.

How much does Mercadona Scraper cost?

It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

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 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.

Ready to collect with Mercadona Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.