# iHerb Scraper - Products, Prices, Supplement Facts & Reviews (`scrapewise/iherb-scraper`) Actor

Scrape iHerb by keyword, category, brand or product link: price, list price, discount, rating, reviews, stock, size, badges and images. Optional full details (ingredients, supplement facts, UPC, best-by date) and reviews. 35 countries and currencies. Error rows are free.

- **URL**: https://apify.com/scrapewise/iherb-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.43 / 1,000 product delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## iHerb Scraper: products, prices, supplement facts and reviews from iHerb

iHerb Scraper collects **products from iHerb by keyword, category, brand or product link**, without an account
or cookies. Each product comes back as one clean row: name, brand, current price, list price, discount, currency,
star rating, number of reviews, stock, size, badges such as Best seller or Deal, units sold in the last 30 days, link
and image. Turn on details to add the description, other ingredients, a structured Supplement Facts table, suggested
use, warnings, UPC, shipping weight, dimensions, best-by date and category paths. Customer reviews are optional too.

It is used to track supplement and vitamin prices across 35 iHerb country stores, to watch discounts and stock of
competing brands, to build product catalogs with UPC and ingredients for marketplaces and comparison sites, and to
study what buyers praise or complain about in reviews.

### At a glance

| What | Price |
|---|---|
| Product delivered (from a keyword or list) | **US$ 0.50 per 1,000 products** (US$ 0.0005 each) |
| Product with full details | US$ 1.50 per 1,000 products, charged *instead of* the one above |
| Review delivered (optional) | US$ 1.00 per 1,000 reviews |
| Run start | US$ 0.005 per run |

- 3 keywords x 50 products = 150 products = **US$ 0.08**. The same with full details = US$ 0.23.
- Prices above are for the Free plan; Bronze, Silver and Gold+ subscribers pay 5%, 10% and 15% less.
- Error rows, duplicates and products skipped by your filters are never charged. `maxItems` caps every keyword and
  list, and a spending limit set on the run stops it cleanly with everything delivered so far.
- The proxy is included in the price.

### Quick start

Keyword search, 30 products each, best sellers first:

```json
{
  "searchQueries": ["vitamin c", "magnesium glycinate"],
  "maxItems": 30,
  "sortBy": "best_sellers"
}
```

A category and a brand, with full details, in UK pounds:

```json
{
  "categoryUrls": [
    "https://www.iherb.com/c/collagen-supplements",
    "https://www.iherb.com/c/now-foods"
  ],
  "maxItems": 100,
  "includeDetails": true,
  "country": "GB"
}
```

Specific products with their 20 newest reviews:

