Thorne APIthorne.com ↗
Search and browse Thorne supplement products via API. Returns pricing, benefits, badges, ratings, health need filters, and pagination across the full catalog.
What is the Thorne API?
The Thorne.com API provides access to the full Thorne supplement catalog through a single search_products endpoint that returns up to 18 fields per product, including price, retail price, benefits, badges, and availability. You can query by keyword, filter by health need category or product type, paginate through results, and receive dynamic facet data showing available filter values and counts for any given result set.
curl -X GET 'https://api.parse.bot/scraper/5eccb8b7-2e22-4753-b630-60c3201d42ea/search_products?page=1&query=vitamin+d' \ -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 thorne-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: Thorne SDK — search supplements, filter by health need, paginate."""
from parse_apis.thorne_product_search_api import Thorne, NotFoundError
client = Thorne()
# Search for vitamin D products with a total-items cap.
for product in client.products.search(query="vitamin d", limit=5):
print(product.name, product.price, product.average_rating)
# Filter by health need and drill into the first result.
product = client.products.search(health_need="Immune", limit=1).first()
if product:
print(product.name, product.sku, product.benefits, product.subscribable)
# Typed error handling around a search call.
try:
result = client.products.search(query="magnesium", limit=3).first()
if result:
print(result.name, result.review_count, result.dosage_unit)
except NotFoundError as exc:
print(f"not found: {exc}")
print("exercised: products.search with query / health_need filter / error handling")
Search for products on Thorne.com. Returns product details with pagination and available filter facets. When no query or filters are provided, returns all products. Supports filtering by health need category and product type.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (starts at 1) |
| sort | string | Sort field (leave empty for relevance) |
| query | string | Search query (e.g., 'vitamin d', 'magnesium', 'protein') |
| health_need | string | Filter by health need category (e.g., 'Immune', 'Bone & Joint', 'Sports Performance', 'Heart & Vessels', 'Energy') |
| product_type | string | Filter by product type (e.g., 'Supplements', 'Accessories') |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"query": "string - the search query used",
"facets": "array of filter facets with name and available values (value, label, count)",
"has_more": "boolean - whether more pages exist",
"products": "array of product objects with id, sku, name, headline, short_description, price, retail_price, image_url, url, benefits, badges, average_rating, review_count, out_of_stock, discontinued, orderable, subscribable, dosage_unit, dosage_frequency, search_tag",
"page_size": "integer - results per page",
"total_pages": "integer - total number of pages",
"total_results": "integer - total number of matching products"
},
"sample": {
"data": {
"page": 1,
"query": "magnesium",
"facets": [
{
"name": "Product Type",
"values": [
{
"count": 17,
"label": "Supplements",
"value": "Supplements"
}
]
}
],
"has_more": false,
"products": [
{
"id": 30,
"sku": "M272",
"url": "https://www.thorne.com/products/dp/magnesium-citramate",
"name": "Magnesium CitraMate",
"price": "$22.00",
"badges": [
"Bestsellers"
],
"benefits": [
"Bone & Joint",
"Heart & Vessels"
],
"headline": "A well-absorbed form of magnesium",
"image_url": "https://d1vo8zfysxy97v.cloudfront.net/media/product/m272.png",
"orderable": true,
"search_tag": "Magnesium",
"dosage_unit": "Capsule(s)",
"discontinued": false,
"out_of_stock": false,
"retail_price": "$22.00",
"review_count": 268,
"subscribable": true,
"average_rating": 5,
"dosage_frequency": "With Meals",
"short_description": "Get support for more than 600 enzymatic processes"
}
],
"page_size": 25,
"total_pages": 1,
"total_results": 17
},
"status": "success"
}
}About the Thorne API
What the API Returns
The search_products endpoint returns structured product data from Thorne.com. Each product object includes id, sku, name, headline, short_description, price, retail_price, image_url, url, benefits, and badges. Alongside products, the response includes total_results, total_pages, page_size, has_more, and the query string that was used — making it straightforward to build paginated product listings or catalog mirrors.
Filtering and Search
The query parameter accepts free-text searches like vitamin d, magnesium, or protein. Results can be narrowed further with health_need (e.g., Immune, Bone & Joint, Sports Performance, Heart & Vessels, Energy) and product_type (e.g., Supplements, Accessories). Omitting all filters returns the full catalog. The sort parameter controls ordering; leaving it empty defaults to relevance ranking.
Facets and Navigation
Every response includes a facets array. Each facet has a name and a list of available values, each with a value, label, and count. This lets you dynamically render filter menus that reflect what's actually available in the current result set — useful for building faceted search UIs without hardcoding filter options.
Pagination
Pagination is controlled by the page integer parameter (starting at 1). The response reports back page, page_size, total_pages, and the has_more boolean, giving you everything needed to iterate through large result sets programmatically.
The Thorne API is a managed, monitored endpoint for thorne.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when thorne.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 thorne.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,retail_price, andbenefitsfields across multiple products - Track price changes on specific Thorne SKUs by polling
search_productswith a product name query - Populate a health-category landing page using the
health_needfilter and facet counts - Sync Thorne catalog data into an internal product database using paginated full-catalog requests
- Surface product badges and headlines in a curated wellness recommendation feed
- Generate structured product feeds for affiliate or content sites using
url,image_url, andshort_description - Analyze category breadth by iterating facet values returned in the
facetsarray
| 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 Thorne have an official developer API?+
What product detail fields does `search_products` return?+
id, sku, name, headline, short_description, price, retail_price, image_url, url, benefits, and badges. The response also carries pagination metadata (total_results, total_pages, has_more) and a facets array with filter values and counts.Does the API return individual product pages or customer reviews?+
What health need categories are available as filters?+
health_need parameter accepts values like Immune, Bone & Joint, Sports Performance, Heart & Vessels, and Energy. The exact set of available values for any search context is also returned in the facets array of each response, so you can read them dynamically rather than hardcoding them.Can I retrieve inventory or stock status for products?+
search_products. The API exposes price, retail_price, badges, and availability-related badge data, but does not include a discrete inventory count or in-stock boolean. You can fork this API on Parse and revise it to capture stock status if it appears on the product detail page.