Decathlon.es - Prices, Discounts, Specs & Reviews
Pricing
from $1.00 / 1,000 product results
Decathlon.es - Prices, Discounts, Specs & Reviews
Scrape Decathlon Spain (decathlon.es) sporting goods: current price plus strike-through discount, brand, seller, technical specifications, colour/size availability, GTINs, and reviews. Search by keyword/category with brand and price filters, or paste product and listing links.
Pricing
from $1.00 / 1,000 product results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Share
Decathlon Spain Scraper: Prices, Discounts, Specs & Reviews
Decathlon Spain Scraper turns decathlon.es into structured product data. Get the current price plus the strike through original price and discount percentage when a product is marked down, technical specifications, colour and size availability, first party vs marketplace seller, and reviews straight from Decathlon's own reviews API. Search by keyword or a real decathlon.es category, filter by brand and price, or paste product and listing links directly, then export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Was price and discount, structured, not scraped from a badge. When a product is marked down, both prices are captured plus the discount percentage and sale end date, gated on the site's own real reference price pair, never fabricated on full price items.
- First party vs marketplace seller. Decathlon Spain also runs a marketplace with third party sellers, and every record tells you which one sold it.
- Real technical specifications. Practice level, terrain, fit, material, waterproofing and more, straight from the product page's own structured attribute list, not scraped free text.
- Reviews straight from Decathlon's own API. Overall rating, review count, recommended count and individual reviews, rating, title, body, author, date and verified buyer flag, not a third party review vendor.
- Real filters and sort. Brand narrows the actual server side result set, on sale filters each page as it's read, and sorting by price, highest discount or highest rated reorders the full result set, not just one fetched page.
- Two ways in. Keyword or category search with real site filters, or paste any product, search or category link and pagination continues forward automatically.
- Incremental mode for scheduled monitoring. Run the same search again and again and get back only new and updated products by default, with unchanged products suppressed and not billed. Turn on emit expired to also mark products that disappear once a run scans the whole tracked search, and if one of those later comes back it is reported as reappeared.
Use Cases
- Price and promotion tracking: watch the was price, discount percentage and sale end date across a category to catch markdowns as they go live.
- Assortment and competitive research: compare brand mix, price bands and first party vs marketplace listings across a category or search.
- Product content for catalogs: pull structured technical specifications, composition and care instructions for a comparison site or internal catalog.
- Review and rating analysis: aggregate rating, review counts and individual reviews to gauge customer sentiment on specific models.
- Size and stock monitoring: track which sizes and colours remain available online for a watched list of products.
Data You Get
| Field | Example |
|---|---|
productId / supermodelId / sku | "0000000" / "000000" / "00000000-0000-0000-0000-000000000000" |
name | "Sample Trail Running Jacket - Navy and Lime" |
brand | "SAMPLE BRAND" |
url | "https://www.decathlon.es/es/p/sample-trail-running-jacket/000000/c0000m0000000" |
price / currency | 44.99 / "EUR" |
originalPrice / discountPercent | 64.99 / 31 |
isOnSpecial / saleEndsAt | true / "2026-11-30T22:00:00.000Z" |
onlineAvailable | true |
availableSizes | ["S", "M", "L", "XL"] |
seller | {"name": "Decathlon", "type": "FIRST_PARTY"} |
sports | ["Hiking"] |
image / images | ["https://contents.mediadecathlon.com/sample/picture.jpg"] |
rating / reviewCount | 4.3 / 214 |
category / categoryPath | "Sample Brand" / ["Deportes", "Trekking", "Marcas", "Sample Brand"] |
description | full product description text as shown on the site |
specifications | [{"name": "Nivel de práctica", "value": "Intermedio"}, {"name": "Material", "value": "Poliéster reciclado"}] |
composition / careInstructions / guarantee | material composition, care text and guarantee terms, when the site provides them |
colors | [{"name": "azul marino", "hexaCode": "#1B2A4A"}] |
gtins | ["0000000000000"] |
reviews.averageRating / reviews.totalReviewCount / reviews.recommendedCount | 4.31 / 214 / 178 |
reviews.items[] | [{"rating": 4, "title": "Muy resistente", "body": "Sample review text.", "author": "Sample User", "date": "2026-08-02T09:15:00+00:00", "recommended": true, "verifiedBuyer": true}] |
scrapedAt | "2026-09-29T00:00:00.000000+00:00" |
changeType (incremental mode only) | "NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED" |
changedFields (incremental mode only) | ["price", "isOnSpecial"] |
firstSeenAt / lastSeenAt (incremental mode only) | "2026-09-01T00:00:00Z" / "2026-09-29T00:00:00Z" |
Sample shape: values above are illustrative placeholders, not from a live product.
Every record is a product. specifications, composition, careInstructions, guarantee, colors, gtins, categoryPath and a short list of merchandising tags are only present when full product detail is fetched; reviews reflects whatever the reviews toggle was set to (an empty reviews object when it is off); changeType, changedFields, firstSeenAt and lastSeenAt only appear when incremental mode is on.
How to Use
- Pick a mode:
search(keyword or category, with filters and sort) orurl(paste product, search or category links). - Fill in the fields for that mode, and switch on full product detail and/or reviews if you need them.
- Set Max products total (and optionally Max pages per search) to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Keyword search, first page, with reviews (default):
{"mode": "search","searchTerm": "zapatillas running","maxItems": 20}
Category browse, filtered to a brand, sorted by highest discount, on sale only:
{"mode": "search","category": "deportes/running/zapatillas-running","brand": "ADIDAS","specialsOnly": true,"sortBy": "DISCOUNT_DESC","maxItems": 50,"maxPages": 5}
Full product detail (specifications and GTINs) and reviews for a pasted product link:
{"mode": "url","urls": ["https://www.decathlon.es/es/p/zapatillas-running-adidas-runblaze-mujer-gris-y-rosa/361443/c2c24m8930464"],"fetchDetails": true,"fetchReviews": true}
Paste a category listing page and continue pagination forward from where it left off:
{"mode": "url","urls": ["https://www.decathlon.es/es/deportes/running/zapatillas-running?from=40&size=40"],"maxItems": 100,"maxPages": 10}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/decathlon-es-scraper").call(run_input={"mode": "search", "searchTerm": "zapatillas running", "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/decathlon-es-scraper').call({ mode: 'search', searchTerm: 'zapatillas running', 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.
Caps: Max pages per search and Max products total
Max products total is the hard stop across every search, category or pasted URL in the run. Max pages per search additionally caps how many result pages are walked per individual search, category or listing URL before moving to the next one; leave it at 0 (unlimited) to let Max products total be the only stop. A search or category listing walk stops naturally at an empty page or a page with fewer products than the page size, in addition to either cap.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted run: paste its run or dataset id and the actor skips every product already collected there, so you don't pay twice. It walks the same search from the start again, using that skip list to return only what wasn't collected before, so a capped or interrupted run can still reach genuinely new products further down the result set. This does not currently extend to a pasted single product URL in URL mode: a pasted product is read (and billed) again on every run regardless of Resume, so avoid relying on Resume to save cost on a URL-mode run made up only of individual product links. - Incremental mode (
incrementalMode) is for running the same search, category or URL set again and again on a schedule. Each product is classifiedNEW,UPDATED(withchangedFields), orUNCHANGED(suppressed and not billed unlessemitUnchangedis on).REAPPEAREDandEXPIREDare different: a product is only ever markedEXPIREDafter a run that scans the tracked search completely, with no page cap reached, noresumeFromRunId, andemitExpiredturned on; only a product tombstoned that way can later come back asREAPPEARED. WithemitExpiredoff, a product that stops showing up simply stays at its last known state forever, it is never markedEXPIREDand can never be markedREAPPEAREDeither. For a pasted single product URL specifically, this currently behaves differently than intended: because a pasted product is never added to the run's own collected-ids list (the same gap Resume runs into above), a URL-mode run made up only of individual product links can count as a complete scan every time, so with Emit expired on, each pasted product gets billed anEXPIREDrow on every run, then reports asREAPPEAREDfrom the second run onward, even though the product never actually disappeared. Leave Emit expired off for a URL-mode run of individual product links until this is addressed.stateKeynames or shares the stored state; leaving it empty derives a key from the search and detail/reviews settings automatically. With incremental mode off, output is exactly as before this feature existed.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
- For Notion, also set
notionParentPageUrlto the page where item pages should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keyword or category) or url (paste product or listing links). |
searchTerm | string | none (prefill: "zapatillas running") | Keyword, search mode only. |
category | string | none | A decathlon.es category path (not a full URL, search mode only accepts the path), used only when Search keyword is empty (search mode only). To paste a full category URL, use URL mode instead. |
brand | string | none | Exact brand name to keep, e.g. ADIDAS. Applies in both search and URL mode. |
specialsOnly | boolean | false | Keep only products currently marked down. Applies in both search and URL mode. |
minPrice | number | none | Only return products priced at or above this amount, in euros. Applies in both search and URL mode. |
maxPrice | number | none | Only return products priced at or below this amount, in euros. Applies in both search and URL mode. |
sortBy | string | RELEVANCE | RELEVANCE, PRICE_ASC, PRICE_DESC, DISCOUNT_DESC or RATING_DESC. Applies in both search and URL mode, and for a pasted search or category URL this overrides whatever sort order was already in the URL. |
urls | array | none (prefill: a sample category URL) | Product, search or category listing URLs to scrape, URL mode only. Pagination continues forward automatically from any ?from= already in the URL. |
fetchDetails | boolean | false | Adds the full breadcrumb category path, description, technical specifications, composition/care/guarantee text, colour swatches and GTINs. Not applied to a bare pasted product URL, which always fetches full detail regardless of this toggle. |
fetchReviews | boolean | true | Fetches the product's own reviews from decathlon.es's reviews API. On by default. |
maxReviewsPerProduct | integer | 10 | Cap on reviews per product when Fetch reviews is on; the API itself only ever surfaces up to 30 per page. |
maxPages | integer | 0 | Cap on result pages per search, category or URL entry. 0 means unlimited, the run then stops at Max products total instead. |
maxItems | integer | 20 | Hard cap on total products returned across every search, category or URL entry. 0 means unlimited. |
resumeFromRunId | string | none | Paste a previous run id or its dataset id to continue that run: products already collected there are skipped, so this run only returns new products. |
incrementalMode | boolean | false | Turn on for daily or recurring monitoring of the same search, category or URL set. |
stateKey | string | none | Incremental mode only. Names or deliberately shares a monitoring campaign's stored state. |
emitUnchanged | boolean | false | Incremental mode only. Also return, and bill, products that have not changed, marked UNCHANGED. |
emitExpired | boolean | false | Incremental mode only. Also return, and bill, products that were tracked before and are no longer found, marked EXPIRED, and gates whether such a product can ever be tombstoned at all, not just whether the row is emitted. Only takes effect after a run that fully scans the tracked search. |
proxy | object | {"useApifyProxy": true} | Connection settings. |
mcpConnectors | array | none | Optional MCP connectors to export results into (Notion, Linear, Airtable, Apify). |
notionParentPageUrl | string | none | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items exported to each connector per run. Does not affect the dataset. |
Output Example
{"productId": "0000000","supermodelId": "000000","sku": "00000000-0000-0000-0000-000000000000","name": "Sample Trail Running Jacket - Navy and Lime","brand": "SAMPLE BRAND","url": "https://www.decathlon.es/es/p/sample-trail-running-jacket/000000/c0000m0000000","image": "https://contents.mediadecathlon.com/sample/picture.jpg","images": ["https://contents.mediadecathlon.com/sample/picture.jpg"],"price": 44.99,"currency": "EUR","originalPrice": 64.99,"discountPercent": 31,"isOnSpecial": true,"saleEndsAt": "2026-11-30T22:00:00.000Z","availableSizes": ["S", "M", "L", "XL"],"onlineAvailable": true,"seller": { "name": "Decathlon", "type": "FIRST_PARTY" },"sports": ["Hiking"],"nature": "chaqueta de trekking","rating": 4.31,"reviewCount": 214,"categoryPath": ["Deportes", "Trekking", "Marcas", "Sample Brand"],"category": "Sample Brand","description": "Sample product description as shown on the site.","specifications": [{ "name": "Nivel de práctica", "value": "Intermedio" },{ "name": "Material", "value": "Poliéster reciclado" }],"colors": [{ "name": "azul marino", "hexaCode": "#1B2A4A" }],"gtins": ["0000000000000"],"reviews": {"averageRating": 4.31,"totalReviewCount": 214,"recommendedCount": 178,"items": [{ "rating": 4, "title": "Muy resistente", "body": "Sample review text.", "author": "Sample User", "date": "2026-08-02T09:15:00+00:00", "recommended": true, "verifiedBuyer": true }]},"scrapedAt": "2026-09-29T00:00:00.000000+00:00"}
Sample shape: values above are illustrative placeholders, not from a live product.
Plan Requirement
The default connection works out of the box, and the run automatically retries with a different connection when one is refused. For large or frequent runs, the residential proxy group gives more headroom, pick it under Connection.
FAQ
How much does it cost?
You pay per product returned, plus a small one time surcharge on a product when full detail and/or reviews were actually fetched for it. Fetch reviews is on by default, so most runs include that surcharge; turn it off, along with Fetch full product detail, if you only need the listing fields. A pasted single product URL always fetches full detail and is always charged that surcharge, regardless of the Fetch full product detail toggle. Suppressed incremental mode duplicates are never billed. The Pricing tab shows the current rates, and Max products total caps the cost of any run.
Is it legal to scrape Decathlon Spain?
This actor collects only publicly available product data. You are responsible for how you use it: follow decathlon.es's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product prices and specifications are generally facts, but photos and review text may be subject to third party rights.
Can I get only new or changed products on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs then return only new and updated products, unchanged ones are not billed. Products that disappear are only tracked as expired, and can only later be reported as reappeared, once you turn on Emit expired and a run scans the tracked search completely.
What's the difference between Resume and Incremental mode?
Resume continues one specific interrupted run from a pasted run or dataset id, walking the search again but skipping everything that run already collected. Incremental mode tracks a recurring search, category or URL set by itself, across separately scheduled runs, and classifies each product against what it saw last time.
Why did my run return an empty dataset instead of failing?
If every request during a run gets refused, or a page fails to load, the run logs a warning and finishes with whatever was already collected, which can be an empty dataset, rather than stopping with an error. Run it again in a few minutes. A run only stops with an error status for a genuine input problem, such as an invalid Resume id, or turning on Incremental mode together with Resume when that search already has saved incremental state.
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 e-commerce data?
Pair this actor with these related scrapers from the same team:
| 🔌 MediaMarkt.es Scraper Scrape MediaMarkt Spain (mediamarkt.es) products: current price, strike-through original... | 🛒 LeroyMerlin.es Scraper Scrape Leroy Merlin Spain (leroymerlin.es) DIY and home-improvement products: price... |
| 🛒 druni.es Scrape Druni beauty, cosmetics and perfume products. Search by keyword, category, Ofertas... | 👗 El Corte Inglés Scraper Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home... |
| 🥦 Mercadona Scraper Scrape Mercadona products by delivery-area postal code. Search by keyword or category, or... | 🛒 HORNBACH Products, Prices & Reviews Scraper Scrape HORNBACH (hornbach.de) DIY, building & garden products: current + strike-through... |
💬 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.