~/ecommerce/sephora-scraper

Sephora Scraper (Global)

Apify actor that extracts complete Sephora product data — variants, prices, images, ingredients, and reviews — from Sephora storefronts in the US, Canada, 9 EU markets, 6 Middle East markets, the UK, India, and 10 Asia-Pacific markets, in a single normalized schema.

beauty PythonCrawlee USCAFRITDEESPLCZGRROPTAESABHOMKWQAGBINNZAUSGMYTHIDPHHKTWBN
proooxy/sephora-scraper — spec
categoryecommerce / beauty
languagePython
stackPython, Crawlee
marketsUS, CA, FR, IT, DE, ES, PL, CZ, GR, RO, PT, AE, SA, BH, OM, KW, QA, GB, IN, NZ, AU, SG, MY, TH, ID, PH, HK, TW, BN
outputclean, RAG-ready JSON

key features

One actor for the US, Canada, 9 EU markets, 6 Middle East markets, the UK, India, and 10 APAC markets

Auto-detected market — paste any sephora.* URL and the dispatcher routes it to the right module

Mixed multi-market runs — US + EU + SEA URLs in one startUrls list, streamed to a single dataset tagged with `market`

Locale-correct pricing — each storefront's own currency (24 in all, from USD and EUR to AED and INR), as Sephora's own localization layer returns it

Normalized schema — every market emits the same `source / brand / title / options / variants / medias / stats` shape

Per-market session isolation — auth state cannot cross-contaminate between regions

Global circuit breaker — 50 consecutive failures abort the run to avoid burning compute on a downed target

use cases

  • Pan-regional pricing intelligence across US, EU, and APAC beauty markets
  • Cross-market product availability and assortment monitoring
  • Competitive analysis for brands launching in new Sephora regions
  • Ingredient comparisons across regional formulations
  • Review and rating tracking — including SEA wishlist signals and US AI sentiment summaries
  • Loyalty / membership pricing audits per market

input parameters

ParameterTypeRequiredDescription
startUrlsarrayrequiredProduct or category URLs from any sephora.* storefront. Market is auto-detected from the hostname.
marketstringoptionalOptional market override (us, eu-fr, eu-it, eu-de, eu-es, eu-pl, eu-ro, eu-pt, eu-cz, eu-gr, mena-ae, mena-sa, mena-bh, mena-om, mena-kw, mena-qa, uk, in, sea-nz, sea-au, sea-sg, sea-my, sea-th, sea-id, sea-ph, sea-hk, sea-tw, sea-bn).
localestringoptionalOptional BCP 47 locale (e.g. fr-FR, en-NZ) — overrides the market default.
categoryIdsarrayoptionalEU, Middle East, UK, and India. Category IDs in the market's own format (e.g. C479 on EU storefronts) — an alternative to pasting category URLs.
onlyNewProductsbooleanoptionalOnly recently added products: a server-side filter on US/Canada and FR, IT, DE, ES, PL, RO, PT; newest-first listing pages on SEA and India. Not supported elsewhere.
newProductsPageLimitnumberoptionalListing pages per category when onlyNewProducts runs on SEA or India. Default 3.
advancedFilterstringoptionalUS/Canada category listings only: a raw refinement expression such as filters[isNew]=true.
proxyobjectoptionalApify proxy config. Residential strongly recommended; pin apifyProxyCountry to the target market.
maxConcurrencynumberoptionalConcurrent requests. Default 5. US: 2-5. EU: 3. SEA: 8-16.
maxRequestsPerCrawlnumberoptionalGlobal hard cap across all markets. 0 = unlimited.

Supported markets

RegionMarket IDCountryCurrencyHostname
AmericasusUnited StatesUSDsephora.com
AmericasusCanadaCADsephora.ca
EUeu-frFranceEURsephora.fr
EUeu-itItalyEURsephora.it
EUeu-deGermanyEURsephora.de
EUeu-esSpainEURsephora.es
EUeu-plPolandPLNsephora.pl
EUeu-czCzech RepublicCZKsephora.cz
EUeu-grGreeceEURsephora.gr
EUeu-roRomaniaRONsephora.ro
EUeu-ptPortugalEURsephora.pt
Middle Eastmena-aeUnited Arab EmiratesAEDsephora.me/ae-en
Middle Eastmena-saSaudi ArabiaSARsephora.me/sa-en
Middle Eastmena-bhBahrainBHDsephora.me/bh-en
Middle Eastmena-omOmanOMRsephora.me/om-en
Middle Eastmena-kwKuwaitKWDsephora.me/kw-en
Middle Eastmena-qaQatarQARsephora.me/qa-en
UKukUnited KingdomGBPsephora.co.uk
IndiainIndiaINRsephora.in
APACsea-nzNew ZealandNZDsephora.nz
APACsea-auAustraliaAUDsephora.com.au
APACsea-sgSingaporeSGDsephora.sg
APACsea-myMalaysiaMYRsephora.com.my
APACsea-thThailandTHBsephora.co.th
APACsea-idIndonesiaIDRsephora.co.id
APACsea-phPhilippinesPHPsephora.ph
APACsea-hkHong KongHKDsephora.hk
APACsea-twTaiwanTWDsephora.tw
APACsea-bnBruneiBNDsephora.bn

Output Example

 1{
 2  "market": "sea-nz",
 3  "source": {
 4    "id": 58792,
 5    "canonicalUrl": "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation",
 6    "retailer": "SEPHORA",
 7    "currency": "NZD"
 8  },
 9  "brand": "Rare Beauty",
10  "title": "True To Myself Natural Matte Longwear Foundation",
11  "description": "<p>A self-priming and self-setting foundation...</p>",
12  "ingredients": "Aqua/Water, Cyclopentasiloxane, Glycerin...",
13  "currentSku": "770225",
14  "categories": ["makeup/face/foundation"],
15  "options": [
16    { "name": "shade", "id": "66488", "values": [{"value": "1 Fair Neutral", "orderable": true}] }
17  ],
18  "variants": [
19    {
20      "id": "276343",
21      "sku": "770225",
22      "price": { "current": 77.0, "original": 77.0, "stockStatus": "IN_STOCK" },
23      "options": [{"name": "shade", "value": "1 Fair Neutral"}],
24      "highlights": ["NEW", "Only at Sephora"],
25      "wishlisted": null
26    }
27  ],
28  "medias": [{ "url": "https://www.sephora.nz/.../foundation-shade.jpg", "type": "image" }],
29  "stats": { "reviewCount": 971, "rating": 4.8, "lovesCount": null }
30}

Tips

  • Pin proxy country to the target market. A residential exit in a mismatched country is the single largest source of 403s. Set apifyProxyCountry to the storefront’s ISO code (US, FR, NZ, etc.).
  • Smoke-test first. Set maxRequestsPerCrawl=10 before your first production run in a new market.
  • Tune concurrency per region. US: 2-5. EU: 3. SEA: 8-16. Each market gets its own semaphore in mixed runs.

faq

Which Sephora storefronts does this scraper support?
US (sephora.com), Canada (sephora.ca), 9 EU markets (FR, IT, DE, ES, PL, CZ, GR, RO, PT), 6 Middle East markets on sephora.me (AE, SA, BH, OM, KW, QA), the UK (sephora.co.uk), India (sephora.in), and 10 APAC markets (NZ, AU, SG, MY, TH, ID, PH, HK, TW, BN). The market is auto-detected from the URL — the hostname, or the /ae-en/-style path prefix on sephora.me — so mixed-market runs need no extra input.
Can I scrape multiple markets in a single run?
Yes. Mix sephora.com, sephora.fr, and sephora.nz URLs in one startUrls list. The dispatcher groups them by market, runs each module concurrently with market-appropriate auth, and tags every dataset item with a `market` field.
How does the scraper handle anti-bot protection?
Every market runs through residential proxies with automatic retries on a fresh session when a request is blocked. Pin the proxy country to the storefront's market for the best success rate.
Will my existing v1.x US run configs keep working?
Yes. Pre-2.0 inputs — startUrls, maxConcurrency, proxy, maxRequestsPerCrawl — behave identically. The only output change is a new `market` key on every item, which is a soft additive change.
Why are some fields null in SEA data?
Sephora SEA's API doesn't expose a `lovesCount` counter, so APAC items have `stats.lovesCount = null`. Each variant has a boolean `wishlisted` field instead. Conversely, `sentiments` (AI review summaries) and `source.crawlUrl` are US-only.
Do I need separate API tokens or accounts per market?
No. Your existing Apify API token works unchanged. The actor handles per-market guest tokens internally — no credentials required for EU/SEA, and US works on standard Apify residential proxies.

related in ~/ecommerce

Run Sephora Scraper (Global), or get a custom build

Start extracting on Apify in minutes, or hire me to build a bespoke scraper and RAG pipeline for your exact source and schema.

run on Apify get custom data