# IHerb Product Extractor (`kawsar/iherb-product-extractor`) Actor

iHerb scraper that turns search results into structured product data: names, brands, prices, discounts, ratings, and stock status. Search by keyword or URL, export to JSON or CSV, and track prices without copying anything by hand.

- **URL**: https://apify.com/kawsar/iherb-product-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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 Product Extractor

iHerb Product Extractor scrapes product listings from iHerb search results and turns them into clean, structured data. Give it a keyword like "Sesame Oil" or a full iHerb search URL, and it returns every matching product with its name, brand, price, discount, rating, review count, stock status, and image. Built-in bypass infrastructure handles the anti-bot protection for you, so there is nothing to configure.

### What you get for each product

| Field | Example |
|---|---|
| productName | NOW Foods, Solutions, Sesame Seed Oil, 8 fl oz (237 ml) |
| brandName | NOW Foods |
| price | 11.01 |
| priceDisplay | $11.01 |
| originalPrice | 14.39 (equals price when there is no discount) |
| discountPercent | 25 (0 when the product is not on sale) |
| rating | 4.6 |
| reviewCount | 2722 |
| recentActivity | 300+ sold in 30 days |
| inStock | true |
| isSponsored | false |
| productUrl | https://www.iherb.com/pr/now-foods-solutions-sesame-seed-oil-8-fl-oz-237-ml/66293 |
| imageUrl | https://cloudinary.images-iherb.com/... |

Each record also includes the search term it came from, its page number and position in the results, the iHerb product ID and part number, and a timestamp.

### How to use it

1. Enter one or more search keywords, or paste full iHerb search URLs.
2. Set how many products you want (default 100, up to 1000 per run).
3. Run the actor. Results land in the dataset, ready to export as JSON, CSV, or Excel.

The actor paginates through search results automatically. iHerb shows 48 products per page, so a 500-item run walks through 11 pages on its own.

### Example input

```json
{
    "keywords": ["Sesame Oil", "Vitamin D3"],
    "maxItems": 200
}
````

### Example output

```json
{
    "searchTerm": "Sesame Oil",
    "pageNumber": 1,
    "position": 1,
    "productId": "66293",
    "partNumber": "NOW-07724",
    "productName": "NOW Foods, Solutions, Sesame Seed Oil, 8 fl oz (237 ml)",
    "brandName": "NOW Foods",
    "productUrl": "https://www.iherb.com/pr/now-foods-solutions-sesame-seed-oil-8-fl-oz-237-ml/66293",
    "imageUrl": "https://cloudinary.images-iherb.com/image/upload/f_auto,q_auto:eco/images/now/now07724/u/20.jpg",
    "price": 11.01,
    "priceDisplay": "$11.01",
    "originalPrice": 11.01,
    "originalPriceDisplay": "$11.01",
    "discountPercent": 0,
    "rating": 4.6,
    "reviewCount": 2722,
    "recentActivity": "300+ sold in 30 days",
    "inStock": true,
    "isSponsored": false,
    "scrapedAt": "2026-07-05T12:00:00+00:00",
    "error": null
}
```

### What people use it for

**Price monitoring.** Track how supplement prices move over time, catch discounts the moment they appear, and compare list prices against sale prices.

**Competitor research.** See which brands rank first for a keyword, which listings are sponsored, and how many reviews the top sellers have accumulated.

**SEO and content work.** Pull real product names, ratings, and prices to build comparison pages, buying guides, or affiliate content backed by current data instead of guesses.

**Catalog building.** Export thousands of products with images and part numbers to seed or enrich your own product database.

### Tips

- Keywords and URLs can be mixed in one run. Duplicates are removed automatically.
- Sponsored placements are flagged with `isSponsored`, so you can filter them out of ranking analyses.
- If a search returns nothing, the actor saves a single record with an `error` note instead of failing the whole run, so batch runs keep going.
- Schedule the actor daily or weekly on Apify to build a price history without any extra code.

### Is this legal?

The actor collects only publicly visible product information, the same data anyone sees in a browser. It does not touch accounts, personal data, or anything behind a login. Still, check the terms of service and your local regulations before using scraped data commercially.

# Actor input Schema

## `keywords` (type: `array`):

Product search terms, one per line. Each keyword runs as a separate iHerb search (for example: Sesame Oil, Vitamin C, Collagen Peptides).

## `searchUrls` (type: `array`):

Full iHerb search or category URLs to scrape instead of (or in addition to) keywords. Example: https://www.iherb.com/search?kw=vitamin+d3

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

Maximum number of products to save per run, across all searches. Pagination stops once this limit is reached.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "keywords": [
    "Sesame Oil"
  ],
  "maxItems": 40,
  "requestTimeoutSecs": 30
}
```

# 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 = {
    "keywords": [
        "Sesame Oil"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/iherb-product-extractor").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 = { "keywords": ["Sesame Oil"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/iherb-product-extractor").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 '{
  "keywords": [
    "Sesame Oil"
  ]
}' |
apify call kawsar/iherb-product-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "IHerb Product Extractor",
        "description": "iHerb scraper that turns search results into structured product data: names, brands, prices, discounts, ratings, and stock status. Search by keyword or URL, export to JSON or CSV, and track prices without copying anything by hand.",
        "version": "0.0",
        "x-build-id": "SpEoDgfpJfLUlzMuF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~iherb-product-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-iherb-product-extractor",
                "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/kawsar~iherb-product-extractor/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-iherb-product-extractor",
                "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/kawsar~iherb-product-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-iherb-product-extractor",
                "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": {
                    "keywords": {
                        "title": "Search keywords",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Product search terms, one per line. Each keyword runs as a separate iHerb search (for example: Sesame Oil, Vitamin C, Collagen Peptides).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchUrls": {
                        "title": "iHerb search URLs",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Full iHerb search or category URLs to scrape instead of (or in addition to) keywords. Example: https://www.iherb.com/search?kw=vitamin+d3",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of products to save per run, across all searches. Pagination stops once this limit is reached.",
                        "default": 40
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds.",
                        "default": 30
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
