# G2 Product Reviews Scraper (`automation-lab/g2-product-reviews-scraper`) Actor

Extract public G2 product reviews, ratings, pros, cons, reviewer context, dates, and switching data for recurring competitive intelligence.

- **URL**: https://apify.com/automation-lab/g2-product-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#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

## G2 Product Reviews Scraper

Extract public **G2 product reviews** into structured records for product research, customer-feedback analysis, and recurring competitor intelligence. Supply one or more G2 product URLs, choose rating and date filters, and receive review text, ratings, pros, cons, reviewer context, dates, switching data, sub-ratings, and stable source links.

The Actor is designed for repeatable workflows: run a one-time review analysis, schedule the same input weekly, or feed normalized G2 reviews into a warehouse, dashboard, spreadsheet, or language-model pipeline.

### What does G2 Product Reviews Scraper do?

The Actor resolves each supplied G2 product URL through G2's public structured data surface. It retrieves approved public reviews, follows cursor pagination, applies your filters, and writes normalized review records to the default Apify dataset.

Recent reviews are also matched against G2's public review RSS feed. When that feed exposes separate answers, the Actor populates `pros` and `cons`. The complete combined public answer remains in `reviewText`.

It does not require a G2 login, browser, user cookie, or proxy configuration.

### Who is it for?

- **Product marketers** tracking how buyers describe competing tools.
- **Product managers** collecting recurring feedback and low-rating pain points.
- **Customer research teams** preparing review corpora for qualitative analysis.
- **Competitive-intelligence analysts** comparing review volume and themes across products.
- **Data engineers** who need a repeatable G2 reviews API-style dataset.
- **AI teams** building retrieval, classification, or sentiment-analysis pipelines.

### Why use this Actor?

- Accepts real G2 product URLs or bare product slugs.
- Handles multiple products in one run.
- Supports newest, helpful, high-rating, and low-rating ordering.
- Filters by minimum rating, maximum rating, and date.
- Uses stable review IDs for downstream deduplication.
- Produces typed JSON records in the default dataset.
- Runs with lightweight HTTP requests rather than a browser.
- Stops at the requested global review limit.

### What G2 review data is extracted?

| Field | Meaning |
| --- | --- |
| `reviewId` | Stable G2 review identifier |
| `reviewUrl` | Public source URL for the review |
| `productId`, `productName`, `productSlug` | Product identity |
| `title`, `reviewText` | Review headline and combined answer text |
| `pros`, `cons` | Separately labelled recent-feed answers when available |
| `rating`, `nps` | 1–5 rating and source NPS-style value |
| `reviewerName` | Public reviewer display name |
| `reviewerRole` | G2 role classification identifier |
| `reviewerCompanySegment` | G2 company-segment classification identifier |
| `reviewerIndustry` | G2 industry classification identifier |
| `reviewerCountry`, `reviewerRegion` | Public reviewer location context |
| `publishedAt`, `updatedAt` | Source timestamps |
| `helpfulVotes` | Public helpful-vote count |
| `easeOfUse`, `easeOfSetup` | Product sub-ratings when available |
| `qualityOfSupport`, `meetsRequirements` | Additional sub-ratings when available |
| `switchedFromOtherProduct`, `switchedReason` | Public switching context |
| `vendorResponse` | Vendor response when the public surface exposes one; normally `null` |
| `retrievedAt` | ISO timestamp for this extraction |

Fields are nullable because G2 does not expose every attribute on every review.

### Getting started

1. Open the Actor input page in Apify Console.
2. Add a G2 URL such as `https://www.g2.com/products/slack/reviews`.
3. Choose a review limit and sort order.
4. Optionally set rating or date filters.
5. Click **Start**.
6. Open the default dataset to inspect, download, or integrate the records.

The prefilled Slack input is intentionally small and works without credentials.

### Input parameters

#### `productUrls`

Required array with 1–20 G2 product URLs or product slugs. Accepted examples:

- `https://www.g2.com/products/slack`
- `https://www.g2.com/products/slack/reviews`
- `slack`

Non-G2 URLs and unsupported paths fail validation rather than being silently scraped.

#### `maxReviews`

Maximum review records across all supplied products. For multi-product inputs, the Actor balances the available record budget across resolved products; unused capacity from a sparse product flows to later products. Default: `100`. Range: `1`–`5000`.

