# PissedConsumer Company Reviews Scraper (`automation-lab/pissedconsumer-company-reviews-scraper`) Actor

Export public PissedConsumer company reviews, complaint text, ratings, authors, dates, status signals, responses, and aggregate reputation metrics.

- **URL**: https://apify.com/automation-lab/pissedconsumer-company-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing, Business
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## PissedConsumer Company Reviews Scraper

Export public PissedConsumer company reviews as structured data.

Provide company review-page URLs or subdomain slugs and receive one dataset row per review.
The Actor captures complaint text, ratings, authors, dates, status signals, responses, and company-level reputation context.

It is designed for recurring reputation monitoring, customer-experience research, complaint analysis, and competitor benchmarking.

### What does PissedConsumer Company Reviews Scraper do?

The Actor reads public company review feeds such as:

`https://walmart.pissedconsumer.com/review.html`

It follows public pagination and converts review cards into integration-ready JSON records.

The extraction includes:

- stable review IDs;
- direct review URLs when the listing exposes them;
- review title and body;
- review rating when supplied;
- reviewer name and public profile URL;
- publication date;
- resolved or other status badges;
- reported monetary loss;
- pros, cons, and preferred solution;
- public discussion responses;
- company aggregate rating and registered-review count;
- source-page and scrape timestamps.

Records are deduplicated by PissedConsumer review ID within each run.

### Who is it for?

#### Brand and reputation teams

Track new public complaints and route relevant records into dashboards or response workflows.

#### Customer-experience teams

Analyze recurring service problems, preferred resolutions, and reported loss signals.

#### Agencies

Export comparable complaint data for several client or competitor brands on a schedule.

#### Market and competitor researchers

Compare complaint themes, review volume, response activity, and aggregate ratings across companies.

#### Data and analytics teams

Load normalized review rows into a warehouse, BI tool, spreadsheet, or sentiment pipeline.

### Why use this Actor?

- **URL and slug inputs:** use a full company review URL or a short subdomain slug.
- **Structured output:** avoid maintaining selectors and cleanup logic in downstream jobs.
- **Bounded pagination:** control both records and pages for predictable runs.
- **Useful context:** every row carries company aggregate data and source provenance.
- **HTTP-first extraction:** no browser or residential proxy is used in the current implementation.
- **Visible failures:** changed or blocked markup causes a failed run rather than a misleading empty success.

This Actor focuses on PissedConsumer.
Use a source-specific Actor when you need reviews from another website.

### What data can I extract?

| Field | Meaning |
| --- | --- |
| `companyName` | Company name shown by PissedConsumer |
| `companySlug` | Company subdomain slug |
| `companyDomain` | Public company domain when exposed, otherwise `null` |
| `aggregateRating` | Company aggregate rating on the fetched page |
| `aggregateReviewCount` | Registered-review count used by the aggregate rating |
| `reviewId` | Stable PissedConsumer review identifier |
| `reviewUrl` | Direct review URL when exposed in the listing |
| `authorName` | Public reviewer display name |
| `authorProfileUrl` | Public reviewer profile URL |
| `rating` | Review-level rating when supplied |
| `title` | Complaint or review headline |
| `body` | Review body text |
| `publishedAt` | Source publication timestamp |
| `status` | Status badge such as `Resolved`, when present |
| `monetaryLoss` | Reported loss text, when present |
| `pros` | Public pros attached to the review |
| `cons` | Public cons attached to the review |
| `preferredSolution` | Reviewer's preferred resolution |
| `responses` | Public response/comment objects |
| `responseCount` | Number of responses captured on the listing |
| `sourceUrl` | Exact listing page fetched |
| `pageNumber` | Pagination page where the review appeared |
| `scrapedAt` | UTC extraction timestamp |

Fields that are not present on a source card are returned as `null` or an empty array.

### How to scrape PissedConsumer company reviews

