# iHerb Reviews Scraper ⭐ (`shahidirfan/iherb-reviews-scraper`) Actor

Extract product reviews, ratings & customer feedback from iHerb at scale. Ideal for competitive intelligence, market research & pricing analysis. Monitor competitors effortlessly & gain actionable ecommerce insights.

- **URL**: https://apify.com/shahidirfan/iherb-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 17 total users, 2 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does iHerb Reviews Scraper do?

iHerb Reviews Scraper collects customer reviews from iHerb product pages and delivers them as structured data for product analysis, sentiment tracking, and market research. Provide a product URL or product ID, set a review limit, and the Actor returns ratings, review text, reviewer profiles, language and country context, and image attachments in a clean dataset.

### Why use iHerb Reviews Scraper?

- **Structured review datasets** - Collect ratings, review text, helpful votes, verified purchase status, reviewer badges, and profile activity fields without manual copy-paste.
- **Reviewer context included** - Each record carries reviewer country, language, badge level, review count, helpful count, image count, and profile image when available.
- **Multi-purpose output** - Export results to JSON, CSV, Excel, or XML for dashboards, BI tools, AI training, or competitive reports.
- **Duplicate-safe collection** - Duplicate review IDs and records missing core content are skipped automatically.
- **Image-aware collection** - Optionally limit results to reviews that include images.

### What data can you extract from iHerb?

| Field | Description |
|-------|-------------|
| `rating` | Star rating on a 1-5 scale |
| `reviewTitle` | Review headline |
| `reviewText` | Full review body |
| `verifiedPurchase` | Whether the reviewer purchased the product |
| `helpfulYes` / `helpfulNo` | Helpful and unhelpful vote counts |
| `languageCode` / `languageName` | Review language context |
| `countryCode` / `countryName` | Reviewer country |
| `customerNickname` | Reviewer public nickname |
| `reviewerBadgeName` / `reviewerBadgeTitle` | Contributor badge level |
| `reviewerReviewCount` / `reviewerHelpfulCount` | Reviewer activity metrics |
| `postedDate` | ISO review date |
| `reviewImages` | Attached image URLs |
| `reviewerProfileImage` | Reviewer profile picture URL |

### How to use iHerb Reviews Scraper

1. Open the Actor on Apify Store.
2. Add an iHerb product URL or numeric product ID.
3. Set the maximum number of reviews to collect.
4. Optionally set sort order, language, country, or image-only filters.
5. Run the Actor.
6. Download the dataset or connect it to your workflow.

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `productUrl` | String | No | Example iHerb product URL | iHerb product URL. The product ID is extracted automatically from supported URL formats. |
| `productId` | String | No | `""` | Numeric iHerb product ID. Takes priority over URL-based extraction when both are provided. |
| `maxReviews` | Integer | No | `20` | Maximum number of reviews to collect. Use `0` for no limit. |
| `pageSize` | Integer | No | `20` | Reviews fetched per API page. |
| `sortBy` | String | No | `mostRecent` | Sort mode: `mostRecent`, `newest`, `oldest`, `helpful`, `highestRating`, or `lowestRating`. |
| `sortId` | Integer | No | `6` | Numeric sort ID override when `sortBy` is not sufficient. |
| `languageCode` | String | No | `en-US` | Language filter for reviews (IETF language tag). |
| `countryCode` | String | No | `(empty)` | Country filter for reviews (ISO country code). |
| `withImagesOnly` | Boolean | No | `false` | When `true`, only collect reviews that include images. |
| `proxyConfiguration` | Object | No | Apify Proxy enabled | Proxy settings for your run environment. |

