# TrustRadius Software Scraper (`scrapyx/trustradius-software-scraper`) Actor

Scrapes B2B software rankings and reviews from TrustRadius by category. Returns each category's top-rated products with pricing, awards, pros/cons, review samples and reviewer demographics.

- **URL**: https://apify.com/scrapyx/trustradius-software-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (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 $0.84 / 1,000 results

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TrustRadius Software Scraper

Scrapes B2B software rankings and reviews from
[TrustRadius](https://www.trustradius.com) — a G2/Capterra competitor —
by category.

Give it a category (`crm`, `project-management`, `hr-management`, ...). Get
back the top-rated products with pricing, awards, pros/cons, a sample of
full-text reviews, and reviewer demographics.

***

### What you get

One row per product, plus a `CATEGORY_SUMMARY` row per category.

#### From the category page (always)

`name` · `url` · `categoryRank` · `image` · `brand` · plus the category's own
`aggregateRating` (rating value and review count as TrustRadius shows it on
the listing card).

#### From the product page (`includeProductDetails`, on by default)

`startingPrice` / `priceCurrency` · `awards` (e.g. `"Top Rated 2026"`) ·
`ratingValue` · `reviewCountTotal` (the real total review count) ·
`reviewsEmbedded` + the actual review text/author/date in
`productDetailJsonLd.review` · `positiveNotes` / `negativeNotes` (pros/cons) ·
`topIndustries` / `companySizes` / `topCountries` / `departments` (who
actually uses this product, from TrustRadius' own reviewer demographics).

***

### Read this before you size a crawl: the category list is capped at 25

TrustRadius' category page always renders its **top 25 products by rating**
— and that's it. Every pagination and sort parameter tried
(`page`, `offset`, `start`, `sort=rating/reviews/az`) returned the **exact
same 25 products**, verified by comparing the actual product URLs, not just
counts. The real listing mechanism lives behind TrustRadius' own API, which
`robots.txt` closes off.

This isn't hidden in the data: `CATEGORY_SUMMARY.categoryTotalProducts`
reports the category's real size (CRM: 1,554 products) right next to
`productsReturned` (never more than 25) and `cappedBelowTotal` (`true`
whenever the category has more than this actor can reach). For most
purposes this is still the useful slice — nobody wants product #950 of 1,554
in a software category — but size your expectations accordingly.

***

### Input

```jsonc
{
  "categories": ["crm"],
  "maxItems": 25,
  "includeProductDetails": true
}
```

A category slug that doesn't exist answers a clean 404 — one `ERROR` row,
never wrong data — so slugs aren't pre-validated against a fixed list (there
are hundreds, and TrustRadius' own category-page URL is the source of
truth).

***

### Known limits

**Review counts use different field names on different pages, and this actor
already shipped that bug once.** The category page's own rating block uses
`reviewCount`; the product detail page's uses `ratingCount` — the exact same
number, two different Schema.org property names, verified on the same
product returning 283 both ways. An early version of this actor only read
one of them and silently returned `null` for every single row.
`reviewCountTotal` now checks both.

**The embedded reviews are a small sample, not the full set.** A product
with `reviewCountTotal: 283` typically ships around 5 reviews embedded in
its own page — `reviewsEmbedded` tells you how many actually came through.

***

### Anti-bot posture

A TLS-fingerprint gate: of 5 profiles tried, 3 came back clean
(chrome124, safari17\_0, firefox133) and 2 (chrome99\_android, edge101)
answered HTTP 403. This actor's profile pool avoids both blocked ones.
Residential proxy is the cloud default regardless.

### Policy

`robots.txt`: `Allow: /`, then `Disallow: /api/`, `/share/`, `/search/`,
`/profile/`, `/vendoradmin/`, `/cdn-cgi/`. Category pages (`/crm`, ...) and
product pages (`/products/{slug}`) are **not** disallowed — this actor never
touches `/api/`, `/search/` or any other closed path. No ClaudeBot/
anthropic-ai group.

# Actor input Schema

## `categories` (type: `array`):

TrustRadius category slugs — 'crm', 'project-management', 'hr-management', 'email-marketing', and hundreds more (copy the slug from a category's own trustradius.com URL). An unknown slug answers a clean 404, so a typo costs one ERROR row, never wrong data.

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

TrustRadius' own category page only ever renders its top 25 products by rating — every pagination and sort parameter tried (page/offset/start/sort) returned the identical 25 items. This actor cannot reach past that, so values above 25 have no effect. Set to 0 to return all 25.

## `includeProductDetails` (type: `boolean`):

Fetch each product's own page: starting price, awards, pros/cons, the full review count plus a sample of full-text reviews, and reviewer demographics (top industries/company sizes/countries/departments using it). Costs one extra request per product.

## `maxConcurrency` (type: `integer`):

How many requests may be in flight at once. This absorbs latency variance; it is NOT the throttle — the crawl rate is set by 'Minimum interval between requests' below.

## `minRequestInterval` (type: `number`):

The actual speed control: the shortest gap between two requests to TrustRadius, across all workers.

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

Default is NO proxy, on purpose: measured on 2026-09-21, TrustRadius' Cloudflare gate lets the Apify container's own IP through with a Firefox TLS fingerprint on every request, while every Apify datacenter proxy exit was challenged on all 12 fingerprints tried. Only set this if you have a residential proxy entitlement; an unavailable proxy group degrades to direct rather than failing the run.

## Actor input object example

```json
{
  "categories": [
    "crm"
  ],
  "maxItems": 25,
  "includeProductDetails": true,
  "maxConcurrency": 5,
  "minRequestInterval": 0.4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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 = {
    "categories": [
        "crm"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/trustradius-software-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 = { "categories": ["crm"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/trustradius-software-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 '{
  "categories": [
    "crm"
  ]
}' |
apify call scrapyx/trustradius-software-scraper --silent --output-dataset

```

## MCP server setup

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