# G2 Comparison Scraper (`axlymxp/g2-comparison-scraper`) Actor

Scrape G2 head-to-head comparisons at scale: side-by-side star ratings, all seven G2 criteria scores with respondent counts, entry pricing, top pros & cons, integrations, alternatives, reviewer company-size and industry splits, AI summaries and FAQs. Structured JSON for competitive research.

- **URL**: https://apify.com/axlymxp/g2-comparison-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 dataset items

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?

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

## G2 Comparison Scraper

Turn G2's head-to-head comparison pages into structured, analysis-ready data.

Every software buyer's shortlist ends up on a G2 `/compare/` page — "Asana vs
monday", "HubSpot vs Pipedrive", "Slack vs Teams". Those pages hold the single
richest public dataset on how B2B software products stack up against each other:
real user ratings, G2's seven scoring criteria, entry pricing, the pros and cons
buyers actually mention, and who is doing the reviewing. This Actor extracts all
of it as clean JSON — one row per comparison.

Most G2 scrapers return products or raw reviews. This one returns the
**head-to-head verdict**, already normalized into side-by-side columns.

### Who uses this

| Buyer                          | Job to be done                                                                                     |
| ------------------------------ | -------------------------------------------------------------------------------------------------- |
| **Competitive intelligence**   | Track exactly how your product scores against each rival, criterion by criterion, and watch it move |
| **Product marketing**          | Build battlecards and comparison pages from real review evidence instead of guesswork                |
| **Product management**         | Find the features and criteria where you lose, with the respondent count behind every score         |
| **Investors & analysts**       | Benchmark entire software categories on rating, review volume, pricing and reviewer mix             |
| **SEO & affiliate publishers** | Power "X vs Y" content and comparison tables at scale                                                |
| **Sales enablement**           | Arm reps with the objections buyers raise about each competitor                                     |

### What you get

One dataset row per comparison. The two products are flattened into
`product_a_*` and `product_b_*` columns so the output drops straight into a
spreadsheet or BI tool, while a nested `products` array keeps the full structure
for programmatic use.

| Field                                                | Type    | Description                                                                          |
| ---------------------------------------------------- | ------- | ------------------------------------------------------------------------------------ |
| `url`, `slug`, `title`                               | string  | Canonical comparison page, its slug, and the page title                              |
| `requested_slug`                                     | string  | What you asked for, before G2 canonicalized pair order or product renames            |
| `scraped_at`                                         | string  | UTC ISO-8601 timestamp                                                               |
| `product_a_name` / `product_b_name`                  | string  | Product names as listed on G2                                                        |
| `product_a_slug` / `product_b_slug`                  | string  | G2 product slugs                                                                     |
| `product_a_url` / `product_b_url`                    | string  | G2 product page URLs                                                                 |
| `product_a_image` / `product_b_image`                | string  | Product logo URLs                                                                    |
| `product_a_category` / `product_b_category`          | string  | G2 application category                                                              |
| `product_a_rating` / `product_b_rating`              | number  | Average star rating out of 5                                                         |
| `product_a_review_count` / `product_b_review_count`  | integer | Total G2 reviews behind that rating                                                  |
| `product_a_price` / `product_b_price`                | string  | Entry price as displayed, e.g. `$25.00` or `Free`                                    |
| `product_a_price_unit` / `product_b_price_unit`      | string  | Billing unit, e.g. `1 User Per Month`                                                |
| `product_a_price_plan` / `product_b_price_plan`      | string  | Entry plan name, e.g. `Starter Edition`                                              |
| `product_a_free_trial` / `product_b_free_trial`      | boolean | Whether G2 shows a free-trial badge                                                  |
| `product_a_pros` / `product_b_pros`                  | array   | Most-mentioned positives with review counts: `[{label, count}]`                      |
| `product_a_cons` / `product_b_cons`                  | array   | Most-mentioned negatives with review counts                                          |
| `product_a_integrations` / `product_b_integrations`  | array   | Integrations G2 highlights                                                           |
| `product_a_alternatives` / `product_b_alternatives`  | array   | Top alternatives G2 lists                                                            |
| `product_a_company_size` / `product_b_company_size`  | object  | Reviewer split across Small-Business / Mid-Market / Enterprise, in percent           |
| `product_a_industries` / `product_b_industries`      | object  | Reviewer split by industry, in percent                                               |
| `criteria`                                           | array   | All seven G2 criteria side by side, with scores out of 10 and respondent counts      |
| `criteria_wins_product_a` / `criteria_wins_product_b`| integer | How many criteria each product wins                                                  |
| `overall_winner`                                     | string  | Product winning the most criteria, or `null` when tied                               |
| `ai_summary`                                         | string  | G2's AI-generated head-to-head summary, derived from real reviews                    |
| `faqs`                                               | array   | G2's comparison FAQs as `[{question, answer}]`                                       |
| `features`                                           | array   | Optional: every rated feature with both scores, respondent counts and the winner     |
| `feature_count`                                      | integer | Optional: number of rated features returned                                          |
| `products`                                           | array   | Full nested product objects                                                          |

