# Product Hunt Reviews Scraper (Cheap) (`data_api/product-hunt-reviews-scraper-cheap`) Actor

Product Hunt Reviews Scraper collects user ratings, written feedback, and reviewer metadata from any Product Hunt product page, so you can track sentiment and run competitive analysis without manual work.

- **URL**: https://apify.com/data\_api/product-hunt-reviews-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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

## Product Hunt Reviews Scraper

![Product Hunt Reviews Scraper](cover.jpg)

Product Hunt reviews tell you what real users love and hate about a tool, but reading them one card at a time and copying notes into a sheet does not scale. This scraper does the copying for you. Give it a product handle and it walks every review page, pulling the reviewer, the star score, the "what's great" and "what needs improvement" text, the comparison notes, helpful votes, view counts, and post date into one tidy row per review. Run a single product or queue a whole batch.

### What you get

Every review becomes one row with the same shape, so your columns line up when you drop the results into a sheet or database. Fields you can read are returned as `null` when Product Hunt does not show them. Three groups of data per review:

- **The review** — `starRating`, `likedText`, `dislikedText`, `comparisonText`, `helpfulCount`, `viewCount`, `postedAgo`
- **The reviewer** — `authorName`, `authorProfileUrl`, `authorAvatarUrl`, `authorReviewsTotal`
- **The product** — `productTitle`, `productHandle`, `reviewsPageUrl`, `reviewLink`, plus `reviewKey` and `collectedAt`

### Quick start

1. Hit **Try for free** and open the input form.
2. Type one or more Product Hunt handles into **Product handles** (one per line, e.g. `linear`).
3. Set **Order reviews by** and **Limit to reviewer group** if you want to narrow the pull.
4. Press **Start**, then export the rows as JSON, CSV, Excel, or XML once the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Competitor research** — pull reviews for rival products and line up what users praise and complain about
- **Product feedback mining** — read the `dislikedText` field across hundreds of reviews to find recurring gripes
- **Sentiment tracking** — re-run on a schedule and watch star scores move as a product ships updates
- **Marketing and social proof** — gather strong quotes from high-rated reviews for landing pages and decks
- **Market analysis** — compare ratings and review volume across a category to see who is winning
- **Lead research** — spot reviewers who flagged a competitor and understand the pain behind a low score

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `productHandles` | array of strings | Yes | Product Hunt handles to scrape reviews for, one per line. Example: `slack`, `linear`, `raycast`. |
| `reviewOrder` | string | No | Order reviews come back in: most informative, newest, oldest, highest rated, or lowest rated. Default `most_informative`. |
| `reviewerFilter` | string | No | Keep all reviews or limit to founders or non-founders. Default `all`. |
| `resultsLimit` | integer | No | Cap on reviews gathered per product. Default `50`; max `1000`. |
| `timeoutSeconds` | integer | No | Seconds to wait per request before timing out. Default `45`. |

#### Example input

