Barcode and grams on every buyable variant
Decathlon API returns live Decathlon data as clean JSON for decathlon The primary endpoint, search, returns product results including product id, handle, title, vendor and product type.
2 active endpoints. Every call is 1 credit.
- POST/decathlon/v1/search
- POST/decathlon/v1/product_detail
What Decathlon endpoints does ReefAPI ship?
2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Decathlon API
2 of 2 endpoints, ready to run
Search or browse the US catalogue — every row with the product id and handle, title, house brand, product type, tags, image, price range, sale price and stock flag, plus live facet vocabularies with counts.
{ "ok": true, "meta": { "api": "decathlon", "endpoint": "search", "mode": "live", "latency_ms": 2093.4, "record_count": 20, "cache_hit": false, "completeness_pct": 100 }, "data": { "products": [ { "product_id": "7840733397054", "url": "https://www.decathlon.com/products/quechua-mens-waterproof-snow-hiking-boots-nh100-high-top-zip-black-351123-fw25", "title": "Quechua Men’s NH100 Warm Waterproof Easy-On Snow Hiking Boots", "vendor": "Quechua", "product_type": "Snow boots", "tags": [ "8851794", "FAMILY: 11354", "Footwear" ], "description": "Made for men who want to embrace the simple joys of snow—walking, playing, having fun, and reconnecting with their inner child.", "description_html": "<p>Made for men who want to embrace the simple joys of snow—walking, playing, having fun, and reconnecting with their inner child.</p>", "image": "https://cdn.shopify.com/s/files/1/1330/6287/files/8851794-product_image-p2904869.jpg?v=1755553663", "image_count": 8, "available": true, "price_min": 45, "price_max": 45, "compare_at_price_min": 69.99, "compare_at_price_max": 69.99, "currency": "USD", "on_sale": true, "variant_count": 9, "in_stock_variant_count": 5, "grams_min": 986, "grams_max": 1318, "skus": [ "5057675", "5057676", "5057677" ], "options": [ "Color", "Size" ], "published_at": "2025-12-29T08:56:20-08:00", "created_at": "2025-08-18T14:20:22-07:00", "updated_at": "2026-08-29T13:17:13-07:00" }, { "product_id": "7840732348478", "url": "https://www.decathlon.com/products/quechua-womens-warm-and-waterproof-snow-hiking-boots-nh100-mid-black-346334-fw25", "title": "Quechua Women's NH100 Warm Waterproof Mid Snow Hiking Boots", "vendor": "Quechua", "product_type": "Snow boots", "tags": [ "8873835", "FAMILY: 11354", "FW25" ], "description": "A great balance of warmth and waterproof protection at an affordable price—perfect for occasional winter outings in town or on trails with light snow.", "description_html": "<p>A great balance of warmth and waterproof protection at an affordable price—perfect for occasional winter outings in town or on trails with light snow.</p>", "image": "https://cdn.shopify.com/s/files/1/1330/6287/files/8873835-product_image-p2904938.jpg?v=1755553615", "image_count": 8, "available": true, "price_min": 30, "price_max": 30, "compare_at_price_min": 49.99, "compare_at_price_max": 49.99, "currency": "USD", "on_sale": true, "variant_count": 7, "in_stock_variant_count": 4, "grams_min": 725, "grams_max": 978, "skus": [ "5177939", "5177940", "5177941" ], "options": [ "Color", "Size" ], "published_at": "2026-01-21T11:03:25-08:00", "created_at": "2025-08-18T14:11:42-07:00", "updated_at": "2026-08-29T13:17:13-07:00" }, { "product_id": "7278947926078", "url": "https://www.decathlon.com/products/womens-sh500-warm-waterproof-snow-hiking-boots-332914", "title": "Quechua Women's SH500 Warm Waterproof Snow Hiking Boots", "vendor": "Quechua", "product_type": "Snow boots", "tags": [ "8644860", "BSG", "DEAL" ], "description": "As elegant as they are technical, these warm leather winter snow boots are suitable for all types of terrain thanks to their Snowcontact soles", "description_html": "As elegant as they are technical, these warm leather winter snow boots are suitable for all types of terrain thanks to their Snowcontact soles", "image": "https://cdn.shopify.com/s/files/1/1330/6287/files/8644860-product_image-p2289103.jpg?v=1703075803", "image_count": 13, "available": true, "price_min": 95, "price_max": 95, "compare_at_price_min": 139, "compare_at_price_max": 139, "currency": "USD", "on_sale": true, "variant_count": 7, "in_stock_variant_count": 3, "grams_min": 900, "grams_max": 1300, "skus": [ "4294662", "4294663", "4294664" ], "options": [ "Color", "Size" ], "published_at": "2023-11-14T14:55:43-08:00", "created_at": "2023-11-14T14:55:43-08:00", "updated_at": "2026-08-29T13:17:14-07:00" } ], "collection": null, "facets": { "product_type": [ { "value": "Shoes", "count": 24 }, { "value": "Snow boots", "count": 9 }, { "value": "Trousers/pants", "count": 2 } ], "vendor": [ { "value": "Quechua", "count": 35 } ], "tag": [ { "value": "Published", "count": 30 }, { "value": "INVENTORY_FC_IS_NOT_0", "count": 26 }, { "value": "SIZE_MSG_TOO_SMALL", "count": 26 } ], "price": { "min": 14, "max": 100 } } } }
How the Decathlon API works
Decathlon is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Getting a barcode and a shipping weight out of a search result
Catalogue matching needs a barcode and freight costing needs a weight. Both live at the variant, and the search row carries neither.
{"query": "hiking boots"}Rows come back with the handle and the variant count, plus the facet vocabularies with counts so the filter values are never a guess.
{"handle": "quechua-mens-waterproof-snow-hiking-boots-nh100-high-top-zip-black-351123-fw25"}One row per size and colour, each with an EAN-13, a weight in grams and an inventory quantity as a real integer rather than an in-stock flag.
A variant table you can match against another catalogue by barcode and cost freight from by weight, from one product call.
curl -X POST https://api.reefapi.com/decathlon/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"hiking boots"}'{
"ok": true,
"data": { … },
"meta": {
"api": "decathlon",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Decathlon US: which ids resolve, and which unit to trust
This covers decathlon.com, which is the United States store and nothing else. Prices are USD and the whole US catalog was 510 products at measurement time, so a term the US store does not carry legitimately returns nothing. Rows measured 2026-08-27 on handle kiprun-kipride-mens-running-shoes-380020 and its 22 variants unless noted.
| Field | What it is | Measured example |
|---|---|---|
| handle | The key that resolves in a single round trip: the last path segment of decathlon.com/products/<handle>. | kiprun-kipride-mens-running-shoes-380020 |
| product_id | Numeric store id returned as a string. Accepted, but resolved via a catalog index because the store does not serve a product by id. | "8042533847102" |
| variants[].variant_id | Per size-and-color variant id, also a string. | "42582963060798" |
| variants[].sku | Decathlon's own 7-digit item code, one per variant. | "5815513" |
| variants[].barcode | EAN-13, one per variant. | "3608394355507" |
| grams vs weight + weight_unit | grams is normalized on every variant; weight is the raw figure and its unit changes row to row. | 433 g on all 22 variants, but weight_unit "kg" on one row and "lb" on the next |
| inventory_quantity | Live per-variant stock count, with inventory_policy deny. | 9, 5, 10, 2 across the first four sizes |
| price / compare_at_price / currency | USD only. compare_at_price is null unless the item is on sale. | 140.0 USD; compare_at_price present on 0 of 22 variants |
| collection.products_count vs products_published | Decathlon's declared collection size against how many it actually serves. | 107 vs 91 on the `womens` collection |
| facets.vendor | Live counts for Decathlon's house brands within your result set. | Quechua 34, Simond 20, Wedze 13, Forclaz 11, Kiprun 9, Van Rysel 4 |
weight_unit_varies came back true on a product whose every variant weighs exactly the same 433 g, because Decathlon stores identical weights in different units on different rows. Use `grams` for anything you compute and treat weight and weight_unit as raw passthrough.
Which store this is, what a variant carries, and what a row does not
Measured on a search, a collection browse, both search modes, a product opened in full and a query the store has nothing for.
decathlon.com is a few hundred products, not the European chain's catalogue. A query for something it does not carry returns an honest empty and says so in as many words rather than dressing it up as a failure. If you are expecting the range Decathlon sells in Europe, this is not that store — and knowing that before you build is worth more than a page of features.
Every variant row measured came back with an EAN-13, so the catalogue can be joined against another retailer's by barcode rather than by fuzzy title matching. That is the field this endpoint exists for.
Variants return an inventory quantity as a real integer alongside the buyable flag, so 'one left' and 'a thousand left' are different answers. The shipping weight comes back in grams with the merchant's own weight and unit beside it.
A discounted variant returns both its current price and its compare-at price, so the size of the reduction is a subtraction rather than an inference. Prices vary across the variants of one product and the response says whether they do.
The two modes are the catalogue scan and the store's own type-ahead; they rank differently and the response says which one answered. Browsing a collection is done by passing its handle, with or without a query. Passing the collection name as a mode is rejected with the list of values that are valid — which is the behaviour you want, but it does catch people out.
What people build with Decathlon
The jobs this data is most often used for.
endpoints
credit per call
Pricing and assortment teams use Decathlon to search or browse the decathlon.com (US) catalogue.
Brand-protection teams use Decathlon to get one Decathlon product in full, by handle, product id or decathlon.com URL.
Retail analysts use Decathlon to read a retailer's own catalogue with full product detail, variants, price and stock, all from one ReefAPI key and credit pool.
What Decathlon data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/decathlon/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"hiking boots"}'import requests
r = requests.post(
"https://api.reefapi.com/decathlon/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "hiking boots"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Decathlon.
Get a free key →Which Decathlon country store does this cover?▾
The United States store at decathlon.com, and only that one. Every price came back with currency USD and a live catalog read scanned 510 products in total. Decathlon's European storefronts are separate sites with separate catalogs, different prices and different product handles, and none of them sit behind this API. A US catalog that small also means a search returning nothing is usually a real answer rather than a failure.
Should I pass handle or product_id?▾
handle, whenever you have it. It is the only key the store's own product route resolves, so it costs a single round trip. product_id is accepted for convenience, but the store returns 404 for a product fetched by id, so the id has to be mapped to its handle through a cached catalog index first, and the first such call after that cache expires also pays for a full catalog read. The search action returns both, so store the handle.
Why does weight_unit change between variants of the same product?▾
Because Decathlon's own records store them that way. On one running shoe all 22 variants returned grams 433, but weight and weight_unit alternated between 0.433 kg and 0.9546 lb depending on the row, and the product-level weight_units_seen came back as ["kg", "lb"] with weight_unit_varies true. Read `grams`: it is normalized on every variant and does not vary for variants that genuinely weigh the same.
Does this return real stock levels?▾
Yes, as an integer per variant. The measured running shoe returned inventory_quantity 9, 5, 10 and 2 for its first four size-and-color combinations, with inventory_policy "deny" (the store will not oversell) and inventory_management "shopify". At the product level, variant_count against in_stock_variant_count lets you spot partial sell-through without walking the variant list: a snow boot in the same run returned 9 variants with only 6 in stock.
Why is compare_at_price null on a product I know was discounted?▾
compare_at_price is populated only while the item is actually on sale. The running shoe measured returned compare_at_price null on all 22 variants, meta.coverage.with_compare_at_price 0 and on_sale false. A snow boot in the same run returned price_min 45.0 against compare_at_price_min 69.99 with on_sale true. So null means not currently discounted rather than missing data, and on_sale is the flag to branch on.
Why does a collection's products_count not match how many products I get back?▾
Because Decathlon's declared figure and its served figure disagree, and both are returned rather than one being quietly preferred. Browsing the `womens` collection returned collection.products_count 107, collection.products_published 91 and pagination.total_results 91. products_published is what you can actually page through; products_count is Decathlon's own number. Page against total_results and pagination.has_more.
What are the odd values in the tags array?▾
Decathlon mixes merchandising tags with internal bookkeeping in one list and they are returned verbatim. A single snow boot came back with tags including "hiking_boots" and "FW25" (a season code) next to "FAMILY: 11354" and a bare numeric "8851794". Rather than guessing which tags exist, read facets.tag from your own result set: it lists only the values your matches actually carry, with counts.
What is the difference between catalog mode and suggest mode?▾
catalog is the default and searches the full US catalog: a query for "hiking boots" returned pagination.total_results 35 out of 510 products scanned, with facets, sorting and paging. suggest calls the store's type-ahead index instead, which is one fast request but hard-capped at 10 results with no total and no second page. Use suggest only behind a search box, never for data collection. Any explicit `sort` forces catalog mode so the ordering covers the whole match set rather than one page.
What is the Decathlon API?▾
Decathlon API is a ReefAPI endpoint group for decathlon It returns live JSON through POST requests under /decathlon/v1.
Is the Decathlon API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Decathlon calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Decathlon login or account?▾
No login to Decathlon is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Decathlon data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Decathlon API use?▾
Decathlon actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Decathlon from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call decathlon actions with the same key, credit pool and JSON envelope used by normal REST requests.
16 More APIs APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Decathlon, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.