ScavioScavio
Pricing
Tools
Sign InsGet Startedg
Blog
Iherb6 min readNov 2, 2026

How to Get iHerb Supplement Prices, Stock and Expiration Dates Through an API

Use Scavio's iHerb API: one POST prices 50 iHerb products with stock flags; product detail adds supplement facts, UPC and expiration date. 2 credits a call.

Scavio Team

Nov 2, 2026

Try the iHerb API free
scavio
Supplements / Price monitoring
Iherb

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

Bash
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):

JSON
{
  "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

Bash
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:

JSON
{
  "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

Bash
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:

JSON
{
  "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

Bash
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):

JSON
{
  "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

EndpointWhat it returnsCredits
/api/v1/iherb/search48 products a page with price, discount, rating, stock, badges, recent sales and brand filters2
/api/v1/iherb/pricesPrice, list price, discount, stock flag, rating and review count for up to 50 ids2
/api/v1/iherb/productSupplement facts, UPC, price per serving, expiration date, variants, rankings, ingredients and images2
/api/v1/iherb/reviewsAverage rating, star histogram, counts per language, top positive and critical review2

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

  1. Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required, enough for 25 iHerb calls.
  2. Copy your API key from the dashboard.
  3. Send a POST to /api/v1/iherb/search with your key in the Authorization header.

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.

iHerb prices and stock as JSON

  • Search, bulk prices, product and reviews
  • Supplement facts and expiration dates
  • 2 credits a call, no iHerb account
Try the iHerb API free

50 free credits, no credit card

On this page

  1. Step 1: Search for products
  2. Step 2: Re-check prices and stock for 50 products
  3. Step 3: Read the label and the expiration date
  4. Step 4: Summarize the reviews

Related articles

View all
  • scavio
    Comparison / Supplements
    Iherb
    5 Best iHerb Product Data APIs in 2026: Scavio Prices 50 Supplements for Under Half a Cent
  • scavio
    Web scraping / Price monitoring
    Iherb
    How Do I Get the Image and Price for a List of iHerb URLs? One API Call per URL, Then Prices 50 at a Time
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy