# Capterra Reviews Scraper — Ratings, Pros/Cons, Reviewer Data (`axery/capterra-reviews-scraper`) Actor

Scrape user reviews of any software product on Capterra - rating, pros, cons, reviewer job title and industry, likelihood to recommend. No login, no API key.

- **URL**: https://apify.com/axery/capterra-reviews-scraper.md
- **Developed by:** [Axery](https://apify.com/axery) (community)
- **Categories:** Social media, Developer tools, News
- **Stats:** 2 total users, 1 monthly users, 62.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.50 / 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/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 Software Reviews Scraper

Scrapes user reviews of any software product on Capterra — rating, pros, cons, reviewer job title and industry, likelihood to recommend. No login, no API key.

Useful for competitive research, product feedback analysis, and tracking sentiment on your own or a competitor's software listing.

### What makes this different

**Pros and cons come through as real text, not just a star rating.** Capterra's structured data (`schema.org` markup) only carries the review title and rating — the actual pros/cons text and reviewer detail live in the surrounding page markup with no JSON equivalent. This Actor recovers them and merges everything into one row per review, so you get the reasoning behind the rating, not just the number.

**Reviewer context, not just an anonymous score.** Job title, industry, and how long they've used the product are attached to every review where Capterra shows them — useful for weighting reviews from your actual buyer persona differently from the rest.

**A pagination trap most scrapers would never notice.** Request a page past a product's real archive depth and Capterra doesn't error or come back empty — it silently re-serves page 1. This Actor tracks which reviews it has already emitted and stops the instant a page contributes nothing new, so you get a clean, deduplicated set instead of the same reviews repeated as if they were new ones.

**The TLS gate is handled.** Every Chrome or Safari fingerprint gets a bare 403 challenge from Capterra's edge; Firefox's fingerprint does not. This was found by testing six fingerprints, not guessed — the Actor uses the one that actually works.

### Input

| Field | Type | Notes |
|---|---|---|
| `productPaths` | array | The `/p/{id}/{Slug}` part of the product's Capterra URL. |
| `maxItems` | integer | Per product, 25/page. `0` walks the entire archive. |
| `incremental` | boolean | Only reviews not seen in previous runs. |
| `proxyConfiguration` | object | Not normally needed. |

#### Finding the product path

From `https://www.capterra.com/p/135003/Slack/`, the path is `p/135003/Slack`. A wrong path fails clearly on the first page; a page number beyond a product's real review depth ends the run gracefully rather than erroring, since that's the normal, expected end of a smaller product's archive.

### Output

```json
{
  "product": "Slack",
  "reviewer_name": "Richard M.",
  "job_title": "Founder",
  "industry": "Marketing and Advertising",
  "tenure": "2+ years",
  "review_title": "Slack: Essential for Desk Based Workforces",
  "rating": 5,
  "likelihood_to_recommend": 10,
  "pros": "Slack is the best way for a desk based workforce to communicate...",
  "cons": "Honestly, nothing. Occasionally there will be a bug or issue...",
  "reviewed_at": "2026-07-25"
}
```

Each run also writes a `RUN_COVERAGE` record to the key-value store with what was requested, what came back, and any per-product failures — so a partial run is visible rather than silent.

### Local development

```bash
pip install -r requirements.txt
python test_local.py p/135003/Slack --max 60 --out sample_output.json
```

`sample_output.json` is real output from a live three-page run.

# Actor input Schema

## `productPaths` (type: `array`):

The `/p/{id}/{Slug}` portion of the product's Capterra URL - e.g. `p/135003/Slack` from `capterra.com/p/135003/Slack/`. Each is fetched independently into the same dataset.

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

Cap on reviews returned per product, 25 per page. `0` walks the entire archive - for a widely-reviewed product that can be thousands of reviews, so scope this deliberately.

## `incremental` (type: `boolean`):

Remember reviews between runs and return only ones not seen before.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Defaults to Residential - this Actor was flagged by Apify's automated QA after failing from Apify's own container IP, even though a direct residential-ISP connection succeeds every time.

## Actor input object example

```json
{
  "productPaths": [
    "p/135003/Slack"
  ],
  "maxItems": 100,
  "incremental": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per review: rating, pros, cons, reviewer job title and industry, likelihood to recommend.

# 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 = {
    "productPaths": [
        "p/135003/Slack"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("axery/capterra-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 = {
    "productPaths": ["p/135003/Slack"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("axery/capterra-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 '{
  "productPaths": [
    "p/135003/Slack"
  ],
  "maxItems": 100
}' |
apify call axery/capterra-reviews-scraper --silent --output-dataset

```

## MCP server setup

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