elcorteingles.es - Prices, Variants, Rebajas & Reviews avatar

elcorteingles.es - Prices, Variants, Rebajas & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
elcorteingles.es - Prices, Variants, Rebajas & Reviews

elcorteingles.es - Prices, Variants, Rebajas & Reviews

Scrape El Corte Inglés (elcorteingles.es): moda, electrónica, hogar, perfumería, joyería, juguetes and libros. Current price plus was-price/discount on marked-down items, colour/size variants with availability, brand, category path, images and reviews. Search by keyword/category or paste links.

Pricing

from $1.00 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

6 days ago

Last modified

Share

El Corte Inglés Product Scraper

Pull product data from El Corte Inglés (elcorteingles.es), Spain's flagship department store: moda (fashion), electrónica, hogar, perfumería, joyería y relojes, juguetes and libros. Search by keyword or a real site category, or paste product and listing links directly. Every record includes the current price, the strike-through original price with discount percentage when a product is marked down, colour/size variants with their own price and availability, and product reviews.

Why This Scraper?

  • Was-price and discount, structured, not scraped from a badge. When a product is marked down, both the original and current price are captured plus the discount percentage, read straight from the site's own product data.
  • Colour and size variants. Fashion, footwear and similar products return every colour and size as its own variant, each with its own price, was-price/discount and availability.
  • Reviews with rating and distribution. Overall rating, total review count, and individual reviews (rating, title, body, author, date).
  • Two ways in. Keyword or category search with brand, price and on-sale filters plus the site's own sort, or paste any product/listing link and continue pagination automatically.
  • Optional export to your apps. Send results into Notion, Linear, Airtable, or any Apify MCP connector alongside the dataset.

Data You Get

FieldExample value
productId / skuA12345678, 41931658
nameSample Running Sneaker
brandSAMPLE BRAND
category / categoryPathZapatillas, ["Moda hombre", "Zapatillas"]
urlhttps://www.elcorteingles.es/moda-hombre/A12345678-sample-slug/
price / currency39.90, EUR
originalPrice / discountPercent79.90, 50
isOnSaletrue
color / sizeBeige, 42
onlineAvailabletrue
seller / isMarketplaceSAMPLE SELLER, true
image / images["https://dam.elcorteingles.es/producto/sample-00.jpg"]
descriptionfull product description text
specifications{"Género": "Hombre", "Capacidad": "15 ml"}
variants[{"sku": "41931658", "color": "Beige", "size": "39", "price": 39.9, "originalPrice": 79.9, "discountPercent": 50, "onlineAvailable": true}]
reviews.averageRating / reviews.totalReviewCount4.6, 212
reviews.items[][{"rating": 5, "title": "Muy cómodas", "body": "Sample review text.", "author": "Cliente", "date": "2026-06-05T00:00:00.000+00:00"}]
changeType / changedFields / firstSeenAt / lastSeenAt"UPDATED", ["price", "isOnSale"], ISO timestamps -- only present when incrementalMode is on (see "Incremental mode" below).

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

How to Use

1. Keyword search, first page, with reviews (default):

{
"mode": "search",
"searchTerm": "zapatillas running",
"maxItems": 20
}

2. Category browse, filtered to a brand and price band, sorted by discount, on sale only:

{
"mode": "search",
"categoryPath": "moda-hombre/zapatillas",
"brands": ["Skechers"],
"minPrice": 20,
"maxPrice": 100,
"onSaleOnly": true,
"sortBy": "DISCOUNT_DESC",
"maxItems": 50,
"maxPages": 5
}

3. Full product detail (variants + description + specifications) and reviews for a pasted product link:

{
"mode": "url",
"urls": ["https://www.elcorteingles.es/moda-hombre/A12345678-sample-slug/"],
"fetchDetails": true,
"fetchReviews": true
}

4. Paste a category or search-result listing and keep paginating forward:

{
"mode": "url",
"urls": ["https://www.elcorteingles.es/electronica/television/"],
"maxItems": 100,
"maxPages": 10
}

5. Continue a previous run, collecting only new products:

{
"mode": "search",
"categoryPath": "moda-hombre/zapatillas",
"resumeFromRunId": "<a previous run id or dataset id>"
}

6. Recurring monitoring: run the same search on a schedule, get only what changed:

{
"mode": "search",
"categoryPath": "moda-hombre/zapatillas",
"onSaleOnly": true,
"incrementalMode": true
}

Incremental mode (recurring monitoring)

incrementalMode is for a search/category you run repeatedly (e.g. an Apify schedule): the actor remembers the products it saw last time -- itself, in a dedicated key-value store keyed by your search -- and returns only what's different this time:

