Dr Nutrition APIdrnutrition.com ↗
Search and filter the drnutrition.com product catalogue by keyword, brand, category, goal, price, and more. Returns product details and filter facets with counts.
What is the Dr Nutrition API?
The Dr Nutrition API gives programmatic access to the drnutrition.com supplement catalogue through a single search_products endpoint that returns up to 20+ product fields per variant alongside 11 filter facet groups. You can query by free-text keyword, brand, fitness goal, dietary preference, gender, price band, discount band, availability, and product type, with full pagination support and per-option counts on every facet.
curl -X GET 'https://api.parse.bot/scraper/ef9fa421-1760-452d-99bb-4f070d039467/search_products?categories=Whey+Protein+Isolate' \ -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 drnutrition-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.
"""Walkthrough: Dr Nutrition SDK — search products, read filters, paginate."""
from parse_apis.drnutrition_com_api import DrNutrition, SortOrder, ParseError
client = DrNutrition()
# Fetch the full catalog page to discover available filter facets.
catalog = client.catalogs.search(query="whey protein", region="om")
print(f"Total results: {catalog.total} across {catalog.total_pages} pages")
for f in catalog.filters:
opts = ", ".join(o.label for o in f.options[:3])
print(f" Filter '{f.title}': {opts}")
# Use a discovered brand filter value to narrow a paginated product search.
brand_value = catalog.filters[0].options[0].value if catalog.filters else None
for product in client.products.search(
query="whey protein",
brands=brand_value,
sort=SortOrder.PRICE_ASC,
region="om",
limit=5,
):
print(
f"{product.title} {product.currency} {product.selling_price}"
f" (was {product.price}, -{product.discount_percent}%)"
)
print(f" rating={product.rating} in_stock={product.in_stock} labels={product.product_labels}")
# Drill into the cheapest hit for full field access.
try:
cheapest = client.products.search(sort=SortOrder.PRICE_ASC, region="om", limit=1).first()
except ParseError as e:
print(f"Upstream parse failure ({e.code}): {e}")
cheapest = None
if cheapest is not None:
print(f"\nCheapest: {cheapest.title}")
print(f" SKU {cheapest.sku} weight {cheapest.weight}")
print(f" {cheapest.category_one_name} > {cheapest.category_two_name}")
print(f" {cheapest.url}")
print("exercised: catalogs.search / products.search / filters / product fields")
Returns one page of products matching a keyword and/or filter selections, plus the filter facet groups (brands, categories, dietaries, goals, gender, availability, discount, price, product_labels, product_type, rating) with per-option counts and the option values you can pass back into the same-named filter parameters. At least one of query or a filter parameter must be supplied; otherwise the call is rejected. Filter parameters take comma-separated option values exactly as they appear in the returned facet options (category and brand values are display names, e.g. one shape is 'Whey Protein Isolate'). Pagination is caller-controlled through page (default 1) and per_page (default 20, capped at 100); total and total_pages describe the full result set and has_more tells whether a next page exists. Note: the site groups product variants under relevance ordering, so total can be larger when a non-relevance sort is used. Prices are in the currency of the selected region (region defaults to Oman, currency OMR). A filter or category value the site does not recognize yields an empty products list with total 0 (a valid empty result). One upstream request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number. |
| sort | string | Result ordering. |
| goals | string | Comma-separated fitness goal names, as listed in filters[key=goals].options[*].value. |
| price | string | Comma-separated price band codes 'MIN-MAX' in the region's currency, as listed in filters[key=price].options[*].value (confirmed shape: '0-20'). |
| query | string | Free-text keyword to search product titles, e.g. a product type or ingredient. May be combined with filters. |
| brands | string | Comma-separated brand names, as listed in filters[key=brands].options[*].value. |
| gender | string | Comma-separated gender facet values, as listed in filters[key=gender].options[*].value. |
| region | string | Two-letter lowercase country code of the Dr Nutrition storefront whose catalogue and prices are returned (confirmed: om, ae). |
| discount | string | Comma-separated discount band codes, as listed in filters[key=discount].options[*].value (confirmed shape: '20_30'). |
| per_page | integer | Products per page; values above 100 are clamped to 100. |
| dietaries | string | Comma-separated dietary preference names, as listed in filters[key=dietaries].options[*].value (e.g. one shape is 'Gluten-Free'). |
| categories | string | Comma-separated category display names, as listed in filters[key=categories].options[*].value. |
| availability | string | Comma-separated availability facet values, as listed in filters[key=availability].options[*].value (confirmed: 'In stock', 'Out of stock'). |
| product_type | string | Comma-separated product type names, as listed in filters[key=product_type].options[*].value. |
| product_labels | string | Comma-separated product label ids, as listed in filters[key=product_labels].options[*].value (numeric id string, e.g. one shape is '1'). |
{
"type": "object",
"fields": {
"page": "current page number",
"sort": "sort code applied",
"query": "the keyword applied, or null when only filters were used",
"total": "total matching products across all pages",
"region": "uppercase country code the site resolved the request to",
"filters": "array of facet groups {key, title, options[]}; each option has value (pass back into the same-named input), label, count, selected",
"has_more": "whether a following page exists",
"per_page": "page size applied",
"products": "array of product variant records: product_id, product_option_id (variant), title, slug, url, sku, item_no, currency, price (list), selling_price (current), discount_percent, has_special_price, in_stock, availability, quantity, rating, weight, image, category_one_name, category_two_name, product_labels (array of label texts), express_delivery_available",
"total_pages": "number of pages at this per_page"
},
"sample": {
"data": {
"page": 1,
"sort": "relevance",
"query": null,
"total": 3,
"region": "OM",
"filters": [
{
"key": "brands",
"title": "Brands",
"options": [
{
"count": 2,
"label": "Muscletech",
"value": "Muscletech",
"selected": true
}
]
},
{
"key": "discount",
"title": "Discount",
"options": [
{
"count": 2,
"label": "30% - 50%",
"value": "30_50",
"selected": false
}
]
},
{
"key": "price",
"title": "Price Range",
"options": [
{
"count": 2,
"label": "0 - 14",
"value": "0-14",
"selected": false
}
]
}
],
"has_more": false,
"per_page": 20,
"products": [
{
"sku": "631656703252",
"url": "https://drnutrition.com/en-om/muscletech-nitro-tech-performance-series-2-lb-vanilla-cream",
"slug": "muscletech-nitro-tech-performance-series-2-lb-vanilla-cream",
"image": "https://media.drnutrition.com/media/thumbnail/bjx8wwXexm0tTE9XK1I0zg3gAYJxztuTfJpL53I6.jpg",
"price": 19.87,
"title": "Muscletech Nitro Tech Whey Protein, Vanilla Cream, 2 LB",
"rating": 4.7,
"weight": "1.18kg",
"item_no": "00001025",
"currency": "OMR",
"in_stock": true,
"quantity": 23,
"product_id": 347,
"availability": "In stock",
"selling_price": 13.44,
"product_labels": [
"GLP-1 Friendly"
],
"discount_percent": 32,
"category_one_name": "Sports Nutrition",
"category_two_name": "Whey Protein Isolate",
"has_special_price": true,
"product_option_id": 2732,
"express_delivery_available": true
}
],
"total_pages": 1
},
"status": "success"
}
}About the Dr Nutrition API
What the API Returns
The search_products endpoint returns a paginated list of product variant records from the drnutrition.com catalogue. Each record includes product_id, product_option_id (the specific variant), title, slug, url, sku, item_no, currency, price (list price), and additional variant-level fields. Alongside products, the response includes total, total_pages, per_page, page, has_more, and the region the request resolved to.
Filtering and Facets
Every response contains a filters array of facet groups — brands, categories, dietaries, goals, gender, availability, discount, price, product_labels, product_type, and rating — each carrying an array of options with value, label, count, and selected flags. You use the value from a facet option directly as the input parameter for the next request, making it straightforward to build cascading filter UIs or scrape structured option sets.
Region and Sorting
The region input accepts a two-letter lowercase country code to target a specific Dr Nutrition regional storefront, returning prices in that region's currency. The sort parameter controls result ordering. Filters such as goals, brands, gender, and price accept comma-separated values, enabling multi-select filtering in a single call.
Scope
The API currently covers the product catalogue for the storefronts accessible via the region parameter. It does not expose individual product detail pages, review text, nutritional panels, or order/account data. Filter facet counts reflect the current result set, so narrowing filters will change available counts on remaining facets.
The Dr Nutrition API is a managed, monitored endpoint for drnutrition.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when drnutrition.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 drnutrition.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 a supplement comparison tool using
price,brands, andgoalsfilters to surface competing products side-by-side. - Track price changes across regional storefronts by querying the same
querykeyword with differentregioncodes and comparing the returnedpriceandcurrencyfields. - Populate a filtered product listing page using the
filtersfacet groups with per-optioncountvalues for dynamic UI rendering. - Monitor discount band availability by polling the
discountfacet options and filtering results by discount code. - Audit which brands carry products tagged with a specific
dietariesorgoalsfacet, using the returned facetcountdata. - Aggregate product availability status across categories by iterating
categoriesfacet values and checkingavailabilityfacet counts per result set. - Build a gender-targeted supplement catalogue page using the
genderfilter combined withproduct_typeandproduct_labelsfacets.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does drnutrition.com have an official developer API?+
What does the `filters` field in the response actually contain?+
filters array contains 11 facet groups: brands, categories, dietaries, goals, gender, availability, discount, price, product_labels, product_type, and rating. Each group has a key, a title, and an options array where every option carries a value (the string to pass back as a filter input), a label, a count of matching products, and a selected boolean indicating whether that option is active in the current request.Can I retrieve full product detail pages, nutritional information, or customer review text?+
How does multi-region support work, and are all Dr Nutrition storefronts covered?+
region input accepts a two-letter country code to request a specific regional storefront, and the response confirms which region was resolved via the region field. Coverage depends on which storefronts Dr Nutrition operates; not all country codes may return distinct catalogue data. If a region you need is unsupported, you can fork the API on Parse and revise it to target additional storefront URLs.Is there a way to retrieve all products without a keyword or filter?+
query and all filter inputs are optional, so you can call search_products without any of them to retrieve the full catalogue paginated by page. The total and total_pages fields in the response tell you how many records and pages exist at the current per_page size.