1. Open the Actor input page.
2. Add one or more PissedConsumer company review URLs, or enter company slugs.
3. Set the maximum reviews for each company.
4. Keep the page limit low for a first test.
5. Start the run.
6. Open the default dataset when the run succeeds.
7. Export JSON, CSV, Excel, XML, or another supported dataset format.
8. Save the task or schedule it if you need recurring monitoring.

A small first run can use:

```json
{
  "companySlugs": ["walmart"],
  "maxReviewsPerCompany": 20,
  "maxPagesPerCompany": 3
}
```

### Input parameters

#### `startUrls`

An array of public PissedConsumer company URLs.

Example:

```json
{
  "startUrls": [
    { "url": "https://amazon.pissedconsumer.com/review.html" }
  ]
}
```

URLs on non-PissedConsumer domains are rejected.
Company detail URLs are normalized to the matching company review feed.

#### `companySlugs`

An array of PissedConsumer subdomain slugs.

For `https://target.pissedconsumer.com/review.html`, use `target`.

```json
{
  "companySlugs": ["walmart", "target", "amazon"]
}
```

#### `maxReviewsPerCompany`

Maximum review rows saved for each company.

The allowed range is 1 to 5,000.
The default is 50.

#### `maxPagesPerCompany`

Pagination safety limit for each company.

The allowed range is 1 to 200.
The default is 20.
Public pages normally contain around 15 review cards, but the count can vary.

### Output example

A representative dataset item looks like this:

```json
{
  "companyName": "Walmart",
  "companySlug": "walmart",
  "companyDomain": null,
  "aggregateRating": 2.2,
  "aggregateReviewCount": 4766,
  "reviewId": "7358378",
  "reviewUrl": null,
  "authorName": "Tabbatha Lht",
  "authorProfileUrl": "https://www.pissedconsumer.com/people/31272255.html",
  "rating": null,
  "title": "Your Contractor or running a scam on your customers at Sam's club at the Tucker Ga location",
  "body": "No one came to the phone at all...",
  "publishedAt": "2026-07-25 15:34:18",
  "status": null,
  "monetaryLoss": null,
  "pros": [],
  "cons": [],
  "preferredSolution": null,
  "responses": [],
  "responseCount": 0,
  "sourceUrl": "https://walmart.pissedconsumer.com/review.html",
  "pageNumber": 1,
  "scrapedAt": "2026-07-26T02:50:25.071Z"
}
```

Review text is normalized for whitespace while preserving its readable content.
The Actor does not download review images or other media assets.

### How much does it cost to scrape PissedConsumer reviews?

The Actor uses pay-per-event pricing:

- a **$0.0001** start fee per run;
- a tiered price per review saved;
- the current BRONZE-tier item price is **$0.00004029 per review**.

At the BRONZE tier, example Actor charges are:

| Reviews saved | Example charge |
| ---: | ---: |
| 20 | 0.000906 USD |
| 100 | 0.004129 USD |
| 1,000 | 0.040390 USD |

The formula is the start fee plus the applicable tier price multiplied by saved reviews.
Higher usage tiers have lower per-review prices.
Apify platform usage can be billed separately according to your Apify plan.

The Actor only charges the item event after a valid review record is accepted for the dataset.
Duplicates, failed pages, and rejected cards are not charged as review items.

### Pagination, limits, and deduplication

Pagination uses the public `review.html?page=N` form.
The Actor stops when any of these conditions is reached:

- `maxReviewsPerCompany` has been saved;
- `maxPagesPerCompany` has been fetched;
- a page contains no new valid reviews;
- the source returns fewer cards than a normal full page.

Each company is processed independently.
A review ID is emitted at most once per company during a run.

For a full historical export, raise both limits deliberately.
For scheduled monitoring, prefer a smaller review limit to reduce repeated transfer and processing.

### Reliability and failure behavior

The Actor validates HTTP status, response content type, and recognizable review markup.

