Capterra Software Reviews
Capterra Reviews API
Page through a Capterra product's B2B software reviews as JSON: the overall score plus five per-criterion scores including likelihood to recommend, title, pros, cons, advice, how long the reviewer used the product, the incentivized flag and its disclosure, what they considered and what they switched from, and the reviewer's job title, industry and company size — plus the vendor name Capterra never publishes on the product page, and a competitor list richer than the profile's, each alternative carrying its own rating histogram and starting price. 25 reviews per page. Costs 2 credits per request.
Authorizations
AuthorizationstringheaderrequiredBearer authentication header of the form Bearer <token>, where <token> is your Scavio API key (e.g. Bearer sk_live_your_key).
Body
application/jsonproduct_idstringThe Capterra product id — the number in /p/186596/Notion/ — sent as a STRING, 1-50 characters. A JSON number is rejected. Required unless you pass url. Every Capterra Search row returns it as product_id.
Example: 186596
slugstringProduct slug, 1-200 characters. LOAD-BEARING here, unlike on the Capterra Product endpoint, where it is cosmetic. It is case sensitive upstream: a wrong or wrongly-cased slug makes Capterra serve PAGE ONE for every page number under a 200, with the page silently dropped from its canonical. Scavio catches that off the canonical and refetches once with Capterra's own spelling, so you still get the page you asked for — but you pay for it in latency, roughly doubling the response time. Pass back the slug a Capterra Search or Capterra Product response gave you and the repair never fires. Page 1 is served correctly under any slug and never pays it.
Example: Notion
urlstringA full capterra.com reviews URL, as an alternative to product_id + slug, 1-1000 characters. Passing back reviews_url from a Capterra Product response is the most reliable way to page: it carries Capterra's own spelling of the slug. A non-capterra.com host is rejected (capterra.co.uk and capterra.com.br are accepted).
Example: https://www.capterra.com/p/186596/Notion/reviews/
pageintegerReviews page, 1-based, 1 to 100. Capterra fixes the page size at 25 and serves no page past 100 whatever review_count and total_pages say, so page 101 is rejected here with a free 400 rather than sold as page one. Page 1 already rides along inside the Capterra Product response at no extra cost — start here at page 2.
Example: 2
Request
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
# Page 1 is already inside product() - start paging at 2.
profile = client.capterra.product(product_id="186596")["data"]
reviews = list(profile["reviews"]) # the 25 that came free with the profile
page = 2
while page <= 100: # Capterra serves no page past 100
batch = client.capterra.reviews(
product_id="186596",
slug=profile["slug"], # case-sensitive: pass it back, do not guess
page=page,
)["data"]
reviews.extend(batch["reviews"])
if not batch["has_next_page"]:
break
page += 1
print(len(reviews), batch["vendor"]["name"]) # the vendor product() leaves nullResponse