# G2 Reviews Scraper — Software Reviews & Ratings (`tortuga/g2-scraper`) Actor

Scrape G2 software reviews and product profiles: star ratings, likes and dislikes, problems solved, reviewer role, company size and industry, plus product ratings, categories, pricing, alternatives.

- **URL**: https://apify.com/tortuga/g2-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Other
- **Stats:** 2 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Scrape G2 software reviews and product profiles: star rating, review title, what the reviewer likes and dislikes, the problems the product solves, reviewer job title, company size and industry, review dates, validation and incentive badges, plus product ratings, star distribution, categories, pricing plans, alternatives and category rankings. Works for any G2 product, category or search URL.

G2 blocks ordinary scrapers at the edge, so this Actor reads the site through Apify's Unblocker proxy with plain HTTP requests: no headless browser, no login, no cookies to maintain. Every response is checked before it is counted (a page without the review list or an anti-bot page is fetched again), and a request is only made when its results still fit your limits. You pay per item, with no start fee.

### What data does G2 Reviews Scraper extract?

**Review items** (`mode: reviews`, default):

| Field | Description |
|---|---|
| `productSlug`, `productName`, `productUrl`, `productId` | Product the review belongs to (`slack`, "Slack", its G2 URL, G2's numeric product id) |
| `reviewId`, `url` | G2 review id and the permalink of the review (`…/reviews/slack-review-13686121`) |
| `title` | Review headline |
| `rating` | 0-5 in half-star steps |
| `likes` | Answer to "What do you like best about …?" |
| `dislikes` | Answer to "What do you dislike about …?" |
| `problemsSolved` | Answer to "What problems is … solving and how is that benefiting you?" |
| `recommendations` | Answer to "Recommendations to others considering …" (mostly on older reviews) |
| `answers` | Any other question / answer pairs of the review, as `[{question, answer}]` |
| `text` | The whole review body in one string |
| `reviewerName` | Reviewer's display name as G2 shows it ("Amit M."); anonymous reviewers keep G2's label ("Verified User in Computer Software") |
| `reviewerUrl`, `reviewerId` | Public G2 profile link (`https://www.g2.com/users/…`) and G2's numeric reviewer id; `null` for anonymous reviewers |
| `reviewerRole` | Job title as the reviewer wrote it |
| `companySize` | "Small-Business (50 or fewer emp.)", "Mid-Market (51-1000 emp.)" or "Enterprise (> 1000 emp.)" |
| `industry` | Reviewer's industry when G2 shows it |
| `reviewDate`, `publishedAt` | Publication date (`2026-10-01`) and full timestamp |
| `updatedDate` | Date the reviewer last refreshed the review, when G2 shows one |
| `validatedReviewer`, `validationMethod` | G2's "Validated Reviewer" badge and how the identity was checked ("LinkedIn", "business email account", …) |
| `verifiedCurrentUser` | "Current User" badge (screenshot or in-app proof of use) |
| `reviewSource` | How the review was collected: "Organic", "G2 invite", "Seller invite", "Thank You page", … |
| `incentivized` | The reviewer was offered a gift card or other nominal incentive |
| `badges`, `translatedFrom` | Other badges on the review ("AI Translated", "G2 Icon") and the original language of translated reviews |
| `disclosure` | G2's note on reviews that do not count towards scores (business partners, guest users) |
| `isVideoReview`, `videoUrl` | Video flag and link when the review carries a video |
| `scrapedAt` | Time of collection (UTC) |

Reviewer avatars and initials monograms are not collected. G2 shows no reviewer LinkedIn links on review cards (a "Validated through LinkedIn" badge only says how the identity was checked), so there is no LinkedIn field.

**Product items** (`mode: products`): `slug`, `name`, `url`, `productId`, `vendor`, `vendorUrl`, `description`, `rating`, `reviewCount`, `starDistribution` (review count per star, when G2 serves the page with its review list) and `starPercentages`, `categories` with `categoryUrls`, `parentCategories`, `pricing` (plan name, price, currency, terms), `pricingUrl`, `alternatives` and `comparisons` (name, URL, rating, review count), `features` by group, `pros` and `cons` (the themes G2 extracts from reviews, with mention counts), `languages`, `solutionType`, `integrationCount`, `videoReviewCount`, `logoUrl`, `websiteUrl`.

**Category cards** (`mode: category`): `rank`, `name`, `slug`, `url`, `productId`, `vendor`, `vendorUrl`, `rating`, `reviewCount`, `description` (G2's "What do users say?" summary, or the product description on search pages), `badges`, top `pros` and `cons` with mention counts, `bestFor`, `category`, `categorySlug`, `categoryUrl`, `subcategory`, `relatedCategories`, `isSponsored`, `logoUrl`, `page`.

### How to use G2 Reviews Scraper

1. Paste one or more URLs into **Start URLs**: a product page (`https://www.g2.com/products/slack/reviews`), a category page (`https://www.g2.com/categories/crm`) or a search page (`https://www.g2.com/search?query=help+desk`). Or type product slugs such as `slack` into **Product slugs**.
2. Pick **What to scrape**: reviews (default), product profiles, or category cards.
3. Set **Max items** and, for runs over several products, **Max reviews per product**.
4. Optionally choose **Sort reviews**, **Only these star ratings**, **Only these company sizes**, a keyword in **Only reviews mentioning**, or a date in **Only reviews published or updated since**.
5. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "startUrls": [
    { "url": "https://www.g2.com/products/slack/reviews" },
    { "url": "https://www.g2.com/categories/crm" }
  ],
  "productSlugs": ["notion", "hubspot-marketing-hub"],
  "mode": "reviews",
  "maxItems": 500,
  "maxReviewsPerProduct": 50,
  "sortReviews": "most_recent",
  "ratingFilter": ["1", "2"],
  "companySizeFilter": ["enterprise"],
  "publishedAfter": "30 days"
}
```

### Output example

```json
{
  "type": "review",
  "productSlug": "slack",
  "productName": "Slack",
  "productUrl": "https://www.g2.com/products/slack/reviews",
  "productId": 3437,
  "reviewId": "11444244",
  "url": "https://www.g2.com/products/slack/reviews/slack-review-11444244",
  "title": "Boost Your Team's Efficiency with Slack",
  "rating": 4.5,
  "likes": "What I like best about Slack is its ability to centralize and streamline team communication. The intuitive channel system keeps conversations organized and relevant, while real-time messaging facilitates quick decisions.",
  "dislikes": "What I dislike about Slack primarily revolves around notification management and cost. The sheer volume of notifications can become overwhelming, even with customized settings.",
  "problemsSolved": "Slack primarily fixes the chaos of scattered team communication. Instead of endless emails and digging for info, it pulls all our conversations, files, and updates into one spot.",
  "recommendations": null,
  "answers": [],
  "text": "What I like best about Slack is its ability to centralize and streamline team communication. … What I dislike about Slack primarily revolves around notification management and cost. … Slack primarily fixes the chaos of scattered team communication. …",
  "reviewerName": "Saqib I.",
  "reviewerUrl": "https://www.g2.com/users/9ca7cba8-1321-4601-9f4b-bdeedeb8834c",
  "reviewerId": 6307363,
  "reviewerRole": "RCM Executive",
  "companySize": "Small-Business (50 or fewer emp.)",
  "industry": "Insurance",
  "reviewDate": "2025-07-28",
  "publishedAt": "2025-07-28T14:46:17-05:00",
  "updatedDate": "2026-10-01",
  "validatedReviewer": true,
  "validationMethod": "LinkedIn",
  "verifiedCurrentUser": true,
  "reviewSource": "Organic",
  "incentivized": false,
  "badges": ["AI Translated"],
  "translatedFrom": "English",
  "disclosure": null,
  "isVideoReview": false,
  "videoUrl": null,
  "scrapedAt": "2026-10-02T20:20:22Z"
}
```

### Proxy note

G2 blocks datacenter and residential proxies alike, so this Actor uses **Apify's Unblocker proxy** by default. Unblocker is billed to your Apify account per successful request: 10 Unblocker units, about $0.0015 on the free plan and less on paid plans. Failed requests are free. One request returns 10 reviews, one product profile, or 15-20 category cards, so the proxy adds about **$0.00015 per review** on top of the review price (closer to $0.0002 per review beyond the first 100 of a product, see below). The run's `SUMMARY` record reports the number of successful requests. Responses through Unblocker take between 2 and 60 seconds each; the Actor keeps five requests in flight, which works out to roughly 50-100 reviews per minute.

### How much does it cost to scrape G2 reviews?

Pay per item: **$0.0015 per review**, $0.004 per product profile, $0.001 per category card. There is no start fee and no subscription. On top of that you pay the Unblocker proxy (see the proxy note) and normal Apify platform usage, which is a few cents per thousand reviews. 1,000 reviews cost about $1.70 all-in on the free plan, 100 reviews about $0.17.

### How many G2 reviews can I get per product?

G2 shows visitors without an account the first 100 reviews of any sorted or filtered list and nothing beyond page 10. Up to 100 reviews per product you get exactly that list in the order you chose, 10 reviews per request.

When **Max reviews per product** is higher, the Actor also reads the slices of the list that G2's own filters offer (star rating, then company size, region, industry and user role). Each slice is a list of its own with its own 100 reviews, slices that are still larger are split again, and every slice contributes in proportion to its size. The result stays close to "the newest N reviews" and keeps the product's real mix of star ratings. Products with a few thousand reviews can be collected almost completely this way; reviews that have no company size or region on G2 (about 1%) can drop out. For the largest products (tens of thousands of reviews) set a limit that matches what you need, since every 10 reviews is one proxy request.

### Can I get only negative reviews, or only new ones?

Yes. **Only these star ratings** with `1` and `2` returns complaints only; G2 applies the filter, so you do not pay for reviews you do not want (note that G2's 1-star bucket includes 0 and half-star ratings). **Only these company sizes** narrows to small business, mid-market or enterprise reviewers, and **Only reviews mentioning** searches the review text for a keyword such as "pricing".

For monitoring, set **Only reviews published or updated since** to a date or a period like `7 days` and schedule the Actor. Reviews are read newest first and the run stops at the page where they get older than that, so a weekly check of a product usually costs one or two requests. Deduplicate on `reviewId`.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (Apify Console: **Saved tasks** -> **Schedule**, for example daily). Each run then remembers what earlier runs of the same input returned and outputs only what is new: reviews no earlier run saved in `reviews` mode (read newest first; paging stops at the first page that reaches already-seen reviews, so a daily check of a product is usually one request), products whose rating or pricing plans changed in `products` mode, and products that are new to the list or whose rating changed in `category` mode. Unchanged items are skipped before they are saved, so they are not charged. **Only reviews published or updated since** (`2 days`, `1 week` or a date like `2026-10-01`) is the date limit for monitoring: it bounds how far back the first run reads. Monitored items carry `changeType` (`new` or `changed`) and, for changed products, `previousValues` with the old values of the fields that changed (e.g. `{"rating": 4.5}`). Use **Monitoring key** to keep several schedules on the same input apart.

### Does it work with category and search pages?

Yes. A category URL such as `https://www.g2.com/categories/crm` is paginated automatically (15 products per page, ranked by G2 score). In category mode you get the ranking cards: the cheapest way to list a whole category with ratings, review counts, G2's summary of what users say, and the top pro and con of each product. In reviews mode every product of the category is opened and up to **Max reviews per product** reviews are saved for each; in products mode each product gets a full profile. Search URLs (`https://www.g2.com/search?query=…`) work the same way with 20 products per page. Parent categories that only group sub-categories return the popular products G2 lists for each sub-category.

### Does it need a G2 account or a browser?

No. Everything comes from pages G2 serves to anonymous visitors. The Actor sends plain HTTP requests through the Unblocker proxy and reads the review list from the same endpoint the product page loads it from, together with the structured data G2 embeds for search engines. No login, no cookies and no headless browser, which keeps memory use low (512 MB is enough).

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets. Schedule it to monitor new reviews of your product or your competitors, or feed `likes`, `dislikes` and `problemsSolved` into an LLM for theme analysis.

### Is it legal to scrape G2?

This Actor collects only data that G2 shows publicly to logged-out visitors: review texts and ratings, the reviewer's display name as shown (usually first name and last initial, or G2's "Verified User" label for anonymous reviewers), the public G2 profile link and reviewer id, job title, industry and company size band, and product and vendor business information. It does not collect photos, avatars or any contact details, and nothing behind a login. Reviewer names and profile links are personal data under GDPR and similar laws: make sure you have a lawful basis for processing them, and do not use them to contact or profile individuals. You are responsible for how you use the data and for complying with G2's terms and applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

