# B\&H Reviews Scraper (`shahidirfan/b-h-reviews-scraper`) Actor

Extract product reviews from B\&H Photo Video at scale. Automatically collect customer ratings, feedback, and detailed reviews for competitive analysis, market research, and sentiment tracking. Perfect for ecommerce intelligence and data-driven decision making.

- **URL**: https://apify.com/shahidirfan/b-h-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

## B&H Reviews Scraper

Collect complete customer review datasets for B&H products using a product URL or product ID. Extract ratings, review text, reviewer metadata, client responses, and product context in a structured format ready for analysis. Ideal for e-commerce research, product intelligence, and sentiment monitoring.

### Features

- **Review Coverage at Scale** - Collect large review sets with configurable limits
- **Flexible Product Input** - Start with either a B&H product URL or direct product ID
- **Pagination Support** - Automatically collects review pages until your target is reached
- **Stable Internal Pagination** - Uses production-safe internal paging defaults
- **Rich Review Metadata** - Includes badges, timestamps, media, and moderation fields
- **Cleaner Datasets** - Removes null and empty values for denser output records

### Use Cases

#### Product Research
Understand real customer experiences before purchasing or recommending equipment. Identify recurring strengths and weaknesses across popular products.

#### Competitive Intelligence
Compare user sentiment between similar products and bundles. Track how customer feedback shifts after product launches or updates.

#### Sentiment and Voice-of-Customer Analysis
Build review corpora for NLP workflows, keyword extraction, and sentiment scoring. Separate actionable feedback from generic comments.

#### Marketplace and Catalog Enrichment
Attach review insights to internal catalogs and dashboards. Use ratings and review themes to improve merchandising decisions.

#### Customer Support Insights
Identify recurring confusion points, setup issues, and post-purchase concerns. Prioritize documentation and support responses based on real feedback.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `productUrl` | String | No | Example B&H review URL | Product URL used to detect product ID |
| `productId` | String | No | `1935439` | Numeric B&H product ID |
| `results_wanted` | Integer | No | `20` | Maximum reviews to collect (`0` = no limit) |

---

### Output Data

Each dataset item may include:

| Field | Type | Description |
|-------|------|-------------|
| `review_id` | String | Unique review ID |
| `content_id` | String | Review content identifier |
| `product_id` | String | Product ID linked to the review |
| `input_product_id` | String | Input product ID used for run |
| `input_product_url` | String | Input product URL used for run |
| `product_name` | String | Product name |
| `product_brand` | String | Product brand |
| `product_family` | String | Product family/category |
| `product_page_url` | String | Product page URL |
| `product_image_url` | String | Product image URL |
| `title` | String | Review title |
| `review_text` | String | Main review text |
| `rating` | Number | Review rating |
| `rating_range` | Number | Maximum rating scale |
| `submission_time` | String | Submission timestamp |
| `last_moderated_time` | String | Last moderation timestamp |
| `last_modification_time` | String | Last update timestamp |
| `moderation_status` | String | Moderation state |
| `user_nickname` | String | Reviewer nickname |
| `user_location` | String | Reviewer location if available |
| `author_id` | String | Reviewer author ID |
| `source_client` | String | Client source name |
| `campaign_id` | String | Campaign identifier |
| `locale` | String | Content locale |
| `is_featured` | Boolean | Featured review flag |
| `is_ratings_only` | Boolean | Ratings-only flag |
| `is_recommended` | Boolean | Recommendation flag |
| `is_syndicated` | Boolean | Syndication flag |
| `badges` | Array | Review badges |
| `client_responses` | Array | Brand/client responses |
| `photos` | Array | Review photo metadata |
| `videos` | Array | Review video metadata |
| `_source` | String | Source marker |

---

### Usage Examples

#### Basic Run with Product URL

