# Gartner.com \[$0.9💰] Reviews \[Short URLs + Detail Enrichment] (`memo23/apify-gartner-scraper-ppr`) Actor

💰$0.9 per 1,000 results. Extracts structured Gartner review data: ratings, company size, industry, job titles, detailed Q\&A sections, vendor comparisons, deployment info, and reviewer demographics. Outputs a comprehensive JSON with 50+ fields per review.

- **URL**: https://apify.com/memo23/apify-gartner-scraper-ppr.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Automation, Lead generation, Integrations
- **Stats:** 106 total users, 14 monthly users, 76.1% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.90 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Gartner.com Peer Insights Reviews Scraper

### How it works

This actor scrapes product reviews from Gartner Peer Insights (gartner.com/reviews). It accepts both **canonical** URLs (`/reviews/market/<market>/vendor/<vendor>/product/<product>/reviews`) and **short product URLs** (`/reviews/product/<slug>`), forwards query-string filters (review rating, company size, industry, job role, sort), and paginates through all matching reviews. Malformed URLs with missing `&` separators between query params are auto-repaired. For deep per-review data — Q\&A sections, deployment architecture, vendor/market metadata, user demographics — opt in with `enrichReviewDetails: true` and supply an authenticated Gartner cookie session (Gartner gates `/review/view/{id}` pages behind login).

### Features

Multiple Inputs Supported:

- Start from a Gartner reviews page URL with optional filters such as:
  - Basic URL: https://www.gartner.com/reviews/market/document-management/vendor/opentext/product/opentext-documentum-content-management/reviews
  - With filters: https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness\&companySize=2|3|4|5|1\&reviewRating=4|5
  - Short product URL (no market/vendor in path): https://www.gartner.com/reviews/product/zendesk-for-customer-service — the actor fetches the page once to resolve the missing market & vendor SEO names, then scrapes reviews via Gartner's short-page RPC endpoint (`/reviews/ui-api/rpc/<id>?p=…`). This RPC returns the cross-market superset of reviews for the product (typically a few more than the canonical /api2-proxy filter). Schema is leaner — `industryCd`, `companySizeCd`, `functionCd`, `function`, `partnerReview`, `upVotes`, `tags`, and `sortValue` come back as `null`. If the RPC method ID rotates, set the `gartnerRpcMethod` input (find the new ID in DevTools → Network → look for `ui-api/rpc/<id>?p=…`).
  - Short URL with filters: https://www.gartner.com/reviews/product/zendesk-for-customer-service?sort=-review\_date\&reviewRating=1|2|3|4 — the same query-string filters supported on canonical URLs (`sort`, `reviewRating`, `companySize`, `industry`, `jobRole` / `function`, `deploymentRegion`, `partnerReview`, `months`) are forwarded to the RPC. Sort values map: `-helpfulness` → `most-helpful`, `-review_date` → `most-recent`. Malformed URLs missing the `&` separator between params (e.g. `…?reviewRating=1|2|3|4sort=-review_date`) are auto-repaired before parsing, and a `[input] repaired malformed URL` warning is logged so the typo is visible.
  - Single review detail page: https://www.gartner.com/reviews/market/{market}/vendor/{vendor}/product/{product}/review/view/{reviewId}
- Or specify product and category (market) via input parameters and the actor will construct the API URL.

Enhanced URL Parser & API Builder:

- Intelligently parses complex filter URLs with support for:
  - **Company Size Filters**: Automatically maps company size values (1-5) to include additional internal IDs
  - **Multi-value Filters**: Supports pipe (`|`) and comma (`,`) separated values for filters like `companySize=2|3|4|5|1`
  - **Review Rating Filters**: Handles rating filters like `reviewRating=4|5`
  - **Partner Review Filters**: Supports boolean partner review filtering
  - **Industry & Function Filters**: Parses job roles, industries, and deployment regions
  - **Sort Parameters**: Preserves sort preferences (`-helpfulness`, `-review_date`)
- Constructs optimized API calls with proper parameter encoding and filter mapping

