Sephora Product Scraper (Global)
Pricing
$30.00/month + usage
Sephora Product Scraper (Global)
Scrape Sephora products across 20 storefronts (US, Canada, 9 EU markets, 10 APAC countries) through one unified Python actor. Extract prices, variants, ratings, and catalog details via official mobile APIs with TLS fingerprint impersonation, OAuth2/guest-token auth, and per-market session isolation.
Pricing
$30.00/month + usage
Rating
5.0
(1)
Developer
Richard Feng
Actor stats
13
Bookmarked
322
Total users
10
Monthly active users
0.55 hours
Issues response
2 days ago
Last modified
Categories
Share
What does Sephora Scraper do?
Sephora Scraper extracts complete product data — every variant, every price, every image, every review — from 20 Sephora storefronts across the US, Canada, 9 EU markets, and 10 Asia-Pacific markets. Paste any sephora.* product or category URL and the actor auto-detects the market, fetches the data, and returns a normalized JSON record that's identical in shape across every region.
The same run can span multiple markets. 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 headers and auth, and streams everything to a single dataset tagged with a market field.
Why use Sephora Scraper?
- 20 markets, one SKU. One actor covers US + Canada + 9 EU countries + 10 APAC countries. No juggling multiple scrapers.
- Fast, structured fetches. No browser automation, no HTML scraping. Expect seconds per product, not minutes.
- Locale-correct pricing. NZD for New Zealand, EUR for France, USD for US — returned by Sephora's own localization layer, not guessed.
- Normalized schema. Every market emits the same top-level shape:
source / brand / title / options / variants / medias / stats. Drop-in compatible with v1.x US dataset consumers. - Production-tested. Built on top of the
autofacts/sephoraUS scraper that's been running continuously since 2025. EU and SEA ports were translated directly from thesephora-eu-scraperandsephora-nz-scraperstandalone actors.
How to use Sephora Scraper
- In the Input tab, paste any Sephora product or category URL(s) into Sephora start URLs — from any country.
- (Optional) Set Max requests per crawl to cap the run (applies to all markets).
- (Optional) Override the auto-detected market with the Market override field if you're passing bare IDs instead of URLs.
- Click Start and download the results from the Dataset tab (JSON, CSV, XLSX, HTML).
No API keys, no tokens, no proxy account required for EU/SEA. US runs perform best with a residential-proxy Apify plan.
Input
| Field | Description |
|---|---|
startUrls | Product or category URLs from any sephora.* storefront. Required. |
market | Optional market override. Values: 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. Leave blank to auto-detect from URLs. |
locale | Optional BCP 47 locale (e.g. fr-FR, en-NZ). Overrides the market's default. |
categoryIds | EU-only. SFCC category IDs like C479. Alternative to pasting category URLs. |
proxy | Proxy configuration. Residential strongly recommended; set apifyProxyCountry to match the target market (e.g. FR for sephora.fr, NZ for sephora.nz) — see Tips. |
maxConcurrency | Concurrent requests. Default 5. |
maxRequestsPerCrawl | Global hard cap on total Crawlee requests across every active market (includes listing, search, detail). 0 = unlimited. |
Supported markets
| Region | Market ID | Country | Locale | Currency | Hostname |
|---|---|---|---|---|---|
| Americas | us | United States | en-US | USD | sephora.com |
| Americas | us | Canada | en-CA / fr-CA | CAD | sephora.ca |
| EU | eu-fr | France | fr-FR | EUR | sephora.fr |
| EU | eu-it | Italy | it-IT | EUR | sephora.it |
| EU | eu-de | Germany | de-DE | EUR | sephora.de |
| EU | eu-es | Spain | es-ES | EUR | sephora.es |
| EU | eu-pl | Poland | pl-PL | PLN | sephora.pl |
| EU | eu-cz | Czech Republic | cs-CZ | CZK | sephora.cz |
| EU | eu-gr | Greece | el-GR | EUR | sephora.gr |
| EU | eu-ro | Romania | ro-RO | RON | sephora.ro |
| EU | eu-pt | Portugal | pt-PT | EUR | sephora.pt |
| APAC | sea-nz | New Zealand | en-NZ | NZD | sephora.nz |
| APAC | sea-au | Australia | en-AU | AUD | sephora.com.au |
| APAC | sea-sg | Singapore | en-SG | SGD | sephora.sg |
| APAC | sea-my | Malaysia | en-MY | MYR | sephora.com.my |
| APAC | sea-th | Thailand | th-TH | THB | sephora.co.th |
| APAC | sea-id | Indonesia | id-ID | IDR | sephora.co.id |
| APAC | sea-ph | Philippines | en-PH | PHP | sephora.ph |
| APAC | sea-hk | Hong Kong | zh-HK | HKD | sephora.hk |
| APAC | sea-tw | Taiwan | zh-TW | TWD | sephora.tw |
| APAC | sea-bn | Brunei | en-BN | BND | sephora.bn |
Output
Each dataset item follows the schema in .actor/dataset_schema.json. Example (NZ):
{"market": "sea-nz","source": {"id": 58792,"crawlUrl": null,"canonicalUrl": "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation","retailer": "SEPHORA","currency": "NZD"},"brand": "Rare Beauty","title": "True To Myself Natural Matte Longwear Foundation","description": "<p>A self-priming and self-setting foundation...</p>","shortDescription": "<p>3-in-1 foundation primes, covers and sets...</p>","categories": ["makeup/face/foundation"],"options": [{ "name": "shade", "id": "66488", "values": [{"value": "1 Fair Neutral", "label": "1 Fair Neutral", "orderable": true}] }],"variants": [{"id": "276343","sku": "770225","price": { "current": 77.0, "original": 77.0, "stockStatus": "IN_STOCK" },"options": [{"name": "shade", "value": "1 Fair Neutral"}],"highlights": ["NEW", "Only at Sephora"],"wishlisted": null}],"medias": [{"url": "https://www.sephora.nz/.../foundation-shade.jpg", "type": "image"}],"stats": { "reviewCount": 971, "rating": 4.8, "lovesCount": null },"sentiments": null}
Download as JSON, CSV, XLSX, or HTML from the Dataset tab.
Data fields
| Field | Type | US | EU | SEA | Notes |
|---|---|---|---|---|---|
market | string | ✓ | ✓ | ✓ | Market identifier stamped by dispatcher |
source.id | number/string | ✓ | ✓ | ✓ | US: string P123; EU/SEA: numeric |
source.crawlUrl | string | ✓ | — | — | US-only |
source.canonicalUrl | string | ✓ | ✓ | ✓ | |
source.currency | string | ✓ | ✓ | ✓ | Per-market currency |
variants[].price.current | number | ✓ | ✓ | ✓ | Local currency |
variants[].price.stockStatus | enum | ✓ | ✓ | ✓ | IN_STOCK / OUT_OF_STOCK / UNKNOWN |
variants[].wishlisted | boolean | — | — | ✓ | SEA-only |
stats.reviewCount / rating | number | ✓ | ✓ | ✓ | |
stats.lovesCount | number | ✓ | ✓ | — | SEA does not expose loves; see wishlisted instead |
sentiments | object | ✓ | — | — | US-only AI review summaries |
Tips / advanced options
- Pin the proxy country to the target market. A residential exit in a mismatched country (e.g. a US IP hitting
sephora.fr) is the single largest source of 403s from Sephora's Akamai layer. SetapifyProxyCountryto the storefront's country:US/CAfor US,FR/IT/DE/ES/PL/ROfor EU (PTroutes throughES), and the matching ISO code for each APAC country (NZ,AU,SG,MY,TH,ID,PH,HK,TW,BN). Unpinned residential works but expect a noticeably lower success rate. - US — set
maxConcurrencybetween 2 and 5. Sephora US is aggressive about rate-limiting; higher concurrency increases 403 rates, not throughput. - EU —
maxConcurrency=3is the sweet spot. Higher concurrency triggers extra session-refresh churn with no throughput gain. - SEA —
maxConcurrency=16finishes a full-market catalog scrape in a few minutes. - Mixed runs — concurrency is enforced per-market (each market gets its own semaphore), so a mixed run at concurrency=5 doesn't blast any one storefront.
- Smoke test first — set
maxRequestsPerCrawl=10before your first production run in a new market.
FAQ
Will my existing 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 addition (not a breaking change).
Do I need a new API token? No. Your existing Apify API token works unchanged.
What's the market field in the output? The dispatcher's auto-detected country/region tag. Useful for filtering when a single run scrapes multiple storefronts. Values match the table under Supported markets.
Why does stats.lovesCount show null for NZ/AU/etc.? Sephora SEA (the API that backs NZ/AU/SG/MY/TH/ID/PH/HK/TW/BN) doesn't expose a loves counter. Each variant has a boolean wishlisted field instead — use it if you need the SEA equivalent.
How do I scrape only a specific market? Paste only URLs from that market's hostname, OR set the market input field explicitly (e.g. eu-fr).
Why do I see sephora-scraper.internal/... URLs in the Run's Request Queue tab? Those are internal tracking identifiers, not the URLs the actor fetches. The actor resolves them at the moment of request and the resolved form is never written to the Console, logs, or the dataset. Your actual scrape targets the public Sephora stores you requested in startUrls.
Will re-running with the same input re-scrape everything? Yes. Each run starts with a fresh Request Queue (the default Apify queue, purged per run), so hitting Run twice will re-scrape every URL. If you need resume-on-rerun semantics for very long crawls, split the input into smaller batches.
Why did my run abort with "circuit breaker tripped"? Every 50 consecutive failed requests trigger an early abort — this protects you from burning compute when the target is entirely down. Check Sephora's availability, then re-run. Normal transient errors (429s, 5xxs on individual products) don't trip the breaker because they're mixed with successes.
Legality / Terms of Service. Scraping is a gray area that depends on jurisdiction and intended use. Review Sephora's ToS and consult counsel before running at scale. This actor is provided as-is for research, compliance, competitive monitoring, and other lawful use cases.
Support
Issues and feature requests: open an issue on the Apify listing or email the autofacts team. For custom-scope requests (historical backfills, loyalty data, sub-brand catalogs), contact us directly.