The seven criteria are **Meets Requirements, Ease of Use, Ease of Setup, Ease of
Admin, Quality of Support, Good Partner in Doing Business, and Product
Direction** — each scored out of 10, each with the number of reviewers behind it.

### High-value use cases

1. **Live competitive scorecard.** Schedule your product against each rival
   weekly and alert when a criterion score or `overall_winner` flips.
2. **Battlecards that cite evidence.** `product_b_cons` gives you the exact
   complaints buyers raise about a competitor, with volume behind each one.
3. **Category benchmarking.** Enable automatic discovery to pull thousands of
   comparisons and rank an entire category by rating, review volume and pricing.
4. **Segment fit analysis.** `company_size` and `industries` show whether a rival
   wins because it dominates Small-Business while you serve Enterprise.
5. **Feature gap analysis.** Turn on the full feature table to get hundreds of
   scored features per comparison and find precisely where you lose.
6. **Programmatic SEO.** Generate accurate "X vs Y" pages backed by real data.

### Input parameters

| Parameter                 | Type    | Default | Description                                                                     |
| ------------------------- | ------- | ------- | ------------------------------------------------------------------------------- |
| `comparisonUrls`          | array   | —       | Full G2 comparison URLs. The most precise way to target what you want           |
| `productPairs`            | array   | —       | Slugs like `asana-vs-monday-com`, or free text like `Slack vs Microsoft Teams`   |
| `productA` / `productB`   | string  | —       | A single pair, given as product slugs or G2 product URLs                        |
| `discoverFromSitemap`     | boolean | `false` | Top the list up automatically from G2's official comparison sitemaps            |
| `maxComparisons`          | integer | `10`    | Stop after this many comparisons; each produces exactly one row                 |
| `includeReviewerInsights` | boolean | `true`  | Add company-size and industry breakdowns (one extra fetch per comparison)       |
| `includeFeatureScores`    | boolean | `false` | Add the full per-feature score table (one extra fetch; large output)            |
| `proxyConfiguration`      | object  | residential | Apify Proxy settings — residential strongly recommended                     |
| `useResidentialProxy`     | boolean | `true`  | Use the built-in residential pool when Apify Proxy is off                       |
| `proxyCountry`            | string  | `US`    | Exit country for the built-in fallback                                          |

You can mix inputs freely — URLs, pairs and a single A/B pair are merged and
de-duplicated. Product order does not matter: G2 canonicalizes it, and renamed
products are followed automatically, with the original preserved in
`requested_slug`.

#### Example input

