
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape iHerb (iherb.com): search, categories and brands, full product details (ingredients, supplement facts, UPC, expiry dates, stock), customer reviews and price and stock monitoring in 188 markets. No login needed.
Scrape iHerb product listings, full product pages, customer reviews and price changes from any category, brand, search or product link. You get prices, discounts, ratings, stock, UPC barcodes, ingredients, supplement facts and best-by dates as clean JSON, CSV or Excel. It reads iHerb's own data feeds, needs no login and no browser, and saves 1,000 listed products in about 10 seconds.
https://www.iherb.com/c/vitamins), a brand (https://www.iherb.com/c/now-foods), a search page, Specials, or product pages. Or type keywords into Search keywords.| Field | What it does |
|---|---|
startUrls | iHerb links: product (/pr/...), category or brand (/c/...), search (/search?kw=...), Specials, New products, review pages (/r/...). Any country subdomain works. |
searchQueries | Keywords to search, one per line. |
mode | auto, search (listing data), details (full product pages), reviews or monitor. |
maxItems | Most results per link or keyword (0 = everything). |
countryCode, currencyCode, languageCode | iHerb market, price currency and text language. |
sortBy, brands, minPrice, maxPrice, minRating, inStockOnly, onSaleOnly | Filters for categories, brands and searches. |
maxReviewsPerProduct, reviewLanguage, reviewSort, reviewRating | Review settings. |
includeUpc | Add UPC barcodes in full details mode (on by default). |
monitorChangesOnly | Monitor mode: save only changed products (on by default). |
{
"startUrls": [{ "url": "https://www.iherb.com/c/vitamins" }],
"searchQueries": ["magnesium glycinate"],
"mode": "details",
"maxItems": 50,
"countryCode": "US",
"currencyCode": "USD",
"minRating": 4.5,
"inStockOnly": true,
"sortBy": "best_sellers"
}
Every row has a recordType: product, review or change (monitor mode). The dataset has a table view for each.
| Field | Description |
|---|---|
productId, url, title, brand, brandCode, partNumber, upc | Product identity |
price, listPrice, discountPercentage, currency, priceText, pricePerServing, promoCode, promoMessage | Price in the selected market |
rating, reviewCount, soldLast30Days | Popularity |
stockStatus, stockQuantity, isAvailableToPurchase, backInStockDate | Availability (in_stock, limited, out_of_stock, discontinued) |
description, suggestedUse, ingredients, allergenInfo, warnings, nutritionalFacts, servingSize | Product page content (details mode) |
expiryDate, expiryDateFormatted, weight, dimensions, categories, categoryRanks, images, videos | More details |
reviewId, rating, title, text, reviewerName, reviewerLocation, isVerified, helpfulYes, languageCode, date | Review rows |
changeType, previousPrice, currentPrice, priceChangePercent, previousStockStatus, history | Monitor rows |
Product details row (trimmed, from a real run):
{
"recordType": "product",
"productId": "62118",
"url": "https://www.iherb.com/pr/california-gold-nutrition-omega-3-premium-fish-oil-100-fish-gelatin-softgels-1-100-mg-per-softgel/62118",
"title": "Omega-3 Premium Fish Oil, 100 Fish Gelatin Softgels (1,100 mg per Softgel)",
"brand": "California Gold Nutrition",
"partNumber": "MLI-00952",
"upc": "898220009527",
"price": 12.2,
"listPrice": 12.2,
"currency": "USD",
"pricePerServing": "$0.24/serving",
"stockStatus": "in_stock",
"rating": 4.8,
"reviewCount": 492188,
"soldLast30Days": 50000,
"packageQuantity": "100 count",
"servingSize": "2 Softgels",
"expiryDate": "2029-05-01T00:00:00.000Z",
"expiryDateFormatted": "05/2029",
"categories": ["Supplements", "Omegas & Fish Oils (EPA DHA)", "Omega-3 Fish Oil"],
"categoryRanks": [{ "category": "Omega-3 Fish Oil", "rank": 1, "categoryUrl": "https://www.iherb.com/c/omega-3-fish-oil" }],
"ingredients": ["Fish Gelatin Softgel (Gelatin, Vegetable Glycerin, Water) and Vitamin E (<0.1% as Mixed Tocopherols)"],
"allergenInfo": "Contains: Fish (Anchovy, Mackerel, Sardine & Tilapia) and Soy",
"nutritionalFacts": [
{ "name": "Eicosapentaenoic Acid (EPA as TG)", "amount": "360 mg", "dailyValue": "†" },
{ "name": "Docosahexaenoic Acid (DHA as TG)", "amount": "240 mg", "dailyValue": "†" }
],
"imageUrl": "https://cloudinary.images-iherb.com/image/upload/f_auto,q_auto:eco/images/mli/mli00952/v/392.jpg",
"country": "US"
}
Review row:
{
"recordType": "review",
"reviewId": "a49ac85c-8d0e-46e6-a7cf-5fba9fda0c91",
"productId": "10421",
"productTitle": "Vitamin D-3, High Potency, 125 mcg (5,000 IU), 120 Softgels",
"rating": 5,
"title": "Potent Sunshine in a Softgel",
"text": "These high-potency softgels provide a significant dose of Vitamin D-3...",
"reviewerName": "Jane D.",
"reviewerLocation": "Thailand",
"isVerified": true,
"helpfulYes": 0,
"languageCode": "en-US",
"date": "2026-04-09T10:35:43.612Z"
}
You pay $0.40 per 1,000 results ($0.0004 per product, review or monitor row), plus a small platform usage fee for compute and proxy traffic. In our tests that fee was about $0.001 for 1,000 listed products and about $0.008 for 1,000 full product pages.
Example: 1,000 products from a category ≈ $0.40 + $0.001 = about $0.40. Rows that are filtered out, not found or unchanged in monitor mode are never charged. Set a maximum cost per run and the scraper stops cleanly when it is reached.
Is it legal to scrape iHerb? The scraper only reads public data that any visitor can see without logging in. Check iHerb's terms and your local laws for how you use the data, especially reviewer names.
Do I need an account, cookies or a proxy? No account or cookies. Datacenter proxies are on by default and work well; if iHerb ever refuses them, the run switches to US residential proxies by itself.
How many results can I get? A whole category or search (iHerb lists up to about 45,000 products), and up to 10,000 reviews per product for each language, star rating and order.
Why is a field empty?
iHerb does not publish everything for every product: stockQuantity only appears when stock is low, expiryDate only for products with a best-by date, upc and supplement facts only in full details mode.
How does the monitor work?
Run the scraper in monitor mode on a schedule. Each run compares prices and stock with the previous run for the same country and currency and saves new_item, price_drop, price_increase, out_of_stock, back_in_stock or removed rows. Up to 30 checks of history are kept per product.
Can I schedule it or use the API? Yes. Schedule runs in the console, call the run API, and connect the results to webhooks and integrations.
soldLast30Days is iHerb's rounded figure (for example 50,000+), not an exact count.iherb-price-monitor store to start over.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalStart URLs
iHerb links: product pages (/pr/...), category and brand pages (/c/vitamins, /c/now-foods), search pages (/search?kw=...), Specials or New products, or review pages (/r/...). Any country subdomain works (de.iherb.com, kr.iherb.com).
searchQueriesarrayOptionalSearch keywords
Keywords to search on iHerb, one per line (for example 'magnesium glycinate'). Each keyword is scraped like a search page.
modeenumOptionaldefault "auto"What to scrape
Auto returns the listing data for category, brand and search links and full details for product links. Full details adds ingredients, supplement facts, UPC, expiry date, weight and dimensions, rankings and all images for every listed product. Reviews returns customer reviews of the products. Monitor compares prices and stock with your previous run of the same market.
maxItemsintegerOptionaldefault 20Max results per input
Most results to save for each URL or keyword (products, or reviews in reviews mode). 0 means everything iHerb lists.
Country, currency and language of the iHerb store to read.
countryCodeenumOptionaldefault "US"Country
iHerb market: sets the local prices, which products can ship there and their stock.
currencyCodeenumOptionaldefault "USD"Currency
Currency the prices are shown in.
languageCodeenumOptionaldefault "en-US"Language
Language of product names, descriptions and ingredients.
Narrow category, brand and search results.
sortByenumOptionalSort by
Order of category, brand and search results. Empty keeps the order of the link (or iHerb's default).
brandsarrayOptionalBrands
Only products of these brands, by name or iHerb brand code (for example 'NOW Foods' or 'CGN').
minPricenumberOptionalMin price
Only products at or above this price, in the selected currency.
maxPricenumberOptionalMax price
Only products at or below this price, in the selected currency.
minRatingnumberOptionalMin rating
Only products rated at least this many stars (0 to 5, for example 4.5).
inStockOnlybooleanOptionaldefault falseIn stock only
Skip products that are out of stock or discontinued.
onSaleOnlybooleanOptionaldefault falseOn sale only
Only products with a discount or a promo code.
Settings for the Customer reviews mode and for review links.
maxReviewsPerProductintegerOptionaldefault 20Max reviews per product
Reviews mode: most reviews per product (0 means up to 10,000, the most iHerb serves per product and filter). 'Max results per input' still caps the total.
reviewLanguageenumOptionaldefault "all"Review language
Only reviews written in this language. All languages is the default; English is often a small share of iHerb reviews.
reviewSortenumOptionaldefault "most_relevant"Review order
Order of the reviews.
reviewRatingenumOptionaldefault "all"Star rating
Only reviews with this star rating (for example 1 star for complaints).
Details and monitor options.
includeUpcbooleanOptionaldefault trueInclude UPC barcodes
Full details: add each product's UPC barcode (one small extra request per 24 products).
monitorChangesOnlybooleanOptionaldefault trueMonitor: changes only
Monitor mode: save only products whose price or stock changed since the last run (new products count as changes). Off saves every checked product.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxies work for iHerb. The run switches to US residential proxies on its own if iHerb starts refusing datacenter exits.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| recordType | string | null | product, review or change |
| productId | string | null | iHerb product ID |
| url | string | null | Product page |
| title | string | null | Product name |
| brand | string | null | Brand |
| brandCode | string | null | iHerb brand code |
| partNumber | string | null | iHerb part number (SKU) |
| upc | string | null | UPC barcode (full details) |
| price | number | null | Current price in the selected currency |
| listPrice | number | null | List price before discount |
| discountPercentage | number | null | Discount from the list price, in percent |
| promoCode | string | null | Promo code shown on the product |
| promoMessage | string | null | Promo text |
| currency | string | null | Currency code |
| priceText | string | null | Price as shown by iHerb |
| pricePerServing | string | null | Price per serving or unit |
| rating | number | null | Average rating (0 to 5), or the review's stars |
| reviewCount | number | null | Number of ratings |
| stockStatus | string | null | in_stock, limited, out_of_stock, discontinued or unknown |
| stockQuantity | number | null | Units left (iHerb shows it only when stock is low) |
| imageUrl | string | null | Main image |
| packageQuantity | string | null | Pack size |
| soldLast30Days | number | null | Units sold in the last 30 days (iHerb's rounded figure) |
| expiryDate | string | null | Best-by date (ISO) |
| expiryDateFormatted | string | null | Best-by date as shown |
| servingSize | string | null | Serving size |
| categories | array | null | Category path |
| description | string | null | Description |
| ingredients | array | null | Other ingredients |
| allergenInfo | string | null | Allergen statements |
| nutritionalFacts | array | null | Supplement facts: name, amount, daily value |
| suggestedUse | string | null | Suggested use |
| warnings | string | null | Warnings |
| images | array | null | All images |
| reviewId | string | null | Review ID |
| productUrl | string | null | Reviewed product page |
| productTitle | string | null | Reviewed product name |
| text | string | null | Review text |
| reviewerName | string | null | Reviewer nickname |
| reviewerLocation | string | null | Reviewer country |
| isVerified | boolean | null | Verified purchase |
| helpfulYes | number | null | Helpful votes |
| helpfulNo | number | null | Not helpful votes |
| languageCode | string | null | Review language |
| date | string | null | Review date (ISO) |
| changeType | string | null | new_item, price_drop, price_increase, out_of_stock, back_in_stock, removed or no_change |
| previousPrice | number | null | Price at the previous check |
| currentPrice | number | null | Price now |
| priceChangePercent | number | null | Price change in percent |
| previousStockStatus | string | null | Stock at the previous check |
| position | number | null | Position in the listing |
| searchQuery | string | null | Keyword searched |
| sourceUrl | string | null | Input this row came from |
| country | string | null | iHerb market |
| scrapedAt | string | null | When the row was scraped (ISO) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One saved iHerb product, review or monitor row. | $0.0004 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/iherb-scraper').call({
"startUrls": [
{
"url": "https://www.iherb.com/c/vitamins"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/iherb-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/iherb-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.