Adidas API endpoint
Searches Adidas.com product listings by keyword, or browses a category listing by taxonomy slug, with real pagination and sort options. Exactly one of query or category is required. Returns product summaries (title, price, rating, images, color variants) plus facet filter groups, sort options, and (for category browse) a breadcrumb trail. Keyword search is best-effort relevance, not a guaranteed match: an obscure keyword returns whatever Adidas's own search index surfaces. A genuinely empty keyword search returns an empty product list, and requesting a page beyond the available result pages (or an unknown category) returns a not-found error. Category values are the path segment after /us/ in an Adidas category URL (e.g. women-athletic_sneakers); they can also be read from the url fields of a search/category response's own filters and breadcrumbs. Facets are applied by composing them into the category slug rather than by a separate parameter: each filters[].values[].slug is a token you splice into the category value (e.g. category=women-black-athletic_sneakers applies the Color=Black facet, and category=women-athletic_sneakers-prime applies Shipping=PRIME). Use filters[].key (the facet's stable name, e.g. searchcolor) rather than filters[].id, which is an opaque per-deployment UUID that cannot be used to build a request. Note the token's position within the slug varies by facet, so compose from a slug you have seen rather than assuming a fixed order.
/adidas/searchquery is optional, 1 to 200 characters. Exactly one of query or category is required.
sort is optional. Allowed values: price-low-to-high, newest-to-oldest, top-sellers, price-high-to-low. Omitted means the site's default relevance ordering.
page is optional, a one-based page number, defaults to 1 (1 to 500). Each page returns up to 48 products.
Notable response behavior:
query returns whatever Adidas's own search index surfaces (there is no reliable signal to distinguish a true match from Adidas's fallback results).page beyond the available result pages — or an unknown category — returns a not-found error rather than an empty page.products[].id is the Adidas SKU to pass as product_id to adidas-product for full product-detail data.products[] carries rich per-SKU metadata: division (brand line, e.g. Originals/Sportswear/Performance), category (e.g. shoes/clothing), sport[], generic_product_type[], surface[], available_sizes[], color_variations[], and orderable/preorderable/personalizable availability flags.filters[] are the facet groups Adidas's own search exposes (e.g. Shipping, Width, Brand, Price), each with values[] carrying a live count. sort_options[] lists the four sort orders with the currently selected one flagged. breadcrumbs[] is populated only for category browse (empty for keyword search).category value. Each filters[].values[].slug is the token to splice in — category=women-black-athletic_sneakers applies Color=Black to women-athletic_sneakers, and category=women-athletic_sneakers-prime applies Shipping=PRIME. The resulting total_products matches the facet value's advertised count. The token's position within the slug varies by facet (Color sits in the middle, Shipping at the end), so compose from a slug you have actually seen rather than assuming a fixed order, and read filters[].values[].selected to see what is already applied.filters[].key (the facet's stable name, e.g. searchcolor, multi_age_gender_en_us) when reasoning about facets. filters[].id is Adidas's opaque per-deployment UUID — it is not stable across categories and cannot be used to build a request.women-athletic_sneakers exposes 10 groups, men-clothing 15, and some categories add a Size group that others omit. Always read the facets from the response rather than assuming a fixed list.total_pages is derived from total_products and the 48-per-page size.A category-browse request (category=women-athletic_sneakers) returns the same shape with breadcrumbs populated:
{"code":200,"msg":"OK","data":{"category":"women-athletic_sneakers","page":1,"page_size":48,"count":48,"total_products":1424,"total_pages":30,"products":[{"id":"JI0397","title":"Adifom IIInfinity Slides","price":27,"original_price":45,"discount_percent":40}],"breadcrumbs":[{"text":"Women","link":"/women"},{"text":"Athletic & Sneakers","link":"/women-athletic_sneakers"}]}}
| Field | Filled in, of 48 checked | Values in the sample |
|---|---|---|
| id | 48 | |
| model_number | 48 | “IH9052RS” and 18 other values |
| title | 48 | “HANDBALL SPEZIAL SHOES” and 20 other values |
| subtitle | 48 | Women's Originals (36), Women's Sportswear (11), Basketball (1) |
| url | 48 | adidas.com |
| division | 48 | Originals (36), Sportswear (11), Performance (1) |
| category | 48 | shoes in all 48 |
| sport | 48 | median 1 entry |
| generic_product_type | 48 | median 1 entry |
| surface | 47 | median 1 entry |
| color_variations | 47 | median 12 entries |
| available_sizes | 48 | median 14 entries |
| image_url | 48 | assets.adidas.com |
| hover_image_url | 48 | assets.adidas.com |
| price | 48 | 40 to 170, median 100 |
| original_price | 48 | 65 to 170, median 110 |
| orderable | 47 | true in 47 of 47 |
| online_from | 48 | 2023-01-01 to 2026-10-05 |
| alt_text | 48 | “Women's Originals Brown HANDBALL SPEZIAL SHOES” and 35 other values |
| rating | 46 | 4.4 to 4.95, median 4.79 |
| rating_count | 48 | -99 to 3,579, median 1,202 |
| discount_percent | 16 | 20 to 50, median 30 |
| unisex | 1 | true in 1 of 1 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| query | string | No | Search keyword. Exactly one of query or category is required. | running shoes | |
| category | string | No | Category/taxonomy slug, the path segment after /us/ in an Adidas category URL. Exactly one of query or category is required. | women-athletic_sneakers | |
| sort | string | No | Sort order. Allowed values: price-low-to-high, newest-to-oldest, top-sellers, price-high-to-low. Omitted means relevance. | price-low-to-high | |
| page | integer | No | 1 | One-based page number, defaults to 1 | 1 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/adidas/search?query=coffee&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "samba",
"page": 1,
"page_size": 48,
"count": 48,
"total_products": 11939,
"total_pages": 249,
"products": [
{
"id": "KJ7435",
"model_number": "OSD72",
"title": "SAMBA OG SHOES",
"subtitle": "Women's Originals",
"url": "https://www.adidas.com/samba-og-shoes/KJ7435.html",
"division": "Originals",
"category": "shoes",
"sport": [
"Lifestyle"
],
"generic_product_type": [
"TRAINERS"
],
"surface": [
"Street"
],
"color_variations": [
"KI6674",
"KH9727"
],
"available_sizes": [
"5",
"5.5",
"6",
"6.5",
"7",
"7.5",
"8",
"8.5",
"9",
"9.5",
"10",
"10.5",
"11"
],
"image_url": "https://assets.adidas.com/images/w_280,h_280,f_auto,q_auto:sensitive/f88fdc6701a845be8fa1b2d0656b4ab0_9366/samba-og-shoes.jpg",
"price": 120,
"rating": 4.7889,
"rating_count": 450,
"orderable": true
}
],
"filters": [
{
"id": "0728964a-0c81-452b-b3b6-90a2ec2a5791",
"key": "brand_en_us",
"title": "Brand",
"multiselect": true,
"values": [
{
"name": "Originals",
"value": "originals",
"slug": "originals",
"count": 768
}
]
}
],
"sort_options": [
{
"id": "price-low-to-high"
},
{
"id": "newest-to-oldest"
},
{
"id": "top-sellers"
},
{
"id": "price-high-to-low"
}
]
}
}Request schema
No body schema
Response schema
#/definitions/adidas.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | adidas.SearchResponse | No | ||||
| data.breadcrumbs | array | No | ||||
| data.breadcrumbs[].link | string | No | ||||
| data.breadcrumbs[].text | string | No | ||||
| data.category | string | No | ||||
| data.count | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.filters | array | No | ||||
| data.filters[].id | string | No | ID is Adidas's own per-deployment filter UUID. It is opaque, is not stable across categories, and cannot be used to build a request -- use Key for that. | |||
| data.filters[].key | string | No | Key is the facet's stable, human-readable name (e.g. "searchcolor", "multi_age_gender_en_us"). This is the value that appears as a value's "on" field upstream, and the one to reason about when composing a filtered category slug -- see the package docs and docs/adidas-search.md. | |||
| data.filters[].multiselect | boolean | No | ||||
| data.filters[].title | string | No | ||||
| data.filters[].values | array | No | ||||
| data.filters[].values[].count | integer | No | ||||
| data.filters[].values[].name | string | No | ||||
| data.filters[].values[].selected | boolean | No | Selected reports whether this value is already applied to the current result set. | |||
| data.filters[].values[].slug | string | No | Slug is the locale-independent, slug-safe form of Value -- the token to splice into a category slug to apply this facet (e.g. "black" -> category "women-black-athletic_sneakers"). Falls back to Value when the upstream omits it. | |||
| data.filters[].values[].value | string | No | Value is the value as Adidas returns it for this locale. | |||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.products | array | No | ||||
| data.products[].alt_text | string | No | ||||
| data.products[].available_sizes | array | No | ||||
| data.products[].category | string | No | ||||
| data.products[].color_variations | array | No | ||||
| data.products[].discount_percent | integer | No | ||||
| data.products[].division | string | No | ||||
| data.products[].generic_product_type | array | No | ||||
| data.products[].hover_image_url | string | No | ||||
| data.products[].id | string | No | ||||
| data.products[].image_url | string | No | ||||
| data.products[].is_flash | boolean | No | ||||
| data.products[].model_number | string | No | ||||
| data.products[].online_from | string | No | ||||
| data.products[].orderable | boolean | No | ||||
| data.products[].original_price | number | No | ||||
| data.products[].personalizable | boolean | No | ||||
| data.products[].preorderable | boolean | No | ||||
| data.products[].price | number | No | ||||
| data.products[].rating | number | No | ||||
| data.products[].rating_count | integer | No | ||||
| data.products[].sport | array | No | ||||
| data.products[].subtitle | string | No | ||||
| data.products[].surface | array | No | ||||
| data.products[].title | string | No | ||||
| data.products[].unisex | boolean | No | ||||
| data.products[].url | string | No | ||||
| data.query | string | No | ||||
| data.sort | string | No | ||||
| data.sort_options | array | No | ||||
| data.sort_options[].id | string | No | ||||
| data.sort_options[].selected | boolean | No | ||||
| data.source_url | string | No | ||||
| data.total_pages | integer | No | ||||
| data.total_products | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/adidas/search?query=coffee&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"