```json
{
    "productPairs": ["asana-vs-monday-com", "Slack vs Microsoft Teams"],
    "comparisonUrls": [
        { "url": "https://www.g2.com/compare/hubspot-sales-hub-vs-pipedrive" }
    ],
    "maxComparisons": 3,
    "includeReviewerInsights": true,
    "includeFeatureScores": false,
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

#### Example output (abridged)

```json
{
    "url": "https://www.g2.com/compare/hubspot-sales-hub-vs-pipedrive",
    "slug": "hubspot-sales-hub-vs-pipedrive",
    "title": "HubSpot Sales Hub vs. Pipedrive",
    "scraped_at": "2026-09-19T01:48:19+00:00",
    "product_a_name": "HubSpot Sales Hub",
    "product_a_rating": 4.4,
    "product_a_review_count": 14302,
    "product_a_price": "$0.00",
    "product_a_price_plan": "Free HubSpot CRM",
    "product_a_free_trial": true,
    "product_a_pros": [
        { "label": "Ease of Use", "count": 1216 },
        { "label": "Features", "count": 702 }
    ],
    "product_a_company_size": { "Small-Business": 60.5, "Mid-Market": 35.5, "Enterprise": 4.0 },
    "product_b_name": "Pipedrive",
    "product_b_rating": 4.3,
    "product_b_review_count": 3793,
    "product_b_price": "$24.00",
    "product_b_price_unit": "1 Seats Per Month",
    "product_b_company_size": { "Small-Business": 74.1, "Mid-Market": 22.1, "Enterprise": 3.9 },
    "criteria": [
        {
            "criterion": "Ease of Use",
            "product_a_score": 8.7,
            "product_a_responses": 11269,
            "product_b_score": 8.8,
            "product_b_responses": 3324,
            "winner": "Pipedrive"
        }
    ],
    "criteria_wins_product_a": 2,
    "criteria_wins_product_b": 3,
    "overall_winner": "Pipedrive",
    "ai_summary": "Users report that Pipedrive excels in pipeline visibility...",
    "faqs": [{ "question": "What is the difference between...", "answer": "..." }]
}
```

### Scheduling, webhooks and integrations

- **Schedule** a run daily or weekly to build a competitive time series — store
  each run's dataset and diff `criteria` scores and `overall_winner` over time.
- **Webhooks** can push every finished run into your own service.
- Export to **JSON, CSV, Excel or XML**, or connect the dataset to **Google
  Sheets, Make, Zapier, Airbyte, S3** and other Apify integrations.
- Pull results from the **Apify API** in any language.

### Use it from an AI assistant (MCP)

This Actor is callable over the Apify MCP server, so assistants like Claude and
other MCP-aware agents can run it as a tool and reason over the results — for
example "compare our product against these three rivals on G2 and tell me where
we lose". Point your MCP client at Apify's server and call this Actor by name.

### FAQ

**Which comparisons can I scrape?**
Any public G2 `/compare/` page. G2 publishes over a million of them across its
comparison sitemaps, which `discoverFromSitemap` can walk automatically.

**Do I need exact slugs?**
No. Pass full URLs, slugs, or free text like `Slack vs Microsoft Teams`. Product
order does not matter and renamed products are followed automatically.

**How fresh is the data?**
Every run fetches the live page, so results reflect G2 at that moment. Ratings
and criteria scores move slowly, so weekly or monthly scheduling is usually
enough to track meaningful change.

**Is the AI summary G2's or yours?**
It is G2's own AI-generated summary, shown on the comparison page and derived
from real user reviews. We extract it verbatim and never generate text.

**Why do I need a residential proxy?**
G2 is protected by DataDome bot detection, which blocks nearly all datacenter
IPs. The Actor drives a real browser through a residential exit and rotates
automatically when an exit is refused. Keep residential proxying enabled for
reliable results.

**What happens if a comparison fails to load?**
The run continues. Failing pages are logged and skipped so one bad URL never
costs you the whole run. If every comparison fails, the run fails loudly rather
than returning an empty dataset silently.

**Can I resume an interrupted run?**
Yes. Progress is checkpointed after every comparison. Re-running the same input
resumes where it stopped and never writes duplicate rows.

**How large is the output with feature scores on?**
Comparisons commonly carry 200–700 rated features, so rows get big. Leave
`includeFeatureScores` off unless you specifically need feature-level gaps.

**Is scraping G2 legal?**
This Actor collects only publicly available information, with no login and no
personal data beyond what G2 publishes publicly. You are responsible for using
the output in line with applicable law and G2's terms.

### Support

Found a bug or need an extra field? Open an issue on the Actor's Issues tab —
runtime errors are monitored and fixes ship quickly.

# Actor input Schema

## `comparisonUrls` (type: `array`):

Full G2 comparison page URLs, e.g. https://www.g2.com/compare/asana-vs-monday-com. The most reliable way to target exactly the comparisons you want.

## `productPairs` (type: `array`):

Comparison slugs such as 'asana-vs-monday-com', or free text such as 'Slack vs Microsoft Teams'. G2 automatically resolves renamed products and canonical pair order.

## `productA` (type: `string`):

First product slug or G2 product URL, used with 'Product B' to build a single comparison.

## `productB` (type: `string`):

Second product slug or G2 product URL, used with 'Product A'.

## `discoverFromSitemap` (type: `boolean`):

Top the list up from G2's official comparison sitemaps (over a million comparison pages) until 'Max comparisons' is reached. Useful for bulk dataset building when you don't have a specific list.

## `maxComparisons` (type: `integer`):

Stop after this many comparison pages. Each comparison produces exactly one dataset row.

## `includeReviewerInsights` (type: `boolean`):

Add the reviewer company-size and industry breakdowns for both products. Costs one extra page fetch per comparison.

## `includeFeatureScores` (type: `boolean`):

Add every rated feature (often 200-700 per comparison) with each product's score, respondent count and winner. Large output; costs one extra page fetch per comparison.

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

Apify Proxy settings. G2 uses DataDome bot protection, so RESIDENTIAL proxies are strongly recommended — datacenter IPs are usually blocked. Leave disabled to fall back to the built-in residential pool.

## `useResidentialProxy` (type: `boolean`):

When Apify Proxy is disabled, route the browser through the built-in residential pool instead of your own IP. G2 blocks most datacenter IPs, so keep this on.

## `proxyCountry` (type: `string`):

Exit country for the built-in residential fallback (ISO-3166 alpha-2). G2 serves English content from US exits.

## `debugFingerprint` (type: `boolean`):

Diagnostic only. Instead of scraping, report the run environment's browser fingerprint and G2's anti-bot verdict to the key-value store record DIAGNOSTICS.

## Actor input object example

```json
{
  "comparisonUrls": [
    {
      "url": "https://www.g2.com/compare/asana-vs-monday-com"
    }
  ],
  "productPairs": [
    "slack-vs-microsoft-teams"
  ],
  "productA": "hubspot-sales-hub",
  "productB": "pipedrive",
  "discoverFromSitemap": false,
  "maxComparisons": 10,
  "includeReviewerInsights": true,
  "includeFeatureScores": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "useResidentialProxy": true,
  "proxyCountry": "US",
  "debugFingerprint": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "comparisonUrls": [
        {
            "url": "https://www.g2.com/compare/asana-vs-monday-com"
        }
    ],
    "productPairs": [
        "slack-vs-microsoft-teams"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/g2-comparison-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 = {
    "comparisonUrls": [{ "url": "https://www.g2.com/compare/asana-vs-monday-com" }],
    "productPairs": ["slack-vs-microsoft-teams"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/g2-comparison-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 '{
  "comparisonUrls": [
    {
      "url": "https://www.g2.com/compare/asana-vs-monday-com"
    }
  ],
  "productPairs": [
    "slack-vs-microsoft-teams"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call axlymxp/g2-comparison-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/g2-comparison-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/r8bTF5ba3qbZ4MdaW/builds/S3CRDNLDI2iuxXhqw/openapi.json
