Decathlon.es at a glance
Decathlon.es is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes product id, sku, product, brand and category, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 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
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
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.
What Decathlon.es can do
- 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.
Choose what to collect
These inputs let you configure Decathlon.es - Prices, Discounts, Specs & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | 'search' finds products by keyword or by a real decathlon.es category, with a brand filter, price range, specials toggle, and sort. 'url' scrapes any product, search, or category listing page URL you paste, walking pagination forward automatically. |
searchTermstring | Free-text keyword, e.g. 'zapatillas running' or 'mochila trekking'. Leave empty and use Category below to browse a category without a keyword (the two are alternative ways in, not combined). Search mode only. |
categorystring | A real decathlon.es category path, e.g. 'deportes/running/zapatillas-running' (not a full link; to paste a full category link use URL mode). Search mode only. Used only when Search keyword is empty. |
brandstring | Only return products from this exact brand, e.g. 'ADIDAS', 'KIPRUN', 'QUECHUA'. Match the brand name as shown on the site. Leave empty for all brands. Applies to both search and URL mode. |
specialsOnlyboolean | Keep only products currently marked down -- decathlon.es's own live discount signal (a real strike-through original price plus discount percentage on the product itself), not a guessed category or a separate landing-page feed. Applies to both search and URL mode. |
minPricenumber | Only return products priced at or above this amount, in euros. Applies to both search and URL mode. |
maxPricenumber | Only return products priced at or below this amount, in euros. Applies to both search and URL mode. |
Show 16 more inputs
| Input | What it controls |
|---|---|
sortBystring | decathlon.es's own sort order, verified live to reorder the full server-side result set (so it stays correct across pagination, not just within one fetched page). Applies to both search and URL mode; any value other than Relevance overrides the sort in a pasted URL. |
urlsarray | Paste one or more decathlon.es product pages, search result pages, or category listing pages. Pagination continues forward automatically from any ?from= already in the URL. Brand, On sale only and the price filters above still narrow the results in this mode, and Sort order and Brand override any sort= / Ns= / facets= already in a pasted URL. Leaving this field untouched in URL mode scrapes one example per URL shape. URLs from other sites or other-country Decathlon sites are skipped with a warning. |
fetchDetailsboolean | Adds the full breadcrumb category path, complete description, technical characteristics (level, terrain, fit, material, etc.), composition/care/guarantee text, colour swatches, and per-size GTIN/EAN codes from the product page. Current price, was-price/discount, brand, and card image are already included without this toggle. |
fetchReviewsboolean | Fetch the product's own reviews (not a third-party vendor) from decathlon.es's reviews API: overall rating, total review count, recommended count, and individual reviews (rating, title, body, author, date, verified-buyer flag). Products with no reviews simply return an empty list. |
maxReviewsPerProductinteger | Cap on reviews fetched per product when 'Fetch reviews' is on, walking the review pages as needed; maximum 1000. |
maxPagesinteger | Stop after this many result pages per search/category/URL entry. 0 (default) = unlimited -- the run stops at Max products total instead. |
maxItemsinteger | Hard cap on total products returned across every search/category/URL entry. 0 = unlimited (still bounded by Max pages per search); maximum 100000. |
resumeFromRunIdstring | Paste a previous run id (or its dataset id) to continue that run without returning or charging for products already collected there. Use this after an interrupted run. For recurring daily/scheduled monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching products as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED products. A product is UPDATED when a compared field changes (price, original price, promotion, sizes, availability, name, brand, images order, specifications...); changedFields names them. Excluded from the comparison (still present in the output): scrapedAt, rating, reviewCount and the whole reviews block, so new reviews never trigger UPDATED. Image CDN shard hosts and cache-buster parameters are ignored too. Turn on "Emit unchanged" or "Emit expired" only when you also want those products returned (and billed). State is kept separately for each search/category/URL and detail/reviews setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. 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/category/URL and detail/reviews settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off 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 specifically want the full snapshot every run. |
emitExpiredboolean | Off 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 -- not 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. |
ignoreFieldsForChangesarray | Incremental mode only. Extra field names that must never make a product UPDATED or appear in changedFields (they stay in the output). Use a dotted path for a nested field, for example reviews.items. Already ignored by default: scrapedAt, rating, reviewCount, reviews. |
mcpConnectorsarray | Optionally 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). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap 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)skuSKU (text)nameProduct (text)brandBrand (text)categoryCategory (text)pricePrice (number)currencyCurrency (text)originalPriceOriginal price (number)discountPercentDiscount % (number)isOnSpecialOn sale (boolean)ratingRating (number)reviewCountReviews (number)Show 24 more fields
onlineAvailableAvailable (boolean)inStockIn stock (boolean)sellerSeller (first-party vs marketplace) (object)urlURL (link)imageImage (image)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)scrapedAtScraped at (date)specificationsSpecifications (name/value list) (object)compositionComposition (text)careInstructionsCare instructions (text)guaranteeGuarantee (text)reviewsReviews (summary and items) (object)supermodelIdModel ID (text)categoryPathCategory path (array)descriptionDescription (text)availableSizesAvailable sizes (array)colorsColours (array)gtinsGTINs (array)sportsSports (array)imagesImages (array)saleEndsAtSale ends (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"inStock": 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,
"percentageSatisfied": 83.75,
"ratingDistribution": {
"1": 20,
"2": 14,
"3": 20,
"4": 40,
"5": 120
},
"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,
"reviewId": "00000000-0000-0000-0000-000000000000",
"replies": [],
"usedSince": "de 2 a 8 semanas",
"incentivized": false
}
]
},
"scrapedAt": "2026-09-29T00:00:00.000000+00:00"
}Ways to use this data
- 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.
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 Decathlon.es return?
The documented output for Decathlon.es includes product id, sku, product, brand, category, price, currency and original price. Availability of each field depends on the source page and the selected mode.
How much does Decathlon.es cost?
It costs $2.00 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.
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.
Ignore fields when detecting changes (incremental mode only)
In incremental mode a product is UPDATED when a compared field changes, and changedFields names the fields that moved. scrapedAt, rating, reviewCount and the whole reviews block are excluded by default, so new reviews never trigger UPDATED; they remain in every row. Image CDN shard hosts and cache-buster parameters are normalised too. Add your own names to ignoreFieldsForChanges (a dotted path such as reviews.items targets a nested field). Changing the list never causes a one-off wave of UPDATED rows, because stored products are compared again using the current list.
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.
What happens when pages cannot be loaded?
It depends on how many pages loaded. If no page at all could be loaded (every request was refused or failed), the run ends as failed with one of the three connection messages listed under Plan Requirement, and nothing is collected or billed for that run; run it again in a few minutes. If some pages loaded and others were refused, the run finishes with the products it did collect and logs a warning for each page that could not be loaded, so check the log when a result looks short. A search that loads fine but simply has no matching products finishes successfully with an empty dataset. The run also 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.
