Decathlon.es - Prices, Discounts, Specs & Reviews avatar

Decathlon.es - Prices, Discounts, Specs & Reviews

Pricing

from $1.00 / 1,000 product results

Go to Apify Store
Decathlon.es - Prices, Discounts, Specs & Reviews

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

Abot API

Maintained by Community

Actor stats

1

Bookmarked

4

Total users

1

Monthly active users

10 days ago

Last modified

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

FieldExample
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 / currency44.99 / "EUR"
originalPrice / discountPercent64.99 / 31
isOnSpecial / saleEndsAttrue / "2026-11-30T22:00:00.000Z"
onlineAvailabletrue
availableSizes["S", "M", "L", "XL"]
seller{"name": "Decathlon", "type": "FIRST_PARTY"}
sports["Hiking"]
image / images["https://contents.mediadecathlon.com/sample/picture.jpg"]
rating / reviewCount4.3 / 214
category / categoryPath"Sample Brand" / ["Deportes", "Trekking", "Marcas", "Sample Brand"]
descriptionfull product description text as shown on the site
specifications[{"name": "Nivel de práctica", "value": "Intermedio"}, {"name": "Material", "value": "Poliéster reciclado"}]
composition / careInstructions / guaranteematerial composition, care text and guarantee terms, when the site provides them
colors[{"name": "azul marino", "hexaCode": "#1B2A4A"}]
gtins["0000000000000"]
reviews.averageRating / reviews.totalReviewCount / reviews.recommendedCount4.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

  1. Pick a mode: search (keyword or category, with filters and sort) or url (paste product, search or category links).
  2. Fill in the fields for that mode, and switch on full product detail and/or reviews if you need them.
  3. Set Max products total (and optionally Max pages per search) to control run size and cost, then click Start.
  4. 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 ApifyClient
client = 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 classified NEW, UPDATED (with changedFields), or UNCHANGED (suppressed and not billed unless emitUnchanged is on). REAPPEARED and EXPIRED are different: a product is only ever marked EXPIRED after a run that scans the tracked search completely, with no page cap reached, no resumeFromRunId, and emitExpired turned on; only a product tombstoned that way can later come back as REAPPEARED. With emitExpired off, a product that stops showing up simply stays at its last known state forever, it is never marked EXPIRED and can never be marked REAPPEARED either. 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 an EXPIRED row on every run, then reports as REAPPEARED from 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. stateKey names 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.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. If the picker is empty, you haven't authorized a connector yet.
  3. For Notion, also set notionParentPageUrl to 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

ParameterTypeDefaultDescription
modestringsearchsearch (keyword or category) or url (paste product or listing links).
searchTermstringnone (prefill: "zapatillas running")Keyword, search mode only.
categorystringnoneA 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.
brandstringnoneExact brand name to keep, e.g. ADIDAS. Applies in both search and URL mode.
specialsOnlybooleanfalseKeep only products currently marked down. Applies in both search and URL mode.
minPricenumbernoneOnly return products priced at or above this amount, in euros. Applies in both search and URL mode.
maxPricenumbernoneOnly return products priced at or below this amount, in euros. Applies in both search and URL mode.
sortBystringRELEVANCERELEVANCE, 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.
urlsarraynone (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.
fetchDetailsbooleanfalseAdds 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.
fetchReviewsbooleantrueFetches the product's own reviews from decathlon.es's reviews API. On by default.
maxReviewsPerProductinteger10Cap on reviews per product when Fetch reviews is on; the API itself only ever surfaces up to 30 per page.
maxPagesinteger0Cap on result pages per search, category or URL entry. 0 means unlimited, the run then stops at Max products total instead.
maxItemsinteger20Hard cap on total products returned across every search, category or URL entry. 0 means unlimited.
resumeFromRunIdstringnonePaste 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.
incrementalModebooleanfalseTurn on for daily or recurring monitoring of the same search, category or URL set.
stateKeystringnoneIncremental mode only. Names or deliberately shares a monitoring campaign's stored state.
emitUnchangedbooleanfalseIncremental mode only. Also return, and bill, products that have not changed, marked UNCHANGED.
emitExpiredbooleanfalseIncremental 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.
proxyobject{"useApifyProxy": true}Connection settings.
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

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

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

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