Boots API endpoint
Returns one page of Boots UK's public product catalog, including product cards and live facets. Supply `q`, one or more hierarchical `category` keys, or both. Use repeatable `filter=facet_key:option_key` values from that response's dynamic facets, plus the dedicated price and stock controls. `sort` accepts `relevance`, `price_low_to_high`, `price_high_to_low`, `top_rated`, `best_seller`, or `newest`.
/boots/searchQuery parameters:
q (optional): free-text product query. Supply this or at least one category.category (optional, repeatable): exact category hierarchy keys from root to
the desired leaf, taken from a prior response's facets item whose key is
category. Supply this or q.filter (optional, repeatable): a dynamic facet choice written as
facet_key:option_key. Both parts must come from the returned facets
metadata. For example, filter=brand:No7 and
filter=roundedReviewScore:4. It supports every returned multiple and
colour facet; use category, price parameters, and in_stock for their
corresponding special filters.price_min (optional): inclusive GBP lower bound. For example, 45.price_max (optional): inclusive GBP upper bound. For example, 100.in_stock (optional): true hides out-of-stock items; false leaves stock
unfiltered.page (optional): 1 through 1000; default 1.page_size (optional): 1 through 48; default 48.sort (optional): relevance (default), price_low_to_high,
price_high_to_low, top_rated, best_seller, or newest.The response includes product cards, the upstream total, and current dynamic
facet metadata. Product cards preserve current and regular price, per-unit
price when supplied, stock messaging, basket eligibility, delivery and
promotion signals, Advantage Card points, and whether colour or size variants
exist. Every non-special facet option is usable with filter; category options
retain their nested hierarchy in children. The price facet's minimum and
maximum describe the live range for the query.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| product_id | 20 | |
| part_number | 20 | “10274975.P” and 19 other values |
| name | 20 | “Boots Vitamin C 500 mg 90 Tablets (3 month supply)” and 19 other values |
| brand | 20 | Boots (16), Garnier (2), The Ordinary (1) and 1 more |
| url | 20 | boots.com |
| image_url | 20 | boots.scene7.com |
| price | 20 | |
| regular_price | 20 | |
| unit_price | 20 | “£0.06 per 1UNI” and 16 other values |
| rating | 20 | 3.49 to 5, median 4.32 |
| review_count | 20 | 1 to 1,041, median 76 |
| in_stock | 20 | true in 20 of 20 |
| stock_message | 20 | Stock coming soon in all 20 |
| can_add_to_basket | 20 | true in 20 of 20 |
| express_delivery | 20 | true in 0 of 20 |
| advantage_card_points | 20 | 9 to 270, median 27 |
| has_promotion | 20 | true in 19 of 20 |
| offers | 19 | median 3 entries |
| categories | 20 | median 28 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Free-text product query; required unless category is supplied | vitamin c | |
| category | array<string> | No | Repeat the exact category hierarchy keys from root through the desired leaf; required unless q is supplied Repeat this query parameter for multiple values. | health & pharmacy | |
| filter | array<string> | No | Repeat a dynamic facet filter as facet_key:option_key, using key/option values returned in facets; category, currentPrice, and inStock use their dedicated parameters Repeat this query parameter for multiple values. | brand:No7 | |
| price_min | number | No | Inclusive minimum GBP price; may be combined with price_max | 45 | |
| price_max | number | No | Inclusive maximum GBP price; may be combined with price_min | 100 | |
| in_stock | boolean | No | true hides out-of-stock items; false leaves stock unfiltered | true | |
| page | integer | No | Page from 1 through 1000 | ||
| page_size | integer | No | Results per page from 1 through 48 | ||
| sort | string | No | Sort: relevance, price_low_to_high, price_high_to_low, top_rated, best_seller, or newest Allowed values: relevance, price_low_to_high, price_high_to_low, top_rated, best_seller, newest. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/boots/search?q=coffee&in_stock=true&page=1&sort=relevance" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"query": "vitamin c",
"page": 1,
"page_size": 48,
"sort": "relevance",
"total": 3462,
"count": 1,
"products": [
{
"id": "2351529",
"name": "Boots Vitamin C 500 mg 90 Tablets",
"brand": "Boots",
"price": {
"amount": 5.5,
"currency": "GBP",
"text": "£5.50"
},
"regular_price": {
"amount": 7,
"currency": "GBP",
"text": "£7.00"
},
"unit_price": "£0.06 per 1UNI",
"can_add_to_basket": true,
"variants": {
"has_colours": true,
"has_sizes": false
}
}
],
"facets": [
{
"key": "brand",
"name": "Brand",
"options": [
{
"key": "Boots",
"name": "Boots",
"count": 317
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/boots.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | boots.SearchResponse | No | ||||
| data.categories | array | No | ||||
| data.count | integer | No | ||||
| data.facets | array | No | ||||
| data.facets[].key | string | No | ||||
| data.facets[].maximum | number | No | ||||
| data.facets[].minimum | number | No | ||||
| data.facets[].name | string | No | ||||
| data.facets[].options | array | No | ||||
| data.facets[].options[].children | array | No | ||||
| data.facets[].options[].count | integer | No | ||||
| data.facets[].options[].key | string | No | ||||
| data.facets[].options[].name | string | No | ||||
| data.facets[].type | string | No | ||||
| data.fetched_at | string | No | ||||
| data.has_more | boolean | No | ||||
| data.page | integer | No | ||||
| data.page_size | integer | No | ||||
| data.products | array | No | ||||
| data.products[].advantage_card_points | integer | No | ||||
| data.products[].brand | string | No | ||||
| data.products[].can_add_to_basket | boolean | No | ||||
| data.products[].categories | array | No | ||||
| data.products[].express_delivery | boolean | No | ||||
| data.products[].has_promotion | boolean | No | ||||
| data.products[].id | string | No | ||||
| data.products[].image_url | string | No | ||||
| data.products[].in_stock | boolean | No | ||||
| data.products[].name | string | No | ||||
| data.products[].offers | array | No | ||||
| data.products[].part_number | string | No | ||||
| data.products[].price | boots.Price | No | ||||
| data.products[].price.amount | number | No | ||||
| data.products[].price.currency | string | No | ||||
| data.products[].price.text | string | No | ||||
| data.products[].product_id | string | No | ||||
| data.products[].rating | number | No | ||||
| data.products[].regular_price | boots.Price | No | ||||
| data.products[].regular_price.amount | number | No | ||||
| data.products[].regular_price.currency | string | No | ||||
| data.products[].regular_price.text | string | No | ||||
| data.products[].review_count | integer | No | ||||
| data.products[].stock_message | string | No | ||||
| data.products[].unit_price | string | No | ||||
| data.products[].url | string | No | ||||
| data.products[].variants | boots.ProductVariants | No | ||||
| data.products[].variants.has_colours | boolean | No | ||||
| data.products[].variants.has_sizes | boolean | No | ||||
| data.query | string | No | ||||
| data.sort | string | No | ||||
| data.source_url | string | No | ||||
| data.total | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/boots/search?q=coffee&in_stock=true&page=1&sort=relevance" \
-H "x-api-key: $CRAWLORA_API_KEY"