Transient timeouts, HTTP 429, and temporary 5xx responses are retried a bounded number of times.
Malformed inputs and stable 4xx responses are not retried indefinitely.

If PissedConsumer changes its markup or serves an unrecognized challenge page, the run fails with a diagnostic message.
This avoids treating a blocked page as a valid zero-result dataset.

No proxy is enabled in the current version because representative company pages work through anonymous direct HTTP.

### Monitoring and sentiment-analysis workflows

#### Scheduled reputation monitoring

Create one saved task per monitored company or one multi-company task.
Schedule it daily or weekly.
Send the dataset to a webhook, Make, Zapier, or your warehouse.
Deduplicate across runs using `reviewId`.

#### Complaint escalation

Filter new rows by keywords, reported loss, status, or low rating.
Create tickets for high-risk complaints.
Keep `reviewUrl` and `sourceUrl` as audit links.

#### Competitor benchmarking

Run the same limits for several company slugs.
Group by `companySlug`.
Compare aggregate rating, complaint themes, status signals, and response activity.

#### Text analytics

Send `title` and `body` into a classifier or language model.
Use `pros`, `cons`, and `preferredSolution` as additional labels.
Store model output beside the stable `reviewId`.

### Export and integrations

The default dataset works with standard Apify integrations.

Common destinations include:

- Google Sheets;
- Airtable;
- Make;
- Zapier;
- Slack or email alerts;
- webhooks;
- Amazon S3;
- BigQuery and other warehouses;
- Python or JavaScript ETL jobs.

Use dataset transformations or downstream code when you only need a subset of fields.

### Run with the Apify API using cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~pissedconsumer-company-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "companySlugs": ["walmart"],
    "maxReviewsPerCompany": 20,
    "maxPagesPerCompany": 3
  }'
```

To wait for completion and receive dataset items, use the synchronous dataset endpoint supported by the Apify API.

### Run with JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('automation-lab/pissedconsumer-company-reviews-scraper').call({
  companySlugs: ['walmart', 'target'],
  maxReviewsPerCompany: 50,
  maxPagesPerCompany: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Keep your token in an environment variable or secret manager.

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])

run = client.actor('automation-lab/pissedconsumer-company-reviews-scraper').call(
    run_input={
        'startUrls': [
            {'url': 'https://amazon.pissedconsumer.com/review.html'}
        ],
        'maxReviewsPerCompany': 25,
        'maxPagesPerCompany': 3,
    }
)

items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/pissedconsumer-company-reviews-scraper"
```

