# Decathlon Scraper (`crawlerbros/decathlon-scraper`) Actor

Scrape Decathlon US (decathlon.com) sporting-goods catalog. Search by keyword, browse any of 200+ categories, or fetch specific products by handle/URL. Get pricing, discounts, stock, brand, images, colors, sizes and full descriptions.

- **URL**: https://apify.com/crawlerbros/decathlon-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Decathlon Scraper

Scrape [decathlon.com](https://www.decathlon.com) — Decathlon's US sporting-goods store. Search products by keyword, browse any of 200+ categories (tents, running shoes, bikes, backpacks, apparel...), or fetch specific products by handle/URL. Get pricing, discounts, stock status, brand, colors, sizes, images and full descriptions. No login, no cookies, no proxy required.

### What this actor does

- **Five modes:** `search`, `byCollection`, `byProductHandles`, `byRelatedProducts`, `browseCollections`
- **Full category taxonomy:** 200+ curated Decathlon categories (tents, hiking boots, road bikes, cycling apparel, ski gear, and more)
- **Filters:** brand, product type/category, gender (Men's/Women's/Unisex/Boys'/Girls'), price range, in-stock only, on-sale only
- **Sorting:** relevance, price (low/high), title (A-Z/Z-A), newest first
- **Rich product data:** brand, category, price + discount %, colors, sizes, per-variant SKUs, images, description
- **Empty fields are omitted** — every record only contains fields that were actually populated

### Output per product

- `productId`, `title`, `handle`, `productUrl`
- `vendor` — Decathlon in-house brand (Quechua, Kiprun, Forclaz, Van Rysel, Simond, Wedze, Rockrider, Itiwit, Riverside, Decathlon)
- `productType` — category (Tent, Shoes, Backpack, Sleeping bag, etc.)
- `gender` — Men's / Women's / Unisex / Boys' / Girls', only present when the product is gender-labeled
- `description` — plain-text product description
- `tags[]`
- `priceMin`, `priceMax`, `currency`
- `onSale`, `compareAtPriceMax`, `discountPercentage` — only present when the product is discounted
- `inStock`, `variantCount`
- `colors[]`, `sizes[]` — only present when the product has that option
- `variants[]` — per-variant `title`, `sku`, `price`, `compareAtPrice`, `available`, `weightGrams`
- `images[]`, `mainImageUrl`, `imageCount`
- `collectionHandle` — present when fetched via `byCollection`
- `relatedToHandle` — present when fetched via `byRelatedProducts` (the seed product's handle)
- `createdAt`, `updatedAt`, `publishedAt`
- `sourceUrl`, `recordType: "product"`, `scrapedAt`

### Output per category (mode=browseCollections)

- `collectionId`, `title`, `handle`, `collectionUrl`
- `description`, `productsCount`, `imageUrl`
- `publishedAt`, `updatedAt`
- `sourceUrl`, `recordType: "collection"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byCollection` / `byProductHandles` / `byRelatedProducts` / `browseCollections` |
| `searchQuery` | string | `tent` | Free-text keyword (mode=search) — matched against title, description, brand, category, tags |
| `collectionHandle` | select | – | One of 200+ categories to browse (mode=byCollection) |
| `productIdentifiers` | array | – | Exact product handles or full product URLs (mode=byProductHandles) |
| `relatedToProduct` | string | – | A product handle or URL to find related/similar products for (mode=byRelatedProducts) — returns up to 10 items Decathlon itself recommends |
| `vendor` | select | any | Filter to one Decathlon brand |
| `productType` | select | any | Filter to one exact product type/category |
| `gender` | select | any | Filter to Men's / Women's / Unisex / Boys' / Girls' (applies to search, byCollection, byRelatedProducts) |
| `minPrice` / `maxPrice` | int | 0 / 12000 | Price range in USD |
| `inStockOnly` | bool | `false` | Only in-stock products |
| `onSaleOnly` | bool | `false` | Only discounted products |
| `sortBy` | select | `relevance` | `relevance` / `priceLowToHigh` / `priceHighToLow` / `titleAZ` / `titleZA` / `newest` |
| `maxItems` | int | `20` | Hard cap on emitted records (1–1000) |

#### Example: search for waterproof jackets under $150, in stock

```json
{
  "mode": "search",
  "searchQuery": "rain jacket",
  "maxPrice": 150,
  "inStockOnly": true,
  "sortBy": "priceLowToHigh"
}
```

#### Example: browse all 2-person tents on sale

```json
{
  "mode": "byCollection",
  "collectionHandle": "camping-tents-2-3-person",
  "onSaleOnly": true
}
```

#### Example: fetch specific products by URL

```json
{
  "mode": "byProductHandles",
  "productIdentifiers": [
    "https://www.decathlon.com/products/women-s-trekking-backpack-45-10-l-mt500-air",
    "kiprun-kipstorm-lab-mens-carbon-plate-running-shoes-369831"
  ]
}
```

#### Example: find products related to a specific tent

```json
{
  "mode": "byRelatedProducts",
  "relatedToProduct": "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person"
}
```

#### Example: list every available category

```json
{
  "mode": "browseCollections",
  "maxItems": 250
}
```

### Use cases

- **Price monitoring** — track Decathlon's own-brand gear pricing and discounts over time
- **Competitor research** — compare sporting-goods pricing/assortment against other retailers
- **Product feeds** — build a comparison-shopping or affiliate feed from Decathlon's catalog
- **Inventory intelligence** — monitor stock status and new arrivals across categories
- **Market research** — analyze category breadth, brand mix, and pricing by sport/activity

### FAQ

**Is login or a cookie required?** No — decathlon.com's product/category data is served through its public storefront JSON API, no account needed.

**What brands are covered?** Decathlon's US store currently carries its own in-house brands: Quechua (camping/hiking), Kiprun (running), Forclaz (trekking), Van Rysel (cycling), Simond (climbing), Wedze (winter sports), Rockrider (mountain biking), Itiwit (watersports), Riverside (bikes), and the Decathlon house brand.

**Why is `colors` or `sizes` sometimes missing?** Not every product has that variant option — a one-size backpack has no `colors`/`sizes` field, per the "no null fields" policy.

**How does `search` work?** It scans the current product catalog and matches your keyword against the title, description, brand, category and tags — no exact-phrase requirement.

**How many products/categories does the store have?** decathlon.com's US storefront currently lists roughly 500 products across 200+ categories. `browseCollections` with a high `maxItems` returns the full category list in one run.

**How does `byRelatedProducts` work?** It calls the same product-recommendation widget that powers the "You may also like" section on a Decathlon product page, then fetches full details for each recommended product — capped at 10 results (Decathlon's own limit, regardless of `maxItems`).

**Can I combine filters?** Yes — `vendor`, `productType`, `gender`, `minPrice`/`maxPrice`, `inStockOnly` and `onSaleOnly` all combine (AND logic) on top of `search` or `byCollection`.

**What currency are prices in?** USD — this actor targets the US storefront (decathlon.com).

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `searchQuery` (type: `string`):

Free-text keyword matched against product title, description, brand, category and tags.

## `collectionHandle` (type: `string`):

Pick one Decathlon category to browse all products in it.

## `productIdentifiers` (type: `array`):

Exact Decathlon product handles (e.g. quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person) or full product URLs.

## `relatedToProduct` (type: `string`):

A Decathlon product handle or URL. Returns up to 10 related/similar products Decathlon itself recommends for this item.

## `vendor` (type: `string`):

Only keep products from this Decathlon in-house brand (applies to search and byCollection modes).

## `productType` (type: `string`):

Only keep products of this exact product type (applies to search and byCollection modes).

## `gender` (type: `string`):

Only keep products for this gender/age group (applies to search, byCollection, and byRelatedProducts modes). Absent on unisex-labeled or ungendered products.

## `minPrice` (type: `integer`):

Drop products cheaper than this (lowest variant price).

## `maxPrice` (type: `integer`):

Drop products more expensive than this (lowest variant price).

## `inStockOnly` (type: `boolean`):

Only keep products with at least one purchasable (in-stock) variant.

## `onSaleOnly` (type: `boolean`):

Only keep products currently discounted (compare-at price higher than current price).

## `sortBy` (type: `string`):

How to order results (applied after filtering).

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "tent",
  "collectionHandle": "camping-tents-2-3-person",
  "productIdentifiers": [
    "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person"
  ],
  "relatedToProduct": "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person",
  "vendor": "",
  "productType": "",
  "gender": "",
  "minPrice": 0,
  "maxPrice": 12000,
  "inStockOnly": false,
  "onSaleOnly": false,
  "sortBy": "relevance",
  "maxItems": 20
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped Decathlon products and/or categories.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "searchQuery": "tent",
    "collectionHandle": "camping-tents-2-3-person",
    "productIdentifiers": [
        "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person"
    ],
    "relatedToProduct": "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person",
    "vendor": "",
    "productType": "",
    "gender": "",
    "minPrice": 0,
    "maxPrice": 12000,
    "inStockOnly": false,
    "onSaleOnly": false,
    "sortBy": "relevance",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/decathlon-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "searchQuery": "tent",
    "collectionHandle": "camping-tents-2-3-person",
    "productIdentifiers": ["quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person"],
    "relatedToProduct": "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person",
    "vendor": "",
    "productType": "",
    "gender": "",
    "minPrice": 0,
    "maxPrice": 12000,
    "inStockOnly": False,
    "onSaleOnly": False,
    "sortBy": "relevance",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/decathlon-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "tent",
  "collectionHandle": "camping-tents-2-3-person",
  "productIdentifiers": [
    "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person"
  ],
  "relatedToProduct": "quechua-2-second-fresh-black-waterproof-pop-up-camping-tent-3-person",
  "vendor": "",
  "productType": "",
  "gender": "",
  "minPrice": 0,
  "maxPrice": 12000,
  "inStockOnly": false,
  "onSaleOnly": false,
  "sortBy": "relevance",
  "maxItems": 20
}' |
apify call crawlerbros/decathlon-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/decathlon-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aG97Scy9LhAxU3tuo/builds/5XuISlX2CPlN2Me09/openapi.json
