Store locator and service-coverage research
Use CVS endpoints to turn store locator and service-coverage research into repeatable API requests with documented inputs and JSON responses.
Turn CVS's public retail surfaces into structured JSON — store locations by ZIP or coordinate with service indicators, the full brand and category taxonomy, keyword search and category browsing across the non-prescription (OTC) retail catalog, and per-product detail plus ingredient/label statements. US/US-territory egress only. Covers general store info and retail products, not pharmacy hours or any patient-specific data.
Find nearby CVS stores, search or browse the OTC retail catalog with brand/category taxonomy, and get product detail and ingredient labels as structured JSON.
Endpoint families
6
Documented params
18
Examples
7
Live catalog snapshot
Active endpoints
7
Methods
GET
Required params
11
Schema refs
7
{
"platform": "CVS",
"endpoint": "cvs-store-locator",
"method": "GET",
"path": "/cvs/store-locator",
"auth": "apiKey"
}Use cases
Find nearby CVS stores, search or browse the OTC retail catalog with brand/category taxonomy, and get product detail and ingredient labels as structured JSON.
Use CVS endpoints to turn store locator and service-coverage research into repeatable API requests with documented inputs and JSON responses.
Use CVS endpoints to turn otc retail catalog search and pricing monitoring into repeatable API requests with documented inputs and JSON responses.
Use CVS endpoints to turn product ingredient and label research into repeatable API requests with documented inputs and JSON responses.
Use CVS endpoints to turn local retail presence mapping into repeatable API requests with documented inputs and JSON responses.
Managed execution
Every figure below is read from the live CVS endpoint catalog — 7 endpoints, 18 documented request parameters, and 7 published response schemas — the same catalog Docs and Playground run against.
7 documented CVS endpoints, grouped into 7 request families — Brands, Categories and Category, plus 4 more.
18 request parameters are documented across those CVS endpoints, 11 of them required — the full input contract is public before you write any integration code.
7 of the 7 CVS endpoints ship a recorded example response, and 7 carry a documented response schema — you can code against the real JSON before the first request.
CVS endpoints document their error responses (400, 404, 429 and 503) alongside the success schema, so a block, a rate limit, or a missing record comes back as a typed error rather than silently empty data.
7 hosted MCP tools back the CVS endpoints, so an agent can call the same routes with the same parameters and the same JSON contract, with no custom glue.
Coverage map
These cards are generated from the active endpoint catalog, so the landing page reflects the same API surface used by Docs and Playground.
/cvs/brands
/cvs/categories
/cvs/category
/cvs/product/{slug}
/cvs/product-ingredients/{slug}
/cvs/search
Endpoint catalog
/cvs/store-locatorReturns nearby CVS store locations for a ZIP code or a latitude/longitude pair: address, phone, fax, distance, and retail store hours, plus a has_pharmacy existence flag and a list of general service indicators (e.g. photo, ATM, same-day delivery). Covers general store info only -- this does not return pharmacy hours, pharmacy phone, prescription data, or any patient-specific information. zip is a 5-digit US ZIP code; alternatively supply latitude and longitude together. CVS.com is only available from US/US-territory egress; a request from an unsupported region returns an upstream error rather than an empty result.
Response notes
- `store_hours` is the retail (front-of-store) weekly schedule only. - `has_pharmacy` is a plain existence flag (does this location have a pharmacy counter) — no pharmacy hours, pharmacy phone, or prescription data is returned. - `services` is the raw list of upstream service-indicator codes for the store (e.g. `PH_Photo_Ind`, `atmInd`, `RS_BOPIS_Ind`, `RS_SameDayDelivery_Ind`), passed through as-is rather than translated to friendly names. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. - Missing both `zip` and `latitude`/`longitude`, or an invalid ZIP, returns a `400` invalid-parameter error before any upstream request is made. Example response: ```json {"code":200,"msg":"OK","data":{"total_count":5,"stores":[{"store_id":"9767","address_line1":"9045 WILSHIRE BOULEVARD","city":"BEVERLY HILLS","state":"CA","zip":"90211","phone":"3102735252","fax":"3102736289","latitude":34.06741,"longitude":-118.38934,"distance_miles":1.12,"time_zone":"PDT","store_hours":[{"weekday":"MON","open_time":"08:00 AM","close_time":"11:00 PM"}],"has_pharmacy":true,"services":["RX_Pharmacy_Ind","PH_Photo_Ind","atmInd","RS_BOPIS_Ind"]}]}} ```
MCP tool cvs_store_locator
/cvs/brandsReturns CVS.com's full brand directory (name and path). Each brand's path is directly usable as GET /cvs/category's path parameter to browse that brand's products.
Response notes
- Each brand's `path` is directly usable as [`cvs-category`](cvs-category.md)'s `path` query parameter to browse that brand's products. The path is derived from the brand name (lowercased, non-alphanumeric runs collapsed to a single `-`) — not copied from an upstream field, since the upstream's own `isBrandShop` flag is unpopulated for every brand. - A brand whose name has no usable letters/digits (rare) is omitted rather than given a broken path. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. Example response: ```json {"code":200,"msg":"OK","data":{"total_count":2758,"brands":[{"name":"Pepsi","path":"brand-shop/p/pepsi"},{"name":"one+other","path":"brand-shop/o/one-other"},{"name":"Safe Home","path":"brand-shop/s/safe-home"}]}} ```
MCP tool cvs_brands
/cvs/categoriesReturns CVS.com's full category/subcategory navigation taxonomy (name and path, nested to whatever depth the upstream carries). Each node's path is directly usable as GET /cvs/category's path parameter.
Response notes
- Each node's `path` is directly usable as [`cvs-category`](cvs-category.md)'s `path` query parameter. - `children` is nested to whatever depth the upstream carries (subcategories of subcategories included); a leaf node omits `children` entirely. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. Example response: ```json {"code":200,"msg":"OK","data":{"categories":[{"id":"cat1","title":"Health & Medicine","path":"health-medicine","children":[{"id":"cat510006","title":"Allergy & Sinus","path":"health-medicine/allergy-sinus","children":[{"id":"cat510010","title":"Allergy Medicine","path":"health-medicine/allergy-sinus/allergy-medicine"}]}]}]}} ```
MCP tool cvs_categories
/cvs/searchPerforms a keyword search across CVS.com's non-prescription retail/OTC catalog and returns one page of results: normalized 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. This is the same product-search backend cvs-category reads, just reached by keyword instead of by category/brand path. 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/US-territory egress; a request from an unsupported region returns an upstream error rather than an empty result.
Response notes
- The response shape is identical to `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. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a request CVS blocks, returns a `503` upstream error rather than an empty or wrong result. - An empty or unrecognized `q`, or an unrecognized `sort` value, returns a `400` invalid-parameter error before any upstream request is made. Example response: ```json {"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}]}]}} ```
MCP tool cvs_search
/cvs/categoryReturns one page of a CVS.com OTC (over-the-counter) retail category, subcategory, or brand page's product grid: normalized 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 category-specific attributes, each with its selectable values and result counts) available to filter the page further. Covers the non-prescription retail catalog only. path is the segment of a page URL after "/shop/", e.g. "beauty" (top-level category), "health-medicine/allergy-sinus" (subcategory), or "brand-shop/s/safe-home" (brand page); a full https://www.cvs.com/shop/... URL or a "/shop/..." path is also accepted. Any of these can also carry an optional facet-filter suffix in the site's own URL shape, e.g. "beauty/makeup/eyes/q/CoverGirl/Black/brpc" to filter to brand CoverGirl and color Black -- see the response's facets field for which values/type codes a given category supports; filter values are case-sensitive exactly as the site renders them. page is a 1-indexed page number (default 1). sort is an optional result order matching the site's own Sort By control. CVS.com is only available from US/US-territory egress; a request from an unsupported region returns an upstream error rather than an empty result.
Response notes
- `list_price`/`sale_price`/`currency` come from the page's own pricing data; a product with no price omits these fields. - `is_sponsored`, `is_featured`, and `is_new_product` reflect the merchandising flags the category page itself carries. - `facets` lists every filter the current category/filter state exposes: `key` is the upstream facet field name (e.g. `brand`, `e_color`, `d_priceBucket`), `label` is its display name (e.g. `Brand`, `Color`, `Price`), and `values` is a list of `{name, count}` — `count` is the number of results selecting that value would produce given whatever filters, if any, the request already applied. The set of facets and their values is category-specific and upstream-controlled; read it from a live response rather than assuming a fixed set. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. - An unrecognized `path` (including a malformed filter suffix) or an unrecognized `sort` value returns a `400` invalid-parameter error before any upstream request is made. Example response: ```json {"code":200,"msg":"OK","data":{"total_count":8766,"page":1,"products":[{"id":"478253","title":"Crest Pro-Health Breath Mist, Clean Mint, 0.44 OZ, 2 PK","url":"https://www.cvs.com/shop/crest-pro-health-breath-mist-clean-mint-0-44-oz-2-pk-prodid-478253","brand":"Crest","image_url":"https://www.cvs.com/bizcontent/merchandising/productimages/high_res/72894700032.jpg","currency":"USD","list_price":4.99,"sale_price":4.99}],"facets":[{"key":"brand","label":"Brand","values":[{"name":"Crest","count":12},{"name":"one+other","count":3}]},{"key":"d_priceBucket","label":"Price","values":[{"name":"$0 - $5","count":9},{"name":"$5 - $10","count":6}]}]}} ```
MCP tool cvs_category
/cvs/product/{slug}Returns one CVS.com OTC (over-the-counter) retail product's detail: name, description, brand, category, price, currency, online availability, image gallery, and aggregate rating. Covers the non-prescription retail catalog only -- this does not cover prescription items, pharmacy ordering, or any patient-specific data. slug is the segment of a product page URL after "/shop/", e.g. "safe-home-premium-radon-test-kit-prodid-945948"; a full https://www.cvs.com/shop/... URL is also accepted. CVS.com is only available from US/US-territory egress; a request from an unsupported region returns an upstream error rather than an empty result.
Response notes
- `availability` is the short form of the page's schema.org availability (`InStock`, `OutOfStock`, `SoldOut`, ...), reflecting online availability only — not any particular store's shelf stock. - `price` and `currency` come from the page's own offer. - `images` is the product's image gallery. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. - An unrecognized `slug` returns a `400` invalid-parameter error before any upstream request is made. Example response: ```json {"code":200,"msg":"OK","data":{"id":"945948","title":"Safe Home Premium Radon Test Kit","description":"Safe Home Premium Radon Test Kit","brand":"Safe Home","category":"Household > Home & Kitchen > Kitchen Accessories","currency":"USD","price":14.99,"availability":"InStock","images":["https://www.cvs.com/bizcontent/merchandising/productimages/high_res/868816000016.jpg"],"rating":5,"review_count":1,"url":"https://www.cvs.com/shop/safe-home-premium-radon-test-kit-prodid-945948","source_url":"https://www.cvs.com/shop/safe-home-premium-radon-test-kit-prodid-945948","fetched_at":"2026-09-02T00:00:00Z"}} ```
MCP tool cvs_product
/cvs/product-ingredients/{slug}Returns one CVS.com OTC (over-the-counter) retail product's ingredient/label statement: active ingredients, inactive ingredients, and the vendor's full free-text ingredient paragraph (which, for OTC drug products, frequently also carries a Drug Facts-style purpose note). This is sourced from the product's own dedicated ingredients page, a separate page from the main product detail endpoint. Covers the non-prescription retail catalog only -- this does not cover prescription items, pharmacy ordering, or any patient-specific data. slug is the segment of a product page URL after "/shop/", e.g. "e-l-f-16hr-camo-concealer-prodid-2370023"; a full https://www.cvs.com/shop/... URL is also accepted. Some products (particularly non-consumable goods) may return empty ingredient fields -- this reflects upstream having no label data for that product, not an error. CVS.com is only available from US/US-territory egress; a request from an unsupported region returns an upstream error rather than an empty result.
Response notes
- `active_ingredients` and `inactive_ingredients` are the vendor's own structured active/inactive ingredient fields when upstream populates them separately. Many products leave these empty and only populate the combined `paragraph` field below — prefer `paragraph` as the more complete source. - `paragraph` is the vendor's full free-text ingredient statement. For OTC drug products this frequently also carries a Drug Facts-style purpose note (e.g. `"Active Ingredient (in each drop): Menthol, 1.5 mg - Purpose: Oral anesthetic ..."`). - Some products (particularly non-consumable goods) return empty ingredient fields alongside a valid `id`/`title` — this reflects upstream having no label data for that product, not an error. - CVS.com is only available from US/US-territory egress; a request from an unsupported region, or a page CVS blocks, returns a `503` upstream error rather than an empty or wrong result. - An unrecognized `slug` returns a `400` invalid-parameter error before any upstream request is made. A well-formed but nonexistent product id returns a `404`. Example response: ```json {"code":200,"msg":"OK","data":{"id":"2370023","title":"e.l.f. 16hr Camo Concealer","paragraph":"Active Ingredients: WATER (AQUA), CYCLOPENTASILOXANE, ACRYLATES CROSSPOLYMER...Inactive Ingredients: Water, Cyclopentasiloxane, Acrylates Crosspolymer...","url":"https://www.cvs.com/shop/ingredients/e-l-f-16hr-camo-concealer-prodid-2370023","source_url":"https://www.cvs.com/shop/ingredients/e-l-f-16hr-camo-concealer-prodid-2370023","fetched_at":"2026-09-03T00:00:00Z"}} ```
MCP tool cvs_product_ingredients
Related APIs
Marketplaces & Retail
Collect marketplace product signals from Amazon without building brittle storefront scrapers.
Marketplaces & Retail
Build resale, pricing, and marketplace workflows from structured eBay data.
Marketplaces & Retail
Turn public Shop.app product and merchant pages into structured JSON for e-commerce product intelligence, price research, shop monitoring, and marketplace discovery workflows.
How to scrape CVS
Crawlora's CVS endpoints return normalized public CVS.com data as JSON with one API key — no CVS account required. CVS.com is only reachable from US/US-territory egress; a request from an unsupported region returns an upstream error.
Pass a 5-digit US zip, or latitude and longitude together, to /cvs/store-locator for nearby CVS locations with address, phone, fax, distance, retail store hours, a has_pharmacy flag, and general service indicators (photo, ATM, same-day delivery) — this covers store info only, not pharmacy hours or patient data.
Call /cvs/brands for the full brand directory or /cvs/categories for the full category/subcategory navigation taxonomy — each entry's path is directly usable as /cvs/category's path parameter to browse that brand's or category's products.
Pass a keyword to /cvs/search for one page of matching products — title, brand, image, current/original price, and sponsored/featured/new-product flags — plus the total result count and the selectable facets (brand, color, size, price range, and more) with per-value result counts.
Pass a category path (the URL segment after "/shop/", e.g. "beauty" or "health-medicine/allergy-sinus") to /cvs/category for that page's normalized product grid — title, brand, image, current and original price, and sponsored/featured/new flags — paginated with page.
Pass a product slug (the URL segment after "/shop/", e.g. "safe-home-premium-radon-test-kit-prodid-945948") to /cvs/product/{slug} for that item's name, description, brand, price, currency, availability, image gallery, and aggregate rating — or to /cvs/product-ingredients/{slug} for its active/inactive ingredient statement, sourced from the product's separate ingredients page. Some non-consumable products legitimately return empty ingredient fields.
Every CVS endpoint covers the non-prescription retail catalog and general store info only — none of them return prescription ordering, pharmacy hours, pharmacy phone, or any patient-specific data.
FAQ
Call /cvs/store-locator with a ZIP or coordinate for nearby stores, /cvs/brands or /cvs/categories for the taxonomy, /cvs/search with a keyword or /cvs/category with a category path for the OTC product grid, /cvs/product/{slug} for one product's detail, or /cvs/product-ingredients/{slug} for its label statement — all return structured JSON with one API key.
Yes — /cvs/search takes a keyword and returns one page of matching products plus the total result count and the same selectable facets (brand, color, size, price range, and more) that category browsing exposes.
No. Every CVS endpoint covers general store info and the non-prescription (OTC) retail catalog only — pharmacy hours, pharmacy phone, prescription ordering, and any patient-specific data are out of scope.
No. CVS.com is only available from US/US-territory egress — a request from an unsupported region returns an upstream error rather than an empty result.
Yes — /cvs/store-locator returns a has_pharmacy existence flag per store, alongside its other general service indicators.
Yes — /cvs/product-ingredients/{slug} returns the active ingredients, inactive ingredients, and full label statement from the product's own dedicated ingredients page, separate from the main product-detail endpoint. Some products (particularly non-consumable goods) return empty ingredient fields, reflecting upstream having no label data rather than an error.