# G2 Product Reviews Scraper ⭐ (`shahidirfan/g2-product-reviews-scraper`) Actor

Scrape G2 reviews, software ratings, SaaS product reviews, customer feedback, pros, cons, reviewer insights, and product details. Extract structured G2 review data for SaaS competitor analysis, sentiment analysis, market research, lead generation, and AI datasets.

- **URL**: https://apify.com/shahidirfan/g2-product-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does G2 Product Reviews Scraper do?

G2 Product Reviews Scraper collects public reviews for any G2 product and saves them as structured records. Give it a G2 product URL, a review permalink, or a bare product slug. The Actor returns review titles, ratings, dates, reviewer details, pros, cons, problems solved, and direct review links.

Use it for competitor research, voice-of-customer analysis, review monitoring, and datasets for AI and search projects. Results land in an Apify dataset that you can download as JSON, CSV, Excel, or send to another workflow.

### Why use G2 Product Reviews Scraper?

- **Fast live collection.** A 20 review run usually finishes in a few seconds. Larger runs read several review views in parallel.
- **Deep coverage.** The Actor combines star bands, company sizes, roles, regions, countries, industries, and review keywords to go beyond the first page.
- **Reviewer context.** Records include the reviewer label, role, company size, and industry when G2 publishes them.
- **Separate answer fields.** Pros, cons, and problems solved stay in their own columns instead of one long text block.
- **Clean output.** Empty values are removed, so every record contains only the fields that have data.
- **Repeatable runs.** Schedule the Actor to track new reviews, rating shifts, or changes in reviewer sentiment.

### What data can you extract from G2?

| Field                   | Description                                         |
| ----------------------- | --------------------------------------------------- |
| `product_name`          | Product name shown on G2                            |
| `product_slug`          | G2 product slug                                     |
| `product_url`           | G2 reviews page for the product                     |
| `product_category`      | Primary G2 category when available                  |
| `product_rating`        | Average product rating when available               |
| `product_review_count`  | Total public review count when available            |
| `review_id`             | G2 review identifier                                |
| `review_url`            | Direct link to the review                           |
| `review_title`          | Review headline                                     |
| `review_rating`         | Star rating from 0 to 5                             |
| `review_date`           | Publication date in ISO format                      |
| `reviewer_name`         | Public reviewer name or reviewer label              |
| `reviewer_job_title`    | Reviewer role when published                        |
| `reviewer_company_size` | Reviewer company size segment                       |
| `reviewer_industry`     | Reviewer industry when published                    |
| `pros`                  | What the reviewer likes best                        |
| `cons`                  | What the reviewer dislikes                          |
| `problems_solved`       | Problems the product solves for the reviewer        |
| `review_text`           | Full review text with question headings             |
| `badges`                | Review badges when the source publishes them        |
| `review_source`         | Invitation or collection source when available      |
| `verified_reviewer`     | True when G2 marks the reviewer as validated        |
| `incentivized`          | True when G2 marks the review as incentivized       |
| `current_user`          | True when G2 marks the reviewer as a current user   |
| `ai_translated`         | True when G2 marks the review as AI translated      |
| `data_source`           | `g2_feed`, `live_page`, `archive_page`, or `g2_api` |
| `scraped_at`            | ISO timestamp for the collection time               |

Fields that G2 does not publish for a review are left out of that record. A missing company size or industry is a source limitation, not a failed run.

### How to use G2 Product Reviews Scraper

1. Open the Actor in Apify Console.
2. Enter a G2 product URL, review permalink, or bare product slug.
3. Set the number of reviews you want.
4. Raise `max_pages` if you need deeper history.
5. Choose a sort order if you need one.
6. Run the Actor and open the dataset to review or export the results.

Proxy settings are optional. The public G2 review data used by this Actor is normally reachable without a proxy. Enable Apify Proxy only if your runs are rate limited.

### Input Parameters

| Parameter            | Type    | Required | Default                           | Description                                                                    |
| -------------------- | ------- | -------- | --------------------------------- | ------------------------------------------------------------------------------ |
| `startUrl`           | String  | No       | HubSpot Marketing Hub reviews URL | G2 product URL, review page, review permalink, or bare slug                    |
| `results_wanted`     | Integer | No       | `20`                              | Maximum number of reviews to save                                              |
| `max_pages`          | Integer | No       | `10`                              | Maximum review pages to read per view family. Each page holds up to 25 reviews |
| `sort_by`            | String  | No       | `g2_default`                      | Review sort order                                                              |
| `proxyConfiguration` | Object  | No       | No proxy                          | Optional Apify Proxy or custom proxy URLs                                      |

#### URL formats

`startUrl` accepts these forms:

- `https://www.g2.com/products/hubspot-marketing-hub/reviews`
- `https://www.g2.com/products/hubspot-marketing-hub`
- `https://www.g2.com/products/hubspot-marketing-hub/reviews/hubspot-marketing-hub-review-13518315`
- `www.g2.com/products/hubspot-marketing-hub/reviews`
- `hubspot-marketing-hub`

