Someone on a product team asks for "all our competitor's Capterra reviews in a spreadsheet", and it sounds like a 10-minute job. It isn't. I've built a Capterra scraper, so I've spent a lot of time on this, and this week I rechecked every route from scratch. The paid thing I built is at the end. The rest is free.
Is there an official Capterra reviews API?
Not one I could find.
Some context first. G2 bought Capterra, GetApp and Software Advice from Gartner, and the deal closed on 5 February 2026. Capterra's terms page now names G2 Digital Markets and covers all three sites.
G2 has a real API, documented at data.g2.com, and it does have a reviews endpoint, /api/v2/products/{product_id}/reviews. But it needs an account API token with the products.reviews.read scope, and it lists the reviews of a G2 product. I read through its OpenAPI spec, and the only place Capterra shows up is as a provider value in the buyer intent data, not in reviews.
So if you're the vendor and you want your own reviews, ask your Capterra or G2 rep what they can export for you. If you want someone else's reviews, there's no official door.
Read the terms before you scrape
Capterra's user terms were updated on 4 May 2026. Two lines matter here. You "may not access, copy, extract, reproduce, scrape, store, distribute, or use Derived Data without our express prior written permission", where Derived Data means things like aggregated ratings, scores and comparisons. And you "agree not to modify, copy, distribute, transmit, display, perform, reproduce, publish, license, create derivative works from, transfer, or sell or re-sell" content from the site.
Their robots.txt is looser. It blocks /search and any URL with sort_options=, but the product review pages, /p/<id>/<name>/reviews/, are open. I'm not a lawyer. Read the terms yourself and decide what you're comfortable with, especially if you plan to republish anything.
Doing it yourself
I kept this polite, 6 requests in total from my home connection.
Plain requests with a normal browser user agent:
import requests
r = requests.get("https://www.capterra.com/p/135003/Slack/reviews/",
headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"},
timeout=30)
print(r.status_code, r.headers.get("server"), r.headers.get("cf-mitigated"), len(r.text))
print(r.text[:200].replace("\n", " "))
403 cloudflare challenge 5763
<!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta nam
That's Cloudflare's "Just a moment..." page. Plain HTTP clients get this 403 challenge from Capterra, and a browser user agent string didn't change that. On top of it, Capterra's terms, updated 4 May 2026, ban scraping, as quoted above. So a do-it-yourself scraper has two problems, a technical one and a terms one.
The pages are also awkward to collect from:
- 25 reviews a page. Slack has 24,232 reviews, so that's about 970 page loads for one product.
- The pages sort by Capterra's own "most helpful" score. The newest-first sort runs through a Next.js server action, a POST whose ID lives in Capterra's JavaScript and changes when they deploy.
The hosted option
I built software-reviews-scraper on Apify for this. It's mine, and it's paid per result, $1 per 1,000 reviews. Failed URLs, products it can't find and products with no reviews aren't charged. You can pass product names instead of URLs, sort newest first or by stars, filter to 1 and 2 star reviews, and set it to return only reviews you haven't had before.
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("heyitsgautham/software-reviews-scraper").call(
run_input={"productNames": ["Slack"], "maxReviewsPerProduct": 5, "sortBy": "newest"},
logger=None,
)
for row in client.dataset(run.default_dataset_id).iterate_items():
print(row["reviewDate"], row["rating"], row["reviewerCompanySize"], "|", row["title"])
2026-10-23 4 10,001+ employees | Slack at Work
2026-10-21 5 201-500 employees | Great for automation alerts, but the paid plan is costly
2026-10-18 5 501-1,000 employees | Standup Chats Run Smoothly Every Day
2026-10-14 5 1-10 employees | Slack review
2026-10-14 5 1-10 employees | Slack - Excellent Tool for informal office communications
One row from that run, with the reviewer's name and the name-match details cut:
{
"status": "ok",
"site": "capterra",
"productId": "135003",
"productName": "Slack",
"vendorName": "Slack",
"productRating": 4.7,
"productReviewCount": 24232,
"productCategory": "Collaboration",
"productUrl": "https://www.capterra.com/p/135003/Slack/",
"reviewId": "7230315",
"title": "Great for automation alerts, but the paid plan is costly",
"rating": 5,
"easeOfUseRating": 5,
"customerSupportRating": 4,
"functionalityRating": 5,
"valueForMoneyRating": 3,
"recommendationScore": 9,
"pros": "It's excellent for automation alerts and bots. Our workflows post updates straight into channels, so the team sees issues quickly without checking other tools.",
"cons": "The paid plan is costly, especially for a growing team, and the free plan feels limited. The price adds up quickly as more seats are added.",
"overall": "I've used Slack for over 3 years at work. It's where our team talks and where our automated alerts land.",
"reviewDate": "2026-10-21",
"reviewerJobTitle": "Subject Matter Expert - Credit Operations and Automation",
"reviewerIndustry": "Financial Services",
"reviewerCompanySize": "201-500 employees",
"timeUsedProduct": "2+ years",
"isVerified": true,
"verificationMethods": ["ProofOfLink"],
"isIncentivized": false,
"isVendorReferred": false,
"incentive": "NoIncentive",
"reviewSource": "No Incentive Offered: This review was submitted organically.",
"switchedFrom": null,
"alternativesConsidered": null,
"vendorResponse": null,
"input": "Slack"
}
Its limits, from its own README: capterra.com only, so no capterra.co.uk and the other country sites. Name lookup goes through Capterra's search, which doesn't list every product, so pass the URL when a name comes back not_found. And it doesn't do G2, because G2 shows a CAPTCHA to automated visitors and the scraper doesn't solve CAPTCHAs. It's 100 reviews per product by default, and you raise maxReviewsPerProduct to get them all.
This article was created with the help of AI. An AI agent (Claude) ran every test above on my machine on 26 Oct 2026 and drafted the text from those runs, and every output block is copied from them.
Top comments (1)
The distinction between the G2 reviews API and Capterra appearing only as an intent-data provider saves a lot of false starts. Once an authorized export is available, I would retain reviewId, reviewDate, isIncentivized and reviewSource together. A newest-only sync without those last two fields can make a change in the sample look like a change in customer sentiment.