Pagination and enrichment:

- Fetches the initial page to get total counts, then requests all reviews.
- Optionally visits each review page to extract extra details — opt in with `enrichReviewDetails: true` in input (default false).

> **Review-detail enrichment requires authentication.** Gartner gates `/review/view/{id}` pages behind login — anonymous proxy requests are redirected to `/peer-insights/login` with `regActivity=read_greater_4_reviews` and return an empty SSR HTML shell. To use `enrichReviewDetails: true` you must supply Gartner credentials (recommended) or a logged-in cookie session.
>
> **Three ways to authenticate (in priority order):**
>
> 1. `gartnerAccounts` (recommended): a JSON array of `{ "email": "...", "password": "..." }`. The actor logs in automatically at the start of the run and mints a fresh session — no manual cookie pasting and **no expiry problem** (sessions die in ~1–2 hours, so pasted cookies go stale fast; auto-login refreshes every run). Supply several accounts to spread load (one is used per run). Logins are cached in a private key-value store and reused for `sessionCacheMinutes` (default 30) so frequent/scheduled runs don't hammer Gartner's login endpoint. These are YOUR Gartner accounts; credentials are sent only to Gartner's own login endpoint and never stored in plain text in the dataset.
>
> 2. `cookieString`: paste a raw `Cookie:` header value. In DevTools, log into gartner.com → Network tab → click any `www.gartner.com` request → copy the `Cookie:` request header → paste verbatim. Good for one-off runs; expires within hours.
>
> 3. `cookies`: a JSON array of `{name, value, domain, sameSite}` objects (e.g. from a Cookie-Editor extension).
>
> **Behaviour when enrichment is requested:**
>
> - With valid cookies: each review yields a merged item with a rich nested `reviewDetails` object (`headline`, `summary`, `submitDate`, `rating`, `source`, `upvote`, `downvote`, `deploymentArchitecture`, `partnerReview`, `user{id,title,industry,companySize,function}`, `market{id,name,seoName}`, `vendor{id,name,seoName}`, `products[…]`, `sections[…]` with per-section Q\&A and `ratingValue`, plus a flattened top-level `questions` array tagged with their source section). Verified live against Zendesk reviews — every field populates.
> - With `enrichReviewDetails: true` but no credentials/cookies supplied: the actor logs a warning, disables enrichment for the run, and proceeds with the basic-listing scrape only (no wasted proxy traffic).
> - With stale/invalid cookies or a failed login: each detail fetch is detected as auth-gated and logged; the actor pushes the basic listing item (tagged `enrichmentError`) without rich details — the run still succeeds and delivers data.
>
> **Billing with `enrichReviewDetails: true`:** enrichment currently costs the **same** as basic scraping — `$0.90/1k` — because every review pushes exactly one dataset item. (A dedicated `review-detail-page` upcharge event is planned; once it's live in the Apify Console the actor will automatically add a per-detail charge, with no redeploy needed.) The failed-enrichment cases (login redirect, stale cookies) still push the basic item. Note that enrichment roughly **doubles HTTP traffic** (one detail fetch per review on top of pagination), so runs take longer.

### Category runs, summaries and incremental updates

#### A whole category at once

Point `startUrls` at a category instead of a single product and the actor reads Gartner's vendor
list for that market, then scrapes every vendor and product in it:

```json
{ "startUrls": [{ "url": "https://www.gartner.com/reviews/market/collaborative-work-management" }] }
```

Add `vendors` to narrow it to the companies you care about. Names are matched against both vendor
and product names, so everyday spellings work and you don't need the SEO slug. Anything that
matches nothing is reported in the log rather than silently ignored:

```json
{
  "startUrls": [{ "url": "https://www.gartner.com/reviews/market/collaborative-work-management" }],
  "vendors": ["monday.com", "Smartsheet", "Asana"]
}
```

#### Summary only

`summaryOnly: true` returns one `market_summary` row per vendor — average rating, the 1-5 star
breakdown, review volume and the products listed under that vendor — without pulling the reviews
themselves. For all-time and last-12-months these are Gartner's own published figures and the whole
category costs a single request.

```json
{
  "startUrls": [{ "url": "https://www.gartner.com/reviews/market/adaptive-project-management-and-reporting" }],
  "summaryOnly": true,
  "lastNMonths": 12
}
```

Each row carries `scoreSource`, which is `gartner-published` for those two windows and `computed`
for any other window, where the figures are calculated from the reviews inside it.

#### Time windows and incremental re-runs

Both options apply to single products and whole categories:

- `lastNMonths` — a rolling window. Gartner applies it server-side, so a re-run fetches only what
  falls inside it rather than paging through everything and discarding the rest. `12` also switches
  a summary to Gartner's published 12-month scores.
- `reviewsAfterDate` — an exact cutoff such as `2026-06-18`, and it takes precedence over
  `lastNMonths`. The actor requests the smallest window that encloses your date, trims to the date
  itself, and stops paging as soon as it reaches older reviews.

Every review row carries `reviewDateIso` (`2026-07-23`) alongside Gartner's display date
(`Jul 23, 2026`), so runs can be diffed and deduplicated without parsing date strings.

```json
{
  "startUrls": [{ "url": "https://www.gartner.com/reviews/market/collaborative-work-management" }],
  "reviewsAfterDate": "2026-06-18"
}
```

#### Partner reviews and how counts reconcile

Gartner's published rating and review count exclude partner reviews, the ones collected through a
vendor's own campaign, while the review list includes them. monday.com in Adaptive Project
Management is a worked example: Gartner publishes 324, the full set is 327, and the difference is
exactly its 3 partner reviews. Wrike has none and both figures agree at 205.

Every review carries a `partnerReview` flag, and `includePartnerReviews: false` drops them so a run
reproduces Gartner's published number exactly.

Two more things worth knowing when reconciling numbers. A vendor's published count covers every
product it sells in that market, so vendors such as Planview, with four products in one category,
are one summary row and several product-level review sets. And a product listed in two categories
keeps separate reviews in each, so running several categories produces no duplicate reviews —
monday.com's 327 reviews in Adaptive Project Management and its 636 in Collaborative Work
Management have no review in common.

### How to Use

1. Set Up: Ensure you have an Apify account and access to the Apify platform.
2. Configure Input: Provide either a Gartner reviews page URL in `startUrls` or set `product` and `category` SEO names.
3. (Optional) Set `maxItems` to limit number of reviews.
4. Configure Proxy: Strongly recommended to improve reliability and avoid IP blocks.
5. Run the actor and export data (JSON/CSV) from the run dataset.

### Input Configuration

Here are example inputs for scraping reviews:

**Basic Product Scraping:**

```json
{
  "startUrls": [
    {
      "url": "https://www.gartner.com/reviews/market/observability-platforms/vendor/datadog/product/datadog/reviews"
    },
    {
      "url": "https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness&companySize=2|3|4|5|1&reviewRating=4|5&partnerReview=false"
    },
    {
      "url": "https://www.gartner.com/reviews/product/zendesk-for-customer-service"
    }
  ],
  "maxItems": 100,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 3,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Supported Filter Parameters

The actor automatically parses and handles these URL filter parameters:

- **`companySize`**: Company size categories (1-5), automatically mapped to include additional internal IDs
- **`reviewRating`**: Star ratings (1-5), supports multiple values like `reviewRating=4|5`
- **`partnerReview`**: Boolean filter for partner reviews (`true`/`false`)
- **`industry`**: Industry category filters
- **`jobRole`**: Job function filters (mapped to `function` parameter)
- **`deploymentRegion`**: Geographic deployment filters
- **`sort`**: Sort order (`-helpfulness`, `-review_date`)
- **`months`**: Time range filters

Filters support multiple values separated by pipe (`|`) or comma (`,`): `companySize=2|3|4` or `reviewRating=4,5`

### Output Structure

The output dataset contains one item per review. Each item merges base review fields from the Gartner reviews API with additional fields parsed from the review detail page under `reviewDetails`.

```json
{
    "reviewId": 6075242,
    "formattedReviewDate": "Mar 11, 2025",
    "reviewSourceCode": 4,
    "reviewIncentiveCode": 1,
    "productNames": "Grafana Cloud",
    "reviewRating": 5,
    "industryCd": 258,
    "industryName": "Construction",
    "companySizeCd": 9902,
    "companySize": "10B - 30B USD",
    "jobTitle": "Enterprise Architect",
    "reviewSummary": "giving insight into software and customer usage  takes the confusion out of developer expectation and customer service expectation",
    "reviewHeadline": "The user experience isnt what you think it is. Trust the telemetry emissions",
    "upVotes": 0,
    "functionCd": 233,
    "function": "IT",
    "partnerReview": false,
    "productSeoNames": [
        "grafana-cloud"
    ],
    "vendorSeoName": "grafana-labs",
    "sortValue": {
        "long": false,
        "double": true,
        "boolean": false,
        "any": false,
        "string": false,
        "null": false
    },
    "reviewDetails": {
        "headline": "The user experience isnt what you think it is. Trust the telemetry emissions",
        "summary": "giving insight into software and customer usage  takes the confusion out of developer expectation and customer service expectation",
        "submitDate": "Mar 11, 2025",
        "rating": 5,
        "source": "Invited by vendor (direct, user community)",
        "upvote": 0,
        "downvote": 0,
        "deploymentArchitecture": "Hybrid Cloud and On-premises",
        "partnerReview": false,
        "user": {
            "id": 367080855,
            "title": "Enterprise Architect",
            "industry": "Construction",
            "companySize": "10B - 30B USD",
            "function": "IT"
        },
        "market": {
            "id": 21,
            "name": "Observability Platforms",
            "seoName": "observability-platforms"
        },
        "vendor": {
            "id": 64540,
            "name": "Grafana Labs",
            "seoName": "grafana-labs"
        },
        "products": [
            {
                "id": 135988,
                "name": "Grafana Cloud",
                "seoName": "grafana-cloud",
                "subscribed": false
            }
        ],
        "sections": [
            {
                "id": 2,
                "title": "Lessons Learned",
                "questions": [
                    {
                        "key": "lessonslearned-like-most",
                        "title": "What do you like most about the product or service?",
                        "value": "the ease of use and the amount of data and intelligence. remove technical boundaries and allows people to view the products through an agreed upon abstraction",
                        "type": "text"
                    },
                    {
                        "key": "lessonslearned-dislike-most",
                        "title": "What do you dislike most about the product or service?",
                        "value": "out of box experience is still difficult for some users not familiar",
                        "type": "text"
                    }
                ]
            },
            {
                "id": 3,
                "slug": "evaluation-contracting",
                "title": "Evaluation & Contracting",
                "ratingKey": "evaluation-contracting-overall",
                "ratingValue": "3",
                "questions": [
                    {
                        "key": "why-purchase-s24",
                        "title": "Why did you purchase this product or service?",
                        "value": [
                            "Cost management",
                            "Create internal/operational efficiencies"
                        ],
                        "type": "checkboxes"
                    },
                    {
                        "key": "factors-drove-decision-s24",
                        "title": "What were the key factors that drove your decision?",
                        "value": [
                            "Product functionality and performance",
                            "Overall cost"
                        ],
                        "type": "checkboxes"
                    },
                    {
                        "key": "vendors-considered",
                        "title": "Which other vendors did you consider in your evaluation?",
                        "value": [
                            "Honeycomb",
                            "Logz.io",
                            "LogicMonitor",
                            "Oracle",
                            "Datadog",
                            "Elastic",
                            "New Relic"
                        ],
                        "type": "checkboxes"
                    }
                ]
            },
            {
                "id": 4,
                "slug": "integration-deployment",
                "title": "Integration & Deployment",
                "ratingKey": "integration-deployment-overall",
                "ratingValue": "4"
            },
            {
                "id": 5,
                "slug": "service-support",
                "title": "Service & Support",
                "ratingKey": "service-support-overall",
                "ratingValue": "5"
            },
            {
                "id": 6,
                "slug": "product-capabilities",
                "title": "Product Capabilities",
                "ratingKey": "capabilities-overall",
                "ratingValue": "5"
            },
            {
                "id": 7,
                "slug": "additional-context",
                "title": "Additional Context",
                "questions": [
                    {
                        "key": "deployment-architecture-s24",
                        "title": "Deployment architecture",
                        "value": "Hybrid Cloud and On-premises",
                        "type": "text"
                    },
                    {
                        "key": "deployment-country-multi",
                        "title": "In which country(s) did your deployment take place?",
                        "value": "United States",
                        "type": "text"
                    }
                ]
            }
        ],
        "reviewSourceCode": 4,
        "reviewIncentiveCode": 1,
        "snippetAvailable": true
    }
}
```

#### Property Descriptions

- `reviewId`: Unique identifier of the review
- `formattedReviewDate`: Human-readable review date (as displayed by Gartner)
- `reviewSourceCode` / `reviewIncentiveCode`: Vendor invitation and incentive codes (numerical enums)
- `productNames`: Product name string for the reviewed product(s)
- `reviewRating`: Overall star rating (number)
- `industryCd` / `industryName`: Industry code and label
- `companySizeCd` / `companySize`: Company size code and label
- `jobTitle`: Reviewer’s job title
- `reviewSummary`: Short review summary text
- `reviewHeadline`: Review headline text
- `upVotes`: Number of upvotes on the review
- `functionCd` / `function`: Reviewer function code and label (e.g., IT)
- `partnerReview`: Whether the review is partner-related (boolean)
- `productSeoNames`: Array of product SEO names
- `vendorSeoName`: Vendor SEO name
- `sortValue`: Internal sort metadata object (type flags such as `long`, `double`, `boolean`, etc.)

#### reviewDetails Property Descriptions

- `headline` / `summary`: Headline and summary of the review
- `submitDate`: Human-readable submission date
- `rating`: Overall rating (number)
- `source`: Review source text (e.g., vendor-invited)
- `upvote` / `downvote`: Vote counts inside details
- `deploymentArchitecture`: Deployment type (e.g., "Hybrid Cloud and On-premises")
- `partnerReview`: Whether marked as partner review (boolean)
- `user`: Object with reviewer metadata
  - `id`: Reviewer ID
  - `title`: Job title
  - `industry`: Industry name
  - `companySize`: Company size label
  - `function`: Function label
- `market`: Object with market metadata
  - `id`, `name`, `seoName`
- `vendor`: Object with vendor metadata
  - `id`, `name`, `seoName`
- `products`: Array of product objects
  - `id`, `name`, `seoName`, `subscribed`
- `sections`: Array of section objects capturing Q\&A and ratings
  - `id`, `slug` (when present), `title`
  - Optional `ratingKey`, `ratingValue`
  - Optional `questions`: Array of question objects with:
    - `key`: Stable question key
    - `title`: Display text
    - `value`: Answer (string or array of strings depending on `type`)
    - `type`: e.g., `text`, `checkboxes`
- Additional flags:
  - `reviewSourceCode`, `reviewIncentiveCode`, `snippetAvailable`

Note: Fields can vary across markets/products and may change as Gartner updates their API and page schema.

### Explore More Scrapers

If you found this Gartner Peer Insights Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Support

- For issues or feature requests, please use the [Issues](https://console.apify.com/actors/RitYL8xaH99d0miHN/issues) section of this actor.
- If you need customization or have questions, feel free to contact the author:
  - Author's website: <https://muhamed-didovic.github.io/>
  - Email: <muhamed.didovic@gmail.com>

### Additional Services

- Request customization or whole dataset: <muhamed.didovic@gmail.com>
- If you need anything else scraped, or this actor customized, email: <muhamed.didovic@gmail.com>
- For API services of this scraper (no Apify fee, just usage fee for the API), contact: <muhamed.didovic@gmail.com>

### More Review Scrapers

Need reviews from other platforms? Same author, same export format:

- **Trustpilot** — business & product reviews: [apify.com/memo23/trustpilot-scraper-ppe](https://apify.com/memo23/trustpilot-scraper-ppe)
- **G2** — software reviews, ratings & vendor data: [apify.com/memo23/g2-scraper](https://apify.com/memo23/g2-scraper)
- **Capterra** — software reviews & product profiles: [apify.com/memo23/capterra-scraper](https://apify.com/memo23/capterra-scraper)
- **Yelp** — local business reviews & ratings: [apify.com/memo23/yelp-scraper](https://apify.com/memo23/yelp-scraper)

***

### 🤖 Related MCP servers for AI agents

Building an AI agent, or using Claude, Cursor or ChatGPT? Skip the scraping setup — connect our hosted **MCP servers** (no API keys, billed per call):

- **[Reviews MCP Server](https://apify.com/memo23/reviews-mcp-server)** — search companies, read real Trustpilot review texts, and pull multi‑platform ratings (Trustpilot + App Store + Google Play) straight from your assistant.
- **[Reddit MCP Server](https://apify.com/memo23/reddit-mcp-server)** — search Reddit, browse subreddits, read comment threads.
- **[Email Finder & Verifier MCP](https://apify.com/memo23/email-mcp-server)** — find and verify company emails.
- **[Video Transcripts MCP](https://apify.com/memo23/transcripts-mcp-server)** — full YouTube & TikTok transcripts.

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/apify-gartner-scraper-ppr`).