A URL with G2 filters, such as `filters[nps_score][]=5`, keeps those filters. Category pages are not supported because they list products, not reviews. Comparison URLs use the first product.

#### Sort options

| Value           | Behavior                                                                |
| --------------- | ----------------------------------------------------------------------- |
| `g2_default`    | G2 default source order, newest first                                   |
| `most_recent`   | Newest reviews first                                                    |
| `most_helpful`  | Same source order. G2 does not publish helpful vote counts in this data |
| `highest_rated` | Highest star ratings first in the saved set                             |
| `lowest_rated`  | Lowest star ratings first in the saved set                              |

#### Review coverage and limits

G2 serves up to 25 reviews per public view. A single view cannot be paged with `page=2`, so the Actor reads many filter views instead:

- all reviews
- 5, 4, 3, 2, and 1 star bands
- small business, mid-market, and enterprise company sizes
- common reviewer roles
- regions and countries
- four common industries
- keyword searches inside review text
- narrow combinations of company size, role, and star rating

`max_pages` caps how many pages the Actor reads in each view family. The default of 10 is enough for most runs. For requests above 500 reviews, set `max_pages` to 20 or 30.

If you have a G2 vendor token, set the `G2_API_TOKEN` environment variable. The Actor uses that source first and can page through 100 reviews per request.

### Output Data

| Field                   | Type    | Description                         |
| ----------------------- | ------- | ----------------------------------- |
| `product_name`          | String  | Product name                        |
| `product_slug`          | String  | G2 product slug                     |
| `product_url`           | String  | Product reviews page                |
| `product_category`      | String  | Primary G2 category when available  |
| `product_rating`        | Number  | Average rating when available       |
| `product_review_count`  | Integer | Total public reviews when available |
| `review_id`             | String  | Review identifier                   |
| `review_url`            | String  | Review permalink                    |
| `review_title`          | String  | Review headline                     |
| `review_rating`         | Number  | Star rating                         |
| `review_date`           | String  | Publication date                    |
| `reviewer_name`         | String  | Reviewer name or label              |
| `reviewer_job_title`    | String  | Reviewer role                       |
| `reviewer_company_size` | String  | Company size segment                |
| `reviewer_industry`     | String  | Reviewer industry                   |
| `pros`                  | String  | Positive answer                     |
| `cons`                  | String  | Negative answer                     |
| `problems_solved`       | String  | Outcome answer                      |
| `review_text`           | String  | Full review text                    |
| `badges`                | Array   | Review badges when available        |
| `review_source`         | String  | Collection source when available    |
| `verified_reviewer`     | Boolean | Validated reviewer flag             |
| `incentivized`          | Boolean | Incentivized review flag            |
| `current_user`          | Boolean | Current user flag                   |
| `ai_translated`         | Boolean | AI translation flag                 |
| `data_source`           | String  | Where the record came from          |
| `scraped_at`            | String  | ISO timestamp                       |

### Usage Examples

#### Collect 50 recent reviews

```json
{
    "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews",
    "results_wanted": 50
}
```

#### Collect a larger dataset

```json
{
    "startUrl": "https://www.g2.com/products/slack/reviews",
    "results_wanted": 500,
    "max_pages": 20
}
```

#### Sort by highest rating

```json
{
    "startUrl": "https://www.g2.com/products/notion/reviews",
    "results_wanted": 100,
    "sort_by": "highest_rated"
}
```

#### Keep a star filter from the URL

```json
{
    "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews?filters%5Bnps_score%5D%5B%5D=1",
    "results_wanted": 50
}
```

#### Use a review permalink

```json
{
    "startUrl": "https://www.g2.com/products/slack/reviews/slack-review-13686121",
    "results_wanted": 20
}
```

### Sample Output

```json
{
    "product_name": "Slack",
    "product_slug": "slack",
    "product_url": "https://www.g2.com/products/slack/reviews",
    "review_id": "13870634",
    "review_url": "https://www.g2.com/products/slack/reviews/slack-review-13870634",
    "review_title": "Straightforward Team Communication with Handy Integrations",
    "review_rating": 4,
    "review_date": "2026-10-27T11:11:25.000Z",
    "reviewer_name": "Verified User",
    "reviewer_industry": "Computer Software",
    "reviewer_job_title": "User",
    "reviewer_company_size": "501-1,000 employees",
    "pros": "Slack has helped our team communicate more effectively. It’s straightforward to use, and it’s especially useful when working with remote teams. We use the integration to several tools so that we can get notifications within Slack. Agents and apps is a good way for us to do that.",
    "cons": "When there are too many conversations and channels, it can be difficult to keep up with new messages, especially on busy days.",
    "problems_solved": "It’s been helping our team communicate more effectively and stay aligned.",
    "review_text": "What do you like best?\nSlack has helped our team communicate more effectively. It’s straightforward to use, and it’s especially useful when working with remote teams. We use the integration to several tools so that we can get notifications within Slack. Agents and apps is a good way for us to do that.\n\nWhat do you dislike?\nWhen there are too many conversations and channels, it can be difficult to keep up with new messages, especially on busy days.\n\nWhat problems is the product solving?\nIt’s been helping our team communicate more effectively and stay aligned.",
    "data_source": "g2_feed",
    "scraped_at": "2026-10-27T15:53:35.246Z"
}
```

