# 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:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## iHerb Reviews Scraper

Extract detailed iHerb review data from product pages for market research, product quality analysis, and customer sentiment tracking. Collect clean, structured review records including ratings, review text, author context, language, and country signals.

---

### Features

- **Review-first extraction** — Collect individual product reviews instead of product listings.
- **Rich review fields** — Capture title, text, rating, helpful votes, verified purchase status, and review dates.
- **Reviewer context** — Gather reviewer nickname, profile link, country, and profile-level activity fields.
- **Image-aware filtering** — Optionally collect only reviews that include images.
- **Clean dataset output** — Empty and null-like fields are removed from each item for better downstream analysis.

---

### Use Cases

#### Product Quality Monitoring
Track customer feedback patterns over time for a specific supplement or wellness product. Detect recurring complaints or strong positive signals quickly.

#### Competitor Review Analysis
Collect review data from competitor products to compare sentiment, pain points, and satisfaction trends. Use this for product positioning and messaging.

#### Customer Voice Research
Build datasets of real customer language for copywriting, product development, and support training. Identify frequently mentioned benefits and objections.

#### Localized Market Insights
Analyze reviews by country and language to understand regional differences in customer perception.

#### BI and Reporting Pipelines
Feed review datasets into dashboards, notebooks, or internal tools for scoring, trend detection, and monthly reporting.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `productUrl` | String | No | Example iHerb product URL | Product URL to scrape reviews from. |
| `productId` | String | No | `""` | Optional numeric product ID override. If empty, it is extracted from `productUrl`. |
| `maxReviews` | Integer | No | `20` | Maximum number of reviews to collect. Use `0` for no explicit limit. |
| `pageSize` | Integer | No | `20` | Number of reviews requested per page. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": false }` | Proxy settings for your run environment. |

---

### Output Data

Each dataset item contains:

| Field | Type | Description |
|---|---|---|
| `reviewId` | String | Unique review identifier. |
| `productId` | String | iHerb product identifier. |
| `productUrl` | String | Product URL used for extraction. |
| `reviewTitle` | String | Review headline/title. |
| `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 verified. |
| `hasRewarded` | Boolean | Reward-related review 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 | Reviewer total review count. |
| `reviewerHelpfulCount` | Number | Reviewer helpful vote count. |
| `reviewerImageCount` | Number | Reviewer total image count. |
| `helpfulYes` | Number | Helpful upvotes on review. |
| `helpfulNo` | Number | Unhelpful votes on review. |
| `reviewImageCount` | Number | Number of images in this review. |
| `reviewImages` | Array | Review image URLs when available. |
| `hasReviewImages` | Boolean | Whether the review has images. |
| `sortId` | Number | Effective sort mode used in run. |
| `page` | Number | Source page number. |
| `scrapedAt` | String | Extraction timestamp in ISO format. |

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

---

### Usage Examples

#### Basic Review Extraction

```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

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

#### Messy URL Input (Auto Detection)

```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": "f7fcb72f-4091-4f6f-a2af-0e7b4f7afacf",
  "productId": "61839",
  "productUrl": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839",
  "reviewTitle": "Good",
  "reviewText": "This Bee Propolis is excellent! The quality is top-notch and very effective.",
  "rating": 5,
  "ratingRaw": 50,
  "verifiedPurchase": true,
  "hasRewarded": true,
  "postedDate": "2025-08-29T20:17:11.58Z",
  "postedDateLocalized": "Aug 29, 2025",
  "languageCode": "en-US",
  "languageName": "English",
  "countryCode": "BH",
  "countryName": "Bahrain",
  "customerNickname": "iHerb customer",
  "customerProfileLink": "5073043785990325831",
  "reviewerUsername": "5073043785990325831",
  "reviewerReviewCount": 37,
  "reviewerHelpfulCount": 3,
  "helpfulYes": 0,
  "helpfulNo": 0,
  "reviewImageCount": 0,
  "hasReviewImages": false,
  "sortId": 6,
  "page": 1,
  "scrapedAt": "2026-04-12T12:00:00.000Z"
}
```

***

### Tips for Best Results

#### Start small, then scale

- Run with `maxReviews: 20` first to validate output shape.
- Increase limits after confirming your filters and sort settings.

#### Keep pagination balanced

- Use `pageSize: 20` for stable runs.
- Increase gradually only when you need larger batches.

#### Use simple inputs

- Provide either `productUrl` or `productId`.
- Messy product URLs are normalized automatically.

#### Build recurring insights

- Schedule regular runs to monitor sentiment shifts.
- Compare review snapshots month-over-month.

***

### Integrations

Use review data with:

- **Google Sheets** — Quick review dashboards and shared reports.
- **Airtable** — Searchable review database for teams.
- **Looker Studio / BI tools** — Trend charts and scoring models.
- **Webhooks** — Trigger downstream workflows automatically.
- **Make** — No-code automation across apps.
- **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.

***

### Frequently Asked Questions

#### Does this actor collect product listings?

No. This actor is focused on product reviews only.

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

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

#### Can I use messy product URLs?

Yes. The actor auto-detects the product ID from messy URLs containing extra query parameters or surrounding text.

#### Why can some fields be missing for certain reviews?

Not every review includes all optional metadata, so records contain only available values.

#### Where are run statistics stored?

Run-level metrics are saved in key-value store record `statistics`.

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

No. Either one is enough.

***

### Support

For issues and feature requests, use Apify Console support channels.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Scheduling Runs](https://docs.apify.com/platform/schedules)

***

### Legal Notice

This actor is intended for legitimate data collection. You are responsible for compliance with website terms, local regulations, and applicable laws.

# 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

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "iHerb Reviews Scraper ⭐",
        "description": "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.",
        "version": "0.0",
        "x-build-id": "Ly5cdwmrdOLELordX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~iherb-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-iherb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/shahidirfan~iherb-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-iherb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/shahidirfan~iherb-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-iherb-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "productUrl": {
                        "title": "Product URL",
                        "type": "string",
                        "description": "iHerb product URL to scrape reviews from.",
                        "default": "https://pk.iherb.com/pr/california-gold-nutrition-bee-propolis-2x-concentrated-extract-500-mg-90-veggie-caps/61839"
                    },
                    "productId": {
                        "title": "Product ID (Optional)",
                        "type": "string",
                        "description": "Numeric iHerb product ID. If empty, it is extracted from productUrl.",
                        "default": ""
                    },
                    "maxReviews": {
                        "title": "Maximum Reviews",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape (0 = unlimited).",
                        "default": 20
                    },
                    "pageSize": {
                        "title": "Page Size",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of reviews fetched per API page.",
                        "default": 20
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings for reliable scraping on protected pages.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