```json
{
    "productHandles": ["slack", "linear", "raycast"],
    "reviewOrder": "most_informative",
    "reviewerFilter": "all",
    "resultsLimit": 50,
    "timeoutSeconds": 45
}
````

### Output

Each review on the page becomes one row, and every field is always present — values Product Hunt does not expose come back as `null` so your dataset stays rectangular.

#### Example output

```json
{
    "reviewKey": "413579",
    "authorName": "Stella W.",
    "authorProfileUrl": "https://www.producthunt.com/@stella_w",
    "authorAvatarUrl": "https://ph-avatars.imgix.net/stella-w.png",
    "authorReviewsTotal": 4,
    "starRating": 5,
    "likedText": "Linear keeps the whole team aligned and the keyboard-first flow makes triaging issues genuinely fast.",
    "dislikedText": "The mobile app still lags behind the desktop version on a few power features.",
    "comparisonText": "We moved off Jira because Linear is quicker to set up and far less cluttered day to day.",
    "postedAgo": "4mo ago",
    "helpfulCount": 12,
    "viewCount": 217,
    "productTitle": "Linear",
    "productHandle": "linear",
    "reviewsPageUrl": "https://www.producthunt.com/products/linear/reviews",
    "reviewLink": "https://www.producthunt.com/products/linear/reviews#413579",
    "errorMessage": null,
    "collectedAt": "2026-06-29T12:00:00.000000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `reviewKey` | string | Numeric ID that uniquely tags this review |
| `authorName` | string | Display name of the person who wrote the review |
| `authorProfileUrl` | string | Link to the reviewer's Product Hunt profile |
| `authorAvatarUrl` | string | Link to the reviewer's profile picture |
| `authorReviewsTotal` | integer | How many reviews this person has posted on Product Hunt |
| `starRating` | integer | Headline rating from 1 to 5 stars |
| `likedText` | string | The reviewer's praise, from the "What's great" block |
| `dislikedText` | string | Drawbacks or fixes from "What needs improvement" |
| `comparisonText` | string | How the reviewer rates this product against rivals |
| `postedAgo` | string | Relative post time as shown on the page, like "4mo ago" |
| `helpfulCount` | integer | How many readers marked the review as helpful |
| `viewCount` | integer | How many times the review has been seen |
| `productTitle` | string | Product name as shown on Product Hunt |
| `productHandle` | string | Short URL handle for the product, such as "linear" |
| `reviewsPageUrl` | string | Link to the product's reviews page |
| `reviewLink` | string | Deep link straight to this review |
| `errorMessage` | string | Why a handle failed; `null` on success |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |

### Tips for best results

- **Start small.** Run one handle with a low `resultsLimit` first to confirm the output fits your pipeline, then open it up.
- **Use the right handle.** The handle is the part of the URL after `/products/` — `producthunt.com/products/linear/reviews` means the handle is `linear`.
- **Sort to match the job.** Set `reviewOrder` to lowest rated first when you are hunting for complaints, or highest rated for testimonials.
- **Filter by founder.** Set `reviewerFilter` to founders to read maker context, or non-founders for unbiased user opinion.
- **Raise `timeoutSeconds`** toward 60 if you scrape large products and see the occasional timeout in the log.

### How can I use Product Hunt review data?

**How can I use the Product Hunt Reviews Scraper to research a competitor?**
Add the competitor's handle to `productHandles` and run it. You get every review with its star score, the liked and disliked notes, and the comparison text in one table. Sort by lowest rated first to surface the pain points your own product can solve, then quote them straight from the dataset.

**How can I export Product Hunt reviews to a spreadsheet?**
Run the scraper, then open the Storage tab and download the dataset as CSV or Excel. Each review is one row with consistent columns — reviewer, stars, the review text, helpful votes, and post date — so it loads cleanly into Sheets, Excel, or any BI tool without cleanup.

**How can I track Product Hunt sentiment over time?**
Schedule the scraper to run on the same handle on a regular cadence. Because `starRating`, `helpfulCount`, and `postedAgo` are captured on every pass, you can chart how a product's ratings and review volume shift after each launch or update.

**How can I pull reviews for several products at once?**
Put one handle per line in `productHandles` and the scraper works through them in a single run, tagging each row with `productTitle` and `productHandle`. That makes it easy to compare ratings and review counts across a whole category in one export.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `productHandles` (type: `array`):

Product Hunt handles to pull reviews for. Add one handle per line to run several products in a single batch.

## `reviewOrder` (type: `string`):

Choose the sequence the reviews come back in.

## `reviewerFilter` (type: `string`):

Keep every review, or narrow it down to founders or to everyone else.

## `resultsLimit` (type: `integer`):

Top end on how many reviews to gather for each product handle.

## `timeoutSeconds` (type: `integer`):

How long to wait on each request before it is treated as timed out.

## Actor input object example

```json
{
  "productHandles": [
    "slack",
    "linear",
    "raycast"
  ],
  "reviewOrder": "most_informative",
  "reviewerFilter": "all",
  "resultsLimit": 50,
  "timeoutSeconds": 45
}
```

# 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 = {
    "productHandles": [
        "linear"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/product-hunt-reviews-scraper-cheap").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 = { "productHandles": ["linear"] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/product-hunt-reviews-scraper-cheap").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 '{
  "productHandles": [
    "linear"
  ]
}' |
apify call data_api/product-hunt-reviews-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Product Hunt Reviews Scraper (Cheap)",
        "description": "Product Hunt Reviews Scraper collects user ratings, written feedback, and reviewer metadata from any Product Hunt product page, so you can track sentiment and run competitive analysis without manual work.",
        "version": "0.0",
        "x-build-id": "snxqY2Mj1jMLY1bvy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~product-hunt-reviews-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-product-hunt-reviews-scraper-cheap",
                "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/data_api~product-hunt-reviews-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-product-hunt-reviews-scraper-cheap",
                "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/data_api~product-hunt-reviews-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-product-hunt-reviews-scraper-cheap",
                "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",
                "required": [
                    "productHandles"
                ],
                "properties": {
                    "productHandles": {
                        "title": "Product handles",
                        "type": "array",
                        "description": "Product Hunt handles to pull reviews for. Add one handle per line to run several products in a single batch.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "reviewOrder": {
                        "title": "Order reviews by",
                        "enum": [
                            "most_informative",
                            "recent",
                            "oldest",
                            "most_positive",
                            "most_negative"
                        ],
                        "type": "string",
                        "description": "Choose the sequence the reviews come back in.",
                        "default": "most_informative"
                    },
                    "reviewerFilter": {
                        "title": "Limit to reviewer group",
                        "enum": [
                            "all",
                            "founder",
                            "others"
                        ],
                        "type": "string",
                        "description": "Keep every review, or narrow it down to founders or to everyone else.",
                        "default": "all"
                    },
                    "resultsLimit": {
                        "title": "Reviews per product",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Top end on how many reviews to gather for each product handle.",
                        "default": 50
                    },
                    "timeoutSeconds": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "How long to wait on each request before it is treated as timed out.",
                        "default": 45
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
