# Capterra Reviews Scraper (sub-ratings, pros/cons, alerts) (`datahamster/capterra-reviews`) Actor

Capterra reviews scraper: paste product page URLs and get every review as a flat row - title, date, overall rating and the four sub-ratings, recommendation score, pros, cons, alternatives considered, switched-from, reviewer role, industry, company size and the vendor reply. Monitor mode alerts.

- **URL**: https://apify.com/datahamster/capterra-reviews.md
- **Developed by:** [Viktor Dubnytskiy](https://apify.com/datahamster) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 result items

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Capterra Reviews Scraper (sub-ratings, pros/cons, alerts)

Scrape every review of a Capterra product page into flat rows — not just the star rating, but the four sub-ratings, the recommendation score, the pros and cons text, which products the reviewer considered or switched from, and the vendor's reply. Paste product URLs, no login and no Capterra account needed.

### What you get (example output)

One row per review. Real values from the example dataset of this actor:

| Field | Example value |
|---|---|
| `title` | `Slack: Essential for Desk Based Workforces` |
| `writtenOn` | `July 25, 2026` |
| `overallRating` | `5` |
| `easeOfUseRating` / `customerSupportRating` / `functionalityRating` / `valueForMoneyRating` | `5` / `5` / `5` / `5` |
| `recommendationRating` | `10` (out of 10) |
| `pros` | `Slack is the best way for a desk based workforce to communicate. Hands down…` |
| `cons` | `Honestly, nothing. Occassionally there will be a bug or issue…` |
| `reviewerJobTitle` / `reviewerIndustry` / `reviewerCompanySize` | `Founder` / `Marketing and Advertising` / `Self-employed` |
| `timeUsedProduct` / `incentivized` / `verifiedLinkedIn` | `2+ years` / `NoIncentive` / `true` |
| `productOverallRating` / `productTotalReviews` | `4.7` / `24190` |

Also on every row: `reviewId`, `productId`, `productUrl`, `url`, `generalComments`, `adviceToOthers`, `switchedFrom`, `alternativesConsidered`, `sourceSite`, `vendorResponse`, `page`, `rank`, `scrapedAt`.

### Use cases

- **Competitive intelligence**: read `alternativesConsidered` and `switchedFrom` to see which products your competitor wins and loses deals against.
- **Voice of customer**: run sentiment or theme extraction over `pros`, `cons` and `generalComments`, segmented by `reviewerIndustry` and `reviewerCompanySize`.
- **Review monitoring**: schedule monitor mode and get a webhook or Telegram message when a new review lands for your product or a competitor's.

### How it works

1. Each product URL is normalised to its reviews page and read through Apify Web Unblocker, which passes the Cloudflare protection on capterra.com.
2. Review pages are paginated 25 reviews at a time, newest first, up to `maxPages` per product.
3. Every review is flattened into one row, including the sub-ratings, the free-text sections and the product-level rating and review count at the time of the run.
4. In `monitor` mode the run compares against the previous run of the same task and returns only new or changed reviews, optionally posting a summary to a webhook or Telegram chat.

### Input

| Field | Meaning | Default |
|---|---|---|
| `productUrls` | Capterra product pages: `capterra.com/p/<id>/<Name>/` | `["https://www.capterra.com/p/135003/Slack/"]` |
| `maxPages` | Review pages per product (25 reviews per page, newest first) | `4` |
| `maxItems` | Stop after this many reviews | `20` |
| `mode` | `scrape` or `monitor` (only new/changed since the previous run) | `scrape` |
| `monitorKey` | State key for monitor mode outside a saved task | empty |
| `webhookUrl` | HTTPS endpoint for the monitor-mode change summary | empty |
| `telegramBotToken` / `telegramChatId` | Send the monitor-mode summary to Telegram | empty |

### Pricing

| Event | Price |
|---|---|
| result | $0.001 per review ($1 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.001 per new/changed review |

Charged only for reviews actually pushed. Capterra sits behind Cloudflare, so the actor runs through Apify Web Unblocker; Apify bills that traffic on top (about 0.7 MB per page of 25).

### Why this actor

- All four sub-ratings and the 0–10 recommendation score as separate numeric fields, not one star value.
- `switchedFrom` and `alternativesConsidered` come back as arrays — the competitive-displacement data most exports drop.
- `incentivized` and `verifiedLinkedIn` let you weight or filter reviews by how they were obtained.
- Passes Cloudflare through Apify Web Unblocker; no login and no Capterra account.
- You pay per pushed row; an empty or blocked run costs nothing beyond platform usage, and `RUN_SUMMARY` records the reason (`no_matches`, `blocked`, `rate_limited`, `invalid_input`, `upstream_error`).
- Monitor mode with webhook and Telegram alerts for new reviews.

### Limits

- Reviews only — product pricing and feature tables are not collected.
- Reviewer identity is only what Capterra displays publicly (usually a first name and an initial); no contact details, no profile enrichment.
- `writtenOn` is Capterra's display date (`July 25, 2026`), not an ISO timestamp.
- Where Capterra streams a long `pros`/`cons` block separately and the page does not carry its text, the field comes back empty rather than as a placeholder string.
- Pages are served through Web Unblocker, so a run is slower than an API-based scraper: budget roughly 10–15 seconds per page of 25 reviews.

### FAQ

**How do I scrape all reviews for one Capterra product?**
Put the product page URL in `productUrls` and raise `maxPages` (25 reviews per page, newest first) and `maxItems` until they cover `productTotalReviews`, which every row reports.

**Can I monitor new Capterra reviews for my product?**
Yes — save the actor as a task with `mode: monitor`, schedule it, and set `webhookUrl` or the Telegram fields. Each run returns only reviews that appeared since the previous run.

**Do I need a Capterra login or API key?**
No. The actor reads public product review pages through Apify Web Unblocker; you provide no credentials.

### Changelog

- 0.1, rebuild 2026-09-12 (fixes, no schema change): `productName` is now read from the page's own product (JSON-LD / heading) instead of the review payload, where a neighbouring product could win; `pros` and `cons` streamed as separate blocks are resolved to their text, and an unresolved placeholder is never emitted.
- 0.1: initial release.

***

If this actor is useful, a review on its Apify Store page helps other people find it. For bugs or a missing field, open a ticket on the **Issues** tab of this actor.

# Actor input Schema

## `productUrls` (type: `array`):

Capterra product pages whose reviews you want, as full URLs in the form capterra.com/p/<product id>/<Product Name>/. The /reviews/ suffix is optional. Example: \["https://www.capterra.com/p/135003/Slack/"].

## `maxPages` (type: `integer`):

How many review pages to read per product, 1 to 1000. One page is 25 reviews, newest first, so maxPages 4 gives the 100 most recent reviews. Example: 1.

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

Stop after this many reviews in total across all products. Integer, example: 20. You are charged only for reviews actually pushed to the dataset.

## `mode` (type: `string`):

"scrape" returns every review found. "monitor" returns only reviews that are new or changed since the previous run of the same task and adds changeType, changedFields and previous. Example: "scrape".

## `monitorKey` (type: `string`):

Optional name for the monitor-mode state when the actor is not started from a saved task; runs sharing this key compare against each other. Example: "slack-reviews".

## `webhookUrl` (type: `string`):

Optional HTTPS endpoint that receives a POST with a JSON summary of the new reviews at the end of a monitor-mode run. Example: "https://hooks.example.com/capterra".

## `telegramBotToken` (type: `string`):

Optional Telegram bot token (from @BotFather) used to send the monitor-mode change summary. Format: "123456789:AA...".

## `telegramChatId` (type: `string`):

Optional Telegram chat id that receives the monitor-mode summary; use a negative id for a group. Example: "-1001234567890".

## Actor input object example

```json
{
  "productUrls": [
    "https://www.capterra.com/p/135003/Slack/"
  ],
  "maxPages": 1,
  "maxItems": 20,
  "mode": "scrape"
}
```

# Actor output Schema

## `results` (type: `string`):

All pushed rows (dataset, JSON)

## `resultsTable` (type: `string`):

Dataset in the Console viewer

## `runSummary` (type: `string`):

RUN\_SUMMARY record (pushed, skipped, emptyReason)

# 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 = {
    "productUrls": [
        "https://www.capterra.com/p/135003/Slack/"
    ],
    "maxPages": 1,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahamster/capterra-reviews").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 = {
    "productUrls": ["https://www.capterra.com/p/135003/Slack/"],
    "maxPages": 1,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("datahamster/capterra-reviews").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 '{
  "productUrls": [
    "https://www.capterra.com/p/135003/Slack/"
  ],
  "maxPages": 1,
  "maxItems": 20
}' |
apify call datahamster/capterra-reviews --silent --output-dataset

```

## MCP server setup

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

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/cvyDC5lYKaRcExWfR/builds/88svGCQT8VGDvMBtN/openapi.json
