# ConsumerAffairs Reviews Scraper (`memo23/consumeraffairs-reviews-scraper`) Actor

Scrape ConsumerAffairs.com reviews by company URL or just the company name. Get star rating, full text, date, reviewer city, verified-buyer badge, topic tags, photos and the company's reply, plus overall rating and star breakdown. Sort by newest, filter by stars, set a date cutoff.

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

## Pricing

from $3.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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## ConsumerAffairs Reviews Scraper

**Export every customer review of any company on ConsumerAffairs.com, with star rating, full text, date, reviewer city, verified-buyer badge, topic tags, photos and the company's public reply.**

Paste a company URL or just type the company name. Get the newest reviews, only the 1-star complaints, or everything since a date, as JSON, CSV or Excel.

![How the ConsumerAffairs Reviews Scraper works](https://api.apify.com/v2/key-value-stores/TGsc11HacX5agjsPK/records/how-it-works-consumeraffairs.png)

### Why Use This Scraper?

- **Company name or URL.** Type "CarShield" or "Choice Home Warranty" and the scraper finds the right ConsumerAffairs profile for you. Full URLs and short paths (`insurance/geico`) work too.
- **Full review text.** Long reviews are captured in full, including the part hidden behind "More".
- **Company replies included.** The brand's public response, its author and timestamp, plus the "Resolution In Progress" status where ConsumerAffairs shows one.
- **Filters that run on the site.** Sort by newest, oldest, most helpful or top reviews; pull only selected star ratings; stop at a date cutoff. Sorting and star filtering happen on ConsumerAffairs itself, and a date cutoff ends the walk, so you don't pay for reviews you would throw away.
- **Company context on every row.** Overall rating, total ratings, the 5→1 star breakdown, accreditation and category travel with each review, so a single CSV is ready for analysis.
- **Complete runs.** Every page is retried on a fresh residential IP until it loads, and reviews are de-duplicated, so a 880-review company returns 880 reviews.
- **No browser, no setup.** Plain HTTP with residential proxies already configured.

### Overview

ConsumerAffairs.com is one of the largest US consumer review sites, with millions of reviews of insurers, home warranty companies, lenders, movers, solar installers, retailers and more. Many of those companies answer reviews publicly, and accredited brands mark buyers as verified.

This actor is for anyone who needs those reviews as data: reputation and CX teams tracking their own brand, analysts comparing competitors, researchers studying complaints, and agencies reporting to clients.

**Dataset shape:** one row per review. Each row carries the review itself (stars, text, date, reviewer, verified flag, topic tags, photos, company reply) and the company it belongs to (name, rating, ratings count, star breakdown, category, accreditation). There are no separate company rows, so you are only billed for reviews.

### Supported Inputs

#### Company page URLs

Any ConsumerAffairs company review page. The category part of the path varies by industry.

- `https://www.consumeraffairs.com/insurance/geico.html`
- `https://www.consumeraffairs.com/auto_warranty/carshield.html`
- `https://www.consumeraffairs.com/homeowners/choice_home_warranty.html`
- `https://www.consumeraffairs.com/online/ancestry.html`

Old `.htm` addresses, `?page=3` style query strings and `#review-…` anchors are cleaned up automatically. Short paths such as `insurance/geico` or `/solar-energy/sunrun.html` work as well.

#### Company names

Put names in `companyNames`, e.g. `["CarShield", "Sunrun", "Amazon"]`. The scraper matches each name against the ConsumerAffairs site index, opens the best candidates and keeps the first one that is a real company review page. The other close matches are printed in the run log.

Some brands have several profiles (State Farm has separate pages for auto, home and banking; Liberty Mutual's main page is `insurance/liberty_auto.html`). For those, pass the exact URL.

#### Unsupported inputs

- Category and "best of" guide pages (`/insurance/car.html`, `/awards/...`). These are editorial articles, not review lists.
- News articles, city guides and comparison pages (`geico-vs-progressive-vs-state-farm.html`).
- Review pages of other sites.

### Use Cases

| Who | What they do with it |
|---|---|
| Reputation and CX teams | Track new reviews and complaints for their own brand every week |
| Competitive intelligence | Compare star ratings, complaint topics and reply rates across rivals |
| Product and service teams | Mine 1- and 2-star reviews for recurring problems (claims, billing, staff) |
| Market researchers | Build review datasets for an industry: home warranties, solar, insurance, lenders |
| Agencies | Produce monthly review reports for clients without copy-pasting |
| Data science and AI | Sentiment analysis, topic modelling, LLM training and RAG over real customer feedback |

### How It Works

1. **Resolve inputs.** URLs are normalised; company names are matched against the ConsumerAffairs sitemap and confirmed by opening the page.
2. **Read the company header.** The first page gives the company rating, ratings count, star breakdown, category and accreditation.
3. **Walk the review pages.** Pages are fetched in parallel with your sort order, star filter and date cutoff applied by the site itself.
4. **Handle bot protection.** Each request goes out on a fresh residential IP; a blocked request is retried on another one.
5. **Save one row per review.** Reviews are de-duplicated and pushed to the dataset as they arrive.

### Input Configuration

#### Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `companyUrls` | array of strings | `[]` | ConsumerAffairs company review pages: full URLs or short paths like `insurance/geico`. |
| `companyNames` | array of strings | `[]` | Company names to look up, e.g. `"CarShield"`. Best match is used. |
| `maxReviewsPerCompany` | integer | `100` | Reviews to collect per company. `0` = all of them. |
| `sortBy` | string | `recent` | `recent`, `top_reviews` (the site's default order), `helpful` or `oldest`. |
| `starRatings` | array of strings | `[]` | Only these ratings, e.g. `["1","2"]`. Empty = all ratings. |
| `reviewsSince` | string | none | Drop older reviews. `2026-01-31` or a period like `30 days`, `6 months`, `1 year`. |
| `maxItems` | integer | `0` | Cap on reviews for the whole run across all companies. `0` = no extra cap. |
| `flatten` | boolean | `false` | Turn nested fields into flat columns (`companyReply_text`, `companyRatingBreakdown_5`) for spreadsheets. |
| `maxConcurrency` | integer | `8` | Review pages fetched in parallel per company (1–32). |
| `maxRequestRetries` | integer | `8` | Attempts per page before it is skipped (1–20). |
| `proxy` | object | Apify Residential US | Residential proxies are required; datacenter IPs are blocked. |

At least one of `companyUrls` or `companyNames` is required.

#### Common scenarios

**Latest 200 reviews of one company**

```json
{
  "companyUrls": ["https://www.consumeraffairs.com/insurance/geico.html"],
  "maxReviewsPerCompany": 200,
  "sortBy": "recent"
}
```

**Complaints from the last 90 days for several competitors, by name**

```json
{
  "companyNames": ["CarShield", "Endurance Warranty", "American Dream Auto Protect"],
  "starRatings": ["1", "2"],
  "reviewsSince": "90 days",
  "maxReviewsPerCompany": 0,
  "sortBy": "recent"
}
```

**Every review of a company, flattened for Excel**

```json
{
  "companyUrls": ["online/ancestry"],
  "maxReviewsPerCompany": 0,
  "sortBy": "oldest",
  "flatten": true
}
```

### Output Overview

Every dataset item is one review. Fields fall into three groups:

- **The review:** `reviewId`, `reviewUrl`, `rating`, `text`, `reviewDate` (ISO) and `reviewDateRaw` (as shown), reviewer `authorName` / `authorLocation` / `authorAvatarUrl`, `verifiedPurchase`, `aspectTags`, `photos`.
- **The company's response:** `companyReply` (`author`, `date`, `text`) or `null`, `resolutionStatus`, and `featuredLabel` when the company pinned the review.
- **The company:** `companyName`, `companyUrl`, `companyId`, `companyRating`, `companyRatingCount`, `companyRatingBreakdown` (counts for 5→1 stars), `companyAccredited`, `companyCategory`, `companyCategoryUrl`, `companyLogoUrl`.
- **Run context:** `input` (the URL or name you gave), `sortBy`, `starFilter`, `page`, `scrapedAt`.

With `flatten: true`, `companyReply` becomes `companyReply_author` / `companyReply_date` / `companyReply_text` and the breakdown becomes `companyRatingBreakdown_1` … `_5`.

### Output Samples

#### Review with a company reply (input: company name "CarShield", sort: recent)

```json
{
  "reviewId": "14053242",
  "reviewUrl": "https://www.consumeraffairs.com/auto_warranty/carshield.html#review-14053242",
  "rating": 5,
  "text": "Excellent customer service. Provided great options to handle matter.",
  "reviewDate": "2026-09-14",
  "reviewDateRaw": "Sept. 14, 2026",
  "authorName": "Leroy",
  "authorLocation": "Annandale, VA",
  "authorAvatarUrl": null,
  "verifiedPurchase": true,
  "aspectTags": ["Customer Service", "Staff"],
  "photos": [],
  "companyReply": {
    "author": "CarShield",
    "date": "2026-09-15T15:48:08Z",
    "text": "Leroy, It's great to hear that you had a positive experience with our Customer Service Department! Please reach out if you need further assistance."
  },
  "resolutionStatus": null,
  "featuredLabel": null,
  "companyName": "CarShield",
  "companyUrl": "https://www.consumeraffairs.com/auto_warranty/carshield.html",
  "companyRating": 4.03,
  "companyRatingCount": 10588,
  "companyRatingBreakdown": { "1": 1455, "2": 267, "3": 449, "4": 753, "5": 7664 },
  "companyAccredited": true,
  "companyCategory": "Extended Auto Warranties",
  "companyCategoryUrl": "https://www.consumeraffairs.com/auto_warranty/",
  "companyLogoUrl": "https://cdn-mediahub.consumeraffairs.com/carshield_high_png_14rwqlp/o/130/x.webp",
  "companyId": "18054",
  "input": "CarShield",
  "sortBy": "recent",
  "starFilter": null,
  "page": 1,
  "scrapedAt": "2026-10-03T12:06:14.086Z"
}
```

#### 1-star review, no reply (input: GEICO URL, trimmed to the review fields)

```json
{
  "reviewId": "14064564",
  "rating": 1,
  "text": "They would get a negative one if possible. Customer service is nonexistent. They don't care about the insured. After an accident- over 2 months to get an estimate. Ridiculous. And their prices are absolutely terrible.",
  "reviewDate": "2026-09-30",
  "authorName": "LuAnn",
  "authorLocation": "Gardner, MA",
  "verifiedPurchase": false,
  "aspectTags": ["Customer Service", "Coverage", "Price", "Staff", "Rates"],
  "photos": [],
  "companyReply": null,
  "companyName": "GEICO",
  "companyRating": 1.34,
  "companyRatingCount": 5584,
  "companyAccredited": false,
  "companyCategory": "Car Insurance"
}
```

### Key Output Fields

#### Review

`reviewId`, `reviewUrl`, `rating` (1–5), `text` (full, paragraphs separated by blank lines), `reviewDate`, `reviewDateRaw`

#### Reviewer

`authorName` (first name as published), `authorLocation` (city, state), `authorAvatarUrl`, `verifiedPurchase`

#### Topics and media

`aspectTags` (ConsumerAffairs' own topic labels such as "Claims Handling", "Price", "Staff"), `photos` (full-size image URLs attached to the review)

#### Company response

`companyReply.author`, `companyReply.date`, `companyReply.text`, `resolutionStatus`, `featuredLabel`

#### Company

`companyName`, `companyId`, `companyUrl`, `companyRating`, `companyRatingCount`, `companyRatingBreakdown`, `companyAccredited`, `companyCategory`, `companyCategoryUrl`, `companyLogoUrl`

#### Run context

`input`, `sortBy`, `starFilter`, `page`, `scrapedAt`

### FAQ

#### Which ConsumerAffairs pages are supported?

Company review pages, the ones that list customer reviews with stars, such as `/insurance/geico.html`. Guides, "best of" lists and news articles are not review pages and are skipped.

#### Can I search by company name?

Yes, with `companyNames`. If a brand has several ConsumerAffairs profiles, the best match is used and the alternatives are listed in the run log. Pass the URL when you need a specific one.

#### Why does the number of reviews differ from the rating count on the site?

The header count includes star ratings left without a written review on some profiles. The scraper returns every written review that ConsumerAffairs lists. On the profiles we tested the two numbers matched exactly.

#### Why are the first few reviews older than the rest when sorting by newest?

Accredited companies can pin "featured" reviews above the list. They are real reviews and are kept; you can spot them by `featuredLabel` (e.g. "Review featured by CarShield"). The date cutoff ignores them when deciding where to stop.

#### How does the date cutoff work?

`reviewsSince` drops every review older than the date. With `sortBy: "recent"` the scraper also stops paging once it passes the date, so you are not charged for pages you don't need.

#### Does it get the reviewer's full name or contact details?

No. ConsumerAffairs publishes a first name and a city, and that is what you get. The scraper does not collect emails, phone numbers or anything behind a login.

#### Why do I need residential proxies?

ConsumerAffairs uses bot protection that blocks datacenter IPs after a few requests. The actor defaults to Apify Residential (US) and retries blocked pages automatically.

#### What happens if a page cannot be loaded?

It is retried on new IPs up to `maxRequestRetries` times. If it still fails, it is skipped, logged, and the run continues with the next page. The run's status message says how many pages were unreachable.

#### Is there a free tier?

Free Apify plans get up to 100 reviews per run, enough to test any company.

### Support

For custom solutions, bulk scraping, or support:

- Email: <muhamed.didovic@gmail.com>
- Website: <https://muhamed-didovic.github.io/>
- Issues: use the **Issues** tab on this actor's page
- Apify Support: contact through the Apify platform

### Additional Services

Need scheduled exports to Google Sheets, a combined dataset across ConsumerAffairs, Trustpilot and BBB, sentiment or topic tagging, or a custom field? Email <muhamed.didovic@gmail.com> with what you need.

### Explore More Scrapers

If you found this Apify Scraper useful, check out the other scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). Review scrapers from the same author with the same export style:

- **Trustpilot**: [apify.com/memo23/trustpilot-scraper-ppe](https://apify.com/memo23/trustpilot-scraper-ppe)
- **G2**: [apify.com/memo23/g2-scraper](https://apify.com/memo23/g2-scraper)
- **Yelp**: [apify.com/memo23/yelp-scraper](https://apify.com/memo23/yelp-scraper)

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/consumeraffairs-reviews-scraper`).

**Purpose:** Returns customer reviews from ConsumerAffairs.com company pages, one row per review, with the company's rating and star breakdown on every row. Plain HTTP with residential proxies; no browser needed.

**Minimal input:**

```json
{
  "companyNames": ["CarShield"],
  "maxReviewsPerCompany": 20
}
```

URL form: `{ "companyUrls": ["https://www.consumeraffairs.com/insurance/geico.html"], "maxReviewsPerCompany": 20 }`.

**Output fields:** reviewId, reviewUrl, rating, text, reviewDate, reviewDateRaw, authorName, authorLocation, authorAvatarUrl, verifiedPurchase, aspectTags, photos, companyReply {author, date, text}, resolutionStatus, featuredLabel, companyName, companyId, companyUrl, companyRating, companyRatingCount, companyRatingBreakdown {1..5}, companyAccredited, companyCategory, companyCategoryUrl, companyLogoUrl, input, sortBy, starFilter, page, scrapedAt.

**Behaviors an agent should know:**

- `companyUrls` and `companyNames` can be mixed; a bare word in `companyUrls` (e.g. `"geico"`) is treated as a name. Unmatched names are reported in the run status message, not as an error.
- `sortBy` defaults to `recent`. `starRatings` takes strings `"1"`–`"5"`. `reviewsSince` accepts `YYYY-MM-DD` or `N days|weeks|months|years`.
- `maxReviewsPerCompany` defaults to 100; `0` means all reviews. `maxItems` caps the whole run.
- Pinned "featured" reviews can appear first regardless of sort; they have a non-null `featuredLabel`.
- Billing is pay-per-event: a small actor-start fee plus one charge per review row saved. Free plans are capped at 100 reviews per run.

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Consumers Unified, LLC (ConsumerAffairs) or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available company review pages. It does not log in, use authenticated endpoints, or access content behind the ConsumerAffairs account wall. Reviewer names are published by ConsumerAffairs as first names only. Users are responsible for making sure their use complies with ConsumerAffairs' Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

### SEO Keywords

consumeraffairs scraper, consumeraffairs reviews scraper, consumeraffairs.com reviews, consumer affairs reviews export, consumeraffairs api, customer reviews scraper, company reviews scraper, review data extraction, complaint data scraper, negative reviews export, reputation monitoring, review monitoring tool, competitor review analysis, customer feedback data, sentiment analysis dataset, insurance reviews scraper, home warranty reviews, extended car warranty reviews, solar company reviews, mortgage lender reviews, moving company reviews

# Actor input Schema

## `companyUrls` (type: `array`):

ConsumerAffairs company review pages. Full URLs (https://www.consumeraffairs.com/insurance/geico.html) or short paths (insurance/geico) both work. Query strings like ?page=3 are ignored.

## `companyNames` (type: `array`):

Look companies up by name instead of URL, e.g. "CarShield" or "Choice Home Warranty". The best-matching ConsumerAffairs profile is used and the other matches are listed in the run log. Brands with several profiles (State Farm auto vs home) are more precise as URLs.

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

Stop after this many reviews for each company. 0 = every review the company has.

## `sortBy` (type: `string`):

Order reviews are read in. "Most recent" plus a max-reviews limit gives you the newest reviews.

## `starRatings` (type: `array`):

Only scrape reviews with these star ratings, using the site's own filter (e.g. \["1", "2"] for complaints). Leave empty for all ratings.

## `reviewsSince` (type: `string`):

Drop reviews older than this. A date (2026-01-31) or a relative period ("30 days", "6 months", "1 year"). With sort = Most recent the scraper stops reading pages once it passes this date.

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

Cap on reviews for the whole run, across all companies. 0 = no cap beyond the per-company limit.

## `flatten` (type: `boolean`):

Turn nested fields (companyReply, companyRatingBreakdown) into top-level columns such as companyReply_text, which is easier to use in spreadsheets.

## `maxConcurrency` (type: `integer`):

How many review pages are fetched in parallel for each company.

## `maxRequestRetries` (type: `integer`):

ConsumerAffairs uses bot protection that rejects some requests. Each page is retried on a new IP up to this many times.

## `proxy` (type: `object`):

Residential proxies are required; ConsumerAffairs blocks datacenter IPs. Defaults to Apify Residential (US).

## Actor input object example

```json
{
  "companyUrls": [
    "https://www.consumeraffairs.com/insurance/geico.html"
  ],
  "maxReviewsPerCompany": 100,
  "sortBy": "recent",
  "maxItems": 0,
  "flatten": false,
  "maxConcurrency": 8,
  "maxRequestRetries": 8,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "companyUrls": [
        "https://www.consumeraffairs.com/insurance/geico.html"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/consumeraffairs-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 = {
    "companyUrls": ["https://www.consumeraffairs.com/insurance/geico.html"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/consumeraffairs-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 '{
  "companyUrls": [
    "https://www.consumeraffairs.com/insurance/geico.html"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call memo23/consumeraffairs-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/consumeraffairs-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/HcC6uXPuA6y9F1Tu0/builds/RnJbzDOA3eMVOglaD/openapi.json
