# G2 Reviews Scraper - Seller URLs, Stars, Dates, No Login (`benthepythondev/g2-reviews-scraper`) Actor

Returns published G2 software reviews: stars, title, likes, dislikes, problems solved, date, reviewer role, company size, industry, sub-ratings and switching reason. Product or seller URLs, star, date, company-size and keyword filters on every URL. Blocks retried; empty results succeed.

- **URL**: https://apify.com/benthepythondev/g2-reviews-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Lead generation, Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 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?

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 Reviews Scraper - Seller URLs, Star, Date and Keyword Filters, No Login

Export published G2 software reviews for any number of products or sellers in one run: star rating, title, what the reviewer likes, dislikes and which problems the product solves, publish date, reviewer name, role, company size, industry and country, G2's sub-ratings (ease of use, setup, admin, support, meets requirements), love and hate themes and the product the reviewer switched from. Star, date, company-size and keyword filters work on product links and seller links alike. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

**Price:** $0.003 per review on the Free plan, $0.0028 on Bronze, $0.0026 on Silver and $0.0025 from Gold up ($3.00 to $2.50 per 1,000 reviews), plus $0.00005 per run start. A product without matching reviews, a link that leads nowhere and a filter that matches nothing cost nothing beyond the start. Until November 10, 2026 the Actor still carries the earlier price of $0.007 per review; the prices above apply from that day.

### 🧭 What users of other G2 review scrapers run into, and what this Actor does

| Seen on the most used G2 review Actors | This Actor |
|---|---|
| One URL per run; the keyword search works on product URLs only | `startUrls` takes a list of product links, seller links and plain slugs. Keyword, star, date and company-size filters apply to every one of them, seller links included. |
| A block or a renamed product ends the run with an error | A request that fails is tried again three times, then over an Apify datacenter and then a residential connection. A link that cannot be read is reported in the status message and skipped; the run ends as succeeded with the rows it has. |
| "Session pool empty — all requests returning 403" | No pages, no browser, no cookies: the Actor reads the search service G2's own site uses. 2,500 reviews took 26 requests and 9 seconds in a test, without a refusal. |
| Star filter plus keyword can return nothing without saying why | The status message says per product how many reviews G2 has for exactly these filters ("Slack: 1 reviews saved of 1 matching"), so an empty result is explained. |
| Only "published after"; at least 10 reviews per run | `publishedAfter` and `publishedBefore` (a date or a span like `30 days`), any limit from 1. |
| 4 GB of memory for a review list | 256 MB. |

### 🔎 What is the G2 Reviews Scraper?

G2 publishes reviews of business software, and its site search runs on a search service that returns those reviews 100 at a time. This Actor asks that service for exactly the reviews you filtered for, newest first or in another order, and saves one row per review. Only reviews G2 has published and approved are read; reviews still in moderation or rejected are filtered out in the query itself. There is no page limit: all 40,121 published Slack reviews can be read.

#### What data does it extract?