```json
{
    "productUrl": "https://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
    "results_wanted": 50
}
````

#### Run with Product ID

```json
{
    "productId": "1935439",
    "results_wanted": 100
}
```

#### Full Collection with Safety Cap

```json
{
    "productId": "1935439",
    "results_wanted": 0
}
```

***

### Sample Output

```json
{
    "review_id": "180995929",
    "content_id": "c48c8750-7ef8-5813-b984-4599bd17b79c",
    "product_id": "1935819",
    "input_product_id": "1935439",
    "input_product_url": "https://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
    "product_name": "a7 V Mirrorless Camera with 28-70mm II Lens",
    "title": "The BEST hybrid camera",
    "review_text": "This camera is a great hybrid camera for sports and lifestyle! The lens is also especially sharp for a kit lens, the only downside is the variable aperture.",
    "rating": 5,
    "submission_time": "2026-04-13T23:27:13+05:00",
    "user_nickname": "Jackson",
    "moderation_status": "APPROVED",
    "badges": [
        {
            "id": "verifiedPurchaser",
            "type": "Custom",
            "content_type": "REVIEW"
        }
    ],
    "_source": "api.bazaarvoice.com"
}
```

***

### Tips for Best Results

#### Use Product ID for Stability

- Product IDs are the most stable input format
- URLs are convenient and automatically parsed

#### Start Small, Then Scale

- Begin with `results_wanted: 20` for quick validation
- Increase limits after verifying output shape

#### Internal Query Behavior

- The actor uses internal API defaults for page size, page cap, and sorting
- This keeps input simple and stable across local and cloud runs

***

### Integrations

Connect your output with:

- **Google Sheets** - Review tracking and reporting
- **Airtable** - Searchable review databases
- **BigQuery** - Large-scale analysis pipelines
- **Webhooks** - Real-time workflow automation
- **Make** - Automated business process flows
- **Zapier** - Trigger downstream actions

#### Export Formats

- **JSON** - Developer-friendly pipelines
- **CSV** - Spreadsheet analysis
- **Excel** - Business reporting
- **XML** - Legacy integrations

***

### Frequently Asked Questions

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

No. Provide either one. If both are provided, product ID is used directly.

#### Can I fetch all available reviews?

Yes. Set `results_wanted` to `0`.

#### Why do some fields appear only on some reviews?

Some metadata is optional and depends on what was submitted for that specific review.

#### Can I control the review sort mode?

Sort mode is handled internally by the actor to keep the input simple.

#### Does the output remove empty values?

Yes. Empty and null values are removed to keep records cleaner.

***

### Support

For issues or feature requests, use the Apify Console support channels.

#### Resources

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

***

### Legal Notice

This actor is intended for legitimate data collection and analysis. Users are responsible for complying with applicable laws and website terms.

# Actor input Schema

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

B\&H product URL. The actor extracts the product ID from this URL.

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

Numeric B\&H product ID. If set, this value is used directly.

## `results_wanted` (type: `integer`):

Maximum number of reviews to collect. Use 0 (or leave empty in API input) for no limit.

## Actor input object example

```json
{
  "productUrl": "https://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
  "productId": "1935439",
  "results_wanted": 20
}
```

# Actor output Schema

## `overview` (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 = {
    "productUrl": "https://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
    "productId": "1935439",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/b-h-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://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
    "productId": "1935439",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/b-h-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://www.bhphotovideo.com/c/product/1935439-REG/sony_a7_v_mirrorless_camera.html/reviews",
  "productId": "1935439",
  "results_wanted": 20
}' |
apify call shahidirfan/b-h-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "B&H Reviews Scraper",
        "description": "Extract product reviews from B&H Photo Video at scale. Automatically collect customer ratings, feedback, and detailed reviews for competitive analysis, market research, and sentiment tracking. Perfect for ecommerce intelligence and data-driven decision making.",
        "version": "0.0",
        "x-build-id": "GHOVYq25Yl2Y5Jf6i"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~b-h-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-b-h-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~b-h-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-b-h-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~b-h-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-b-h-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": "B&H product URL. The actor extracts the product ID from this URL."
                    },
                    "productId": {
                        "title": "Product ID",
                        "type": "string",
                        "description": "Numeric B&H product ID. If set, this value is used directly."
                    },
                    "results_wanted": {
                        "title": "Maximum number of reviews",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of reviews to collect. Use 0 (or leave empty in API input) for no limit.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
