Sephora
Sephora price (with the sale price of the sku you ask for), regular price, size, shade and online stock per sku, and every sku of a product. Rating from Sephora. Search with ratings too.
Sephora price (with the sale price of the sku you ask for), regular price, size, shade and online stock per sku, and every sku of a product. Rating from Sephora. Search with ratings too.
At a glance
Property | Value |
|---|---|
|
|
Item id | The product id ( |
Marketplaces | Live: |
Tier |
|
Ids per call | 50. Not a bulk lookup: Sephora answers one product per request, so each id is its own request, a few at a time. |
Typical call | 15–40 s for 50 ids |
Search |
|
Price is for one sku
A Sephora product has several skus (shades, sizes), and they can differ in price. price is the price of one sku: the one in your id, or Sephora's default sku when you send a bare product id (sephora.skuId says which). Send the sku when you care about a specific shade or size. Search returns ids with the sku already attached.
A sale is known only for the sku you ask for
Sephora reports a sale price only for the sku a call asks about. When that sku is on sale, price is the sale price and sephora.listPrice is its regular price; when it is not, sephora.listPrice is null. The other skus of the product are listed in sephora.skus with their regular price only: a sku without a sale price there may still be on sale. Ask for that sku (P467208:<sku>) to find out. Scrapely never reports a sale it did not read.
Stock is the online flag, per sku
availability.inStock is Sephora's out-of-stock flag for that sku, online (false is out of stock). Each sku in sephora.skus has its own inStock. Store stock, pickup and same-day delivery are not reported, and nothing says how many are left.
Ratings are Sephora's own
sephora.rating and sephora.reviewCount come from Sephora, not a reviews provider. A lookup by bare product id carries them (null when the product has no reviews yet). A lookup with a sku is cheaper and has none, so they are null there: take them from search, which has them for every result.
Example
- cURL
- Python
- Node.js
curl -X POST "https://api.scrapelyserp.com/v1/products" \
-H "Authorization: Bearer $SCRAPELY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"sephora","ids":["P467208:2417145","P479863"]}'import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCRAPELY_API_KEY']}"}
r = requests.post(
"https://api.scrapelyserp.com/v1/products",
headers=HEADERS,
json={"platform": "sephora", "ids": ["P467208:2417145", "P479863"]},
timeout=30,
)
r.raise_for_status()
data = r.json()
for p in data["results"]:
print(p["id"], p["status"], (p.get("price") or {}).get("amount"), (p.get("availability") or {}).get("inStock"))const res = await fetch('https://api.scrapelyserp.com/v1/products', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SCRAPELY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ platform: 'sephora', ids: ['P467208:2417145', 'P479863'] }),
signal: AbortSignal.timeout(30_000),
});
if (!res.ok) throw new Error((await res.json()).error.code);
const data = await res.json();
for (const p of data.results) console.log(p.id, p.status, p.price?.amount, p.availability?.inStock);Full reference → POST /v1/products
Sephora fields
Besides the common fields, each result carries a sephora object.
Field | Description |
|---|---|
| The price of the sku |
|
|
| The sku |
| The regular price of that sku, only when it is on sale. |
| The sku's size, what varies on the product ( |
|
|
| Sephora's own, by bare product id only; |
| Every sku of the product, the one asked for included: |
| The sku's image. |
| The product page, opened on that sku. Sephora's product pages refuse plain scripted fetches, so open them in a browser. |
Not given | Store stock, pickup and same-day, units left, descriptions and ingredients. |
Search lists one result per product, in the sku Sephora shows, and its id carries that sku. To read other shades or sizes, send their skus (take them from sephora.skus).
Statuses on Sephora
partial: Sephora answered without a title. Ask again later.not_found: Sephora has no such product, or no such sku on that product. A sku from another product isnot_found.unavailable: no usable answer after retries. Not charged; ask again.