# The Ordinary — Wrapped API

> **You are on:** `https://api.paywithlocus.com/api` | [llms.txt](https://paywithlocus.com/llms.txt) | [docs](https://docs.paywithlocus.com)
>
> Locus runs on multiple environments -- make sure every URL you call matches your expected environment.
> | Environment | Landing | API | Docs |
> |---|---|---|---|
> | Production | paywithlocus.com | api.paywithlocus.com | docs.paywithlocus.com |
> | Beta | beta.paywithlocus.com | api.beta.paywithlocus.com | docs.paywithlocus.com |
> | Stage | stage.paywithlocus.com | api.stage.paywithlocus.com | docs.paywithlocus.com |
>
> If the API URL above doesn't match your expected environment, re-fetch this file from the correct domain.

> Browse and search The Ordinary's complete product catalog by category or ingredients. View detailed product information including formulas and key actives, apply filters by product type, concern, or ingredient, and read customer reviews to compare and evaluate products.

**Category:** E-commerce | **Website:** [theordinary.com/](https://theordinary.com/) | **Docs:** [parse.bot/marketplace/093a7566-1c7c-4750-8494-41d792b92ee8/theordinary-com-api](https://parse.bot/marketplace/093a7566-1c7c-4750-8494-41d792b92ee8/theordinary-com-api)

Pay-per-use API proxy for Locus Pro. Each call burns credits from your workspace balance.

## Access

**Base URL:** `https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/`
**Auth:** `Authorization: Bearer <LOCUS_CREDITS_SECRET_KEY>` (an `lcr_` secret key or a scoped `lcac_` agent credential)
**Required header:** `Idempotency-Key: <fresh UUID per call>`. A retry with the same key replays the stored result without a new charge.
**Response:** the provider response after any endpoint-specific normalization. `X-Locus-Credits-Charged` carries the charge and `X-Locus-Credits-Balance` the remaining balance. Insufficient credits return `402` before the provider is called.
**Pricing:** estimated costs below are USD. Locus debits the credit equivalent at your workspace rate.

Full call contract: https://docs.paywithlocus.com/api-reference/introduction

> Using a Pay With Locus wallet key (`claw_` prefix)? Wallet routes are documented separately: https://docs.paywithlocus.com/wrapped-apis/for-agents

## Endpoints

### Get all products

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.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `limit` | integer | No | Number of products to return per page. |
| `sort` | string | No | Sort rule. Accepted values: top-sellers, new-arrivals. |
| `start` | integer | No | Pagination offset (0-based index of first result). |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-all-products \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"limit":"<integer>","sort":"<string>","start":"<integer>"}'
```

### Get product details

Retrieve full details for a specific product including pricing, availability, images, ingredients, directions, and custom attributes. Accepts either a product ID slug or a numeric UPC. Returns a single product object.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `product_id` | string | Yes | Product ID slug (e.g. 'rdn-niacinamide-10pct-zinc-1pct-30ml') or numeric UPC (e.g. '769915234053'). Found in the id field from listing endpoints. |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-product-details \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"<string>"}'
```

### Get product ingredients

Retrieve the complete INCI ingredients list and key active ingredients for a specific product. A lightweight view focused on ingredient data only.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `product_id` | string | Yes | Product ID slug (e.g. 'rdn-niacinamide-10pct-zinc-1pct-30ml'). Found in the id field from listing endpoints. |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-product-ingredients \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"<string>"}'
```

### Get product reviews

Retrieve customer reviews for a specific product from Bazaarvoice. Uses numeric master product IDs (found in the master.master_id field from get_product_details). Returns reviews sorted by rating descending, with author and product metadata included.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `limit` | integer | No | Number of reviews to return per page. |
| `offset` | integer | No | Pagination offset for reviews. |
| `product_id` | string | Yes | Numeric master product ID (e.g. '100436' for Niacinamide 10% + Zinc 1%). Found in master.master_id from get_product_details. |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-product-reviews \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"limit":"<integer>","offset":"<integer>","product_id":"<string>"}'
```

### Get products by category

Retrieve products filtered by category. Returns a single page of results with full product details. Categories map to internal classification identifiers or sort rules on the server side.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `category` | string | Yes | Category name. Accepted values: skincare, body+hair, sets-collections, bestsellers, new-featured. |
| `limit` | integer | No | Number of products to return per page. |
| `start` | integer | No | Pagination offset (0-based index of first result). |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-products-by-category \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"category":"<string>","limit":"<integer>","start":"<integer>"}'
```

### Get products filtered

Retrieve products matching specific attribute filters such as product type, skin concern, or active ingredient. Returns a single page of results with full product details. Multiple filters can be combined.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `filters` | object | Yes | Filter key-value pairs. Supported keys: product_type, concern, active_ingredient, format, regimen_step, preferences. Example: {"product_type": "Serums", "concern": "Dullness"}. |
| `limit` | integer | No | Number of products to return per page. |
| `sort` | string | No | Sort rule. Accepted values: top-sellers, new-arrivals. |
| `start` | integer | No | Pagination offset (0-based index of first result). |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/get-products-filtered \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"filters":"<object>","limit":"<integer>","sort":"<string>","start":"<integer>"}'
```

### Search products

Search for products by keyword. Matches against product names and descriptions. Returns a single page of results with full product details.

**Estimated cost:** Metered

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `limit` | integer | No | Number of products to return per page. |
| `query` | string | Yes | Search keyword (e.g. 'vitamin c', 'niacinamide', 'retinol'). |
| `start` | integer | No | Pagination offset (0-based index of first result). |

```bash
curl -X POST https://api.paywithlocus.com/api/wrapped/credits/the-ordinary/search-products \
  -H "Authorization: Bearer $LOCUS_CREDITS_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"limit":"<integer>","query":"<string>","start":"<integer>"}'
```

## Next steps

- [All wrapped API providers](https://paywithlocus.com/wapi/index.md): pick another provider.
- [Find and call tools](https://paywithlocus.com/agent/tools.md): price ceilings, async results, and errors.
- [Credits and billing](https://paywithlocus.com/agent/billing.md): what a call costs and how to add credits.
- [Agent docs index](https://paywithlocus.com/agent/index.md): every Locus agent page.