changeTypeMeaning
NEWNot seen on a previous run for this search.
UPDATEDSeen before, and at least one tracked field differs -- changedFields lists exactly which.
REAPPEAREDWas marked EXPIRED on a previous run, now back.
EXPIREDSeen before, not found this run (only emitted when emitExpired is on -- see below).

Every incremental row also carries changedFields (empty for NEW/REAPPEARED), firstSeenAt, and lastSeenAt (ISO timestamps).

This is a different feature from resumeFromRunId above: Resume continues one specific interrupted run from a pasted id; Incremental mode tracks a search across separate scheduled runs, with no id to paste. The two are independent -- Resume can be combined with Incremental mode only to bootstrap the very first incremental run from an already-collected dataset (using that id both to seed the new baseline and to skip re-collecting); combining them once a baseline already exists is rejected, since a resumed run only returns a delta and would otherwise wipe out everything already tracked.

  • stateKey (optional): give the monitoring campaign a stable name. Leave empty and the actor derives one automatically from your search term/category/URLs and filters -- caps (maxItems, maxPages, maxNotifyListings) are never part of that key, so raising or lowering them between scheduled runs never starts a new baseline or re-bills everything as NEW.
  • emitUnchanged (default off): also return UNCHANGED rows (the full current snapshot every run), not just what changed. Returning unchanged rows bills like any other product result -- leave off unless you need the complete snapshot every time.
  • emitExpired (default off): also return EXPIRED rows for products no longer found. Only runs when this run actually scanned the search to its natural end -- a maxItems/maxPages cap, a resumeFromRunId run, or an unsupported/failed URL skips EXPIRED detection for that run (logged), since a partial scan can't tell "gone from the site" apart from "not reached yet" -- previously tracked data is kept as-is until a complete run can check. Returning expired rows bills like any other product result.

What counts as a change. Price, was-price/discount, stock, marketplace seller, and the review rating and count are all compared -- these are exactly the "did something really change" signals a monitoring user wants, measured live and confirmed stable when nothing on the site actually changed (see below). A product's individual review list is included too: a genuinely new review is real, deliberate content and will surface as UPDATED, the same as a price or stock change. description/specifications/the full colour-size variants matrix/breadcrumb categoryPath only ever come from a landed fetchDetails fetch, and the product's reviews only from a landed fetchReviews fetch -- if either fetch fails for one run (a transient block, not a toggle change: both toggles are part of what's tracked, so they never change mid-campaign), that run's row still ships with whatever it has, but those specific fields are excluded from change detection for that comparison so a transient fetch miss on OUR side is never reported as those fields having changed on the site.

Volatility measurement. Two fetches of the same category listing page ~4 minutes apart returned byte-identical price/stock/seller/image/variant data across every matched product; two fetches of the same product's reviews feed ~1 minute apart returned the identical review count and the identical ordered review list (the feed is sorted submissiontime:desc with a fixed page size, so it's deterministic absent a genuinely new review). Nothing was excluded as noise as a result -- every field above is either page-static structural data or a real product-state value.

State storage ceiling. Each tracked product's baseline entry is roughly 2.4 KB uncompressed with the default toggles (no detail/reviews), or roughly 6.1 KB with fetchDetails+fetchReviews on and the default 10 reviews/product -- measured live from real category and review-feed payloads. Apify's key-value store record-size cap applies to the compressed size; this actor's state blob compresses at roughly 10-16x (gzip), so the practical ceiling per state key is on the order of ~36,000 tracked products with the default toggles, or ~22,000 with fetchDetails+fetchReviews on. Use a separate stateKey per campaign to split a monitoring workload larger than that.

Input Parameters

