Yes, you can turn a list of iHerb URLs into prices and the right product picture without a scraper. Pass each URL to Scavio's iHerb API at POST /api/v1/iherb/product: it returns the current price, stock status and images[], the product's own photo gallery, with no banners or logos mixed in. After that, refresh prices for up to 50 products in one POST /api/v1/iherb/prices call. Each call costs 2 credits, about $0.004 on the Growth plan billed yearly, and data is from iHerb's US store in US dollars.
The question was asked on r/WebScrapingInsider and cross-posted to r/DataHoarder and r/scrapingtheweb. The poster had a spreadsheet of iHerb products with a URL for each and wanted a simple website showing them with prices. A spreadsheet extension they tried was not free and returned "several pictures (some are not related)" for each product, and they asked how to do it without cost. Replies said a generic image grabber was the wrong tool, and one suggested taking price and image in the same pass so the two never drift apart. Both fit in one API call per product.
Step 1: Get the id from each URL
Every iHerb product URL ends in the product id:
https://www.iherb.com/pr/california-gold-nutrition-vitamin-d3-125-mcg-5-000-iu-90-fish-gelatin-softgels/70316
Here it is 70316. The product endpoint also accepts the whole URL, so you only need the id for the bulk prices call.
Step 2: Ask for each product once
curl -s https://api.scavio.dev/api/v1/iherb/product \
-H "Authorization: Bearer $SCAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.iherb.com/pr/california-gold-nutrition-vitamin-d3-125-mcg-5-000-iu-90-fish-gelatin-softgels/70316"}'On November 2, 2026 this answered in 4.9 seconds. Trimmed to what a product page needs (images cut to two of 9):
{
"product_id": "70316",
"name": "California Gold Nutrition, Vitamin D3, 125 mcg (5,000 IU), 90 Fish Gelatin Softgels",
"brand": "California Gold Nutrition",
"url": "https://www.iherb.com/pr/california-gold-nutrition-vitamin-d3-125-mcg-5-000-iu-90-fish-gelatin-softgels/70316",
"price": 6.07,
"list_price": 6.07,
"currency": "USD",
"in_stock": true,
"stock_status": "In stock",
"images": [
"https://cloudinary.images-iherb.com/image/upload/f_auto,q_auto:eco/images/cgn/cgn01065/l/404.jpg",
"https://cloudinary.images-iherb.com/image/upload/f_auto,q_auto:eco/images/cgn/cgn01065/l/409.jpg"
]
}We opened the first image: it was the front of the bottle, 1600 x 1600 pixels, with no logos or banners around it. Check the first image of a few of your own products before you rely on that order. The same response carries the supplement facts, UPC, price per serving and expiration date, if your site wants more than a picture and a price.
Step 3: Refresh prices 50 at a time
Images rarely change; prices and stock do. Keep the images from Step 2 and re-check prices in bulk:
import re
import requests
API_KEY = "sk_your_key_here" # from the Scavio dashboard; keep it out of source control
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
urls = [
"https://www.iherb.com/pr/california-gold-nutrition-vitamin-d3-125-mcg-5-000-iu-90-fish-gelatin-softgels/70316",
"https://www.iherb.com/pr/natural-factors-magnesium-glycinate-200-mg-120-vegetarian-capsules/116559",
]
ids = [re.search(r"/(\d+)/?$", u).group(1) for u in urls]
for i in range(0, len(ids), 50):
r = requests.post("https://api.scavio.dev/api/v1/iherb/prices",
headers=HEADERS, json={"product_ids": ids[i:i + 50]}, timeout=60)
r.raise_for_status()
for row in r.json()["data"]["products"]:
if row["found"]:
print(row["product_id"], row["price"], row["list_price"], row["in_stock"])A 50-id call took 1.9 seconds in our test and returned one row per id in the order sent, with price, list price, discount, stock flag, rating and review count. An id that no longer exists comes back as found: false and in not_found, which also tells you which rows in the sheet to clean up.
What it costs, and the limits
- A sheet of 300 products: 300 product calls once, 600 credits, for prices, stock and images; then 6 prices calls a day, 12 credits, to keep prices current. At the Growth-yearly rate of $2 per 1,000 credits that is $1.20 once and about $0.72 a month. The 50 free credits on signup cover 25 calls, enough to try it on part of the sheet.
- US store only: prices are iHerb US in US dollars, even if your sheet holds links from another country's iHerb site.
- Images are iHerb's: a commenter in the thread pointed out that reusing retailer photos on a public site can raise terms and copyright questions, and that hotlinking makes your site depend on iHerb's image URLs. Read iHerb's terms before you publish them, and store copies only where you are allowed to.
- Serve from your own data: as another reply put it, do not make your site call iHerb on every page view. Write the API's answers to your sheet or database and update on a schedule.
Try the iHerb API free, 50 credits, no card, or paste a product URL into the playground.
Reference: iHerb API overview · product docs · prices docs · how to get iHerb supplement prices and stock · the best iHerb product data APIs
Frequently asked questions
How do I get the main image of an iHerb product?
Call Scavio's /api/v1/iherb/product with the product URL or id. It returns images[], the product's own gallery from iherb.com, and no banners or logos. In our capture of California Gold Nutrition Vitamin D3 the first of its 9 images was the front of the bottle at 1600 x 1600 pixels. Search results also carry one image per product.
Can I get iHerb prices for a whole spreadsheet of products?
Yes. Take the number at the end of each iherb.com /pr/ URL, which is the product id, and send up to 50 of them per call to Scavio's /api/v1/iherb/prices. Each row returns price, list price, discount, stock flag, rating and review count, in your order, for 2 credits per call.
Is there a free way to scrape iHerb images?
You can write your own scraper, which costs time rather than money and needs fixing when the page changes. Scavio's 50 free credits cover 25 iHerb calls with no card, enough to test the approach; a sheet of 300 products then costs 600 credits for the images once and 12 credits per daily price refresh.
Can I use iHerb product images on my own website?
That depends on iHerb's terms and on how you use the images, and a commenter in the thread raised the same concern. Product photos are often the brand's or the retailer's copyrighted work, and hotlinking leaves your site dependent on their image URLs. Check the terms and, for a commercial site, ask a lawyer or the brand.