beauty >99% Success Rate

Sephora Scraper (Global)

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

Python Crawlee curl_cffi US CA FR IT DE ES PL CZ GR RO PT NZ AU SG MY TH ID PH HK TW BN

Key Features

21 storefronts in one actor — US, Canada, 9 EU markets, and 10 APAC markets covered by a single SKU

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 — NZD, EUR, USD, AUD and 17 other currencies returned by Sephora's own localization layer

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
startUrlsarrayYesProduct or category URLs from any sephora.* storefront. Market is auto-detected from the hostname.
marketstringNoOptional market override (us, eu-fr, eu-it, eu-de, eu-es, eu-pl, eu-cz, eu-gr, eu-ro, eu-pt, sea-nz, sea-au, sea-sg, sea-my, sea-th, sea-id, sea-ph, sea-hk, sea-tw, sea-bn).
localestringNoOptional BCP 47 locale (e.g. fr-FR, en-NZ) — overrides the market default.
categoryIdsarrayNoEU-only. SFCC category IDs like C479 — alternative to pasting category URLs.
proxyobjectNoApify proxy config. Residential strongly recommended; pin apifyProxyCountry to the target market.
maxConcurrencynumberNoConcurrent requests. Default 5. US: 2-5. EU: 3. SEA: 8-16.
maxRequestsPerCrawlnumberNoGlobal 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
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 from Sephora’s Akamai layer. 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.

Frequently Asked Questions

Which Sephora storefronts does this scraper support?
21 storefronts: US (sephora.com), Canada (sephora.ca), 9 EU markets (FR, IT, DE, ES, PL, CZ, GR, RO, PT), and 10 APAC markets (NZ, AU, SG, MY, TH, ID, PH, HK, TW, BN). Market is auto-detected from the hostname — no input changes needed when mixing markets.
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?
It uses residential proxies for all markets and curl_cffi for browser-grade TLS fingerprinting on EU and SEA traffic to bypass Akamai. US traffic uses Crawlee's HttpCrawler with a session pool that rotates on 403/429.
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 Tools

Ready to Extract Data?

Start using Sephora Scraper (Global) on Apify, or hire me for a custom solution.