#### `sortBy`

- `newest` — newest submitted reviews first.
- `helpful` — highest helpful count first.
- `rating_high` — highest ratings first.
- `rating_low` — lowest ratings first.

#### `minRating` and `maxRating`

Inclusive 1–5 rating boundaries. For pain-point analysis, set `maxRating` to `3`. The Actor rejects a minimum greater than the maximum.

#### `sinceDate`

Optional ISO 8601 timestamp. Use this in scheduled workflows to request only records newer than a known checkpoint, for example `2026-01-01T00:00:00.000Z`.

### Example input

```json
{
  "productUrls": [
    { "url": "https://www.g2.com/products/slack/reviews" },
    { "url": "https://www.g2.com/products/microsoft-teams/reviews" }
  ],
  "maxReviews": 50,
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 3,
  "sinceDate": "2026-01-01T00:00:00.000Z"
}
```

### Example output

```json
{
  "reviewId": "12345678",
  "reviewUrl": "https://www.g2.com/products/sample-product/reviews/12345678",
  "productId": 1234,
  "productName": "Sample Product",
  "productSlug": "sample-product",
  "title": "Useful collaboration software",
  "reviewText": "The product helps our team collaborate efficiently.",
  "pros": "Easy to use and quick to set up.",
  "cons": "Some advanced settings take time to learn.",
  "rating": 5,
  "nps": 9,
  "reviewerName": "Sample Reviewer",
  "reviewerCountry": "United States",
  "publishedAt": "2026-01-15T12:00:00.000Z",
  "helpfulVotes": 4,
  "vendorResponse": null,
  "retrievedAt": "2026-01-15T12:05:00.000Z"
}
```

The displayed example is anonymized. Live output contains public source values.

### How much does it cost to extract G2 product reviews?

Pricing uses pay per event. A run has a one-time **$0.005 start event** plus one `review` event per emitted review. No charge is emitted for a rejected, duplicate, or missing record.

At the BRONZE tier, a review costs **$0.004**:

| Reviews | Estimated BRONZE price |
| ---: | ---: |
| 10 | 0.045 USD |
| 100 | 0.405 USD |
| 1,000 | 4.005 USD |

Higher subscription tiers receive lower per-review event prices. The Apify Console shows the tier applicable to your account before a run. Estimates exclude unrelated platform plan fees.

### Recurring competitor-review monitoring

Create an Apify Task with several product URLs and a `sinceDate`, then schedule it daily or weekly. Stable `reviewId` values let your destination deduplicate records. Update the checkpoint in your orchestration layer, or retain IDs in your warehouse and process only unseen reviews.

A practical workflow is:

1. Run the Actor on a schedule.
2. Export dataset items through an integration or webhook.
3. Upsert by `reviewId`.
4. Classify new low-rating reviews by topic.
5. Alert product or competitive-intelligence owners on material changes.

The Actor does not maintain a cross-run database or send alerts itself.

### Export and integrations

Apify datasets support JSON, JSONL, CSV, XML, RSS, and Excel downloads. You can connect results to Google Sheets, Make, Zapier, webhooks, cloud storage, or your own API client.

For analytics, treat numeric G2 role, segment, and industry values as source classification IDs. Do not invent labels without a maintained G2 mapping.

### Run with the Apify API

Replace `<APIFY_TOKEN>` with your token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~g2-product-reviews-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"productUrls":[{"url":"https://www.g2.com/products/slack/reviews"}],"maxReviews":20}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/g2-product-reviews-scraper').call({
  productUrls: [{ url: 'https://www.g2.com/products/slack/reviews' }],
  maxReviews: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token='<APIFY_TOKEN>')