### Tips for Best Results

- Start with 20 to 50 reviews to confirm the product and fields before a large run.
- Set `max_pages` to 20 or 30 when you request more than 500 reviews.
- Keep a star filter in `startUrl` when you only need one rating band.
- Use `highest_rated` or `lowest_rated` when rating order matters. The Actor sorts the reviews it saves for that run.
- Review dates, roles, company sizes, and industries come from G2. Missing values mean the reviewer did not publish them.
- Schedule repeat runs to collect new reviews without changing the input.
- In local testing on 27 October 2026, 200 reviews completed in about 9 seconds and 1,000 reviews in about 24 seconds with `max_pages: 30`.

### Integrations

- **Google Sheets** - Send review records to a spreadsheet for analysis.
- **Webhooks** - Trigger downstream workflows after a run.
- **Make or Zapier** - Connect results to no-code automations.
- **API** - Read datasets from your own systems.
- **AI and RAG pipelines** - Use clean review text as source material for models and search indexes.

### Frequently Asked Questions

#### Can I export G2 review data to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats.

#### Can I run this Actor on a schedule?

Yes. Schedule it in Apify Console to collect new reviews daily, weekly, or at another interval.

#### How many reviews can one run collect?

It depends on the product and the number of filter views that contain reviews. Runs of 1,000 reviews were tested on a product with more than 10,000 reviews. Smaller products return fewer records and the log reports how many were saved.

#### Why did the run stop before `results_wanted`?

The product may have fewer public reviews than requested, the filter views may be exhausted, or G2 may have rate limited the run. Check the final log line for `stop=results_reached`, `stop=live_exhausted`, or `stop=archive_recovered`.

#### Why are some fields missing?

G2 does not publish every field for every review. Anonymous reviewers often have no industry or company size. Badges and review source labels are not present in every data view. The Actor leaves empty fields out instead of writing null values.

#### What does `data_source` mean?

`g2_feed` means the record came from a live public review view. `live_page` means it came from a public review page. `archive_page` means live data was unavailable and the Actor used a public archived copy. `g2_api` means it came from an authorized G2 vendor feed.

#### Does the Actor support review sorting?

Yes. Use `sort_by` with `g2_default`, `most_recent`, `most_helpful`, `highest_rated`, or `lowest_rated`. Helpful vote counts are not public, so `most_helpful` uses the default source order.

#### Does the Actor support review permalinks?

Yes. A URL such as `https://www.g2.com/products/slack/reviews/slack-review-13686121` resolves to the product and collects reviews from there.

#### Does the Actor support category pages?

No. Category pages list products, not product reviews. Provide a product URL or a bare product slug.

#### Can I use an authorized G2 vendor feed?

Yes. Set the `G2_API_TOKEN` environment variable for the Actor. Records from that source are marked with `data_source: "g2_api"`. Without a token, the Actor uses public review data.

#### Is it legal to collect G2 review data?

The reviews are publicly visible. You are responsible for complying with applicable laws, G2's terms, and privacy rules when you store or use the data.

### Related Actors

- [Capterra Review Scraper](https://apify.com/shahidirfan/capterra-review-scraper) - Collect B2B software reviews from Capterra.
- [Clutch.co Reviews Scraper](https://apify.com/shahidirfan/clutch-co-reviews-scraper) - Collect agency and software reviews from Clutch.
- [TrustPilot Reviews Scraper](https://apify.com/shahidirfan/trustpilot-reviews-scraper) - Collect public company reviews from Trustpilot.

### Support

For issues or feature requests, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate collection of publicly available review data. Users are responsible for using the data responsibly and complying with applicable laws and website terms.

# Actor input Schema

## `startUrl` (type: `string`):

A G2 product URL, review page, review permalink, or bare product slug. Example: https://www.g2.com/products/slack/reviews.

## `results_wanted` (type: `integer`):

Maximum number of reviews to save.

## `max_pages` (type: `integer`):

Maximum feed pages to read per view family (star, company size, role, region, country). Each page holds up to 25 reviews. Raise this for deeper history.

## `sort_by` (type: `string`):

Sort order for collected reviews. G2 default, most recent, and most helpful use the source order; highest and lowest rated sort the saved set.

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

Optional. The public review feed normally works without a proxy. Enable Apify Proxy or add custom proxy URLs when your runs are rate limited.

## Actor input object example

```json
{
  "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews",
  "results_wanted": 20,
  "max_pages": 10,
  "sort_by": "g2_default",
  "proxyConfiguration": {}
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = { "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/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 '{
  "startUrl": "https://www.g2.com/products/hubspot-marketing-hub/reviews"
}' |
apify call shahidirfan/g2-product-reviews-scraper --silent --output-dataset

```

## MCP server setup

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