ParameterTypeDescription
modestringsearch or url.
searchTermstringKeyword (search mode only).
categoryPathstringA real site category path, e.g. moda-hombre/zapatillas (search mode only).
onSaleOnlybooleanKeep only products currently marked down. Applies in both search and URL mode.
brandsarrayExact brand names to keep. Applies in both search and URL mode.
minPrice / maxPricenumberEUR price band to keep. Applies in both search and URL mode. The band is handed to the site's own price filter first, so the run only pages through results already inside it (see "How filtering is bounded" below).
sortBystringRELEVANCE, PRICE_ASC, PRICE_DESC, NEWEST, BEST_SELLERS, DISCOUNT_DESC, RATING_DESC, NAME_ASC, NAME_DESC, or STOCK_DESC. Applies in both search and URL mode. When you paste a category or search-result URL that already has its own sort order encoded in it, that URL-encoded sort takes priority and this input is only consulted as a fallback for URLs that carry none.
urlsarrayProduct, category, or search-result listing URLs to scrape (url mode only).
fetchDetailsbooleanFetch full product detail (breadcrumb category path, description, specifications, complete colour/size variant matrix).
fetchReviewsbooleanFetch the product's reviews.
maxReviewsPerProductintegerCap on individual reviews fetched per product.
maxPagesintegerCap on result pages per search/category/URL entry; 0 (default) = unlimited, walk every page until the site's own page count or Max products total is hit.
maxItemsintegerCap on total products returned; 0 = unlimited.
resumeFromRunIdstringOptional: a previous run id (or its dataset id). Products it already collected are skipped, so this run returns only new products (a delta). Leave empty for a normal run. For a recurring/scheduled search, use incrementalMode instead.
incrementalModebooleanRecurring monitoring: track this search across scheduled runs and return only NEW/UPDATED/REAPPEARED products (see "Incremental mode" above). Off by default.
stateKeystringOptional label for the tracked search when incrementalMode is on. Leave empty to derive one automatically.
emitUnchangedbooleanIncremental mode only: also return UNCHANGED products. Off by default; billed like any other result.
emitExpiredbooleanIncremental mode only: also return products no longer found, when the run reached a complete scan. Off by default; billed like any other result.
proxyobjectApify proxy configuration. Works on every plan by default.
mcpConnectorsarrayOptional MCP connectors to export results into (Notion, Linear, Airtable, Apify).
notionParentPageUrlstringNotion connector only: page under which item pages are created.
maxNotifyListingsintegerCap on items exported to each connector per run. Does not affect the dataset.

Output Example

{
"productId": "A12345678",
"name": "Sample Running Sneaker",
"brand": "SAMPLE BRAND",
"category": "Zapatillas",
"categoryPath": ["Moda hombre", "Zapatillas"],
"url": "https://www.elcorteingles.es/moda-hombre/A12345678-sample-slug/",
"sku": "41931658",
"gtin": "8447340292665",
"price": 39.9,
"currency": "EUR",
"originalPrice": 79.9,
"discountPercent": 50,
"isOnSale": true,
"color": "Beige",
"size": "39",
"onlineAvailable": true,
"seller": "SAMPLE SELLER",
"isMarketplace": true,
"image": "https://dam.elcorteingles.es/producto/sample-00.jpg",
"images": ["https://dam.elcorteingles.es/producto/sample-00.jpg", "https://dam.elcorteingles.es/producto/sample-01.jpg"],
"description": "Sample product description as shown on the site.",
"specifications": { "Género": "Hombre" },
"variants": [
{ "sku": "41931658", "color": "Beige", "size": "39", "price": 39.9, "currency": "EUR", "originalPrice": 79.9, "discountPercent": 50, "isOnSale": true, "onlineAvailable": true }
],
"reviews": {
"averageRating": 4.6,
"totalReviewCount": 212,
"items": [
{ "rating": 5, "title": "Muy cómodas", "body": "Sample review text.", "author": "Cliente", "date": "2026-06-05T00:00:00.000+00:00" }
]
}
}

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

A note on coverage

The supermercado (grocery) section of the site sits behind a materially harder verification step than the rest of the catalog and is not currently scraped by this actor -- a categoryPath or pasted URL under that section is skipped with a clear log message rather than failing the whole run. All other departments (moda, electrónica, hogar, perfumería, joyería y relojes, juguetes, libros) are fully supported.

Reviews come from the site's own reviews feed. Not every product has reviews; products with none simply return an empty items list rather than blocking the run.

How filtering is bounded

minPrice/maxPrice are pushed into the site's own price filter, so a price band narrows the results before they are paged through rather than after. On a large department a minPrice of 900 takes moda-mujer from roughly 10,000 products across 834 pages down to about 174 across 15, and electrónica from roughly 9,800 across 822 pages down to about 1,180 across 99 -- you pay to walk the band you asked for, not the whole department.

brands and onSaleOnly have no equivalent on the site, so those are checked after each page is fetched. To stop a very selective combination from paging through an entire department looking for survivors, the run stops a search after 5 consecutive result pages that contain no match at all.

The run then tells you which of the two happened, in the status message on the run page:

  • "Reached the end of the results: N product(s) matched your filters..." -- the search was read to the end. N is genuinely all there is.
  • "Stopped early: ... these results were NOT read to the end and more matches may exist further down." -- the run gave up on that 5-page rule. Narrow the category or widen the filter to see the rest.

A run that stopped early and returned nothing at all is reported as a failed run, not an empty success: giving up early is not evidence that there are no matches.

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.

What's sentA condensed, human-readable summary per product (name plus key fields) -- the complete record always stays in the Apify dataset.
Notion setupSet notionParentPageUrl to the page the item pages should be created under.
Supported connectorsNotion, Linear, Airtable, and Apify. Leave mcpConnectors empty to skip; it never changes the dataset output. Use maxNotifyListings to cap how many items are exported per connector per run.

A note on proxy

Leave the default proxy configuration as-is for normal runs. You may optionally switch to a different proxy group for very large or sustained runs.