{
  "data": {
    "id": "CmWi1inWXx3Khxocm",
    "actId": "t515auZbFJrdZ5vdU",
    "userId": "zq8lKbpLzTjGDayPC",
    "startedAt": "2026-11-01T22:47:43.431Z",
    "finishedAt": "2026-11-01T22:47:47.966Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 4447,
      "runTimeSecs": 4.447,
      "computeUnits": 0.004941111111111111,
      "imageSizeBytes": 361245184
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "GK9YjZRyQZVzOdoH5",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Sephora Catalog Price & Rating Finder Input\",\n  \"description\": \"Search or browse Sephora products, fetch product URLs, exports reviews or questions. Choose a mode, then set keywords, categories, brands, market, filters and optional detail enrichment.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch: keyword search, category or brand browse, product URLs, bestsellers, new arrivals, sale, reviews or questions.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"category\",\n        \"brand\",\n        \"product\",\n        \"bestsellers\",\n        \"newArrivals\",\n        \"sale\",\n        \"reviews\",\n        \"questions\"\n      ],\n      \"enumTitles\": [\n        \"Search products by keyword\",\n        \"Browse categories\",\n        \"Browse brands\",\n        \"Fetch product URLs or IDs\",\n        \"Bestsellers by category\",\n        \"New arrivals by category\",\n        \"Products on sale\",\n        \"Reviews for product URLs\",\n        \"Questions and answers for product URLs\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQueries\": {\n      \"title\": \"Search keywords\",\n      \"type\": \"array\",\n      \"description\": \"Keywords to search (mode=search). Enter one or more terms, e.g. `moisturizer`, `vitamin c serum`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"moisturizer\"\n      ]\n    },\n    \"categories\": {\n      \"title\": \"Categories\",\n      \"type\": \"array\",\n      \"description\": \"Category slugs, `cat...` IDs or Sephora category URLs (mode=category, bestsellers, newArrivals, sale; also a filter in search). Empty browse modes use the six top-level categories.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"brands\": {\n      \"title\": \"Brands\",\n      \"type\": \"array\",\n      \"description\": \"Brand names, slugs or Sephora brand URLs (mode=brand; also an optional filter in other listing modes). Example: `Rare Beauty` or `/brand/rare-beauty-by-selena-gomez`.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"productUrls\": {\n      \"title\": \"Product URLs or IDs\",\n      \"type\": \"array\",\n      \"description\": \"Sephora product URLs or `P...` IDs (mode=product, reviews, questions). A `?skuId=` in the URL selects that variant.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"market\": {\n      \"title\": \"Market\",\n      \"type\": \"string\",\n      \"description\": \"Storefront and currency: United States (USD), Canada English (CAD) or Canada French (CAD).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"us\",\n        \"ca-en\",\n        \"ca-fr\"\n      ],\n      \"enumTitles\": [\n        \"United States (USD)\",\n        \"Canada - English (CAD)\",\n        \"Canada - French (CAD)\"\n      ],\n      \"default\": \"us\",\n      \"prefill\": \"us\"\n    },\n    \"sortBy\": {\n      \"title\": \"Sort order\",\n      \"type\": \"string\",\n      \"description\": \"Result ordering for listing modes. Bestsellers and sale default to best selling; new arrivals default to newest.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"relevance\",\n        \"bestSelling\",\n        \"topRated\",\n        \"priceLowToHigh\",\n        \"priceHighToLow\",\n        \"newArrivals\"\n      ],\n      \"enumTitles\": [\n        \"Relevance\",\n        \"Best selling\",\n        \"Top rated\",\n        \"Price: low to high\",\n        \"Price: high to low\",\n        \"Newest first\"\n      ],\n      \"default\": \"relevance\",\n      \"prefill\": \"relevance\"\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating\",\n      \"type\": \"integer\",\n      \"description\": \"Only include products rated at or above this value (1-5).\",\n      \"minimum\": 1,\n      \"maximum\": 5\n    },\n    \"priceMin\": {\n      \"title\": \"Minimum price\",\n      \"type\": \"integer\",\n      \"description\": \"Only include products whose current price is at or above this amount, in the selected market's currency.\",\n      \"minimum\": 0,\n      \"maximum\": 100000\n    },\n    \"priceMax\": {\n      \"title\": \"Maximum price\",\n      \"type\": \"integer\",\n      \"description\": \"Only include products whose current price is at or below this amount, in the selected market's currency.\",\n      \"minimum\": 0,\n      \"maximum\": 100000\n    },\n    \"includeNewOnly\": {\n      \"title\": \"New products only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only include products Sephora flags as new.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeBestsellersOnly\": {\n      \"title\": \"Bestsellers only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only include products flagged as bestsellers in listing modes. Not available in product-URL mode.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"saleOnly\": {\n      \"title\": \"On sale only\",\n      \"type\": \"boolean\",\n      \"description\": \"Only include products currently discounted by Sephora.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"refinements\": {\n      \"title\": \"Advanced refinements\",\n      \"type\": \"array\",\n      \"description\": \"Optional Sephora facet values, e.g. `filters[skinType]=drySk` or `filters[ingredientPreferences]=crueltyFree`. Up to 20.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"includeDetails\": {\n      \"title\": \"Include product details\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch descriptions, ingredients, highlights, variants, stock, category path and brand information for every product in listing modes. Product-URL mode always includes details.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeImages\": {\n      \"title\": \"Include rehosted images\",\n      \"type\": \"boolean\",\n      \"description\": \"Copy product images into the run's key-value store so the image links stay publicly accessible.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxImagesPerProduct\": {\n      \"title\": \"Maximum images per product\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of product images to keep and rehost for each product.\",\n      \"minimum\": 1,\n      \"maximum\": 20,\n      \"default\": 3,\n      \"prefill\": 3\n    },\n    \"includeReviews\": {\n      \"title\": \"Include review samples\",\n      \"type\": \"boolean\",\n      \"description\": \"Add recent or most-helpful review samples to product records, and fetch review samples in reviews mode.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxReviewsPerProduct\": {\n      \"title\": \"Maximum reviews per product\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum review rows or samples per product.\",\n      \"minimum\": 1,\n      \"maximum\": 1000,\n      \"default\": 20,\n      \"prefill\": 20\n    },\n    \"reviewsSort\": {\n      \"title\": \"Review order\",\n      \"type\": \"string\",\n      \"description\": \"Ordering for review rows and review samples.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"mostHelpful\",\n        \"newest\",\n        \"oldest\",\n        \"highestRating\",\n        \"lowestRating\"\n      ],\n      \"enumTitles\": [\n        \"Most helpful\",\n        \"Newest first\",\n        \"Oldest first\",\n        \"Highest rating\",\n        \"Lowest rating\"\n      ],\n      \"default\": \"mostHelpful\",\n      \"prefill\": \"mostHelpful\"\n    },\n    \"includeReviewStats\": {\n      \"title\": \"Include review statistics\",\n      \"type\": \"boolean\",\n      \"description\": \"Add the rating histogram, recommendation counts, review dates and GTIN/UPC/EAN identifiers.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeQuestions\": {\n      \"title\": \"Include questions and answers\",\n      \"type\": \"boolean\",\n      \"description\": \"Add questions with their answers to product records, and fetch question rows in questions mode.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxQuestionsPerProduct\": {\n      \"title\": \"Maximum questions per product\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum question rows or embedded questions per product.\",\n      \"minimum\": 1,\n      \"maximum\": 200,\n      \"default\": 10,\n      \"prefill\": 10\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum records\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on all records emitted by the run.\",\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"default\": 50,\n      \"prefill\": 1\n    },\n    \"maxItemsPerQuery\": {\n      \"title\": \"Maximum records per source\",\n      \"type\": \"integer\",\n      \"description\": \"Cap records per keyword, category, brand or product URL. 0 means no per-source cap.\",\n      \"minimum\": 0,\n      \"maximum\": 10000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"onlyNewProducts\": {\n      \"title\": \"Only new products\",\n      \"type\": \"boolean\",\n      \"description\": \"Skip product IDs that were already returned under the same state key in earlier runs.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"stateKey\": {\n      \"title\": \"State key\",\n      \"type\": \"string\",\n      \"description\": \"Name for the saved product-ID state used by 'Only new products'.\",\n      \"editor\": \"textfield\",\n      \"default\": \"default\",\n      \"prefill\": \"default\"\n    },\n    \"resetState\": {\n      \"title\": \"Reset saved state\",\n      \"type\": \"boolean\",\n      \"description\": \"Forget previously seen product IDs for this state key before the run.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. Sephora's public catalog and review endpoints work without a proxy.\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": false\n      },\n      \"prefill\": {\n        \"useApifyProxy\": false\n      }\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Sephora Catalog Price & Rating Finder\n\nSephora's beauty catalog changes constantly: new launches, rotating sale prices, shade and size variants, and thousands of reviews arriving every week. This actor turns that catalog into structured records for price tracking, assortment analysis, ingredient research and review intelligence. Search by keyword, browse categories or brands, or paste product URLs, then optionally add full product details, variants, stock, images, review samples, rating histograms and Q&A. Works in the United States and Canada (English and French), with no login, cookie or proxy setup.\n\n## What this actor does\n\n- **Nine modes:** `search`, `category`, `brand`, `product`, `bestsellers`, `newArrivals`, `sale`, `reviews` and `questions`\n- **Three storefronts:** US (USD), Canada English (CAD) and Canada French (CAD), with French product text for Quebec\n- **Rich product detail:** descriptions, how-to-use, ingredients, highlights, brand copy, category path, variants/SKUs, stock, sale prices and full-size image links\n- **Review intelligence:** review text, ratings, titles, verified/incentivized/staff badges, helpful votes, photos, reviewer demographics, rating histograms and GTIN/UPC/EAN identifiers\n- **Q&A export:** questions with their answers, authors, dates, brand-answer and best-answer flags\n- **Server-side filters and six sort orders:** brand, category, rating, price, new, sale, advanced facet refinements, and relevance / best selling / top rated / price / newest ordering\n- **Empty fields are omitted** from each record instead of being returned as null\n\n## Output per product\n\n- `productId`, `brandName`, `brandId`, `displayName`, `productName`, `skuId` — product identity\n- `market`, `country`, `locale`, `currency` — storefront context\n- `rating`, `reviews`, `lovesCount` — rating and engagement\n- `price`, `priceMin`, `priceMax`, `priceText` — current price, or price range for multi-variant products\n- `listPrice`, `listPriceMin`, `listPriceMax`, `salePrice`, `salePriceMin`, `salePriceMax`, `savingsAmount`, `savingsPercent` — original and discounted pricing\n- `isNew`, `isBestseller`, `isSephoraExclusive`, `isLimitedEdition`, `isLimitedTimeOffer`, `isOnlineOnly`, `isOnSale`, `sponsored` — merchandising flags\n- `inStock`, `outOfStockSkus`, `isReturnable`, `maxPurchaseQuantity` — stock and purchase limits\n- `size`, `shade`, `variationType`, `variantsCount`, `variants[]` — size/shade matrix with per-variant price, sale price, stock, image and product URL\n- `description`, `shortDescription`, `howToUse`, `ingredients`, `highlights[]` — product content\n- `categoryPath[]`, `categoryId`, `categoryUrl`, `brandDescription`, `brandUrl`, `seoTitle`, `seoDescription` — taxonomy and brand context\n- `images[]` with `url` (rehosted when available) and `originalUrl`; `imageOriginal`, `altImage`, `altImageOriginal`, `imageAltText`\n- `reviewStats` with `ratingHistogram[]`, `averageRating`, `totalReviews`, recommendation counts, photo/video counts, review dates and vote totals\n- `reviewSamples[]` — review samples with demographics and badges\n- `questions[]`, `questionCount` — Q&A embedded in product rows\n- `gtins[]`, `upcs[]`, `eans[]` — product identifiers when available\n- `sourceType`, `searchTerm`, `rank`, `page`, `searchUrl`, `categorySlug`, `brandSlug`, `sourceUrl`, `canonicalUrl` — where the record came from\n- `pickupEligible`, `pickupNearbyEligible`, `sameDayEligible`, `nextDayEligible`, `shipToHomeEligible` — fulfillment flags\n- `productUrl`, `recordType`, `scrapedAt`\n\n## Output: per review (mode = `reviews`)\n\n`reviewId`, `productId`, `productName`, `brandName`, `productUrl`, `market`, `country`, `locale`, `currency`, `rating`, `title`, `text`, `author`, `submittedAt`, `isRecommended`, `isVerifiedPurchase`, `isIncentivized`, `isStaff`, `helpfulVotes`, `notHelpfulVotes`, `photos[]`, `contentLocale`, `reviewer` (`skinType`, `skinTone`, `eyeColor`, `hairColor`, `ageRange`, `skinConcerns`), `recordType`, `scrapedAt`.\n\n## Output: per question (mode = `questions`)\n\n`questionId`, `productId`, `productName`, `brandName`, `productUrl`, `question`, `author`, `submittedAt`, `answersCount`, `answers[]` (`text`, `author`, `submittedAt`, `isBrandAnswer`, `isBestAnswer`, `helpfulVotes`), `market`, `country`, `locale`, `currency`, `recordType`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search`, `category`, `brand`, `product`, `bestsellers`, `newArrivals`, `sale`, `reviews`, `questions` |\n| `searchQueries` | array | `[]` | Keywords for `search` (1–100) |\n| `categories` | array | `[]` | Category slugs, `cat...` IDs or URLs (`category`, browse modes; search filter) |\n| `brands` | array | `[]` | Brand names, slugs or URLs (`brand`; optional filter in listing modes) |\n| `productUrls` | array | `[]` | Product URLs or `P...` IDs (`product`, `reviews`, `questions`) |\n| `market` | string | `us` | `us`, `ca-en`, `ca-fr` |\n| `sortBy` | string | `relevance` | `relevance`, `bestSelling`, `topRated`, `priceLowToHigh`, `priceHighToLow`, `newArrivals` |\n| `minRating` | integer | – | Minimum average rating (1–5) |\n| `priceMin` / `priceMax` | integer | – | Current-price bounds in the selected market's currency |\n| `includeNewOnly` | boolean | `false` | Only products flagged new |\n| `includeBestsellersOnly` | boolean | `false` | Only products flagged as bestsellers in listing modes |\n| `saleOnly` | boolean | `false` | Only discounted products |\n| `refinements` | array | `[]` | Facet values such as `filters[skinType]=drySk` (maximum 20) |\n| `includeDetails` | boolean | `false` | Fetch full detail, variants and stock for listing results |\n| `includeImages` | boolean | `true` | Rehost product images for public access |\n| `maxImagesPerProduct` | integer | `3` | Image cap per product (1–20) |\n| `includeReviews` | boolean | `false` | Add review samples to product rows |\n| `maxReviewsPerProduct` | integer | `20` | Review cap per product (1–1000) |\n| `reviewsSort` | string | `mostHelpful` | `mostHelpful`, `newest`, `oldest`, `highestRating`, `lowestRating` |\n| `includeReviewStats` | boolean | `false` | Add histograms, dates, recommendation counts and identifiers |\n| `includeQuestions` | boolean | `false` | Add Q&A to product rows |\n| `maxQuestionsPerProduct` | integer | `10` | Question cap per product (1–200) |\n| `maxItems` | integer | `50` | Overall record cap (1–10000) |\n| `maxItemsPerQuery` | integer | `0` | Per-keyword/category/brand/URL cap; `0` means unlimited |\n| `onlyNewProducts` | boolean | `false` | Skip product IDs already seen under `stateKey` |\n| `stateKey` | string | `default` | Name of the saved product-ID state |\n| `resetState` | boolean | `false` | Clear saved product IDs before the run |\n| `proxyConfiguration` | object | off | Optional; the catalog and review data work without a proxy |\n\n### Example: US search with variants, reviews and stock\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"moisturizer\", \"serum\"],\n  \"market\": \"us\",\n  \"sortBy\": \"topRated\",\n  \"minRating\": 4,\n  \"priceMin\": 15,\n  \"priceMax\": 80,\n  \"includeDetails\": true,\n  \"includeReviewStats\": true,\n  \"maxItems\": 20\n}\n```\n\n### Example: Canada French product with a selected size\n\n```json\n{\n  \"mode\": \"product\",\n  \"productUrls\": [\n    \"https://www.sephora.com/ca/fr/product/the-ordinary-hyaluronic-acid-2-b5-hydrating-serum-P427419?skuId=2735140\"\n  ],\n  \"includeImages\": true,\n  \"includeReviews\": true,\n  \"maxReviewsPerProduct\": 5\n}\n```\n\n### Example: category browse with sale and rating filters\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"skincare\"],\n  \"market\": \"us\",\n  \"saleOnly\": true,\n  \"minRating\": 4,\n  \"sortBy\": \"priceLowToHigh\",\n  \"includeDetails\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: brand review and Q&A export\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"productUrls\": [\"P427419\", \"P511921\"],\n  \"reviewsSort\": \"newest\",\n  \"maxReviewsPerProduct\": 50,\n  \"maxItems\": 100\n}\n```\n\n```json\n{\n  \"mode\": \"questions\",\n  \"productUrls\": [\"P427419\"],\n  \"maxQuestionsPerProduct\": 25,\n  \"maxItems\": 25\n}\n```\n\n## Use cases\n\n- **Price and promotion tracking** — snapshot current and sale prices, discounts and stock for a watchlist\n- **Assortment analysis** — compare brand and category catalogs, shade ranges and size options\n- **Ingredient and INCI research** — export ingredients and highlights for formulation or clean-beauty screening\n- **Review intelligence** — analyze ratings, review text, photos and reviewer demographics by product or brand\n- **Launch monitoring** — use `newArrivals` with `onlyNewProducts` to capture only newly listed products\n- **Q&A and customer-care research** — collect questions with answers, including brand and best answers\n\n## FAQ\n\n**Is this affiliated with Sephora?**\nNo. This is an independent third-party actor that reads publicly accessible Sephora catalog and review data. It is not operated by or affiliated with Sephora.\n\n**Do I need an account, cookies or an API key?**\nNo. The actor uses public catalog and review data and works without login or credentials.\n\n**Do I need to configure a proxy?**\nNo. Direct requests work for the catalog and review endpoints. A proxy input is available only if you want to route traffic yourself.\n\n**Why are some products missing ingredients, highlights or size?**\nThose fields are product-specific. When Sephora does not publish them for a product, the field is omitted rather than filled with a placeholder.\n\n**Why do some products show a price range and others a single price?**\nMulti-size or multi-shade products can have different prices. `priceMin` and `priceMax` show the current range; `price` is the default variant's current price. `listPrice*` and `salePrice*` keep the original and discounted values separate.\n\n**Why are review demographics missing on some reviews?**\nReviewers choose whether to share skin type, tone, eye color, hair color, age range and concerns. Fields are included only when the reviewer provided them.\n\n**Why isn't mainland France supported?**\nThe US and Canada storefronts (English and French) are supported. Mainland France is not reachable reliably from the actor's network path, so it is not offered as a market.\n\n**Why aren't product videos included?**\nSephora's video media links are not publicly reachable without a browser session. Product images, descriptions, ingredients and variants are included instead.\n\n**Why does a product page show a different price than the dataset?**\nPrices and promotions change frequently, and the dataset reflects the moment of the run. Prices also differ by market and currency; use the `market` field to compare like with like.\n\n**How many records can I get?**\n`maxItems` caps the run at up to 10,000 records. Search returns up to 60 products per page, while category and brand browsing return up to 200 per page. Very large result sets are split across categories, brands and filters, and duplicates are removed by product, review or question ID.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "sephora-catalog-price-and-rating-finder",
      "title": "Sephora Catalog Price & Rating Finder",
      "description": "Search and browse Sephora by keyword, category, brand or product URL. Get prices, sale prices, variants, ingredients, stock, review samples, rating histograms, demographics and Q&A for the US and Canada.",
      "version": "1.0",
      "buildTag": "latest",
      "defaultRunOptions": {
        "memoryMbytes": 1024,
        "timeoutSecs": 3600
      },
      "dockerfile": "./Dockerfile",
      "readme": "# Sephora Catalog Price & Rating Finder\n\nSephora's beauty catalog changes constantly: new launches, rotating sale prices, shade and size variants, and thousands of reviews arriving every week. This actor turns that catalog into structured records for price tracking, assortment analysis, ingredient research and review intelligence. Search by keyword, browse categories or brands, or paste product URLs, then optionally add full product details, variants, stock, images, review samples, rating histograms and Q&A. Works in the United States and Canada (English and French), with no login, cookie or proxy setup.\n\n## What this actor does\n\n- **Nine modes:** `search`, `category`, `brand`, `product`, `bestsellers`, `newArrivals`, `sale`, `reviews` and `questions`\n- **Three storefronts:** US (USD), Canada English (CAD) and Canada French (CAD), with French product text for Quebec\n- **Rich product detail:** descriptions, how-to-use, ingredients, highlights, brand copy, category path, variants/SKUs, stock, sale prices and full-size image links\n- **Review intelligence:** review text, ratings, titles, verified/incentivized/staff badges, helpful votes, photos, reviewer demographics, rating histograms and GTIN/UPC/EAN identifiers\n- **Q&A export:** questions with their answers, authors, dates, brand-answer and best-answer flags\n- **Server-side filters and six sort orders:** brand, category, rating, price, new, sale, advanced facet refinements, and relevance / best selling / top rated / price / newest ordering\n- **Empty fields are omitted** from each record instead of being returned as null\n\n## Output per product\n\n- `productId`, `brandName`, `brandId`, `displayName`, `productName`, `skuId` — product identity\n- `market`, `country`, `locale`, `currency` — storefront context\n- `rating`, `reviews`, `lovesCount` — rating and engagement\n- `price`, `priceMin`, `priceMax`, `priceText` — current price, or price range for multi-variant products\n- `listPrice`, `listPriceMin`, `listPriceMax`, `salePrice`, `salePriceMin`, `salePriceMax`, `savingsAmount`, `savingsPercent` — original and discounted pricing\n- `isNew`, `isBestseller`, `isSephoraExclusive`, `isLimitedEdition`, `isLimitedTimeOffer`, `isOnlineOnly`, `isOnSale`, `sponsored` — merchandising flags\n- `inStock`, `outOfStockSkus`, `isReturnable`, `maxPurchaseQuantity` — stock and purchase limits\n- `size`, `shade`, `variationType`, `variantsCount`, `variants[]` — size/shade matrix with per-variant price, sale price, stock, image and product URL\n- `description`, `shortDescription`, `howToUse`, `ingredients`, `highlights[]` — product content\n- `categoryPath[]`, `categoryId`, `categoryUrl`, `brandDescription`, `brandUrl`, `seoTitle`, `seoDescription` — taxonomy and brand context\n- `images[]` with `url` (rehosted when available) and `originalUrl`; `imageOriginal`, `altImage`, `altImageOriginal`, `imageAltText`\n- `reviewStats` with `ratingHistogram[]`, `averageRating`, `totalReviews`, recommendation counts, photo/video counts, review dates and vote totals\n- `reviewSamples[]` — review samples with demographics and badges\n- `questions[]`, `questionCount` — Q&A embedded in product rows\n- `gtins[]`, `upcs[]`, `eans[]` — product identifiers when available\n- `sourceType`, `searchTerm`, `rank`, `page`, `searchUrl`, `categorySlug`, `brandSlug`, `sourceUrl`, `canonicalUrl` — where the record came from\n- `pickupEligible`, `pickupNearbyEligible`, `sameDayEligible`, `nextDayEligible`, `shipToHomeEligible` — fulfillment flags\n- `productUrl`, `recordType`, `scrapedAt`\n\n## Output: per review (mode = `reviews`)\n\n`reviewId`, `productId`, `productName`, `brandName`, `productUrl`, `market`, `country`, `locale`, `currency`, `rating`, `title`, `text`, `author`, `submittedAt`, `isRecommended`, `isVerifiedPurchase`, `isIncentivized`, `isStaff`, `helpfulVotes`, `notHelpfulVotes`, `photos[]`, `contentLocale`, `reviewer` (`skinType`, `skinTone`, `eyeColor`, `hairColor`, `ageRange`, `skinConcerns`), `recordType`, `scrapedAt`.\n\n## Output: per question (mode = `questions`)\n\n`questionId`, `productId`, `productName`, `brandName`, `productUrl`, `question`, `author`, `submittedAt`, `answersCount`, `answers[]` (`text`, `author`, `submittedAt`, `isBrandAnswer`, `isBestAnswer`, `helpfulVotes`), `market`, `country`, `locale`, `currency`, `recordType`, `scrapedAt`.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `search` | `search`, `category`, `brand`, `product`, `bestsellers`, `newArrivals`, `sale`, `reviews`, `questions` |\n| `searchQueries` | array | `[]` | Keywords for `search` (1–100) |\n| `categories` | array | `[]` | Category slugs, `cat...` IDs or URLs (`category`, browse modes; search filter) |\n| `brands` | array | `[]` | Brand names, slugs or URLs (`brand`; optional filter in listing modes) |\n| `productUrls` | array | `[]` | Product URLs or `P...` IDs (`product`, `reviews`, `questions`) |\n| `market` | string | `us` | `us`, `ca-en`, `ca-fr` |\n| `sortBy` | string | `relevance` | `relevance`, `bestSelling`, `topRated`, `priceLowToHigh`, `priceHighToLow`, `newArrivals` |\n| `minRating` | integer | – | Minimum average rating (1–5) |\n| `priceMin` / `priceMax` | integer | – | Current-price bounds in the selected market's currency |\n| `includeNewOnly` | boolean | `false` | Only products flagged new |\n| `includeBestsellersOnly` | boolean | `false` | Only products flagged as bestsellers in listing modes |\n| `saleOnly` | boolean | `false` | Only discounted products |\n| `refinements` | array | `[]` | Facet values such as `filters[skinType]=drySk` (maximum 20) |\n| `includeDetails` | boolean | `false` | Fetch full detail, variants and stock for listing results |\n| `includeImages` | boolean | `true` | Rehost product images for public access |\n| `maxImagesPerProduct` | integer | `3` | Image cap per product (1–20) |\n| `includeReviews` | boolean | `false` | Add review samples to product rows |\n| `maxReviewsPerProduct` | integer | `20` | Review cap per product (1–1000) |\n| `reviewsSort` | string | `mostHelpful` | `mostHelpful`, `newest`, `oldest`, `highestRating`, `lowestRating` |\n| `includeReviewStats` | boolean | `false` | Add histograms, dates, recommendation counts and identifiers |\n| `includeQuestions` | boolean | `false` | Add Q&A to product rows |\n| `maxQuestionsPerProduct` | integer | `10` | Question cap per product (1–200) |\n| `maxItems` | integer | `50` | Overall record cap (1–10000) |\n| `maxItemsPerQuery` | integer | `0` | Per-keyword/category/brand/URL cap; `0` means unlimited |\n| `onlyNewProducts` | boolean | `false` | Skip product IDs already seen under `stateKey` |\n| `stateKey` | string | `default` | Name of the saved product-ID state |\n| `resetState` | boolean | `false` | Clear saved product IDs before the run |\n| `proxyConfiguration` | object | off | Optional; the catalog and review data work without a proxy |\n\n### Example: US search with variants, reviews and stock\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"moisturizer\", \"serum\"],\n  \"market\": \"us\",\n  \"sortBy\": \"topRated\",\n  \"minRating\": 4,\n  \"priceMin\": 15,\n  \"priceMax\": 80,\n  \"includeDetails\": true,\n  \"includeReviewStats\": true,\n  \"maxItems\": 20\n}\n```\n\n### Example: Canada French product with a selected size\n\n```json\n{\n  \"mode\": \"product\",\n  \"productUrls\": [\n    \"https://www.sephora.com/ca/fr/product/the-ordinary-hyaluronic-acid-2-b5-hydrating-serum-P427419?skuId=2735140\"\n  ],\n  \"includeImages\": true,\n  \"includeReviews\": true,\n  \"maxReviewsPerProduct\": 5\n}\n```\n\n### Example: category browse with sale and rating filters\n\n```json\n{\n  \"mode\": \"category\",\n  \"categories\": [\"skincare\"],\n  \"market\": \"us\",\n  \"saleOnly\": true,\n  \"minRating\": 4,\n  \"sortBy\": \"priceLowToHigh\",\n  \"includeDetails\": true,\n  \"maxItems\": 100\n}\n```\n\n### Example: brand review and Q&A export\n\n```json\n{\n  \"mode\": \"reviews\",\n  \"productUrls\": [\"P427419\", \"P511921\"],\n  \"reviewsSort\": \"newest\",\n  \"maxReviewsPerProduct\": 50,\n  \"maxItems\": 100\n}\n```\n\n```json\n{\n  \"mode\": \"questions\",\n  \"productUrls\": [\"P427419\"],\n  \"maxQuestionsPerProduct\": 25,\n  \"maxItems\": 25\n}\n```\n\n## Use cases\n\n- **Price and promotion tracking** — snapshot current and sale prices, discounts and stock for a watchlist\n- **Assortment analysis** — compare brand and category catalogs, shade ranges and size options\n- **Ingredient and INCI research** — export ingredients and highlights for formulation or clean-beauty screening\n- **Review intelligence** — analyze ratings, review text, photos and reviewer demographics by product or brand\n- **Launch monitoring** — use `newArrivals` with `onlyNewProducts` to capture only newly listed products\n- **Q&A and customer-care research** — collect questions with answers, including brand and best answers\n\n## FAQ\n\n**Is this affiliated with Sephora?**\nNo. This is an independent third-party actor that reads publicly accessible Sephora catalog and review data. It is not operated by or affiliated with Sephora.\n\n**Do I need an account, cookies or an API key?**\nNo. The actor uses public catalog and review data and works without login or credentials.\n\n**Do I need to configure a proxy?**\nNo. Direct requests work for the catalog and review endpoints. A proxy input is available only if you want to route traffic yourself.\n\n**Why are some products missing ingredients, highlights or size?**\nThose fields are product-specific. When Sephora does not publish them for a product, the field is omitted rather than filled with a placeholder.\n\n**Why do some products show a price range and others a single price?**\nMulti-size or multi-shade products can have different prices. `priceMin` and `priceMax` show the current range; `price` is the default variant's current price. `listPrice*` and `salePrice*` keep the original and discounted values separate.\n\n**Why are review demographics missing on some reviews?**\nReviewers choose whether to share skin type, tone, eye color, hair color, age range and concerns. Fields are included only when the reviewer provided them.\n\n**Why isn't mainland France supported?**\nThe US and Canada storefronts (English and French) are supported. Mainland France is not reachable reliably from the actor's network path, so it is not offered as a market.\n\n**Why aren't product videos included?**\nSephora's video media links are not publicly reachable without a browser session. Product images, descriptions, ingredients and variants are included instead.\n\n**Why does a product page show a different price than the dataset?**\nPrices and promotions change frequently, and the dataset reflects the moment of the run. Prices also differ by market and currency; use the `market` field to compare like with like.\n\n**How many records can I get?**\n`maxItems` caps the run at up to 10,000 records. Search returns up to 60 products per page, while category and brand browsing return up to 200 per page. Very large result sets are split across categories, brands and filters, and duplicates are removed by product, review or question ID.\n",
      "input": {
        "title": "Sephora Catalog Price & Rating Finder Input",
        "description": "Search or browse Sephora products, fetch product URLs, exports reviews or questions. Choose a mode, then set keywords, categories, brands, market, filters and optional detail enrichment.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch: keyword search, category or brand browse, product URLs, bestsellers, new arrivals, sale, reviews or questions.",
            "editor": "select",
            "enum": [
              "search",
              "category",
              "brand",
              "product",
              "bestsellers",
              "newArrivals",
              "sale",
              "reviews",
              "questions"
            ],
            "enumTitles": [
              "Search products by keyword",
              "Browse categories",
              "Browse brands",
              "Fetch product URLs or IDs",
              "Bestsellers by category",
              "New arrivals by category",
              "Products on sale",
              "Reviews for product URLs",
              "Questions and answers for product URLs"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keywords to search (mode=search). Enter one or more terms, e.g. `moisturizer`, `vitamin c serum`.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "moisturizer"
            ]
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Category slugs, `cat...` IDs or Sephora category URLs (mode=category, bestsellers, newArrivals, sale; also a filter in search). Empty browse modes use the six top-level categories.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "brands": {
            "title": "Brands",
            "type": "array",
            "description": "Brand names, slugs or Sephora brand URLs (mode=brand; also an optional filter in other listing modes). Example: `Rare Beauty` or `/brand/rare-beauty-by-selena-gomez`.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "productUrls": {
            "title": "Product URLs or IDs",
            "type": "array",
            "description": "Sephora product URLs or `P...` IDs (mode=product, reviews, questions). A `?skuId=` in the URL selects that variant.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "market": {
            "title": "Market",
            "type": "string",
            "description": "Storefront and currency: United States (USD), Canada English (CAD) or Canada French (CAD).",
            "editor": "select",
            "enum": [
              "us",
              "ca-en",
              "ca-fr"
            ],
            "enumTitles": [
              "United States (USD)",
              "Canada - English (CAD)",
              "Canada - French (CAD)"
            ],
            "default": "us",
            "prefill": "us"
          },
          "sortBy": {
            "title": "Sort order",
            "type": "string",
            "description": "Result ordering for listing modes. Bestsellers and sale default to best selling; new arrivals default to newest.",
            "editor": "select",
            "enum": [
              "relevance",
              "bestSelling",
              "topRated",
              "priceLowToHigh",
              "priceHighToLow",
              "newArrivals"
            ],
            "enumTitles": [
              "Relevance",
              "Best selling",
              "Top rated",
              "Price: low to high",
              "Price: high to low",
              "Newest first"
            ],
            "default": "relevance",
            "prefill": "relevance"
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "integer",
            "description": "Only include products rated at or above this value (1-5).",
            "minimum": 1,
            "maximum": 5
          },
          "priceMin": {
            "title": "Minimum price",
            "type": "integer",
            "description": "Only include products whose current price is at or above this amount, in the selected market's currency.",
            "minimum": 0,
            "maximum": 100000
          },
          "priceMax": {
            "title": "Maximum price",
            "type": "integer",
            "description": "Only include products whose current price is at or below this amount, in the selected market's currency.",
            "minimum": 0,
            "maximum": 100000
          },
          "includeNewOnly": {
            "title": "New products only",
            "type": "boolean",
            "description": "Only include products Sephora flags as new.",
            "default": false,
            "prefill": false
          },
          "includeBestsellersOnly": {
            "title": "Bestsellers only",
            "type": "boolean",
            "description": "Only include products flagged as bestsellers in listing modes. Not available in product-URL mode.",
            "default": false,
            "prefill": false
          },
          "saleOnly": {
            "title": "On sale only",
            "type": "boolean",
            "description": "Only include products currently discounted by Sephora.",
            "default": false,
            "prefill": false
          },
          "refinements": {
            "title": "Advanced refinements",
            "type": "array",
            "description": "Optional Sephora facet values, e.g. `filters[skinType]=drySk` or `filters[ingredientPreferences]=crueltyFree`. Up to 20.",
            "editor": "stringList",
            "default": [],
            "prefill": []
          },
          "includeDetails": {
            "title": "Include product details",
            "type": "boolean",
            "description": "Fetch descriptions, ingredients, highlights, variants, stock, category path and brand information for every product in listing modes. Product-URL mode always includes details.",
            "default": false,
            "prefill": false
          },
          "includeImages": {
            "title": "Include rehosted images",
            "type": "boolean",
            "description": "Copy product images into the run's key-value store so the image links stay publicly accessible.",
            "default": true,
            "prefill": false
          },
          "maxImagesPerProduct": {
            "title": "Maximum images per product",
            "type": "integer",
            "description": "Maximum number of product images to keep and rehost for each product.",
            "minimum": 1,
            "maximum": 20,
            "default": 3,
            "prefill": 3
          },
          "includeReviews": {
            "title": "Include review samples",
            "type": "boolean",
            "description": "Add recent or most-helpful review samples to product records, and fetch review samples in reviews mode.",
            "default": false,
            "prefill": false
          },
          "maxReviewsPerProduct": {
            "title": "Maximum reviews per product",
            "type": "integer",
            "description": "Maximum review rows or samples per product.",
            "minimum": 1,
            "maximum": 1000,
            "default": 20,
            "prefill": 20
          },
          "reviewsSort": {
            "title": "Review order",
            "type": "string",
            "description": "Ordering for review rows and review samples.",
            "editor": "select",
            "enum": [
              "mostHelpful",
              "newest",
              "oldest",
              "highestRating",
              "lowestRating"
            ],
            "enumTitles": [
              "Most helpful",
              "Newest first",
              "Oldest first",
              "Highest rating",
              "Lowest rating"
            ],
            "default": "mostHelpful",
            "prefill": "mostHelpful"
          },
          "includeReviewStats": {
            "title": "Include review statistics",
            "type": "boolean",
            "description": "Add the rating histogram, recommendation counts, review dates and GTIN/UPC/EAN identifiers.",
            "default": false,
            "prefill": false
          },
          "includeQuestions": {
            "title": "Include questions and answers",
            "type": "boolean",
            "description": "Add questions with their answers to product records, and fetch question rows in questions mode.",
            "default": false,
            "prefill": false
          },
          "maxQuestionsPerProduct": {
            "title": "Maximum questions per product",
            "type": "integer",
            "description": "Maximum question rows or embedded questions per product.",
            "minimum": 1,
            "maximum": 200,
            "default": 10,
            "prefill": 10
          },
          "maxItems": {
            "title": "Maximum records",
            "type": "integer",
            "description": "Hard cap on all records emitted by the run.",
            "minimum": 1,
            "maximum": 10000,
            "default": 50,
            "prefill": 1
          },
          "maxItemsPerQuery": {
            "title": "Maximum records per source",
            "type": "integer",
            "description": "Cap records per keyword, category, brand or product URL. 0 means no per-source cap.",
            "minimum": 0,
            "maximum": 10000,
            "default": 0,
            "prefill": 0
          },
          "onlyNewProducts": {
            "title": "Only new products",
            "type": "boolean",
            "description": "Skip product IDs that were already returned under the same state key in earlier runs.",
            "default": false,
            "prefill": false
          },
          "stateKey": {
            "title": "State key",
            "type": "string",
            "description": "Name for the saved product-ID state used by 'Only new products'.",
            "editor": "textfield",
            "default": "default",
            "prefill": "default"
          },
          "resetState": {
            "title": "Reset saved state",
            "type": "boolean",
            "description": "Forget previously seen product IDs for this state key before the run.",
            "default": false,
            "prefill": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Sephora's public catalog and review endpoints work without a proxy.",
            "editor": "proxy",
            "default": {
              "useApifyProxy": false
            },
            "prefill": {
              "useApifyProxy": false
            }
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Sephora Catalog Price & Rating Finder Output",
        "description": "Sephora product, review and question records with prices, variants, ingredients, stock, ratings, review statistics and Q&A across US, Canada English and Canada French.",
        "properties": {
          "products": {
            "type": "string",
            "title": "Sephora records",
            "description": "Dataset containing Sephora products, reviews and questions, distinguished by recordType.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "products": {
              "title": "Products",
              "transformation": {
                "fields": [
                  "productId",
                  "brandName",
                  "displayName",
                  "rating",
                  "reviews",
                  "price",
                  "priceMin",
                  "priceMax",
                  "salePrice",
                  "inStock",
                  "variantsCount",
                  "market",
                  "productUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "productId": {
                    "label": "Product ID",
                    "format": "text"
                  },
                  "brandName": {
                    "label": "Brand",
                    "format": "text"
                  },
                  "displayName": {
                    "label": "Product",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviews": {
                    "label": "Reviews",
                    "format": "number"
                  },
                  "price": {
                    "label": "Price",
                    "format": "number"
                  },
                  "priceMin": {
                    "label": "Price min",
                    "format": "number"
                  },
                  "priceMax": {
                    "label": "Price max",
                    "format": "number"
                  },
                  "salePrice": {
                    "label": "Sale price",
                    "format": "number"
                  },
                  "inStock": {
                    "label": "In stock",
                    "format": "boolean"
                  },
                  "variantsCount": {
                    "label": "Variants",
                    "format": "number"
                  },
                  "market": {
                    "label": "Market",
                    "format": "text"
                  },
                  "productUrl": {
                    "label": "Product URL",
                    "format": "link"
                  }
                }
              }
            },
            "reviews": {
              "title": "Reviews",
              "transformation": {
                "fields": [
                  "recordType",
                  "reviewId",
                  "productName",
                  "brandName",
                  "rating",
                  "title",
                  "author",
                  "submittedAt",
                  "isVerifiedPurchase",
                  "helpfulVotes",
                  "market"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "reviewId": {
                    "label": "Review ID",
                    "format": "text"
                  },
                  "productName": {
                    "label": "Product",
                    "format": "text"
                  },
                  "brandName": {
                    "label": "Brand",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "author": {
                    "label": "Author",
                    "format": "text"
                  },
                  "submittedAt": {
                    "label": "Submitted",
                    "format": "text"
                  },
                  "isVerifiedPurchase": {
                    "label": "Verified",
                    "format": "boolean"
                  },
                  "helpfulVotes": {
                    "label": "Helpful",
                    "format": "number"
                  },
                  "market": {
                    "label": "Market",
                    "format": "text"
                  }
                }
              }
            },
            "questions": {
              "title": "Questions",
              "transformation": {
                "fields": [
                  "recordType",
                  "questionId",
                  "productName",
                  "brandName",
                  "question",
                  "author",
                  "submittedAt",
                  "answersCount",
                  "market"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "recordType": {
                    "label": "Type",
                    "format": "text"
                  },
                  "questionId": {
                    "label": "Question ID",
                    "format": "text"
                  },
                  "productName": {
                    "label": "Product",
                    "format": "text"
                  },
                  "brandName": {
                    "label": "Brand",
                    "format": "text"
                  },
                  "question": {
                    "label": "Question",
                    "format": "text"
                  },
                  "author": {
                    "label": "Author",
                    "format": "text"
                  },
                  "submittedAt": {
                    "label": "Submitted",
                    "format": "text"
                  },
                  "answersCount": {
                    "label": "Answers",
                    "format": "number"
                  },
                  "market": {
                    "label": "Market",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "176b504e841fe1ffbe241f673747db3dfa736bcc3001bc2946d9717c428a7fb8",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.004941111111111111
    }
  }
}