For **Claude Desktop**, **Cursor**, and **VS Code**, add this equivalent MCP server configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/pissedconsumer-company-reviews-scraper"
    }
  }
}
```

Example prompts:

- “Export the latest 50 Walmart complaint records from PissedConsumer.”
- “Collect 100 reviews each for Walmart, Target, and Amazon.”
- “Summarize unresolved complaint themes and include source review IDs.”

An MCP client still needs valid Apify authentication and sufficient account permissions.

### Responsible use and legality

This Actor extracts information visible on public PissedConsumer company pages.

You are responsible for your use of the data.
Review the source website's terms, applicable privacy law, copyright rules, and your organization's retention policies.
Do not use the output to harass reviewers, infer sensitive traits, or make solely automated high-impact decisions about individuals.

Collect only fields needed for a legitimate purpose.
Protect exported reviewer information.
Honor deletion, correction, and access obligations that apply to your organization.

This documentation is operational guidance, not legal advice.

### Limitations

- Source fields vary by review, so nullable fields are expected.
- Some listing cards do not expose a direct review URL.
- Review-level ratings are absent from some complaint cards.
- Responses are limited to comments rendered on the fetched listing page.
- The Actor does not log in, submit reviews, or respond to complaints.
- The Actor does not download images or attachments.
- Source markup and access controls can change without notice.
- A run is a snapshot, not a guarantee of complete historical coverage.

### Troubleshooting

#### The Actor says my URL is unsupported

Use a public company subdomain URL ending in `.pissedconsumer.com`, or provide only the subdomain slug.
Do not use the `www.pissedconsumer.com` homepage or a different review website.

#### I received fewer reviews than requested

Check `maxPagesPerCompany` first.
The source may also have reached its end, returned duplicate IDs, or omitted valid review bodies on some cards.
Inspect run logs for the stop reason.

#### The run failed on recognizable markup

The source may have changed its page structure or returned a temporary challenge.
Retry later after checking the exact source URL in a normal browser.
Repeated blind retries are not recommended.

#### Why are some ratings or review URLs null?

PissedConsumer does not expose every field on every listing card.
The Actor reports missing source data as `null` rather than inventing a value.

#### How do I avoid duplicates across scheduled runs?

Use `reviewId` as the durable key in your database or automation.
The Actor deduplicates within a run, while your downstream store should deduplicate across runs.

### Related Automation Lab Actors

- [Trustpilot Scraper](https://apify.com/automation-lab/trustpilot-scraper) for Trustpilot business-review workflows.
- [Sitejabber Reviews Scraper](https://apify.com/automation-lab/sitejabber-reviews-scraper) for Sitejabber and SmartCustomer review exports.

Use separate source Actors when you need platform-specific fields and pagination behavior.
Combine their datasets downstream using source name, company identity, and stable review IDs.

### FAQ

#### Does the Actor require a PissedConsumer account?

No.
The current version reads anonymous public company review pages.

#### Does it use a browser or proxy?

No.
The current version uses direct HTTP and Cheerio parsing.

#### Can it scrape multiple companies in one run?

Yes.
Add multiple URLs, multiple slugs, or both.
Duplicate slugs are fetched once.

#### Can I export all historical reviews?

You can raise the review and page limits up to their schema maximums.
Actual coverage depends on what the public paginated company feed exposes.
Start with a bounded test before requesting a large export.

#### Does it perform sentiment analysis?

No.
It returns source data suitable for a downstream sentiment or topic-analysis step.

#### Are company replies distinguished from ordinary comments?

The current output preserves public response/comment objects rendered with the review.
It does not claim that every response is an official company reply.

#### What happens when a page is blocked?

The Actor fails after bounded retries when the response is an HTTP error or lacks recognizable review markup.
It does not silently return an empty successful run.

# Actor input Schema

## `startUrls` (type: `array`):

Public company review pages such as https://walmart.pissedconsumer.com/review.html. Detail-review URLs are normalized to their company feed.

## `companySlugs` (type: `array`):

PissedConsumer subdomain names without the domain, for example walmart or amazon.

## `maxReviewsPerCompany` (type: `integer`):

Maximum review records saved for each company. Increase this for historical exports; use a smaller value for recurring monitoring.

## `maxPagesPerCompany` (type: `integer`):

Safety limit for pagination. Each public page normally contains about 15 reviews.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://walmart.pissedconsumer.com/review.html"
    }
  ],
  "companySlugs": [
    "walmart"
  ],
  "maxReviewsPerCompany": 50,
  "maxPagesPerCompany": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

API link to structured review items in the overview dataset view.

# 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 = {
    "startUrls": [
        {
            "url": "https://walmart.pissedconsumer.com/review.html"
        }
    ],
    "companySlugs": [
        "walmart"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/pissedconsumer-company-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 = {
    "startUrls": [{ "url": "https://walmart.pissedconsumer.com/review.html" }],
    "companySlugs": ["walmart"],
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/pissedconsumer-company-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 '{
  "startUrls": [
    {
      "url": "https://walmart.pissedconsumer.com/review.html"
    }
  ],
  "companySlugs": [
    "walmart"
  ]
}' |
apify call automation-lab/pissedconsumer-company-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/pissedconsumer-company-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/QmDQN28Wi0oGi3eEf/builds/lEF7i9ybkQNTvQkBm/openapi.json
