# Home Depot Reviews Scraper — Ratings, Text, Photos by URL or ID (`memo23/homedepot-reviews-scraper`) Actor

Scrape Home Depot product reviews by product URL or ID — star rating, title, full text, verified-purchaser flag, helpful votes, secondary ratings, reviewer, date, and photos. No login or cookies. JSON, CSV, Excel.

- **URL**: https://apify.com/memo23/homedepot-reviews-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 reviews

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/actors/running/actors-in-store.md#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

## Home Depot Reviews Scraper

Pull **every customer review for any Home Depot product** — star rating, title, full text, verified-purchaser flag, helpful votes, secondary ratings (Quality, Value…), reviewer, date, and photos. Paste a product URL or its ID and get one clean row per review. No login, no cookies, no proxy.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-homedepot-reviews.png)

### Why Use This Scraper?

- **The whole review history** — a product with thousands of reviews paginates in full; cap it with `maxReviewsPerProduct` when you only need a sample.
- **Verified-purchaser signal** — each review is flagged `isVerifiedPurchaser`, so you can weight or filter for confirmed buyers.
- **Secondary ratings** — the sub-scores shoppers leave (Quality, Value, and so on) come through as a labelled object, not just the headline star rating.
- **Photos included** — customer-uploaded review images arrive as direct URLs.
- **Ratings-only reviews too** — HD has many star-only reviews with no text; those are kept (with `text: null`) so your rating distribution stays accurate.
- **Honest failures** — an invalid product ID or one with no reviews yields a single error item, and the run still succeeds.

### Overview

The Actor takes a list of Home Depot products and returns their reviews as structured rows, one review per row, with the product name and brand attached. It reads public review data only and needs no Home Depot account.

### Supported Inputs

| Input form | Example |
|---|---|
| Product URL | `https://www.homedepot.com/p/RYOBI-ONE-HP-18V-…-PBLDD01B/314109432` |
| Bare product ID | `314109432` |

The numeric ID at the end of a product URL is the identifier; paste the whole URL or just the number, and mix both freely in one run.

### Use Cases

- **Product research** — read what buyers actually say before sourcing or reselling a SKU.
- **Competitor & brand monitoring** — track sentiment and rating trends on your own and rival products.
- **Voice-of-customer analysis** — feed real review text into sentiment models, topic clustering, or an LLM summary.
- **Quality signals** — spot recurring complaints (secondary ratings + text) across a product line.
- **Review datasets** — build a labelled ratings/text corpus for training or analytics.

### How It Works

1. **Resolve** — each URL or ID is reduced to the numeric product identifier.
2. **Fetch** — reviews come from the product's review provider on a plain, open host (no Akamai, no bot wall), so no proxy or browser is needed.
3. **Paginate** — reviews are walked page by page (100 per page) up to your cap or the full count.
4. **Deliver** — one row per review, with the product name and brand, written to the dataset.

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `products` | array | — (required) | Home Depot product URLs or numeric IDs. |
| `maxReviewsPerProduct` | integer | all | Cap reviews collected per product. Leave empty for every review. |
| `sort` | select | Newest first | `SubmissionTime`, `Rating`, or `Helpfulness`, ascending or descending. |

Example input:

```json
{
    "products": [
        "https://www.homedepot.com/p/RYOBI-ONE-HP-18V-Brushless-Cordless-1-2-in-Drill-Driver-Tool-Only-PBLDD01B/314109432",
        "205216326"
    ],
    "maxReviewsPerProduct": 500,
    "sort": "SubmissionTime:desc"
}
```

### Output Overview

One row per review. A product with 1,300 reviews produces up to 1,300 rows (or your cap), each carrying the product name and brand. A product with no reviews, or an invalid ID, produces a single error item explaining why — the run still finishes successfully.

### Output Samples

Review row:

```json
{
    "reviewId": "306403962",
    "productId": "314109432",
    "productName": "ONE+ HP 18V Brushless Cordless 1/2 in. Drill/Driver (Tool Only)",
    "productBrand": "RYOBI",
    "productUrl": "https://www.homedepot.com/p/314109432",
    "rating": 5,
    "title": "Great upgrade",
    "text": "Plenty of torque for everything around the house…",
    "isRecommended": true,
    "isVerifiedPurchaser": true,
    "isEarlyReviewer": false,
    "userNickname": "Mike",
    "userLocation": "Texas",
    "submittedAt": "2026-09-05T18:22:10.000+00:00",
    "helpfulPositive": 4,
    "helpfulNegative": 0,
    "secondaryRatings": { "Quality": 5, "Value": 4 },
    "photos": ["https://…/photo.jpg"],
    "syndicated": false,
    "scrapedAt": "2026-09-07T07:02:00.000Z"
}
```

Error item:

```json
{
    "product": "not-a-real-product",
    "error": "invalid_product",
    "message": "\"not-a-real-product\" is not a Home Depot product URL or numeric product ID."
}
```

### Key Output Fields

| Field | Meaning |
|---|---|
| `rating` | Star rating, 1–5. |
| `isVerifiedPurchaser` | `true` when the reviewer's purchase was confirmed. |
| `isEarlyReviewer` | `true` for early-reviewer-program reviews. |
| `isRecommended` | Reviewer's would-recommend answer (`true`/`false`/`null`). |
| `secondaryRatings` | Sub-scores as `{ label: value }`, e.g. Quality / Value. |
| `helpfulPositive` / `helpfulNegative` | Helpful / not-helpful vote counts. |
| `photos` | Customer-uploaded image URLs. |
| `syndicated` | `true` when the review is syndicated from another retailer's site. |