### Output Data

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | String | Unique review identifier |
| `productId` | String | iHerb product identifier |
| `productUrl` | String | Product URL used for extraction |
| `reviewTitle` | String | Review headline |
| `reviewText` | String | Full review text |
| `rating` | Number | Review rating on a 1-5 scale |
| `ratingRaw` | Number | Raw rating value from source format |
| `verifiedPurchase` | Boolean | Whether the review is from a verified purchase |
| `hasRewarded` | Boolean | Reward-related flag when available |
| `postedDate` | String | ISO review date |
| `postedDateLocalized` | String | Localized display date |
| `languageCode` | String | Review language code |
| `languageName` | String | Review language label |
| `countryCode` | String | Reviewer country code |
| `countryName` | String | Reviewer country name |
| `customerNickname` | String | Reviewer nickname |
| `customerProfileLink` | String | Reviewer profile link token |
| `reviewerUsername` | String | Reviewer username |
| `reviewerDisplayName` | String | Reviewer display name |
| `reviewerReviewCount` | Number | Total reviews by this reviewer |
| `reviewerHelpfulCount` | Number | Total helpful votes for this reviewer |
| `reviewerImageCount` | Number | Total images by this reviewer |
| `reviewerAnswerCount` | Number | Total Q\&A answers by this reviewer |
| `reviewerBadgeName` | String | Contributor badge name |
| `reviewerBadgeTitle` | String | Contributor badge display title |
| `reviewerProfileImage` | String | Reviewer profile image URL |
| `helpfulYes` | Number | Helpful upvotes on this review |
| `helpfulNo` | Number | Unhelpful votes on this review |
| `reviewImageCount` | Number | Number of images in this review |
| `reviewImages` | Array | Review image URLs |
| `hasReviewImages` | Boolean | Whether the review has images |
| `sortId` | Number | Sort mode used in the run |
| `page` | Number | Source page number |
| `scrapedAt` | String | Extraction timestamp in ISO format |

Run statistics are saved in the default key-value store under `statistics`.

### Usage Examples

#### Basic review extraction

Collect the first set of reviews from a product page:

```json
{
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "maxReviews": 20
}
```

#### Product ID only

Run with just the numeric product ID when you do not have a full URL:

```json
{
  "productId": "61839",
  "maxReviews": 100
}
```

#### Filtered by language and country

Collect English reviews from a specific country with the most helpful sort order:

```json
{
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "maxReviews": 50,
  "sortBy": "helpful",
  "languageCode": "en-US",
  "countryCode": "US"
}
```

#### Image-only reviews

Collect only reviews that include customer images:

```json
{
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "maxReviews": 30,
  "withImagesOnly": true
}
```

#### Messy URL with auto detection

The Actor extracts the product ID from URLs that contain extra query parameters or surrounding text:

```json
{
  "productUrl": "Check this link: https://www.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839?rcode=ABC123&utm_source=test",
  "maxReviews": 50
}
```

### Sample Output

```json
{
  "reviewId": "e825817a-b0fa-4f2e-81ee-dbe559cd8743",
  "productId": "61839",
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "reviewTitle": "Great",
  "reviewText": "The propolis extract has a rich, resinous taste and feels potent yet gentle in its effect.",
  "rating": 5,
  "ratingRaw": 50,
  "verifiedPurchase": true,
  "hasRewarded": false,
  "postedDate": "2026-04-15T12:48:40.121Z",
  "postedDateLocalized": "Apr 15, 2026",
  "languageCode": "en-US",
  "languageName": "English",
  "countryCode": "MD",
  "countryName": "Moldova, Republic of",
  "customerNickname": "Ina",
  "customerProfileLink": "5238922849634942675",
  "reviewerUsername": "5238922849634942675",
  "reviewerDisplayName": "Ina",
  "reviewerReviewCount": 205,
  "reviewerHelpfulCount": 15,
  "reviewerImageCount": 0,
  "reviewerAnswerCount": 9,
  "reviewerBadgeName": "Silver",
  "reviewerBadgeTitle": "Silver contributor",
  "reviewerProfileImage": "https://ugc-images.images-iherb.com/ugc/20260107/86ebf71b-45bc-400a-869a-129d26a7434d/l.jpeg",
  "helpfulYes": 0,
  "helpfulNo": 0,
  "reviewImageCount": 0,
  "hasReviewImages": false,
  "sortId": 6,
  "page": 1,
  "scrapedAt": "2026-07-08T05:48:36.832Z"
}
```