**Purpose:** Scrape Gartner Peer Insights reviews from a category, single product, short-product, or single-review URL — one flat row per review, with URL query filters forwarded.

**Minimal input:**

```json
{
  "startUrls": [{ "url": "https://www.gartner.com/reviews/product/zendesk-for-customer-service" }],
  "summaryOnly": false,
  "includePartnerReviews": true,
  "maxItems": 50,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 3,
  "enrichReviewDetails": false,
  "reviewInsights": false,
  "painPointAnalysis": false,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
```

Point `startUrls` at a category to scrape every vendor/product; narrow with `vendors`. Optional `lastNMonths` or `reviewsAfterDate` restrict the time window; `enrichReviewDetails` requires auth via `cookieString`, `cookies`, or `gartnerAccounts` (auto-login, with `sessionCacheMinutes`).

**Output:** one row per review — `reviewId`, `formattedReviewDate`, `reviewDateIso`, `reviewSourceCode`, `reviewIncentiveCode`, `productNames`, `reviewRating`, `industryCd`, `industryName`, `companySizeCd`, `companySize`, `jobTitle`, `reviewSummary`, `reviewHeadline`, `upVotes`, `functionCd`, `function`, `partnerReview`, `productSeoNames`, `vendorSeoName`, `sortValue`, plus a nested `reviewDetails` object (`headline`, `summary`, `submitDate`, `rating`, `source`, `deploymentArchitecture`, `user{...}`, `market{...}`, `vendor{...}`, `products[]`, `sections[]` with Q\&A) when `enrichReviewDetails: true`. `summaryOnly` emits `market_summary` rows; `reviewInsights` emits `review_insights` rows; `painPointAnalysis` emits `painPointAnalysis` rows.