### FAQ

**Do I need to log in or use a proxy?**
No. Reviews are read from an open host, so there is no bot wall, login, or proxy to configure.

**Does it get price and stock too?**
No — this Actor is reviews only. Home Depot's price and stock data sits behind a heavier defense and is handled separately.

**How many reviews can I get?**
As many as the product has. Use `maxReviewsPerProduct` to cap cost on products with thousands.

**Why do some reviews have no text?**
Home Depot lets shoppers leave a star rating without writing anything. Those rating-only reviews are kept with `text: null` so your rating counts stay correct.

**What does it cost?**
Pay per result — one charge per review returned, plus a small per-run start fee. An invalid or review-less product costs only the start fee.

### Support

Found a bug or need a field added? Open an issue on the Actor's **Issues** tab in Apify Console, or email <muhamed.didovic@gmail.com>.

### Additional Services

Need a custom retail or review scraper, an enrichment pipeline, or a private version of this Actor? Custom builds available — reach out at <muhamed.didovic@gmail.com>.

### Explore More Scrapers

- **[Amazon Reviews Scraper](https://apify.com/memo23/apify-amazon-reviews-cheerio)** — customer reviews from Amazon product pages
- **[Etsy Scraper](https://apify.com/memo23/etsy-scraper)** — product listings and shop data from Etsy
- **[Google Play Scraper](https://apify.com/memo23/google-play-scraper)** — app listings, ratings, and reviews

Browse the full portfolio: [muhamed-didovic.github.io](https://muhamed-didovic.github.io/)

### 🤖 For AI Agents & LLM Apps

**Purpose:** Return all public reviews for Home Depot products, one review per row, with product name/brand.

**Minimal tested input:**

```json
{ "products": ["314109432"], "maxReviewsPerProduct": 100 }
```

**Output:** array of flat objects, one per review. Fields: `reviewId`, `productId`, `productName`, `productBrand`, `productUrl`, `rating`, `title`, `text`, `isRecommended`, `isVerifiedPurchaser`, `isEarlyReviewer`, `userNickname`, `userLocation`, `submittedAt`, `updatedAt`, `helpfulPositive`, `helpfulNegative`, `secondaryRatings` (object), `photos` (array), `syndicated`, `scrapedAt`.

**Behavior & billing:** Pay-per-event — one charge per review row. Reviews paginate 100/page up to `maxReviewsPerProduct` or the full count. Invalid or review-less products and unresolvable inputs yield one error item each (`error`, `message`) instead of failing the run. No login/cookies/proxy required.

### ⚠️ Disclaimer

This Actor accesses publicly available product-review data for legitimate research, market-intelligence, and business-analysis purposes. It does not log in, bypass authentication, or access private content. Use of this Actor must comply with Home Depot's Terms of Service and all applicable laws, including data-protection regulations (GDPR, CCPA, etc.). The authors are not responsible for any misuse. Users must:

- Respect rate limits and avoid overloading the source's infrastructure
- Not use scraped data to violate user privacy or platform terms
- Process any personal data only with a lawful basis and in compliance with their jurisdiction
- Not republish scraped content in violation of copyright

We do not store scraped data; the Actor returns it directly to your Apify dataset for your authorized use. The Home Depot is a trademark of Home Depot Product Authority, LLC; this Actor is not affiliated with or endorsed by Home Depot.

### SEO Keywords

home depot reviews scraper, homedepot review scraper, scrape home depot reviews, home depot product reviews, home depot ratings scraper, homedepot reviews api, home depot review export, home depot reviews to csv, home depot customer reviews, product review scraper, home depot sentiment analysis, home depot review data, scrape homedepot ratings, home depot verified purchaser reviews, home depot review photos, retail review scraper, home depot voice of customer, home depot review dataset, apify home depot scraper

# Actor input Schema

## `products` (type: `array`):

Home Depot product URLs or numeric product IDs to scrape reviews for. A product URL ends in its numeric ID (e.g. `https://www.homedepot.com/p/.../318066112`); paste the URL or just the ID. Mix freely.

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

Cap the number of reviews collected per product. Leave empty to collect every review.

## `sort` (type: `string`):

Order reviews are returned in.

## Actor input object example

```json
{
  "products": [
    "https://www.homedepot.com/p/RYOBI-ONE-HP-18V-Brushless-Cordless-1-2-in-Drill-Driver-Tool-Only-PBLDD01B/314109432"
  ],
  "sort": "SubmissionTime:desc"
}
```

# Actor output Schema

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

All review rows in the default dataset.

# 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 = {
    "products": [
        "https://www.homedepot.com/p/RYOBI-ONE-HP-18V-Brushless-Cordless-1-2-in-Drill-Driver-Tool-Only-PBLDD01B/314109432"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/homedepot-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 = { "products": ["https://www.homedepot.com/p/RYOBI-ONE-HP-18V-Brushless-Cordless-1-2-in-Drill-Driver-Tool-Only-PBLDD01B/314109432"] }

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

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

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

```

## CLI example

```bash
echo '{
  "products": [
    "https://www.homedepot.com/p/RYOBI-ONE-HP-18V-Brushless-Cordless-1-2-in-Drill-Driver-Tool-Only-PBLDD01B/314109432"
  ]
}' |
apify call memo23/homedepot-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

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