Capterra Products Scraper
Give it Capterra category or product pages and it returns one JSON row per software product: name, vendor, rating, review count, starting price and pricing plans, top features, category rank and the sponsored flag. $6.21 per 1,000 products on the free plan, and you pay only for the rows you get.
$6.21 per 1,000 products on the Free plan, down to $3.51 on higher plans
Why this actor
- A whole category is one input: up to 1,000 products with rank and the sponsored flag, ready for market maps and vendor shortlists.
- Pricing plans and top features in the same row, so no second scrape of each product page.
- Only product data: no reviewer names, photos or contact details. Free error rows with a machine-readable
code(not_found,blocked,unavailable...), so an agent knows whether to retry.
Drop-in input
Drop-in input. Input written for dionysus_way/capterra-software-service-category-scraper (startUrls, maxPages) or nifty.codes/capterra-products-scraper (urls, maxItems) works as it is.
As stated in the actor’s README. The full list of accepted input names is on the Store page.
What you get
| Field | What it holds |
|---|---|
seoId, name, url | Capterra's product id, the title and the product page. |
vendor | The company behind it (category lists only). |
rating, reviewCount | Overall rating and number of reviews. |
category | The category the product was listed in. |
pricing | startingPrice, currency, model (per user, flat...), frequency, hasFreeTrial, hasFreeVersion, a one-line summary and the plans with their prices. |
topFeatures | The features reviewers rate as most important that the product offers. |
rank | Position in the category list, starting at 1. |
sponsored | true when the listing is a paid placement. |
description | The vendor's short blurb (category lists only). |
page, categoryUrl, scrapedAt | Where and when the row was collected. |
Sample row (from the README example; long text shortened, lists cut to two items):
{
"rowType": "product",
"platform": "capterra",
"seoId": "184581",
"name": "Asana",
"vendor": "Asana",
"rating": 4.49,
"reviewCount": 13770,
"category": "Project Management",
"pricing": {
"startingPrice": 10.99,
"currency": "USD",
"model": "Per User",
"frequency": "Per Month",
"hasFreeTrial": true,
"hasFreeVersion": true,
"summary": "From $10.99 (Per User, Per Month)"
},
"topFeatures": [
"Task Management",
"Collaboration Tools"
],
"rank": 18,
"sponsored": false
}
Price
Live Apify price on 2026-10-31, per 1,000 rows, by Apify plan. You pay only for rows delivered; error and summary rows marked free in the README cost nothing. Plus $0.001 per GB of memory when a run starts.
| Per 1,000 | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Product (main) | $6.21 | $5.31 | $4.59 | $3.51 | $3.51 | $3.51 |
Use cases
- Market maps: every product in a category with rating, review volume and price point.
- Prospecting: vendor lists per category for sales and partnerships.
- Pricing research: starting prices and free options across a whole category.
- Ad watch: see who pays for the top slots (
sponsored) and how rank moves week to week.
Run it from code or an AI agent
Actor ID arcadium/capterra-products. Set APIFY_TOKEN to your Apify API token. The input below is the actor’s prefilled example; see the guide for every field.
curl
curl -X POST "https://api.apify.com/v2/acts/arcadium~capterra-products/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.capterra.com/project-management-software/"}],"maxResultsPerCategory":50}'JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/capterra-products').call({
"startUrls": [
{
"url": "https://www.capterra.com/project-management-software/"
}
],
"maxResultsPerCategory": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python
# pip install apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/capterra-products").call(run_input={
"startUrls": [{
"url": "https://www.capterra.com/project-management-software/",
}],
"maxResultsPerCategory": 50,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)MCP
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/capterra-products",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}LangChain
# pip install langchain-apify (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("arcadium/capterra-products")
rows = tool.invoke({"run_input": {
"startUrls": [{
"url": "https://www.capterra.com/project-management-software/",
}],
"maxResultsPerCategory": 50,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])LlamaIndex
# pip install llama-index-readers-apify
import os
from llama_index.core import Document, VectorStoreIndex
from llama_index.readers.apify import ApifyActor
reader = ApifyActor(os.environ["APIFY_TOKEN"])
documents = reader.load_data(
actor_id="arcadium/capterra-products",
run_input={
"startUrls": [{
"url": "https://www.capterra.com/project-management-software/",
}],
"maxResultsPerCategory": 50,
},
dataset_mapping_function=lambda item: Document(text=str(item.get("description") or ""), metadata={"url": item.get("url")}),
)
index = VectorStoreIndex.from_documents(documents)CrewAI
# pip install crewai crewai-tools langchain-apify (reads APIFY_API_TOKEN from the environment)
from crewai import Agent
from crewai_tools import ApifyActorsTool
tool = ApifyActorsTool(actor_name="arcadium/capterra-products")
researcher = Agent(
role="Research analyst",
goal="Answer with data collected by the tool",
backstory="Uses public web data.",
tools=[tool],
)n8n
{
"nodes": [
{
"name": "Run arcadium/capterra-products",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
0,
0
],
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/arcadium~capterra-products/run-sync-get-dataset-items",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\"startUrls\":[{\"url\":\"https://www.capterra.com/project-management-software/\"}],\"maxResultsPerCategory\":50}",
"options": {
"timeout": 300000
}
}
}
],
"connections": {}
}Google Sheets
// Extensions > Apps Script. Store your token once: Project Settings > Script properties > APIFY_TOKEN.
function importLastRun() {
const token = PropertiesService.getScriptProperties().getProperty('APIFY_TOKEN');
const url = 'https://api.apify.com/v2/acts/arcadium~capterra-products/runs/last/dataset/items?status=SUCCEEDED&clean=true&format=json';
const res = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + token } });
const rows = JSON.parse(res.getContentText());
if (!rows.length) return;
const keys = Object.keys(rows[0]);
const values = rows.map((r) => keys.map((k) => (typeof r[k] === 'object' ? JSON.stringify(r[k]) : r[k])));
const sheet = SpreadsheetApp.getActiveSheet();
sheet.clearContents();
sheet.getRange(1, 1, 1, keys.length).setValues([keys]);
sheet.getRange(2, 1, values.length, keys.length).setValues(values);
}Limitations
- Public pages only. Nothing behind a login.
- You give it category or product URLs. Search by keyword is not offered, because Capterra's search pages are off limits for automated tools.
- Prices are the "starting from" figures the site publishes. Many products show "contact vendor" and have no price.
- Product pages do not name the vendor, so
vendoris empty for product URLs. Category runs fill it. topFeatureson a category list mirrors the site's feature check marks. Turn onincludePricingDetailsfor the more complete ranking from the product page.- Sponsored products are listed first, as on the site, so
rankis the page position, not a quality ranking.
FAQ
How fresh is the data? It is read when you run the actor, so it matches what the site shows at that moment.
A category returned fewer products than I asked for. Small categories simply have fewer. The run stops when the list ends.
Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.
Related actors
Capterra Reviews Scraper
Capterra reviews for product URLs: rating, pros, cons, text, reviewer role, industry and company size, incentivized flag; $1.79 per 1,000 reviews.
$1.79 per 1,000 reviews on the Free plan, down to $1.16 on higher plans
Software Reviews Scraper
Capterra, Google Play and App Store reviews of one product, $1.79 per 1,000 (zen-studio: $4.99); zen-studio/software-review-scraper input works as is.
$1.79 per 1,000 reviews on the Free plan, down to $1.16 on higher plans
TrustRadius Reviews Scraper
TrustRadius reviews, $3.59 per 1,000 (zen-studio: $3.99); zen-studio/trustradius-review-scraper input works as is.
$3.59 per 1,000 reviews on the Free plan, down to $2.24 on higher plans