To get iHerb supplement prices and stock programmatically, use Scavio's iHerb API. POST /api/v1/iherb/search returns 48 products a page with product id, price, discount, rating and an in_stock flag; POST /api/v1/iherb/prices re-checks price and stock for up to 50 of those ids in one call; /product adds the supplement facts, UPC, price per serving and the expiration date of the stock on sale; and /reviews returns the star histogram and the top positive and critical review. Every call costs 2 credits, about $0.004 on the Growth plan billed yearly.
iHerb publishes no developer API for its catalogue, and its affiliate program provides tracking links rather than product data. Every response below is from iHerb's US store in US dollars, captured on November 2, 2026.
Step 1: Search for products
curl -s https://api.scavio.dev/api/v1/iherb/search \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "magnesium glycinate"}'This returned 48 products from 10,152 results in 4.8 seconds. The first row, as captured (two raw status codes trimmed):
{
"position": 1,
"product_id": "88819",
"part_number": "NOW-01289",
"name": "NOW Foods, Magnesium Glycinate, 180 Tablets (100 mg per Tablet)",
"brand": "NOW Foods",
"brand_code": "NOW",
"url": "https://www.iherb.com/pr/now-foods-magnesium-glycinate-180-tablets-100-mg-per-tablet/88819",
"image": "https://cloudinary.images-iherb.com/image/upload/f_auto,q_auto:eco/images/now/now01289/u/62.jpg",
"price": 19.59,
"list_price": 19.59,
"original_price": null,
"discount_percent": 0,
"rating": 4.8,
"review_count": 46308,
"in_stock": true,
"is_discontinued": false,
"is_trial": false,
"sponsored": false,
"badges": ["Best seller"],
"recent_sales": "80K+ sold in 30 days",
"category": "Supplements"
}16 of the 48 rows were sponsored, and three products appeared twice, once as an ad and once in place, so de-duplicate by product_id before you count. The response also carries brand_filters, the brands in the result set with their codes and match counts (NOW Foods, NOW, matched 486). Pass "brand_code": "NOW" to stay within one brand, sort for best_selling, rating, price_asc, percent_off and four other orders, and page for the next 48.
Step 2: Re-check prices and stock for 50 products
curl -s https://api.scavio.dev/api/v1/iherb/prices \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_ids": ["88819", "16567", "15", "103274", "145165", "116559"]}'We sent 50 ids from two magnesium searches. The call answered in 1.9 seconds with {"currency": "USD", "count": 50, "not_found": []} and one row per id in the order we sent them. One row, as captured:
{
"product_id": "116559",
"found": true,
"name": "Magnesium Glycinate, 200 mg, 120 Vegetarian Capsules",
"url": "https://www.iherb.com/pr/natural-factors-magnesium-glycinate-200-mg-120-vegetarian-capsules/116559",
"part_number": "NFS-01641",
"brand": "Natural Factors",
"brand_code": "NFS",
"is_iherb_brand": false,
"price": 14.39,
"list_price": 14.39,
"discount_percent": 0,
"discount_type": 0,
"discount_message": null,
"is_in_cart_discount": false,
"in_stock": true,
"is_available_to_purchase": true,
"status_code": 0,
"rating": 4.8,
"review_count": 4313
}price is what the product sells for now and list_price its regular price; they are equal when nothing is discounted, as was true of all 50 that afternoon. An unknown id is not an error: it comes back as {"product_id": "...", "found": false} and is listed in not_found. This is the call to schedule for monitoring, since one request covers 50 products for 2 credits.
Step 3: Read the label and the expiration date
curl -s https://api.scavio.dev/api/v1/iherb/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "116559"}'Product detail answered in 4.2 seconds. Trimmed to the fields search and prices do not have:
{
"product_id": "116559",
"name": "Natural Factors, Magnesium Glycinate, 200 mg, 120 Vegetarian Capsules",
"upc": "068958016412",
"price": 14.39,
"price_per_unit": { "text": "$0.24/serving", "amount": 0.24, "unit": "serving" },
"stock_status": "In stock",
"quantity_limit": 12,
"expiration_date": "02/2031",
"first_available": "02/2023",
"package_quantity": "120 count",
"rankings": [
{ "rank": 5, "category": "Magnesium Oxide", "url": "https://www.iherb.com/c/magnesium-oxide" },
{ "rank": 14, "category": "Magnesium Glycinate", "url": "https://www.iherb.com/c/magnesium-glycinate" }
],
"supplement_facts": {
"serving_size": "2 Capsules",
"servings_per_container": "60",
"nutrients": [
{
"name": "Magnesium (elemental)(from 800 mg of buffered magnesium glycinate [as glycinate, oxide])",
"amount": "400 mg",
"daily_value": "95%"
}
],
"notes": []
},
"suggested_use": "1-2 capsules per day or as directed by a health care professional."
}The full response also has variants with their own product ids, the description, ingredients, warnings, breadcrumbs, weight, dimensions and every image. expiration_date is the month and year on the stock iHerb is shipping now, and it moves as new lots arrive. The upc lets you match the same bottle on Amazon or Walmart.
supplement_facts is what makes price comparisons honest. price_per_unit is per serving, and a serving here is 2 capsules with 400 mg of magnesium; on other bottles it was one capsule with 120 mg. Dividing price by total milligrams across 14 magnesium glycinate products gave $0.060 to $0.263 per 100 mg of magnesium, a 4.4x spread, charted in the best iHerb product data APIs.
Step 4: Summarize the reviews
curl -s https://api.scavio.dev/api/v1/iherb/reviews \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "88819"}'The NOW Foods product's summary came back in 1.5 seconds (languages trimmed to two of 42, the critical review trimmed to its main fields, the positive review left out):
{
"product_id": "88819",
"average_rating": 4.8,
"review_count": 46309,
"rating_histogram": {
"five": { "count": 40770, "percent": 88 },
"four": { "count": 3801, "percent": 8 },
"three": { "count": 1193, "percent": 3 },
"two": { "count": 345, "percent": 1 },
"one": { "count": 200, "percent": 0 }
},
"languages": [
{ "language_code": "en-US", "language": "English", "count": 12864 },
{ "language_code": "ar-SA", "language": "Arabic", "count": 9989 }
],
"top_critical_review": {
"rating": 1,
"title": "Very hard on my stomach",
"text": "I took one tab with my dinner. Within an hour or two I had burning in my stomach ...",
"author_country": "United States",
"posted_at": "2025-05-31T13:31:57.669Z",
"verified_purchase": true,
"helpful_yes": 8,
"helpful_no": 1
}
}top_positive_review sits alongside it. This is a summary: there is no endpoint that pages through all 46,309 reviews, and either top review can be null.
All four endpoints
| Endpoint | What it returns | Credits |
|---|---|---|
/api/v1/iherb/search | 48 products a page with price, discount, rating, stock, badges, recent sales and brand filters | 2 |
/api/v1/iherb/prices | Price, list price, discount, stock flag, rating and review count for up to 50 ids | 2 |
/api/v1/iherb/product | Supplement facts, UPC, price per serving, expiration date, variants, rankings, ingredients and images | 2 |
/api/v1/iherb/reviews | Average rating, star histogram, counts per language, top positive and critical review | 2 |
There is no store or country parameter: iHerb is online-only, and every answer is the US store in US dollars. Search and product took 3.8 to 12.3 seconds in our test, so give them a 60-second client timeout; prices and reviews answered in under 2 seconds. For a side-by-side of every option, see the best iHerb product data APIs, and for building a product page from a list of iHerb links, see getting iHerb images and prices from a list of URLs.
Getting started
- Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required, enough for 25 iHerb calls.
- Copy your API key from the dashboard.
- Send a POST to
/api/v1/iherb/searchwith your key in theAuthorizationheader.
Try the iHerb API free in the playground first, or call it from Claude and other agents through the MCP server.
Reference: iHerb API overview · search · prices · product · reviews
Frequently asked questions
How do I get iHerb prices programmatically?
iHerb has no public product API, so you use a third-party one. With Scavio, search iHerb with /api/v1/iherb/search to collect product ids, then send up to 50 of them to /api/v1/iherb/prices. Each call returns price, list price, discount percent, an in-stock flag, rating and review count per product, in the order you sent them, for 2 credits.
Where is the iHerb product id?
It is the number at the end of an iherb.com product URL: in /pr/natural-factors-magnesium-glycinate-200-mg-120-vegetarian-capsules/116559 the id is 116559. Search results return it as product_id, and the product and reviews endpoints also accept the full URL instead.
What does the iHerb expiration date mean?
iHerb shows, on each product page, the expiration date of the stock it is currently shipping, as a month and year. It changes as new lots arrive, so read it close to the time you need it. On November 2, 2026, 14 magnesium glycinate products showed dates from 02/2028 to 02/2031.
Are iHerb prices the same in every country?
iHerb runs country sites with their own currencies, shipping rules and promotions. Scavio returns the US store in US dollars for every call, including when you pass a product URL from another country's iHerb site, so do not read its prices as another country's.
How much does it cost to monitor iHerb prices?
Every Scavio iHerb call costs 2 credits, about $0.004 on the Growth plan billed yearly. Because /prices covers 50 products per call, re-checking 1,000 products daily is 20 calls and 40 credits a day. New accounts get 50 free credits with no card.