# Gartner Peer Insights Scraper (`khadinakbar/gartner-peer-insights-scraper`) Actor

Scrape public Gartner Peer Insights product profiles, ratings, market listings, and review samples. Optional session cookie unlocks paginated reviews. Unblocker-first. MCP-ready.

- **URL**: https://apify.com/khadinakbar/gartner-peer-insights-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Lead generation, AI, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 review scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Gartner Peer Insights Scraper

For SaaS PMs, competitive analysts, and MCP agents who need structured B2B software review evidence. This Actor extracts public Gartner Peer Insights product ratings, vendor profiles, market product lists, and review samples into dataset rows with fields such as `averageRating`, `reviewCount`, `headline`, and `productUrl`. Optional caller-owned Peer Insights cookie unlocks paginated api3 review catalogs.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow for Peer Insights public pages. An analyst starts with product or market URLs, runs with Apify UNBLOCKER, then exports dataset rows into a comparison sheet or CRM research queue. For multi-platform review aggregation across G2/Capterra instead of Peer Insights, use [software-reviews-all-in-one-scraper](https://apify.com/khadinakbar/software-reviews-all-in-one-scraper) after you finish the Gartner shortlist.

### Best fit

Choose this Actor when you have Peer Insights product URLs, SEO slugs, or market category URLs and need ratings, vendor context, and public review text in a flat Pay-per-event dataset.

It works well for category shortlists from market pages and for bounded product deep-dives that stay on publicly visible Peer Insights pages. Pair it with [software-reviews-all-in-one-scraper](https://apify.com/khadinakbar/software-reviews-all-in-one-scraper) when the next step is a cross-platform review corpus rather than Peer Insights alone.

### Practical scenario

A SaaS PM pastes a Zoom Meetings product URL, keeps Apify **UNBLOCKER** on, and sets `maxReviewsPerProduct` to `5`. The run then returns one product summary plus public review/highlight rows. Next they export the dataset and compare ratings against an internal shortlist.

### Best results

- Prefer exact `productUrls` or `marketUrls` over free-text `searchTerms` when you already have canonical Gartner links.
- Keep `proxyConfiguration.apifyProxyGroups` on **UNBLOCKER**; that route is what consistently clears Cloudflare for these pages.
- Start with a small `maxReviewsPerProduct` / `maxProducts` to confirm the slug, then raise caps for production batches.
- Confirm market SEO names from a live Peer Insights market page before bulk runs.
- Supply a caller-owned Peer Insights cookie only when you need fuller authenticated review catalogs beyond the public sample.

### Quick start input

```json
{
  "productUrls": [
    "https://www.gartner.com/reviews/product/zoom-meetings"
  ],
  "maxReviewsPerProduct": 5,
  "includeProductSummary": true,
  "includeReviewHighlights": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["UNBLOCKER"]
  }
}
```

Market mode:

```json
{
  "marketUrls": [
    "https://www.gartner.com/reviews/market/meeting-solutions"
  ],
  "maxProducts": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["UNBLOCKER"]
  }
}
```

### Input reference

| Field | Type | What it controls |
|---|---|---|
| `productUrls` | array | Product or reviews URLs (short `/reviews/product/{slug}` or long market/vendor/product paths). |
| `marketUrls` | array | Market category URLs returning product cards. |
| `productSlugs` | array | SEO slugs without a full URL. |
| `searchTerms` | array | Best-effort slugified product name hints (not a full Gartner site search API). |
| `maxReviewsPerProduct` | integer | Cap on review/highlight rows per product (default 5, max 500). |
| `maxProducts` | integer | Cap on market product cards (default 20, max 200). |
| `includeProductSummary` | boolean | Save a product profile row (default true). |
| `includeReviewHighlights` | boolean | Save likes/dislikes highlight rows (default true). |
| `sessionCookie` | secret string | Caller-provided Peer Insights Cookie header for authenticated api3 pagination. |
| `proxyConfiguration` | object | Prefer Apify **UNBLOCKER** for Cloudflare-protected pages. |

### Output data

| Field | Description |
|---|---|
| `recordType` | `product`, `review`, or `review-highlight` |
| `productName` / `vendorName` | Display names |
| `averageRating` / `reviewCount` | Aggregate metrics on product rows |
| `rating` / `headline` / `summary` | Review fields |
| `jobTitle` / `industryName` / `companySize` | Reviewer firmographics when public |
| `likeText` / `dislikeText` | Highlight snippets |
| `productUrl` / `sourceUrl` | Provenance |
| `scrapedAt` | ISO 8601 timestamp |

Example review row:

```json
{
  "recordType": "review",
  "reviewId": "6966038",
  "headline": "Good video conferencing product",
  "rating": 4,
  "jobTitle": "IT Associate",
  "industryName": "Software",
  "companySize": "1B-10B USD",
  "productName": "Zoom Meetings",
  "productUrl": "https://www.gartner.com/reviews/product/zoom-meetings",
  "scrapedAt": "2026-01-15T12:00:00.000Z"
}
```

### Pricing

Pay per event + platform usage (`isPPEPlatformUsagePaidByUser: true`). The live Pricing tab is the current source of truth after deployment.

| Event | Price | When charged |
|---|---|---|
| `apify-actor-start` | $0.00005 | Once per run (memory-scaled) |
| `review-scraped` (primary) | $0.006 | Each review or likes/dislikes highlight row saved |
| `product-found` | $0.008 | Each product profile or market product card saved |

Worked cost example for a bounded Zoom Meetings prefill-style run with one product summary plus a couple of public highlight records: `$0.00005 + $0.008 + (two × $0.006) = $0.02005` in named PPE events, plus Unblocker/compute platform usage. Invalid inputs and truthful empty products are not charged row events.

### API example

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~gartner-peer-insights-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "productUrls": ["https://www.gartner.com/reviews/product/zoom-meetings"],
    "maxReviewsPerProduct": 5,
    "includeProductSummary": true,
    "includeReviewHighlights": true,
    "proxyConfiguration": {
      "useApifyProxy": true,
      "apifyProxyGroups": ["UNBLOCKER"]
    }
  }'
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/gartner-peer-insights-scraper').call({
  productUrls: ['https://www.gartner.com/reviews/product/zoom-meetings'],
  maxReviewsPerProduct: 5,
  proxyConfiguration: { useApifyProxy: true, apifyProxyGroups: ['UNBLOCKER'] },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### MCP / AI agent

MCP tool name: `apify--gartner-peer-insights-scraper`.

> Scrape Zoom Meetings Peer Insights public ratings and review samples with UNBLOCKER, then return dataset rows and note COMPLETE vs VALID\_EMPTY vs UPSTREAM\_FAILED.

Agent guidance: prefer `productUrls`/`marketUrls` over `searchTerms`; public pages yield a focused sample unless a caller-owned cookie is set; retry with UNBLOCKER when Cloudflare challenges appear; pagination is caller-driven via `maxProducts` / `maxReviewsPerProduct` caps. Partial runs keep successful rows and mark `PARTIAL`.

### Outcomes

| Outcome | Meaning |
|---|---|
| `COMPLETE` | All targets produced useful rows |
| `PARTIAL` | Some targets were invalid or incomplete |
| `VALID_EMPTY` | Valid targets, no public rows |
| `INVALID_INPUT` | No usable Gartner targets |
| `UPSTREAM_FAILED` | Cloudflare/anti-bot challenge on every request |
| `CONFIG_ERROR` | Proxy/config is unavailable at start |

Every run writes `OUTPUT` and `RUN_SUMMARY` with `itemsPushed` and `chargedEventCounts`.

### Scope and recovery guidance

Provide UNBLOCKER for Cloudflare-protected Peer Insights pages. Start with known product or market URLs, validate one slug, then scale caps. When a public sample is enough, leave the cookie empty. When authenticated catalogs are authorized, supply a caller-owned Cookie header for that run only. Invalid hosts finish as `INVALID_INPUT` with zero row charges; Cloudflare-challenged routes finish as `UPSTREAM_FAILED` so operators can adjust proxy settings.

### Builder's note

I built this Actor after finding that plain datacenter HTTP consistently hits Gartner Cloudflare challenges, while Apify Unblocker returns the Next.js RSC embeds that carry `initialProductInfo`, `initialRatings`, and market `products` arrays. I designed the public contract around those embeds so agents get honest product and sample-review rows without implying a login bypass. In my testing, empty Unblocker shells still happen occasionally, so the runtime retries product parses before recording a truthful empty outcome.

### Differentiation

This Actor documents the public-page boundary clearly, ships MCP-ready schemas, PPE + usage pass-through, Unblocker-first transport, market discovery, and optional caller-owned authenticated pagination—while staying scoped to Peer Insights public pages and optional caller-owned authenticated catalogs.

### Legal / responsible use

Use only for lawful purposes and respect Gartner's terms of service. Public pages and caller-owned sessions only. Callers supply only cookies they are authorized to use for that run. Gartner and Peer Insights are trademarks of their owners. This independent Actor is not affiliated with, associated with, or endorsed by Gartner.

# Actor input Schema

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

Gartner Peer Insights product page URLs. Accepts short form https://www.gartner.com/reviews/product/{slug} or long market/vendor/product/reviews URLs. Use this when you already know the product page. NOT a free-text search — use searchTerms or productSlugs for that.

## `marketUrls` (type: `array`):

Gartner market/category listing URLs such as https://www.gartner.com/reviews/market/meeting-solutions. Returns product cards (name, rating, review count, SEO slug). NOT individual product review pages — use productUrls for those.

## `productSlugs` (type: `array`):

Product SEO names without a full URL (e.g. zoom-meetings, salesforce-sales-cloud). Converted to /reviews/product/{slug}. Prefer productUrls when you have the canonical link.

## `searchTerms` (type: `array`):

Free-text product names slugified into /reviews/product/{slug} lookups (e.g. Zoom Meetings → zoom-meetings). Best-effort public slug resolution; prefer exact productUrls when known. NOT a full Gartner site search API.

## `startUrls` (type: `array`):

Optional requestListSources-style URL list. Same classification as productUrls/marketUrls. Prefer productUrls or marketUrls for clarity.

## `maxReviewsPerProduct` (type: `integer`):

Hard cap on review/highlight rows saved per product. Public pages usually expose a small sample; larger values matter mainly when sessionCookie unlocks api3 pagination. Default 5 for quality tests. Range 1-500.

## `maxProducts` (type: `integer`):

Hard cap on product cards saved from each market URL. Default 20. Range 1-200.

## `includeProductSummary` (type: `boolean`):

If true (default), saves one product profile row (ratings, vendor, description) per product URL in addition to review rows.

## `includeReviewHighlights` (type: `boolean`):

If true (default), also saves public likes/dislikes highlight snippets as review-highlight rows when present on the product page.

## `sort` (type: `string`):

Sort used for authenticated api3 pagination when a Peer Insights cookie is provided. Ignored for public page samples. Default most helpful.

## `sessionCookie` (type: `string`):

Optional Cookie header from a logged-in Gartner Peer Insights browser session. Caller-provided / user-provided: supply your own secret for the run. Enables api3 pagination for fuller review catalogs. Leave empty for public-only scraping. This value is never written to the dataset, output, or logs.

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

Apify Proxy. UNBLOCKER is strongly recommended — Gartner sits behind Cloudflare. Default: UNBLOCKER.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.gartner.com/reviews/product/zoom-meetings"
  ],
  "marketUrls": [],
  "productSlugs": [],
  "searchTerms": [],
  "startUrls": [],
  "maxReviewsPerProduct": 5,
  "maxProducts": 5,
  "includeProductSummary": true,
  "includeReviewHighlights": true,
  "sort": "helpful",
  "sessionCookie": "connect.sid=YOUR_SESSION_VALUE",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Product profiles, market cards, and review/highlight rows.

## `output` (type: `string`):

Final outcome, itemsPushed, and chargedEventCounts.

## `runSummary` (type: `string`):

Per-target outcomes, warnings, and billing counters.

# 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.gartner.com/reviews/product/zoom-meetings"
    ],
    "marketUrls": [],
    "productSlugs": [],
    "searchTerms": [],
    "startUrls": [],
    "maxReviewsPerProduct": 5,
    "maxProducts": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/gartner-peer-insights-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.gartner.com/reviews/product/zoom-meetings"],
    "marketUrls": [],
    "productSlugs": [],
    "searchTerms": [],
    "startUrls": [],
    "maxReviewsPerProduct": 5,
    "maxProducts": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/gartner-peer-insights-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.gartner.com/reviews/product/zoom-meetings"
  ],
  "marketUrls": [],
  "productSlugs": [],
  "searchTerms": [],
  "startUrls": [],
  "maxReviewsPerProduct": 5,
  "maxProducts": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call khadinakbar/gartner-peer-insights-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/gartner-peer-insights-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/bZkCe9FVekifmOMXD/builds/YCu6C6X6A0G6QNukg/openapi.json