- **Review:** id, link, star rating (1-5), likelihood to recommend (0-10), title, full text, likes, dislikes, problems solved, publish, submit and update time (UTC), helpful votes, review source (organic, invited and so on), video flag
- **Reviewer:** name as G2 shows it ("Verified User in Computer Software" when the reviewer stays anonymous), role (User, Administrator, Consultant...), company size, industry, country, region
- **Ratings:** ease of use, ease of setup, ease of admin, quality of support, meets requirements, ease of doing business with (G2's 1-7 scale; empty when the reviewer skipped one)
- **Themes and switching:** G2's love theme and hate theme, whether the reviewer switched from another product and why
- **Product:** name, id, slug, seller name, review page link

### ⬇️ Input

| Field | What it does |
|---|---|
| `startUrls` | G2 product links (`https://www.g2.com/products/slack/reviews`), seller links (`https://www.g2.com/sellers/salesforce`) or plain slugs (`slack`) |
| `maxReviewsPerProduct` | Reviews saved per product (default 100) |
| `maxProductsPerSeller` | For seller links: how many of the seller's products are read, most reviewed first (default 10) |
| `starRatings` | `["1", "2"]` for the critical reviews only; empty means all |
| `searchQuery` | Only reviews whose title or text contains all of these words |
| `publishedAfter`, `publishedBefore` | `2026-01-31` or a span like `30 days`; the end date includes the whole day |
| `companySize` | `small` (50 or fewer), `mid` (51-1000), `enterprise` (over 1000) |
| `sortBy` | `newest` (default), `oldest`, `most_helpful`, `g2_default` |

#### Example input

```json
{
  "startUrls": [
    {"url": "https://www.g2.com/sellers/salesforce"},
    {"url": "https://www.g2.com/products/slack/reviews"}
  ],
  "maxReviewsPerProduct": 50,
  "maxProductsPerSeller": 3,
  "starRatings": ["1", "2"],
  "searchQuery": "support",
  "publishedAfter": "2025-01-01",
  "companySize": ["mid", "enterprise"]
}
```

### ⬆️ Output

```json
{
  "reviewId": 11462200,
  "reviewUrl": "https://www.g2.com/products/slack/reviews/slack-review-11462200",
  "productName": "Slack",
  "sellerName": "Salesforce",
  "starRating": 2,
  "title": "Our primary corporate communications channel",
  "likes": "Basically nothing. Its not the best application. I find teams far better",
  "dislikes": "Very poor interface and unorganized messages. Not very feature rich. Poor customer support. Easy to implement",
  "problemsSolved": "It helps with video conferencing and cross functional communication",
  "reviewText": "Basically nothing. ... cross functional communication",
  "publishedAt": "2025-08-08T06:41:43Z",
  "reviewerName": "Abhinanth G.",
  "reviewerRole": "User",
  "companySize": "Enterprise (>1000 emp.)",
  "industry": "Computer Software",
  "country": "India",
  "helpfulVotes": 0,
  "reviewSource": "organic",
  "likelihoodToRecommend": 4,
  "easeOfUse": 3,
  "easeOfSetup": 5,
  "qualityOfSupport": 4,
  "meetsRequirements": 4,
  "switchedFromOtherProduct": true,
  "switchedReason": "Competitive pricing",
  "productId": 3437,
  "productSlug": "slack",
  "productUrl": "https://www.g2.com/products/slack/reviews",
  "input": "https://www.g2.com/products/slack/reviews",
  "scrapedAt": "2026-10-27T09:13:10Z"
}
```

Empty fields are left out of a row. The run's key-value store holds `RUN_SUMMARY` with the per-product report.

### 🤖 For AI agents

One input to copy: `{"startUrls": [{"url": "https://www.g2.com/products/slack/reviews"}], "maxReviewsPerProduct": 20, "starRatings": ["1", "2"]}`. No credential is needed. A link that is not a G2 product or seller link is skipped, and the status message says why, so an agent can retry with a corrected link.

### 💡 Use cases

- 🥊 **Competitor battlecards:** the 1- and 2-star reviews of a rival product that mention "pricing" or "support", with the product the reviewer switched from.
- 📈 **Review monitoring:** a daily schedule with `publishedAfter: "1 day"` returns only new reviews of your products and your competitors'.
- 🧪 **Product research:** likes and dislikes by company size and industry for a whole seller portfolio in one run.
- 🤖 **LLM and sentiment pipelines:** clean review text with stars, themes and reviewer context, ready for classification or retrieval.

### ⚠️ Limits, stated plainly

- Likes, dislikes and problems solved come as separate fields when G2 stores exactly three answers, which is most reviews written in recent years (94% of 200 recent ones in a test, 38% of reviews from 2016-2017). Otherwise `reviewText` holds the whole review and the three fields are empty.
- Reviewer job titles, profile links and LinkedIn data are not returned. The reviewer name is what G2 shows publicly.
- A seller link reads products whose seller name equals the seller's name on G2; products G2 lists under a sub-brand ("Salesforce Labs") need their own link or the sub-brand's seller link.
- G2's AI pros-and-cons summaries and video review files are not included.
- The search service is G2's own and may change. If it does, runs end with zero rows and a message, not with a charge.

### ❓ FAQ

**Do I need a G2 account or cookies?** No. Nothing is logged in, and no proxy is needed in normal runs.

**How many reviews can I get?** All published reviews of a product. Set `maxReviewsPerProduct` as high as you need; every review is one charged row.

**Why did a run return 0 reviews?** The status message names the reason per link: no published review matches the filters, the product or seller does not exist on G2, or the link is not a G2 link. Each case ends as a succeeded run and costs only the start.

**Can I combine stars, keywords and dates?** Yes, on every link type. All filters are applied together by G2's search service, and the status message shows how many reviews match.

**What does a seller link return?** The reviews of that seller's most reviewed products, each row with `productName` and `sellerName`. Raise `maxProductsPerSeller` to read more of them.

**How is the star rating related to the 0-10 score?** `starRating` is G2's 1-5 star value; `likelihoodToRecommend` is the reviewer's 0-10 answer to "how likely are you to recommend".

**What happens if a run is interrupted?** A migrated or resurrected run reads the reviews it already saved from its dataset and skips them, so nothing is saved or charged twice.

**Can I switch from another G2 Actor?** `url` (a single link) and `products` (slugs) are read as well as `startUrls`. Field names follow common conventions (`likes`, `dislikes`, `problemsSolved`, `reviewUrl`, `companySize`).

**Is it legal?** The Actor reads reviews G2 shows publicly. You are responsible for how you use them: respect G2's terms of use, and treat reviewer names as personal data under GDPR and similar laws. Do not use the data for unsolicited email (CAN-SPAM).

### 🔗 You might also like

- [Booking.com Reviews Scraper](https://apify.com/benthepythondev/booking-reviews-scraper)
- [Google Maps Reviews Scraper](https://apify.com/benthepythondev/google-maps-reviews-scraper)
- [Reddit Search Scraper](https://apify.com/benthepythondev/reddit-search-scraper)
- [Tech Stack Detector](https://apify.com/benthepythondev/tech-stack-detector)

**Keywords:** G2 reviews scraper, G2 scraper, G2 reviews API, export G2 reviews, G2 reviews to CSV, G2 review monitoring, scrape G2.com, G2 seller reviews, software reviews scraper, B2B reviews dataset, G2 competitor analysis, G2 negative reviews, G2 pros and cons, SaaS review data, G2 crowd scraper, review sentiment analysis, G2 reviews JSON

# Actor input Schema

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

G2 product links such as https://www.g2.com/products/slack/reviews, or seller links such as https://www.g2.com/sellers/salesforce (reads the seller's most reviewed products). Plain product slugs like slack or hubspot-marketing-hub work too. Every filter below applies to every link type.

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

Maximum number of reviews saved for each product. Each review is one charged result. There is no page limit: all published reviews of a product can be read (40,121 for Slack).

## `maxProductsPerSeller` (type: `integer`):

For seller links: how many of the seller's products are read, most reviewed first. Products without reviews are left out.

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

Only reviews with these star ratings. Leave empty for all. Combines with the keyword and date filters.

## `searchQuery` (type: `string`):

Only reviews whose title or text contains all of these words, for example 'pricing support'. Works on product and seller links alike and combines with star and date filters.

## `publishedAfter` (type: `string`):

Only reviews G2 published on or after this date (UTC). A date like 2026-01-31 or a span like '30 days'. Use with a schedule to collect new reviews only.

## `publishedBefore` (type: `string`):

Only reviews G2 published on or before this date (UTC, the whole day included), or before a span like '1 year' ago.

## `companySize` (type: `array`):

Only reviews from reviewers at companies of these sizes. Leave empty for all.

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

Order in which reviews are read. With a limit, this decides which reviews you get.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.g2.com/products/slack/reviews"
    }
  ],
  "maxReviewsPerProduct": 20,
  "maxProductsPerSeller": 10,
  "sortBy": "newest"
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        {
            "url": "https://www.g2.com/products/slack/reviews"
        }
    ],
    "maxReviewsPerProduct": 20
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/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/6UIAZhcsWghWWu1xN/builds/EoQp5auuENv7Jy0GL/openapi.json
