The Ordinary APItheordinary.com ↗
Access The Ordinary's full product catalog via API. Retrieve product details, INCI ingredient lists, category filters, keyword search, and customer reviews.
What is the The Ordinary API?
The Ordinary API covers 7 endpoints for querying The Ordinary's skincare catalog, returning product names, prices, full INCI ingredient lists, inventory status, and customer reviews. The get_product_ingredients endpoint isolates the complete INCI formula and key actives for any product by ID, while get_products_filtered lets you narrow results by concern, active ingredient, format, or regimen step — useful for building ingredient-aware skincare tools.
curl -X GET 'https://api.parse.bot/scraper/40173335-04fa-432e-90d9-cdea5deb7cd7/get_all_products?sort=top-sellers&limit=5&start=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace theordinary-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.the_ordinary_api import TheOrdinary, Category, Sort
client = TheOrdinary()
# Browse bestselling products
for product in client.products.by_category(category=Category.BESTSELLERS, limit=5):
print(product.name, product.price, product.currency)
# Search for vitamin C products
for product in client.products.search(query="vitamin c", limit=3):
print(product.name, product.c_product_type, product.short_description)
# Get full product details and check ingredients
details = client.products.get(product_id="rdn-niacinamide-10pct-zinc-1pct-30ml")
print(details.name, details.price, details.brand)
ingredients_info = details.ingredients()
print(ingredients_info.product_name, ingredients_info.key_ingredients)
# Filter products by type with sorting
for product in client.products.filtered(filters={"product_type": "Serums"}, sort=Sort.NEW_ARRIVALS, limit=4):
print(product.name, product.price)
# Read customer reviews via sub-resource
product = client.products.get(product_id="rdn-niacinamide-10pct-zinc-1pct-30ml")
for review in product.reviews.list(limit=5):
print(review.title, review.rating, review.user_nickname)
Retrieve all products from The Ordinary's main listing. Returns a single page of results with full product details including name, price, currency, ingredients, images, and inventory. Use the start and limit parameters to manually control pagination offset.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort rule. Accepted values: top-sellers, new-arrivals. |
| limit | integer | Number of products to return per page. |
| start | integer | Pagination offset (0-based index of first result). |
{
"type": "object",
"fields": {
"sz": "integer page size used",
"start": "integer pagination offset used",
"products": "array of product detail objects with name, price, currency, ingredients, images, inventory",
"total_on_page": "integer count of products returned"
},
"sample": {
"data": {
"sz": 3,
"start": 0,
"products": [
{
"id": "769915234053",
"name": "Glycolic Acid 7% Exfoliating Toner",
"brand": "The Ordinary",
"price": 9,
"master": {
"master_id": "100418"
},
"currency": "USD",
"inventory": {
"orderable": true,
"stock_level": 17169
},
"c_ingredients": "Aqua (Water), Glycolic Acid...",
"c_productType": "Toners",
"c_keyIngredients": "Glycolic Acid, Aloe Barbadensis Leaf Water",
"short_description": "A daily glycolic acid toner."
}
],
"total_on_page": 3
},
"status": "success"
}
}About the The Ordinary API
Product Catalog and Search
The get_all_products endpoint returns paginated product objects with fields including name, price, currency, c_ingredients, c_keyIngredients, inventory, and image data. You can sort by top-sellers or new-arrivals and control pagination with limit and start. The get_products_by_category endpoint accepts a category parameter with values like skincare, body+hair, sets-collections, bestsellers, and new-featured, returning the same full product detail shape. For keyword-based lookup, search_products accepts a query string — for example 'niacinamide' or 'vitamin c' — and returns matching products with all detail fields.
Filtering and Product Detail
get_products_filtered is a POST endpoint that accepts a filters object supporting keys: product_type, concern, active_ingredient, format, regimen_step, and prefer. This allows precise catalog queries such as finding all serums targeting hyperpigmentation that contain a specific active. The get_product_details endpoint accepts either a slug-style product_id (e.g. rdn-niacinamide-10pct-zinc-1pct-30ml) or a numeric UPC, returning the full record including short_description, brand, inventory availability object, and the complete ingredients fields.
Ingredients and Reviews
get_product_ingredients returns the ingredients (full INCI string) and key_ingredients for a product in a lightweight response, without the overhead of the full detail object — useful when you only need formula data at scale. For social proof data, get_product_reviews retrieves customer reviews from Bazaarvoice using a numeric master product ID found in the master.master_id field of product responses. The reviews response includes a Results array of review objects, a TotalResults count, and an Includes object with product and author metadata. Pagination is controlled via limit and offset.
The The Ordinary API is a managed, monitored endpoint for theordinary.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when theordinary.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official theordinary.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build an ingredient comparison tool using
c_ingredientsandc_keyIngredientsfields across multiple products. - Filter The Ordinary's catalog by active ingredient or skin concern for a personalized routine recommender.
- Monitor inventory availability across the product catalog using the
inventoryfield in product detail responses. - Aggregate customer review sentiment using
TotalResultsand review text fromget_product_reviews. - Populate a skincare database with full INCI lists via
get_product_ingredientsfor allergen or formulation research. - Track price changes over time by polling
get_all_productssorted bynew-arrivalsortop-sellers. - Search by keyword (e.g.
'retinol') and extract format and regimen step attributes for product categorization.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does The Ordinary have an official developer API?+
What product ID format does `get_product_reviews` require, and where do I find it?+
get_product_reviews requires a numeric master product ID (e.g. 100436 for Niacinamide 10% + Zinc 1%). This ID is found in the master.master_id field returned by get_product_details or any of the listing endpoints. It is distinct from the slug-style ID used by other endpoints.Can I filter products by multiple concerns or ingredients at the same time?+
get_products_filtered endpoint accepts a filters object with keys including concern, active_ingredient, product_type, format, regimen_step, and prefer. Whether multiple keys can be combined in one request depends on the filter implementation — testing with a filters object containing more than one key is the reliable way to confirm multi-filter behavior for a given combination.Does the API cover The Ordinary products sold on third-party retailers like Sephora or ASOS?+
Are bundle or set products returned separately from individual items?+
get_products_by_category endpoint accepts sets-collections as a valid category value, which returns sets as a distinct group. Individual product endpoints like get_product_details can be called on set product IDs if you have them. Variant-level breakdown within a set (e.g. individual items inside a kit) is not exposed as a separate endpoint. You can fork the API on Parse and revise it to add a dedicated set-contents endpoint if that granularity is needed.