Sephora Product Scraper (Global) avatar

Sephora Product Scraper (Global)

Pricing

$30.00/month + usage

Go to Apify Store
Sephora Product Scraper (Global)

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

Richard Feng

Maintained by Community

Actor stats

13

Bookmarked

322

Total users

10

Monthly active users

0.55 hours

Issues response

2 days ago

Last modified

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/sephora US scraper that's been running continuously since 2025. EU and SEA ports were translated directly from the sephora-eu-scraper and sephora-nz-scraper standalone actors.

How to use Sephora Scraper

  1. In the Input tab, paste any Sephora product or category URL(s) into Sephora start URLs — from any country.
  2. (Optional) Set Max requests per crawl to cap the run (applies to all markets).
  3. (Optional) Override the auto-detected market with the Market override field if you're passing bare IDs instead of URLs.
  4. 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

FieldDescription
startUrlsProduct or category URLs from any sephora.* storefront. Required.
marketOptional 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.
localeOptional BCP 47 locale (e.g. fr-FR, en-NZ). Overrides the market's default.
categoryIdsEU-only. SFCC category IDs like C479. Alternative to pasting category URLs.
proxyProxy configuration. Residential strongly recommended; set apifyProxyCountry to match the target market (e.g. FR for sephora.fr, NZ for sephora.nz) — see Tips.
maxConcurrencyConcurrent requests. Default 5.
maxRequestsPerCrawlGlobal hard cap on total Crawlee requests across every active market (includes listing, search, detail). 0 = unlimited.

Supported markets

RegionMarket IDCountryLocaleCurrencyHostname
AmericasusUnited Statesen-USUSDsephora.com
AmericasusCanadaen-CA / fr-CACADsephora.ca
EUeu-frFrancefr-FREURsephora.fr
EUeu-itItalyit-ITEURsephora.it
EUeu-deGermanyde-DEEURsephora.de
EUeu-esSpaines-ESEURsephora.es
EUeu-plPolandpl-PLPLNsephora.pl
EUeu-czCzech Republiccs-CZCZKsephora.cz
EUeu-grGreeceel-GREURsephora.gr
EUeu-roRomaniaro-RORONsephora.ro
EUeu-ptPortugalpt-PTEURsephora.pt
APACsea-nzNew Zealanden-NZNZDsephora.nz
APACsea-auAustraliaen-AUAUDsephora.com.au
APACsea-sgSingaporeen-SGSGDsephora.sg
APACsea-myMalaysiaen-MYMYRsephora.com.my
APACsea-thThailandth-THTHBsephora.co.th
APACsea-idIndonesiaid-IDIDRsephora.co.id
APACsea-phPhilippinesen-PHPHPsephora.ph
APACsea-hkHong Kongzh-HKHKDsephora.hk
APACsea-twTaiwanzh-TWTWDsephora.tw
APACsea-bnBruneien-BNBNDsephora.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

FieldTypeUSEUSEANotes
marketstringMarket identifier stamped by dispatcher
source.idnumber/stringUS: string P123; EU/SEA: numeric
source.crawlUrlstringUS-only
source.canonicalUrlstring
source.currencystringPer-market currency
variants[].price.currentnumberLocal currency
variants[].price.stockStatusenumIN_STOCK / OUT_OF_STOCK / UNKNOWN
variants[].wishlistedbooleanSEA-only
stats.reviewCount / ratingnumber
stats.lovesCountnumberSEA does not expose loves; see wishlisted instead
sentimentsobjectUS-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. Set apifyProxyCountry to the storefront's country: US / CA for US, FR/IT/DE/ES/PL/RO for EU (PT routes through ES), 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 maxConcurrency between 2 and 5. Sephora US is aggressive about rate-limiting; higher concurrency increases 403 rates, not throughput.
  • EUmaxConcurrency=3 is the sweet spot. Higher concurrency triggers extra session-refresh churn with no throughput gain.
  • SEAmaxConcurrency=16 finishes 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=10 before 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.