# Capterra Reviews Scraper — Pros, Cons & Reviewer (`thenetaji/capterra-reviews-scraper`) Actor

Export a product's Capterra reviews with the headline, the overall comment, and pros and cons kept as separate answers. Every row names the reviewer's job title, industry and how long they used the product, with the per-criterion scores behind the stars.

- **URL**: https://apify.com/thenetaji/capterra-reviews-scraper.md
- **Developed by:** [The Netaji](https://apify.com/thenetaji) (community)
- **Categories:** Business, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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.
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 Reviews Scraper

A software product's Capterra reviews, exported as a spreadsheet. Every row carries the
reviewer's headline, their overall comment, and — kept as separate columns rather than run
together — what they liked and what they disliked. Beside the prose sit the five per-criterion
scores behind the star rating, the would-you-recommend score, and the three things that make a
review set segmentable: the reviewer's job title, their industry, and how long they actually
used the product.

Pros and cons being apart is the part that matters in practice. A search for complaints across
one block of concatenated review prose also matches the praise in the same sentence; a search
across `cons` does not.

### Accepted input

`productUrls` is required and takes one or more Capterra product pages, one per line, as full
links such as `https://www.capterra.com/p/147657/monday-com/` or as the pair inside one,
`147657/monday-com`. The number on its own is not enough — a Capterra product is addressed by a
number and a name, the name is case sensitive (`monday-com`, but `GitLab` and `Structure`), and
neither half can be worked out from the other. Every row
[Capterra Category Scraper](https://apify.com/thenetaji/capterra-category-scraper) produces
carries the whole address in `url`, so a category export feeds straight in.

`maxItems` bounds each product separately and defaults to `100`. Reviews arrive 25 to a page,
so `100` is four pages per product. The cap is per product rather than per run because a run
given twenty products is asking for a comparable slice of each. Set `0` to walk a product to
the end.

`startPage` sets the page each product begins at and defaults to `1`. It resumes a walk that
stopped and splits a long product across several runs. Its ceiling is 100, for the reason in
the next section.

```json
{
  "productUrls": ["https://www.capterra.com/p/147657/monday-com/"],
  "maxItems": 25,
  "startPage": 1
}
```

### Response fields

One row per review. This is the first row of that exact run, with the three prose fields
shortened for length:

```json
{
  "product_id": "147657",
  "slug": "monday-com",
  "page": 1,
  "sort": "most helpful reviews",
  "total_reviews": 6095,
  "page_limit": 100,
  "product_name": "monday.com AI Work Platform",
  "product_rating": 4.6,
  "product_rating_best": 5,
  "product_review_count": 6095,
  "title": "A Powerful AI Assistant That Streamlines Project Management and Boosts Productivity",
  "body": "My experience with the monday.com AI Work Platform has been overwhelmingly positive. It has significantly enha ...",
  "pros": "he monday.com AI assistant has completely transformed my workflow management. With simple text prompts, I can  ...",
  "cons": "The AI features in monday.com have felt underwhelming and gimmicky for our team's daily operations. The automa ...",
  "date": "August 8, 2026",
  "source": "Incentivized review",
  "review_rating": 5,
  "review_rating_best": 5,
  "criteria_ratings": {
    "Overall Rating": 5,
    "Ease of Use": 5,
    "Customer Service": 5,
    "Features": 5,
    "Value for Money": 5
  },
  "likelihood_to_recommend": 10,
  "author": "Marquita V.",
  "role": "SALES MANAGER",
  "industry": "Biotechnology",
  "used_for": "1-2 years"
}
```

`title` and `body` are genuinely two fields on this site rather than one field formatted twice.
They are published separately because they are separate.

`criteria_ratings` is Capterra's own map, keyed by its own labels, rather than five fixed
columns. A reviewer who skipped `Customer Service` has no key for it — a column would publish
that as a score of nothing, which is a different claim.

`likelihood_to_recommend` is out of **10**. Every other score on the row is out of 5, and
`review_rating_best` sits beside the star rating so the two axes stay apart.

`sort` says what arrived, not what was asked for. Capterra has no sort parameter at all — its
sort control does not put anything in the address — so reviews come in its most-helpful order
and the order is reported rather than chosen. There is deliberately no input pretending
otherwise.

`role` is printed as the reviewer typed it, capitals included.

### Behaviour on partial results

A product address Capterra serves nothing for is logged and skipped, and the run continues with
the next one. A product that exists with no reviews returns a successful run with no rows for
it.

**At most 2,500 reviews of any product are reachable, whatever `total_reviews` says.** Capterra
paginates every product to page 100 and no further — the product above states 6,095 reviews and
stops at page 100, so 2,500 are addressable and the other 3,595 cannot be opened from the site
at all, by this Actor or by anyone in a browser. The walk stops there and the run log says so
when a product is bigger than its own pagination. `startPage` is capped at 100 for the same
reason: a higher number has no page behind it.

Pages do not overlap. Measured on 2026-08-23, pages 1 and 2 of the product above came back as
stated ranges 1–25 and 26–50 and shared no review headline.

### Frequently asked questions

**Can I sort by newest, or by lowest rating?**
No, and no Actor can — Capterra's own sort control posts a request back to the page rather than
putting a sort in the address, so there is no sorted address to fetch. Every run gets
most-helpful order, and `sort` on every row states it so a dataset is never assumed to be
recency-ordered.

**Why does `total_reviews` say 6,095 when the run stopped at 2,500?**
Because those are two different numbers. 6,095 is Capterra's count of the reviews a product
has; 2,500 is how many its pagination will hand over. `page_limit` on every row is the honest
one.

**Why did a page fail and then work on its own?**
Capterra sometimes refuses a request and states how long to wait. Two of eight live calls on
2026-08-23 came back that way. The wait is honoured and the page asked for again; the run
reports it and continues rather than failing.

**Where do I get product addresses in bulk?**
From [Capterra Category Scraper](https://apify.com/thenetaji/capterra-category-scraper), which
walks a category in ranked order and publishes each product's address as `url`. Guessing one
does not work — the name half is Capterra's spelling rather than the product's.

**Is a Capterra account, cookie or API key required?**
No. No account, session cookie or key of any kind is supplied to the Actor or needed by it.

### Related Actors

[Capterra Category Scraper](https://apify.com/thenetaji/capterra-category-scraper) is where
product addresses come from: a category in ranked order, with each product's rating, review
count, summary and Shortlist flag.

[Capterra Profile Scraper](https://apify.com/thenetaji/capterra-profile-scraper) reads the
vendor's own description, the supported platforms and the product Q\&A — none of which appear on
a reviews page.

# Actor input Schema

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

Capterra product pages, one per line, as full links such as https://www.capterra.com/p/147657/monday-com/ or as the id and name pair inside one, 147657/monday-com. Copy the address from Capterra's own URL bar, or use the `url` a category row already carries — the number alone is not enough to open a product, and the name half is spelled Capterra's way rather than the product's.

## `startPage` (type: `integer`):

Which page each product's reviews start from. It resumes a walk that stopped and splits a long product across several runs. Capterra paginates to page 100 and no further, so this is the highest value that reaches a page.

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

Maximum reviews to save for each product in the list. Set 0 for no limit. Reviews come 25 to a page and Capterra stops paginating at page 100, so 2500 is the most any product can return however many reviews it states.

## Actor input object example

```json
{
  "productUrls": [
    "147657/monday-com"
  ],
  "startPage": 1,
  "maxItems": 25
}
```

# Actor output Schema

## `dataset` (type: `string`):

All records scraped by this run

# 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/147657/monday-com/"
    ],
    "startPage": 1,
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("thenetaji/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 = {
    "productUrls": ["https://www.capterra.com/p/147657/monday-com/"],
    "startPage": 1,
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("thenetaji/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 '{
  "productUrls": [
    "https://www.capterra.com/p/147657/monday-com/"
  ],
  "startPage": 1,
  "maxItems": 25
}' |
apify call thenetaji/capterra-reviews-scraper --silent --output-dataset

```

## MCP server setup

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