### Tips for Best Results

- Start with `maxReviews: 20` to validate the output shape before scaling up.
- Use `pageSize: 20` for stable runs. Increase gradually only when you need larger batches.
- Provide either `productUrl` or `productId`. Both are not required.
- Messy product URLs with extra query parameters or surrounding text are normalized automatically.
- Schedule regular runs to monitor sentiment shifts and compare review snapshots over time.
- Some fields may be empty when the source page does not publish that information. Check multiple results before assuming the Actor failed.

### Integrations

- **Google Sheets** - Send review data to spreadsheets for shared analysis.
- **Airtable** - Build a searchable review database for your team.
- **Looker Studio / BI tools** - Create trend charts and scoring models.
- **Webhooks** - Trigger downstream workflows after each run.
- **Make** - Connect results to no-code automations.
- **Zapier** - Send reviews into CRM, Slack, or email flows.

#### Export Formats

- **JSON** - Flexible for apps and pipelines.
- **CSV** - Spreadsheet-friendly tabular export.
- **Excel** - Business-ready reporting format.
- **XML** - Compatibility with legacy systems.
- **API** - Access datasets programmatically from your own systems.

### Frequently Asked Questions

#### Does this Actor collect product listings?

No. This Actor collects product reviews only. For product data, use an iHerb product scraper.

#### How many reviews can I collect in one run?

Set `maxReviews` up to `10000`, or use `0` for no explicit limit.

#### Can I use messy product URLs?

Yes. The Actor auto-detects the product ID from URLs with extra query parameters, tracking codes, or surrounding text.

#### Why are some fields missing for certain reviews?

Not every review includes all optional metadata. Records contain only available values. Empty and null fields are removed from the output.

#### Can I filter reviews by language or country?

Yes. Use `languageCode` and `countryCode` to narrow results by locale.

#### Can I sort reviews by rating or date?

Yes. Use `sortBy` with values such as `mostRecent`, `oldest`, `helpful`, `highestRating`, or `lowestRating`.

#### Do I need both product ID and product URL?

No. Either one is enough. When both are provided, `productId` takes priority.

#### Where are run statistics stored?

Run-level metrics are saved in the default key-value store under the key `statistics`.

### Related Actors

- [Flipkart Reviews Scraper](https://apify.com/shahidirfan/flipkart-reviews-scraper)
- [Walmart Reviews Scraper](https://apify.com/shahidirfan/walmart-reviews-scraper)
- [Target Reviews Scraper](https://apify.com/shahidirfan/target-reviews-scraper)
- [B\&H Reviews Scraper](https://apify.com/shahidirfan/b-h-reviews-scraper)

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available iHerb product pages. Users are responsible for using the data responsibly and complying with applicable laws and website terms.

# Actor input Schema

## `productUrl` (type: `string`):

iHerb product URL to scrape reviews from.

## `productId` (type: `string`):

Numeric iHerb product ID. If empty, it is extracted from productUrl.

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape (0 = unlimited).

## `pageSize` (type: `integer`):

Number of reviews fetched per API page.

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

Proxy settings for reliable scraping on protected pages.

## Actor input object example

```json
{
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "productId": "",
  "maxReviews": 20,
  "pageSize": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

Complete product reviews with all details

## `reviewsCSV` (type: `string`):

Export reviews in CSV format

## `reviewsJSON` (type: `string`):

Export reviews in JSON format

## `statistics` (type: `string`):

Scraping statistics and summary

# 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 = {
    "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
    "productId": "",
    "maxReviews": 20,
    "pageSize": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/iherb-reviews-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 = {
    "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
    "productId": "",
    "maxReviews": 20,
    "pageSize": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "productId": "",
  "maxReviews": 20,
  "pageSize": 20
}' |
apify call shahidirfan/iherb-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/iherb-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UNiFp74bVEaDVH46B/builds/98StCgGY5R0uZgHsP/openapi.json
