# Software Advice Reviews Scraper (Same as Capterra) | $2.5/1K (`softwaresubs29/capterra-reviews-scraper`) Actor

Capterra reviews scraper that extracts complete, structured review data, overall and sub-ratings, pros, cons, reviewer role, industry, company size, verified status, and vendor responses — from any Capterra product page, plus full product listings from any Capterra category.

- **URL**: https://apify.com/softwaresubs29/capterra-reviews-scraper.md
- **Developed by:** [Shab Codes](https://apify.com/softwaresubs29) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 review scrapeds

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

## Capterra Reviews Scraper

**Capterra reviews scraper** that extracts complete, structured review data — overall and sub-ratings, pros, cons, reviewer role, industry, company size, verified status, and vendor responses — from any Capterra product page, plus full product listings from any Capterra category. You are **charged per successfully extracted review. Blocked or empty results are never billed.**

*Last updated: July 2026 · actively maintained.*

### Why this one

- **No empty charges — ever.** A result is billed only after it has been extracted, validated, and written to your dataset. Runs that hit anti-bot walls or return nothing cost you nothing. That is a guarantee, not a goal.
- **Every field, every row.** Most Capterra scrapers return a title and a star count. This one returns the full review object: five sub-ratings, pros/cons/overall comment, reasons for choosing and switching, alternatives considered, reviewer role, industry, company size, usage duration, LinkedIn-verified flag, and vendor responses.
- **Built for survival, not best-case runs.** Reviews are read from Capterra's embedded structured data (more stable than HTML scraping), with an independent DOM fallback, a real-browser engine that clears Capterra's anti-bot checks, rotating residential sessions, block detection, and exponential backoff. When Capterra changes cosmetics — or defenses — this actor keeps working.

### What it does

**Mode A — Product reviews.** Give it Capterra product URLs; it extracts every review (or up to your limit) with all fields below.

**Mode B — Category discovery.** Give it a category URL (e.g. `https://www.capterra.com/collaboration-software/`) or a search term (matched against Capterra's 900+ category directory); it enumerates products with name, rating, and review count — and can optionally fan out and scrape each product's reviews too.

### Input examples

Scrape reviews for one or more products:

```json
{
    "mode": "product_reviews",
    "productUrls": ["https://www.capterra.com/p/135003/Slack/reviews/"],
    "maxReviewsPerProduct": 200,
    "sortReviewsBy": "most_recent"
}
```

Discover all products in a category:

```json
{
    "mode": "category_discovery",
    "categoryUrl": "https://www.capterra.com/collaboration-software/",
    "maxProducts": 200,
    "scrapeReviewsForDiscovered": false
}
```

### Output schema (one item per review)

| Field | Type | Notes |
| --- | --- | --- |
| `source` | string | Always `"capterra"` |
| `productId` / `productName` / `productSlug` / `productUrl` | string | Product identity |
| `productCategory` | string|null | From the page's breadcrumb |
| `productAvgRating` / `productReviewCount` | number|null | Product-level aggregates |
| `reviewId` | string | Stable Capterra review id |
| `reviewUrl` | null | Capterra exposes no per-review permalink — null, never fabricated |
| `title` | string|null | Review headline |
| `overallRating` | number | 1–5 |
| `subRatings.easeOfUse` | number|null | 1–5 |
| `subRatings.customerService` | number|null | 1–5 |
| `subRatings.features` | number|null | 1–5 |
| `subRatings.valueForMoney` | number|null | 1–5 |
| `subRatings.likelihoodToRecommend` | number|null | 0–10 |
| `pros` / `cons` / `overallComment` | string|null | Full review text |
| `adviceToOthers` | string|null | |
| `reasonsForChoosing` / `reasonsForSwitching` | string|null | Purchase context |
| `alternativesConsidered` / `switchedFrom` | string\[] | Product names |
| `incentivized` | string|null | e.g. `"NominalGift"` if Capterra disclosed an incentive |
| `reviewerName` | string|null | As displayed publicly by Capterra |
| `reviewerRole` / `reviewerIndustry` | string|null | |
| `companySize` | string|null | Normalized buckets: `self-employed`, `1-10`, … `10001+` |
| `usageDuration` | string|null | e.g. `"1-2 years"` |
| `verified` | boolean|null | Capterra's reviewer-validation flag |
| `verifiedLinkedIn` | boolean|null | |
| `anonymous` | boolean|null | |
| `sourceOfReview` | string|null | e.g. `"Capterra"` |
| `publishedAt` | string|null | ISO-8601 date |
| `helpfulCount` | null | Not exposed by Capterra — null, never fabricated |
| `vendorResponse` | string|null | Vendor's reply text if present |
| `scrapedAt` | string | ISO-8601 timestamp |

Category discovery items have `"type": "product"` with `productId`, `productName`, `productSlug`, `productUrl`, `productAvgRating`, `productReviewCount`, and `description`.

Missing data is always `null` — fields are never guessed or fabricated.

### Pricing, in plain words

You pay a flat rate per **successfully extracted review** (and a smaller rate per discovered product in category mode). Before anything is billed, the row must pass a validation gate: it must contain an overall rating and real review text. Requests that get blocked, return empty pages, or fail validation are retried or skipped — they are **never** written to your dataset and **never** charged. There is no rental fee and no charge for starting a run that finds nothing.

### Sorting and filtering

- `sortReviewsBy: most_helpful` (default) is Capterra's own order and is exact.
- `most_recent`, `highest`, `lowest` sort the reviews the run collected. Capterra serves reviews in most-helpful order, so with a `maxReviewsPerProduct` cap the run fetches that many reviews first, then sorts them. To get a complete date-ordered set, leave `maxReviewsPerProduct` at 0 (all reviews).
- `minRating` / `maxRating` / `postedWithinDays` filter rows before they are saved (and before they are billed).

### Limitations

- Scope is `capterra.com` (the primary/US site). International Capterra domains are not covered in v1.
- Reviews are fetched in Capterra's most-helpful order; see the sorting note above.
- Per-review permalinks and helpful-vote counts are not publicly exposed by Capterra, so those fields are null rather than invented.
- Very large products (20,000+ reviews) work but take proportionally longer; use `maxReviewsPerProduct` if you don't need the full archive.

### Compliance

This actor accesses only publicly visible review pages — no login, no paywall or authentication bypass, and no personal data beyond what Capterra itself displays publicly (reviewer display name, role, company size). It does not attempt to de-anonymize reviewers who chose anonymity. Please use reasonable volumes and respect Capterra's terms of service and applicable data-protection laws; you are responsible for how you use the extracted data.

# Actor input Schema

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

What to scrape. <b>Product reviews</b> extracts full reviews from the product URLs below. <b>Category discovery</b> enumerates products from a category or search page.

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

Capterra product URLs (e.g. <code>https://www.capterra.com/p/135003/Slack/</code>), reviews URLs, or bare <code>id/slug</code> pairs (e.g. <code>135003/Slack</code>). Used in Product reviews mode.

## `categoryUrl` (type: `string`):

Capterra category listing URL, e.g. <code>https://www.capterra.com/collaboration-software/</code>. Used in Category discovery mode.

## `searchTerm` (type: `string`):

Alternative to the category URL: a phrase matched against Capterra's category directory (e.g. <code>project management</code> → Project Management Software). Used in Category discovery mode.

## `maxReviewsPerProduct` (type: `integer`):

Stop after this many reviews per product. 0 = all reviews.

## `maxProducts` (type: `integer`):

Category discovery mode: stop after this many products. 0 = all.

## `scrapeReviewsForDiscovered` (type: `boolean`):

Category discovery mode: after enumerating products, fan out and scrape their reviews too (respects Max reviews per product).

## `sortReviewsBy` (type: `string`):

Order of reviews in the dataset. <b>Most helpful</b> is Capterra's own order and is exact. Other sorts are applied to the set of reviews the run collects (fetching happens in Capterra's most-helpful order).

## `minRating` (type: `integer`):

Only keep reviews with overall rating ≥ this value (1–5). 0 = no filter.

## `maxRating` (type: `integer`):

Only keep reviews with overall rating ≤ this value (1–5). 0 = no filter.

## `postedWithinDays` (type: `integer`):

Only keep reviews published within the last N days. 0 = no filter.

## `includeProductMeta` (type: `boolean`):

Include product-level aggregates (average rating, review count, category) on every review row.

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

Hard cap on dataset items across the whole run. 0 = no cap.

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

Residential proxies are strongly recommended — Capterra blocks datacenter IPs.

## Actor input object example

```json
{
  "mode": "product_reviews",
  "productUrls": [
    "https://www.capterra.com/p/135003/Slack/reviews/"
  ],
  "maxReviewsPerProduct": 100,
  "maxProducts": 100,
  "scrapeReviewsForDiscovered": false,
  "sortReviewsBy": "most_helpful",
  "minRating": 0,
  "maxRating": 0,
  "postedWithinDays": 0,
  "includeProductMeta": true,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "mode": "product_reviews",
    "productUrls": [
        "https://www.capterra.com/p/135003/Slack/reviews/"
    ],
    "maxReviewsPerProduct": 100,
    "includeProductMeta": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("softwaresubs29/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 = {
    "mode": "product_reviews",
    "productUrls": ["https://www.capterra.com/p/135003/Slack/reviews/"],
    "maxReviewsPerProduct": 100,
    "includeProductMeta": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("softwaresubs29/capterra-reviews-scraper").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 '{
  "mode": "product_reviews",
  "productUrls": [
    "https://www.capterra.com/p/135003/Slack/reviews/"
  ],
  "maxReviewsPerProduct": 100,
  "includeProductMeta": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call softwaresubs29/capterra-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qiqQn7Fqoz22TvT42/builds/rSkN5a4fPlyJXy7EF/openapi.json
