Scrape Sephora product pages, shades and reviews
Price, sale price, every shade with its stock state, rating and review count from sephora.com, without a browser. Works for the US, Canada and France storefronts.
Measured on Crawlbase
99.7% of product and search fetches succeeded in August 2026. Only 0.4% of calls used the JavaScript token, and the ones that did got the same data back. Sephora is one of the cleanest large sites we serve.
The call
# Product page as JSON: price, shades, stock, rating curl "https://api.crawlbase.com/?token=YOUR_TOKEN&autoparse=true&country=US&url=https%3A%2F%2Fwww.sephora.com%2Fproduct%2Frare-beauty-soft-pinch-liquid-blush-P97989778" # Search results, first page curl "https://api.crawlbase.com/?token=YOUR_TOKEN&autoparse=true&country=US&url=https%3A%2F%2Fwww.sephora.com%2Fsearch%3Fkeyword%3Dliquid%2520blush"
from crawlbase import CrawlingAPI api = CrawlingAPI({'token': 'YOUR_TOKEN'}) r = api.get('https://www.sephora.com/product/rare-beauty-soft-pinch-liquid-blush-P97989778', {'autoparse': 'true', 'country': 'US'}) product = r['json'] print(product['name'], product['price'], len(product['variants']))
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_TOKEN' }); const r = await api.get('https://www.sephora.com/product/rare-beauty-soft-pinch-liquid-blush-P97989778', { autoparse: 'true', country: 'US' }); console.log(r.json.name, r.json.price, r.json.variants.length);
Parameters that matter
| Parameter | Set it to | Why |
|---|---|---|
javascript | leave unset | Everything on the product page is in the first response. A browser doubles the price and returns the same JSON. |
country | US, CA or FR | Sephora shows the storefront of the visitor's country and prices differ. Match the country to the domain: sephora.com for US and CA, sephora.fr for France. |
autoparse | true | Returns the product as JSON. Without it you get the HTML and parse the embedded state yourself. |
page_wait | never | Only applies with a browser. Not needed here. |
Fields you get
stringstringnumbernumber | nullUSD | CAD | EURnumber (0 to 5)numberstringstringbooleanurl[]string[]What breaks, and the fix
cb_status 200. Treat it as "gone", not as a retry; it is counted as a success because the site answered.currentPage= in the URL. Sorting defaults to "bestselling", which reorders between requests; pin sortBy=NEW or sortBy=PRICE_LOW_TO_HIGH when you paginate a full list.Run it on a schedule
For a catalogue refresh, push the product URLs to the Crawler with store=true and read results from Cloud Storage. 20,000 products complete in about 15 minutes at the default concurrency and cost 20,000 credits.
Questions
Do I need a browser to scrape Sephora?
No. The product JSON is in the first response; almost every successful call in the measured month ran without one.
How much does a Sephora product page cost on Crawlbase?
One credit. Sephora is in the standard tier.
Can I get prices for sephora.fr?
Yes, with country=FR and the sephora.fr URL. Prices return in EUR.