# G2 Reviews Scraper - $1.70 per 1,000, No API Key (`dami_studio/g2-reviews-scraper`) Actor

$1.70 per 1,000 reviews, against the $1.00 to $6.49 charged by other G2 review scrapers with an active user base. Pull real G2 software reviews for any product: rating, title, full review text, reviewer, date and review URL. No G2 account, no API key, no captcha wrangling.

- **URL**: https://apify.com/dami\_studio/g2-reviews-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Developer tools, Automation
- **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.

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 Reviews Scraper & API

Pulls software reviews off G2.com by product URL or slug. Give it `notion` or
`https://www.g2.com/products/notion/reviews` and you get every review G2 publishes for that product:
star rating, title, pros, cons, problems solved, the reviewer's role and company size, and the date.

Measured on real runs: **1,000 reviews in 39 seconds**, 251 in 11 seconds. No G2 account, no API key,
no cookie to paste in.

### Price

**$1.70 per 1,000 reviews** ($0.0017 each), plus $0.002 each time a run starts. Flat rate — no volume
tiers, no plan gates. For context, the other G2 review scrapers on the Apify Store with an active
user base run from $1.00 to $6.49 per 1,000, resolved live on 2026-08-10 at each one's *lowest*
volume tier rather than its headline free-tier rate.

You are charged per review actually returned. A run that finds nothing charges nothing beyond the
start fee.

### What you get

| Field | Notes |
|---|---|
| `productName`, `productSlug`, `productUrl` | the product the review belongs to |
| `reviewId`, `reviewNumericId`, `reviewUrl` | stable ids, and a direct link to the review |
| `title` | the reviewer's own headline |
| `rating` | 1–5 stars |
| `reviewText` | the full body |
| `pros`, `cons`, `problemsSolved` | G2's three structured prompts, kept separate |
| `reviewerName`, `reviewerRole` | as G2 displays them |
| `companySize` | e.g. "Mid-Market (51-1000 emp.)" |
| `publishedAt`, `publishedAtRaw` | ISO 8601, plus G2's original string |

Coverage across a real 1,000-review run: everything above at **100%**, except `companySize` at
**67%** — G2 simply does not show it for every reviewer. Where it is missing you get `null`, not a
guess.

### Input

```json
{
  "products": ["notion", "https://www.g2.com/products/slack/reviews"],
  "maxItems": 500
}
```

- `products` — slugs or full G2 review URLs, mixed freely.
- `maxItems` — stop after this many reviews. Leave it out for everything available.

Run it with no input and you get a single labelled sample row, uncharged, so you can see the shape
before spending anything.

### How it holds up

G2's review pages sit behind DataDome, which blocks plain HTTP clients. This actor does not fight
that — it reads G2's own per-product review feed, which serves the same reviews and is not walled.
That is why it is fast and why it does not need a browser, a proxy budget or a login.

The practical ceiling is about **5,000 reviews per product**, which is what the feed carries. For
most products that is the entire review history.

### What this does not do

- **No product search.** You bring the product; it does not discover products by category or query.
- **No reviewer contact details.** G2 does not publish them and neither does this.
- **No vendor replies or review comments.** Not in the feed.
- **No G2 rating breakdowns, pricing tabs or comparison data.** Reviews only.
- Products with fewer than a handful of reviews may return everything G2 has and stop early. That is
  the product, not a failure.

### FAQ

**Do I need a G2 login or API key?**
No. Nothing to authenticate, nothing to configure.

**How many reviews can I get for one product?**
Up to roughly 5,000, which is the depth of G2's feed. Notion, Slack and similar large products hit
that ceiling; smaller products return their full history.

**How fast is it?**
1,000 reviews in 39 seconds in testing. 251 in 11 seconds.

**What does it cost to scrape 1,000 G2 reviews?**
$1.70, plus the $0.002 start fee.

**Can I get reviews for several products in one run?**
Yes. Pass as many slugs or URLs as you like in `products`; each review row carries its own
`productName` and `productSlug`.

**Is the review text complete or truncated?**
Complete. `reviewText` is the full body, and `pros`, `cons` and `problemsSolved` are kept as separate
fields rather than concatenated.

**What happens if a product URL is wrong?**
You get an uncharged diagnostic row naming the problem, not a silent empty run.

**Can I export to CSV or Excel?**
Yes — Apify exports the dataset as JSON, CSV, Excel or XML, and there is a REST endpoint for the
same data.

# Actor input Schema

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

One entry per product. A full review URL (https://www.g2.com/products/slack/reviews), a product URL (https://www.g2.com/products/slack) or the bare slug (slack) all work. The slug is the part of the G2 URL right after /products/ — copy it from the address bar, because it often differs from the product's display name.

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

Hard cap on billable review rows for each product. You are charged per review returned, so this is also your budget cap. 5000 is the most G2 returns for one product. Reviews come back newest first.

## `starRatings` (type: `array`):

Optional. Keep only reviews with these star ratings. Leave empty for all ratings. Each rating you pick costs one extra request per product.

## `regions` (type: `array`):

Optional. Keep only reviewers from these regions. Leave empty for worldwide. G2 accepts these six continents and nothing else — country names are rejected. Each region you pick costs one extra request per product.

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

On by default. Adds one extra, never-charged row per product with the average star rating, the 1-5 star breakdown, the review count collected and the newest/oldest review dates.

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

Leave empty. The actor uses its own egress. Supply proxyUrls only if you want requests to go out through addresses you control.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.g2.com/products/slack/reviews",
    "notion",
    "hubspot-sales-hub"
  ],
  "maxReviewsPerProduct": 100,
  "starRatings": [
    "1",
    "2"
  ],
  "regions": [
    "North America",
    "Europe"
  ],
  "includeProductSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Results in the default dataset. Only genuine review rows are billable; \_summary, \_sample and \_diagnostic rows are never charged.

# 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.g2.com/products/slack/reviews"
    ]
};

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

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

```

## MCP server setup

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