# Actor input Schema

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

G2 product pages (https://www.g2.com/products/slack/reviews, any tab of a product works), category pages (https://www.g2.com/categories/crm) or search pages (https://www.g2.com/search?query=help+desk). A reviews URL copied from the browser with G2 filters applied (order=…, filters\[…]=…) keeps those filters. Category and search pages are paginated automatically and every product on them is processed in the selected mode.

## `productSlugs` (type: `array`):

Shortcut for product URLs: the part after /products/ in a G2 link, e.g. "slack" or "hubspot-marketing-hub" for https://www.g2.com/products/hubspot-marketing-hub/reviews.

## `mode` (type: `string`):

reviews: one item per user review (default). products: one profile item per product (rating, review count, star distribution, categories, pricing plans, alternatives, features, pros and cons). category: one card per product on category or search pages (rank, rating, review count, summary, badges).

## `maxItems` (type: `integer`):

Stop after this many items in total (reviews, products or cards across all start URLs). Keeps cost predictable: no page is requested for items that would not fit.

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

Reviews mode only: cap per product, so a category run spreads the budget across products. G2 shows visitors 100 reviews per sorted list; above 100 the actor also reads the star-rating, company-size, region, industry and role slices of the list and merges them, each slice contributing in proportion to its size.

## `sortReviews` (type: `string`):

Order in which reviews are collected (matters whenever a cap is set). Most recent is best for monitoring; G2 default is the order the site shows first.

## `ratingFilter` (type: `array`):

Optional: keep only reviews in these star buckets, e.g. 1 and 2 for complaints. G2 groups half stars downwards into the bucket above them: 1 = 0 to 1 stars, 2 = 1.5 to 2, 3 = 2.5 to 3, 4 = 3.5 to 4, 5 = 4.5 to 5. The filter is applied by G2, so you do not pay for reviews you do not want. Leave empty for all.

## `companySizeFilter` (type: `array`):

Optional: keep only reviews written by people at small businesses (50 or fewer employees), mid-market companies (51-1,000) or enterprises (more than 1,000). Applied by G2. Leave empty for all.

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

Optional: keyword search inside the review text (G2's own "Search reviews" box), e.g. "pricing" or "customer support". Leave empty for all reviews.

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

Optional: a date (YYYY-MM-DD) or a period such as "7 days" or "1 month". Reviews are read newest first and collection stops at the page where they get older than this, so a scheduled run only fetches (and bills) what is new. Reviews that were refreshed by their author after this date are included (see updatedDate).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this input returned and output only what is new: in `reviews` mode, reviews no earlier run output (read newest first from G2's most-recent list, without facet slicing, so up to 100 per product per run; paging stops at the first page that reaches already-seen reviews, usually after 1 request when little is new); in `products` mode, profiles whose rating or pricing plans changed; in `category` mode, products new to the list or whose rating changed (review counts and rank are not compared). Use with a Schedule; unchanged items are not charged. Combine with **Only reviews published or updated since** to bound how far back the first run reads.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input. Only used with **Only new or changed items**.

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

G2 blocks datacenter and residential proxies at the edge, so the default is Apify's Unblocker proxy (group UNBLOCKER). It is billed to your Apify account per successful request: 10 Unblocker units, about $0.0015 on the free plan and less on paid plans. One request returns 10 reviews, 15-20 category cards or one product profile; failed requests are free. Other proxy groups will most likely be blocked.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.g2.com/products/slack/reviews"
    }
  ],
  "productSlugs": [],
  "mode": "reviews",
  "maxItems": 100,
  "maxReviewsPerProduct": 100,
  "sortReviews": "most_recent",
  "ratingFilter": [],
  "companySizeFilter": [],
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# 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"
        }
    ],
    "productSlugs": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/g2-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" }],
    "productSlugs": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/g2-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"
    }
  ],
  "productSlugs": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call tortuga/g2-scraper --silent --output-dataset

```

## MCP server setup

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