**Behaviors an agent should know:**

- `startUrls` accepts category, canonical `/market/.../product/.../reviews`, short `/reviews/product/<slug>`, and single `/review/view/<id>` URLs; URL query filters (rating, company size, industry, sort) are forwarded, and malformed URLs are auto-repaired.
- Always set `maxItems` — default cap is 10000; a single category can hold thousands of reviews.
- `summaryOnly: true` returns one row per vendor (Gartner's published figures for all-time / 12-month, one request); `includePartnerReviews: false` reproduces Gartner's published count exactly.
- For incremental re-runs use `lastNMonths` (rolling, server-side) or `reviewsAfterDate` (exact cutoff, takes precedence); `reviewDateIso` on each row enables dedup.
- `enrichReviewDetails: true` needs a valid authenticated Gartner session; without one it falls back to the basic listing.
- Billing: every review bills one `result` event ($0.0009, i.e. $0.90 / 1,000); with `enrichReviewDetails`, once the `review-detail-page` charge is active each enriched review adds $0.001 per detail page fetched (failed enrichments bill only the basic result); `reviewInsights` ($0.02 / product) and `painPointAnalysis` ($0.05 / product) are billed per product analyzed (the AI pain-point pass needs a paid Apify plan).

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Gartner, Inc. or any of its subsidiaries. All trademarks mentioned, including Gartner and Peer Insights, are the property of their respective owners.

The scraper accesses only publicly available review pages on gartner.com — no authenticated endpoints or content behind the Gartner login wall except where you supply your own Gartner account credentials or cookie session for review-detail enrichment. Users are responsible for ensuring their use complies with Gartner's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

gartner scraper, scrape gartner peer insights, gartner reviews scraper, gartner.com scraper, gartner peer insights api, Apify gartner, gartner review data, software reviews scraper, b2b software reviews, vendor rating scraper, gartner market reviews, product review extraction, competitive intelligence data, review monitoring, gartner vendor comparison, software buyer research, review sentiment analysis, saas reviews data, gartner ratings export, enterprise software reviews

# Actor input Schema

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

Paste any mix of:<br>• <b>a whole category</b> — <code>https://www.gartner.com/reviews/market/collaborative-work-management</code> (every vendor and product in it)<br>• a single product — <code>.../market/\<market>/vendor/\<vendor>/product/\<product>/reviews</code><br>• a short product URL — <code>/reviews/product/\<slug></code><br>• a single review — <code>.../review/view/\<id></code><br>Query filters on the URL (rating, company size, industry, sort) are forwarded.

## `vendors` (type: `array`):

Narrows a category run to the companies you care about. Type them as you'd say them — <code>monday.com</code>, <code>Salesforce (Informatica)</code> — they're matched against both vendor and product names. Any name that matches nothing is reported in the log. Empty means every vendor in the category.

## `summaryOnly` (type: `boolean`):

One row per vendor: average rating, the full 1-5 star breakdown, review volume and the products listed under it. For all-time and last-12-months these are Gartner's own published figures and the whole category costs a single request. Any other window is computed from the reviews inside it. Note that Gartner's published figures exclude partner reviews.

## `lastNMonths` (type: `integer`):

Rolling window, filtered by Gartner server-side, so a re-run only fetches what's inside it. 12 also switches the summary to Gartner's own published 12-month scores. Ignored when a cutoff date is set below.

## `reviewsAfterDate` (type: `string`):

Exact cutoff, e.g. <code>2026-06-18</code>. Use this for incremental re-runs: it collects only reviews dated on or after it, and stops paging as soon as it reaches older ones. Takes precedence over <b>Last N months</b>.

## `includePartnerReviews` (type: `boolean`):

Reviews collected through a vendor's own campaign. Gartner counts them in the review list but leaves them out of the rating and review count it publishes, so turn this off to reproduce the published figure exactly. Every review row carries a <code>partnerReview</code> flag either way.

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

Maximum number of reviews to scrape. Worth setting on a first category run — a large category can hold thousands of reviews.

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

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up. Higher values ride out intermittent Cloudflare blocks on the entry request by rotating to more fresh IPs.

## `proxy` (type: `object`):

Proxy used for the scrape.<br><br>In most cases you can leave this alone: paid Apify accounts are routed through our own residential proxy automatically, and free accounts use Apify Proxy automatic. You only need to touch this if you want to force your own proxy.<br><br>Note: selecting a proxy group your Apify plan doesn't include (for example RESIDENTIAL on a free account) makes Apify reject the run before it starts, with a "do not have access to proxy groups" message.

## `enrichReviewDetails` (type: `boolean`):

When true, the actor fetches the /review/view/{id} page for every review and merges a rich <code>reviewDetails</code> object onto each item (sections with Q\&A, deployment architecture, market/vendor metadata, user demographics). Gartner gates these pages behind login, so this REQUIRES a valid authenticated cookie session via <code>cookieString</code> or <code>cookies</code>. Each review bills one result event ($0.0009); when the review-detail-page charge is active it adds $0.001 per detail page fetched. Failed enrichments (login redirect or stale cookies) bill only the basic result event.

## `reviewInsights` (type: `boolean`):

Adds one `review_insights` row per product: rating breakdown & sentiment split, the recurring software complaint themes (bugs, pricing, support, missing features, onboarding, integrations…), top negative-review terms, and feature-request snippets. Deterministic — instant, no AI credits or keys required. Billed per product analyzed.

## `painPointAnalysis` (type: `boolean`):

Runs an AI (Claude) pass over each product's reviews and adds a `painPointAnalysis` row: clustered pain-point themes with severity & recurrence, missing features users ask for, quick wins, overall sentiment and a short summary. Requires a paid Apify plan (uses AI credits) and is billed per product analyzed.

## `cookieString` (type: `string`):

Paste a logged-in Gartner <code>Cookie:</code> header value here (DevTools → Network → click any www.gartner.com request → copy the Cookie request header value verbatim). One way to supply auth for <code>enrichReviewDetails</code>. Cookies expire in hours — for hands-off runs use <code>gartnerAccounts</code> instead.

## `gartnerAccounts` (type: `array`):

Gartner login credentials for automatic authentication. When provided (with <code>enrichReviewDetails</code> on), the actor logs in at the start of each run and mints a fresh session automatically — no cookie pasting, no expiry. Each item is <code>{"email": "...", "password": "..."}</code>. Supply several to spread load across accounts (one is used per run). These are YOUR Gartner accounts; credentials are sent only to Gartner's own login endpoint.

## `sessionCacheMinutes` (type: `integer`):

How long a logged-in Gartner session is reused across runs before re-logging-in. Sessions are cached in a private named key-value store so frequent/scheduled runs don't hit Gartner's login endpoint every time (fewer logins = lower account-block risk). Default 30. Set 0 to disable caching and log in every run.

## `cookies` (type: `array`):

Alternative to <code>cookieString</code> — array of cookie objects in the format <code>{name, value, domain, sameSite}</code> (e.g. exported via a Cookie-Editor extension). Use one or the other.

## `gartnerRpcMethod` (type: `string`):

Override for the short-product-page RPC ID (default works as of this build). If Gartner rotates the Server Action hash, find the new value in DevTools → Network on /reviews/product/\<slug> — look for <code>ui-api/rpc/\<id>?p=…</code>

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness&reviewRating=2&companySize=3%7C4%7C5%7C2"
    }
  ],
  "vendors": [],
  "summaryOnly": false,
  "includePartnerReviews": true,
  "maxItems": 10000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 8,
  "proxy": {
    "useApifyProxy": true
  },
  "enrichReviewDetails": false,
  "reviewInsights": false,
  "painPointAnalysis": false,
  "sessionCacheMinutes": 30
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness&reviewRating=2&companySize=3%7C4%7C5%7C2"
        }
    ],
    "vendors": [],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/apify-gartner-scraper-ppr").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 = {
    "startUrls": [{ "url": "https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness&reviewRating=2&companySize=3%7C4%7C5%7C2" }],
    "vendors": [],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/apify-gartner-scraper-ppr").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 '{
  "startUrls": [
    {
      "url": "https://www.gartner.com/reviews/market/it-service-management-platforms/vendor/servicenow/product/servicenow-service-management/reviews?sort=-helpfulness&reviewRating=2&companySize=3%7C4%7C5%7C2"
    }
  ],
  "vendors": [],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/apify-gartner-scraper-ppr --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/apify-gartner-scraper-ppr"
        }
    }
}

```

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/RitYL8xaH99d0miHN/builds/pNZjoPp1Qm8d5HupL/openapi.json
