CVS API endpoint
Performs a keyword search across CVS.com's non-prescription retail/OTC catalog and returns one page of results: products with title, brand, image, current/original price, and sponsored/featured/new-product flags; the total result count; and the facets (brand, color, size, price range, and other attributes, each with its selectable values and result counts) available to filter the results further. Covers the non-prescription retail catalog only. q is the search keyword or phrase, required. page is a 1-indexed page number (default 1). sort is an optional result order matching cvs-category's own Sort By values. CVS.com is only available from US and US-territory locations; a request served from an unsupported region returns an upstream error rather than an empty result.
/cvs/searchPerforms a keyword search across CVS.com's non-prescription retail/OTC catalog, sourced from the same product-search backend cvs-category reads. Covers the non-prescription retail catalog only — this does not cover prescription items, pharmacy ordering, refills, or any patient-specific data.
q is required — a search keyword or phrase, e.g. ibuprofen.
sort is optional, matching cvs-category's own Sort By values; default is relevance. One of: pa (Price Low to High), pd (Price High to Low), tr (Top Rated), rc (Most Reviewed), az (Name A-Z), za (Name Z-A).
Notable response behavior:
cvs-category's (total_count, page, products, facets) — both endpoints normalize the same underlying product-search data.list_price/sale_price/currency come from the same pricing data cvs-category returns; a product with no price omits these fields.facets lists every filter the current search exposes: key is the upstream facet field name (e.g. brand, e_product_type, d_priceBucket), label is its display name, and values is a list of {name, count}. The set of facets varies per search and is not a fixed enum.503 upstream error rather than an empty or wrong result.q, or an unrecognized sort value, returns a 400 invalid-parameter error before any upstream request is made.| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| title | 20 | “Motrin IB Ibuprofen 200 MG Tablets, 24 CT” and 18 other values |
| url | 20 | cvs.com |
| brand | 20 | CVS (13), Advil (6), Motrin (1) |
| image_url | 20 | cvs.com |
| currency | 20 | USD in all 20 |
| list_price | 20 | 4.49 to 23.49, median 8.99 |
| sale_price | 20 | 4.49 to 23.49, median 8.99 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Search keyword or phrase | ibuprofen | |
| page | integer | No | 1-indexed page number, default 1 | 1 | |
| sort | string | No | Result sort order, default relevance. One of pa (Price Low to High), pd (Price High to Low), tr (Top Rated), rc (Most Reviewed), az (Name A-Z), za (Name Z-A) Allowed values: pa, pd, tr, rc, az, za. | pa | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/cvs/search?q=ibuprofen&page=1&sort=pa" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"total_count": 62,
"page": 1,
"products": [
{
"id": "459334",
"title": "CVS Health Ibuprofen 200mg Tablets, 100 CT",
"url": "https://www.cvs.com/shop/cvs-health-ibuprofen-200mg-tablets-100-ct-prodid-459334",
"brand": "CVS",
"currency": "USD",
"list_price": 2.99,
"sale_price": 2.99
}
],
"facets": [
{
"key": "brand",
"label": "Brand",
"values": [
{
"name": "Advil",
"count": 22
},
{
"name": "CVS",
"count": 26
},
{
"name": "Motrin",
"count": 14
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/cvs.categoryResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | cvs.CategoryResponse | No | ||||
| data.facets | array | No | ||||
| data.facets[].key | string | No | brand | |||
| data.facets[].label | string | No | Brand | |||
| data.facets[].values | array | No | ||||
| data.facets[].values[].count | integer | No | 37 | |||
| data.facets[].values[].name | string | No | CoverGirl | |||
| data.page | integer | No | 1 | |||
| data.products | array | No | ||||
| data.products[].brand | string | No | Crest | |||
| data.products[].currency | string | No | USD | |||
| data.products[].id | string | No | 478253 | |||
| data.products[].image_url | string | No | ||||
| data.products[].is_featured | boolean | No | ||||
| data.products[].is_new_product | boolean | No | ||||
| data.products[].is_sponsored | boolean | No | ||||
| data.products[].list_price | number | No | 4.99 | |||
| data.products[].sale_price | number | No | 4.99 | |||
| data.products[].title | string | No | Crest Pro-Health Breath Mist, Clean Mint, 0.44 OZ, 2 PK | |||
| data.products[].url | string | No | ||||
| data.total_count | integer | No | 8766 | |||
| 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/cvs/search?q=ibuprofen&page=1&sort=pa" \
-H "x-api-key: $CRAWLORA_API_KEY"