To get CVS product data programmatically, use Scavio's CVS API. POST /api/v1/cvs/search with a query and a store_id returns up to 48 products a page with regular and sale price, unit price, the ExtraBucks Rewards and manufacturer coupons on each, and the units on the shelf and for pickup at that store. /stock checks up to 20 SKUs at any store in one call, and /product adds the UPC, ingredients and the sale's end date. Every call costs 1 credit, about $0.002 on the Growth plan billed yearly.
CVS has no public API for this. The CVS Health Developer Portal covers pharmacy, benefits, MinuteClinic and immunization services for approved developers, not cvs.com front-store prices, coupons or shelf stock.
Step 1: Pick a store
Scavio has no store locator, so take the number from the store's page on cvs.com: the URL of 150 East 42nd St in New York ends in storeid=7019. That is also the default when you send no store_id. Prices are the same at every store; stock is not, so the store is what makes the stock fields mean something.
Step 2: Search with that store's stock
curl -s https://api.scavio.dev/api/v1/cvs/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "toothpaste", "store_id": "7019", "limit": 48}'On November 2, 2026 this returned 48 products of 226 results in 3.9 seconds. One row, as captured (URL, image and flag fields trimmed):
{
"position": 6,
"product_id": "789787",
"sku_id": "789787",
"name": "Crest 3D White Fluoride Anticavity Whitening Toothpaste, Radiant Mint, 2.4 OZ",
"brand": "Crest",
"price": 4.69,
"sale_price": 3.99,
"on_sale": true,
"unit_price": "$1.66/oz.",
"promo": "Sale $3.99",
"rating": 4.5627,
"review_count": 3044,
"size": "2.40 OZ",
"coupon_count": 2,
"coupons": [
{
"type": "extrabucks",
"description": "$4 ExtraBucks Rewards for purchasing 2 Crest3D 2.4z/StainEraser3.8z/ProHealth3.5-4.3z/Plus 5.4z/3in1 4.6zTP/Oral-BCharcoal/WhiteTB/Scope-Crest 500 mL",
"coupon_number": null,
"expires": null
},
{
"type": "manufacturer",
"description": null,
"coupon_number": "1051068",
"expires": "2026-11-15T23:59:59-05:00"
}
],
"stock": {
"in_store": 49,
"pickup": 45,
"same_day_delivery": null,
"ship": 0,
"ship_available": false
}
}in_store is units on the shelf at store 7019 and pickup is units you can order for pickup there. ship is the online warehouse pool, the same for every store; this Crest had none to ship but 49 in the New York store. same_day_delivery is always null: CVS reports one same-day count per SKU whichever store you send, so it is not a store's number. Use the shelf and pickup counts for store-level questions. 46 of the 48 rows carried at least one coupon. Pass page for the rest of the 226 results; the response also carries brand, price-range and rating facets.
Step 3: Check up to 20 SKUs at any store
To watch a list of items, send their sku_id values to the stock endpoint with a store number:
curl -s https://api.scavio.dev/api/v1/cvs/stock \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"store_id": "1889", "sku_ids": ["832677", "854346", "396475", "275748", "874110", "789787", "237548", "831633", "447317", "585539", "968333", "186730", "237416", "237544", "275752", "447384", "565430", "108720", "408668", "609256"]}'Store 1889 in Brighton, Massachusetts answered in 0.7 seconds. Five of the 20 items, as captured:
{
"store_id": "1889",
"requested": 20,
"count": 20,
"items": [
{ "sku_id": "832677", "in_store": 0, "pickup": 0, "same_day_delivery": null, "ship": 8151, "ship_available": true },
{ "sku_id": "275748", "in_store": 20, "pickup": 20, "same_day_delivery": null, "ship": 7969, "ship_available": true },
{ "sku_id": "789787", "in_store": 10, "pickup": 10, "same_day_delivery": null, "ship": 0, "ship_available": false },
{ "sku_id": "585539", "in_store": 1, "pickup": 0, "same_day_delivery": null, "ship": 4467, "ship_available": true },
{ "sku_id": "275752", "in_store": 3, "pickup": 1, "same_day_delivery": null, "ship": 2744, "ship_available": true }
]
}The shelf and pickup counts matched a search at the same store for all 20 SKUs. Note SKU 585539: one unit on the shelf and none for pickup, which is how an item can show as in stock in the store yet unavailable to order. Run the same 20 SKUs at five stores and the differences are large: the Crest Radiant Mint had 49 units in New York, 5 in Palm Springs, 10 in Brighton, 14 in Argyle, Texas and 31 in Lakewood, Ohio, at the same $3.99 everywhere.
An unknown store number or SKU is not an error; it reads as 0. Store 17064 in Federal Way, Washington, a CVS pharmacy inside a Target, returned 0 for every item, so a response of all zeros is a reason to check the store.
Step 4: Get the full product
curl -s https://api.scavio.dev/api/v1/cvs/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "789787"}'This call took 24.4 seconds, so give it a timeout of 60 seconds or more. Trimmed to the headline fields:
{
"product_id": "789787",
"name": "Crest 3D White Fluoride Anticavity Whitening Toothpaste, Radiant Mint, 2.4 OZ",
"brand": "Crest",
"price": 4.69,
"sale_price": 3.99,
"promo": "Sale $3.99",
"promo_end_date": "2026-11-07T23:59:00-05:00",
"upc": "030772125489",
"size": "2.4 OZ",
"max_quantity": 15,
"category": "Personal Care > Oral Care > Toothpaste"
}The full response adds the description, highlights, ingredients, directions, warnings, 12 attribute groups (form, key ingredient, life stage and more), breadcrumbs, 11 images and variants[] with each variant's SKU id and UPC. promo_end_date tells you the $3.99 sale price ends on November 7.
All three endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
/api/v1/cvs/search | Up to 48 products a page: price, sale price, unit price, promotion, rating, coupons, and units in store and for pickup at one store | 1 |
/api/v1/cvs/stock | Units in store, for pickup and in the online ship pool for up to 20 SKUs at one store | 1 |
/api/v1/cvs/product | UPC, size, description, ingredients, directions, warnings, attributes, images, variants and the sale's end date | 1 |
Front-store products only: nothing from the pharmacy. For a side-by-side of every option, see the best CVS product data APIs.
Getting started
- Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required.
- Copy your API key from the dashboard.
- Send a POST to
/api/v1/cvs/searchwith your key in theAuthorizationheader and astore_idfrom cvs.com.
Try the CVS API free in the playground first, or call it from Claude and other agents through the MCP server.
Reference: CVS API overview · search · stock · product · is the CVS app's stock accurate?
Frequently asked questions
How do I check if a CVS store has an item in stock?
Pass the store number to Scavio's /api/v1/cvs/search or /api/v1/cvs/stock. Each product comes back with in_store (units on the shelf) and pickup (units you can order for pickup there). On November 2, 2026 Crest 3D White Radiant Mint showed 49 units at store 7019 in New York and 5 at store 9804 in Palm Springs.
How do I find a CVS store number?
Open the store's page on cvs.com. The URL ends in storeid= followed by the number, for example storeid=7019 for 150 East 42nd St in New York, and the page prints the same id. Scavio has no store-locator endpoint, so you supply the number.
Why does a CVS store show 0 for everything?
Either the store number is wrong or the location has no CVS front store. An unknown number reads as 0 rather than an error, and store 17064 in Federal Way, Washington, a CVS pharmacy inside a Target, returned 0 for all 48 toothpastes we searched. Check the store before reporting a sell-out.
Does the API return ExtraBucks and coupons?
Yes, on search. Each row's coupons array lists ExtraBucks Rewards offers with their text and manufacturer coupons with a coupon number and expiry date. Product detail adds the sale's end date, such as November 7, 2026 for the Crest Radiant Mint at $3.99.
How much does CVS data cost with Scavio?
Every CVS call is 1 credit, including a stock call for 20 SKUs: about $0.002 on the Growth plan billed yearly and $0.0043 on the $30 monthly Project plan. New accounts get 50 free credits with no card.