```json
{
  "productUrls": ["https://www.iherb.com/pr/now-foods-c-1000-250-tablets/468", "16567"],
  "includeReviews": true,
  "maxReviewsPerProduct": 20,
  "reviewsSort": "newest"
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords as typed in the iHerb search bar, one per line. 48 products per page, paged until `maxItems`. |
| `categoryUrls` | Any iHerb product list: categories (`/c/vitamin-c`), brand pages (`/c/now-foods`), search links, specials. Filters already in the link are kept. |
| `productUrls` | Product links (`/pr/<name>/<id>`) or numeric ids. Always returned with full details. |
| `maxItems` | Products per keyword and per list (default 30). Product links are not limited by it. |
| `sortBy` | iHerb default, featured, relevance, best sellers, top rated, most rated, price low to high, price high to low, newest, highest discount. |
| `inStockOnly` | Skip products shown as out of stock (not charged). |
| `onSaleOnly` | Keep only discounted products. Pair it with `highest_discount` sort. |
| `includeDetails` | Add description, ingredients, supplement facts, suggested use, warnings, UPC, weight, dimensions, best-by date, category paths, images and star breakdown. |
| `country` | Which iHerb store: prices, currency and stock change by country (default US). |
| `currency` | Optional override such as `EUR` or `USD`; empty uses the country's currency. |
| `includeReviews` | Add each product's reviews as rows with `type: review`. |
| `maxReviewsPerProduct` | Reviews per product (default 10). |
| `reviewsSort` | Most relevant, newest or most helpful. |
| `reviewsRating` | Only reviews with this star rating (all, 5, 4, 3, 2 or 1). |
| `proxyConfiguration` | Apify datacenter by default. |

`searchQuery`, `keyword`, `queries`, `startUrls`, `urls`, `productIds`, `maxResults`, `maxProducts`, `countryCode`
and `maxReviews` are accepted too, so inputs written for other iHerb tools keep working.

### Output

**Product row** (`type: product`), every run:

| Field | What it is |
|---|---|
| `productId`, `partNumber` | iHerb product id and product code (for example `NOW-00687`) |
| `name`, `brand`, `brandCode` | Full product name as iHerb shows it, brand and brand code |
| `price`, `listPrice`, `discountPercent` | Current price, regular price and the discount in percent (0 when not on sale) |
| `currency`, `priceText` | ISO currency of the store that answered, and the price as displayed (`$18.59`, `£15.91`, `24,08 €`) |
| `rating`, `reviewCount` | Average stars (0 to 5) and number of ratings |
| `inStock`, `isDiscontinued` | Stock as shown in the list |
| `size` | Package size from the name or the details (`250 count`, `3.81 oz`) |
| `category` | Main category |
| `badges` | Labels on the product: Best seller, Quality Pick, Deal, New, iHerb Exclusive, Limited Edition, Trial |
| `soldLast30Days` | iHerb's own sales hint, for example `90K+ sold in 30 days` |
| `isSponsored`, `isTrial` | Sponsored placement in the list, trial-size product |
| `url`, `imageUrl` | Product page and main image |
| `position`, `searchQuery`, `sourceUrl` | Position in the list, the keyword, and the link you sent |

**Extra fields with details** (`includeDetails` on, or product links):

| Field | What it is |
|---|---|
| `description` | Overview bullets and text, one per line |
| `ingredients` | Other ingredients and allergen notes |
| `servingSize`, `supplementFacts` | Serving size and the Supplement Facts table as rows of `name`, `amountPerServing`, `dailyValue` |
| `supplementFactsText` | The same table as plain text |
| `suggestedUse`, `warnings` | Directions and warnings from the label |
| `upc` | UPC barcode |
| `expirationDate` | Best-by date of the current stock (`2029-04-01`) |
| `firstAvailable` | When the product first went on sale at iHerb |
| `shippingWeight`, `shippingWeightKg`, `dimensions`, `dimensionsCm` | Package weight and size |
| `pricePerServing`, `stockStatus`, `quantityLimit` | Price per serving, stock message and order limit |
| `rootCategory`, `categoryPaths`, `bestSellerRanks` | Category tree and the best seller rank in each category |
| `ratingBreakdown` | Count and percent of 5, 4, 3, 2 and 1 star ratings |
| `images`, `videos`, `manufacturerUrl`, `questionCount` | All product images, videos, brand site and Q\&A count |

One real row with details (text shortened):

```json
{
  "type": "product",
  "productId": 468,
  "name": "NOW Foods, C-1000, 250 Tablets",
  "brand": "NOW Foods",
  "partNumber": "NOW-00687",
  "price": 18.59,
  "listPrice": 18.59,
  "discountPercent": 0,
  "currency": "USD",
  "rating": 4.7,
  "reviewCount": 6606,
  "inStock": true,
  "size": "250 count",
  "category": "Vitamin C",
  "categoryPaths": ["NOW Foods", "Supplements > Vitamins > Vitamin C > Ascorbic Acid"],
  "soldLast30Days": "1,000+ sold in 30 days",
  "servingSize": "1 Tablet",
  "supplementFacts": [
    {"name": "Vitamin C (as Ascorbic Acid)", "amountPerServing": "1 g (1,000 mg)", "dailyValue": "1,111%"},
    {"name": "Rose Hips Powder (Rosa canina) (Fruit)", "amountPerServing": "25 mg", "dailyValue": "†"}
  ],
  "suggestedUse": "Take 1 tablet daily.",
  "upc": "733739006875",
  "expirationDate": "2029-04-01",
  "shippingWeight": "1.02 lb",
  "url": "https://www.iherb.com/pr/now-foods-c-1000-250-tablets/468"
}
```

**Review row** (`type: review`, only with `includeReviews`):

| Field | What it is |
|---|---|
| `reviewId`, `productId`, `productName`, `productUrl` | The review and its product |
| `rating` | Stars, 1 to 5 |
| `title`, `text`, `language` | The review as written and its language code |
| `titleEnglish`, `textEnglish` | iHerb's English translation, when the review is in another language |
| `postedAt`, `verifiedPurchase`, `rewarded` | Date, verified purchase, and whether the writer got iHerb rewards for it |
| `helpfulYes`, `helpfulNo`, `images` | Helpful votes and links of the photos in the review |

Reviewer names, nicknames, profile links and countries are never collected.

### Countries and currencies

iHerb runs a store per country with its own prices, currency and stock. Pick the store in `country` (United States,
United Kingdom, Canada, Australia, Germany, France, Japan, South Korea, India, United Arab Emirates, Saudi Arabia,
Mexico, Brazil and 22 more). Links from a country subdomain such as `uk.iherb.com` or `de.iherb.com` work in any
store; the `country` field decides the prices. Every row says which `currency` iHerb really answered with.

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not an iHerb link or a product id |
| `INVALID_INPUT` | A field has a wrong value (the run continues with the default when it can) |
| `NO_RESULTS` | iHerb has no products for this keyword or list |
| `NOT_FOUND` | The product or page does not exist or is no longer sold |
| `BLOCKED` | iHerb refused every attempt for this item; run it again in a few minutes |
| `NOT_REACHED` | The run timeout or the cost guard arrived before this item |
| `REVIEWS_UNAVAILABLE` | The product row was delivered but its reviews could not be loaded |

### Integrations, scheduling and AI agents

- **Schedule** the same keywords or categories daily in [Apify schedules](https://docs.apify.com/platform/schedules)
  to follow price drops, new discounts, stock-outs and best-by dates.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
  The dataset has three ready views: Products, Product details and Reviews.
- **Connect** it to Make, n8n, Zapier, Google Sheets or Airtable through
  [Apify integrations](https://docs.apify.com/platform/integrations).
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "compare the price per serving of the 20 best selling
  magnesium glycinate products on iHerb UK" or "summarize the 1 star reviews of these 5 probiotics".

### FAQ

**Do I need an iHerb account?** No. Everything comes from public product pages and lists.

**How many products can I get?** As many as iHerb lists: popular keywords have thousands. Set `maxItems` to what you
need; 48 products come per page.

**Why is the price different from what I see?** iHerb prices change by country store and currency. Set `country` to
the store you see in your browser. Some brands only show the price in the cart; the row then carries the cart price
that iHerb sends with the product.

**Can I get every review of a product?** Yes, set `maxReviewsPerProduct` high. Popular products have thousands of
reviews in many languages, with English translations.

**Is it legal?** The Actor reads public pages only and collects no personal data of reviewers. You are responsible
for how you use the data under the laws that apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Variants (other sizes or flavors) are separate products on iHerb; each one is its own row when it shows up in a list.
- Subscribe & Save and promo-code prices that appear only in the cart are not calculated.
- Best-by dates, stock and prices are the ones iHerb shows at the moment of the run.
- Questions and answers are counted (`questionCount`) but their text is not collected.

### Changelog

- **16 Oct 2026:** first version: keyword, category, brand and product links; prices in 35 country stores; full
  details with supplement facts, UPC and best-by date; reviews with English translations.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords as you would type them in the iHerb search bar, one per line, for example "vitamin c", "magnesium glycinate" or "collagen peptides". Each keyword returns the products iHerb lists for it, page after page (48 per page), with the sort and filters below. Leave every source empty to run the example "vitamin c". Also accepts 'searchQuery', 'keyword' and 'queries'.

## `categoryUrls` (type: `array`):

Any iHerb product list, one per line: categories such as https://www.iherb.com/c/vitamin-c, brand pages such as https://www.iherb.com/c/now-foods, search links (https://www.iherb.com/search?kw=zinc) or specials. Country subdomains (uk.iherb.com, de.iherb.com) work too; the country below decides prices and currency. Also accepts 'startUrls' and 'urls'.

## `productUrls` (type: `array`):

Specific products, one per line: https://www.iherb.com/pr/now-foods-c-1000-250-tablets/468 or just the numeric id (468). Each returns one full row with description, ingredients, supplement facts, suggested use, warnings, UPC, weight and best-by date, charged as 'Product with details'. Also accepts 'productIds'.

## `maxItems` (type: `integer`):

Upper limit of products for each keyword and each category or search link, for example 30 (the default) or 1000. Product links are not limited by it. You pay per product delivered, so this caps the cost of each keyword. Also accepts 'maxResults' and 'maxProducts'.

## `sortBy` (type: `string`):

Same options as the iHerb sort menu. 'iHerb default' keeps the order of the link (or Featured for keywords).

## `inStockOnly` (type: `boolean`):

Skip products that iHerb shows as out of stock. Skipped products are not charged.

## `onSaleOnly` (type: `boolean`):

Keep only products with a discount (list price above the current price). Tip: combine with 'Highest discount' sort to find deals fast.

## `includeDetails` (type: `boolean`):

On: every product from keywords and lists also gets description, ingredients, supplement facts (structured), suggested use, warnings, UPC, shipping weight, dimensions, best-by date, category paths, images and star breakdown. Charged as 'Product with details' instead of 'Product delivered'. Product links always include details.

## `country` (type: `string`):

The iHerb store whose prices, currency and stock you want. iHerb prices differ by country. Also accepts 'countryCode'.

## `currency` (type: `string`):

Three-letter code such as USD, EUR or GBP to override the country's own currency. Leave empty to use the currency of the chosen country. The currency iHerb actually answered with is in every row.

## `includeReviews` (type: `boolean`):

On: each product delivered is followed by its reviews (one row each, type 'review'): rating, title, text, English translation, language, date, verified purchase, helpful votes and photos. Reviewer names and countries are never collected. Charged per review.

## `maxReviewsPerProduct` (type: `integer`):

How many reviews to collect from each product when reviews are on (default 10). Popular products have thousands. Also accepts 'maxReviews'.

## `reviewsSort` (type: `string`):

Same options as the review list on the product page.

## `reviewsRating` (type: `string`):

Keep only reviews with this star rating, for example 1 star to study complaints.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default, at no extra price for you. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "vitamin c"
  ],
  "maxItems": 30,
  "sortBy": "default",
  "inStockOnly": false,
  "onSaleOnly": false,
  "includeDetails": false,
  "country": "US",
  "includeReviews": false,
  "maxReviewsPerProduct": 10,
  "reviewsSort": "most_relevant",
  "reviewsRating": "all",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "vitamin c"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/iherb-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["vitamin c"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/iherb-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "vitamin c"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/iherb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/iherb-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UmfWYPa0gRI7OyabP/builds/hsNtgFSnxGKOkAN2N/openapi.json