run = client.actor('automation-lab/g2-product-reviews-scraper').call(run_input={
    'productUrls': [{'url': 'https://www.g2.com/products/slack/reviews'}],
    'maxReviews': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/g2-product-reviews-scraper"
```

#### Claude Desktop

Add this HTTP server to your Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/g2-product-reviews-scraper"
    }
  }
}
```

#### Cursor

Open Cursor settings, add a remote MCP server, and use the same `https://mcp.apify.com?tools=automation-lab/g2-product-reviews-scraper` URL.

#### VS Code

Add an HTTP MCP server in your VS Code MCP configuration using the same Actor-specific endpoint.

Example prompts:

- “Extract the 50 newest public Slack reviews from G2.”
- “Collect G2 reviews rated three stars or lower for Notion.”
- “Compare recent low-rating feedback for Slack and Microsoft Teams.”

### Limits and source behavior

- Only public G2 product review data is processed.
- The source may omit attributes, so every enrichment field is nullable.
- Separate `pros` and `cons` are best-effort fields for reviews present in the public recent-review feed. `reviewText` remains the canonical combined source text.
- Public vendor responses are not currently exposed by the working structured data/feed routes, so `vendorResponse` is normally `null`.
- The Actor does not scrape category search pages or discover products by keyword.
- Input is capped at 20 products and 5,000 reviews per run.
- Upstream source changes can temporarily affect availability or field coverage.

### Reliability and troubleshooting

Requests use bounded retries for network errors, rate limits, and temporary server failures. Deterministic input errors are not retried.

**“None of the supplied product URLs resolved”** means the slug is invalid, removed, or not a public G2 product. Open the URL in G2 and copy its canonical `/products/<slug>/reviews` form.

**I received fewer records than requested** can mean the rating/date filters match fewer reviews or the product has fewer public reviews. The maximum is a cap, not a guaranteed count.

**Why are pros or cons null?** G2's broader structured review surface combines answers. Separate pros/cons are available only where the recent RSS record can be matched by review ID.

### Responsible use and legality

Use the Actor only for lawful purposes and public information you are permitted to process. Follow G2's terms, applicable privacy and database rules, and your organization's retention policies. Do not use public reviewer data for harassment, discrimination, spam, or attempts to identify people beyond what they chose to publish.

This Actor is an independent extraction tool and is not affiliated with or endorsed by G2.

### FAQ

#### Does it require a G2 account?

No. It uses public structured review surfaces and public feeds.

#### Can I supply a bare slug?

Yes. `slack` and its canonical G2 product URL resolve to the same product.

#### Can it extract multiple products?

Yes, up to 20 per run. `maxReviews` applies globally and is balanced across resolved products so one high-volume product does not consume the full multi-product budget.

#### Can I monitor new reviews?

Yes. Schedule a Task and use `sinceDate` plus stable `reviewId` values in your destination. The Actor itself does not store cross-run state or send alerts.

#### Does it translate or summarize reviews?

No. It returns source text. Add your own analysis step so the original review data stays auditable.

#### Are vendor responses guaranteed?

No. The public working surfaces do not currently expose historical vendor replies, so `vendorResponse` is nullable and normally empty.

### Related automation-lab Actors

- [G2 Reviews & Products Scraper](https://apify.com/automation-lab/g2-scraper) — choose this broader Actor when you also need product discovery and product records.
- [G2 Software Review Feed Scraper](https://apify.com/automation-lab/g2-software-review-feed-scraper) — choose this feed-only option for a small recent-review workflow.

Choose this Actor for URL-led review extraction with rating/date filters and a normalized review-intelligence contract.

# Actor input Schema

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

G2 product/reviews URLs or bare product slugs. Up to 20 products per run.

## `maxReviews` (type: `integer`):

Maximum review records across all supplied products, balanced across products in multi-product runs.

## `sortBy` (type: `string`):

Order used before applying the maximum.

## `minRating` (type: `integer`):

Include reviews at or above this 1–5 rating.

## `maxRating` (type: `integer`):

Include reviews at or below this 1–5 rating.

## `sinceDate` (type: `string`):

Optional ISO 8601 date for recurring runs that only need recent reviews.

## Actor input object example

```json
{
  "productUrls": [
    {
      "url": "https://www.g2.com/products/slack/reviews"
    }
  ],
  "maxReviews": 100,
  "sortBy": "newest",
  "minRating": 1,
  "maxRating": 5
}
```

# Actor output Schema

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

Extracted review records in the default dataset.

# 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": [
        {
            "url": "https://www.g2.com/products/slack/reviews"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/g2-product-reviews-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": [{ "url": "https://www.g2.com/products/slack/reviews" }] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/g2-product-reviews-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": [
    {
      "url": "https://www.g2.com/products/slack/reviews"
    }
  ]
}' |
apify call automation-lab/g2-product-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/g2-product-reviews-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/7Kld4iUuFcu2IvQ8y/builds/LFJf5yddhgsBCriE9/openapi.json
