# G2 Reviews Scraper — Software Reviews & Pricing Data (`logiover/g2-reviews-scraper`) Actor

Scrape G2.com software reviews and product data, no account needed. Every review with pros, cons, problems solved, rating, reviewer role, company size and industry — plus product ratings, star breakdown, pricing plans, alternatives and category rankings. Export CSV, Excel or JSON.

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

## Pricing

from $3.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 — Software Reviews & Pricing Data

> **Independent tool — not affiliated with, endorsed by or sponsored by G2.com, Inc.** "G2" is a trademark of its owner and is used here only to describe the public website this Actor reads.

Scrape **G2.com software reviews and product data** without a G2 account, an API key or a browser extension. Give it a product (`https://www.g2.com/products/slack/reviews` or just `slack`) or a whole category (`https://www.g2.com/categories/crm`) and get back clean rows you can drop into a spreadsheet, a BI tool or an LLM pipeline:

- **Every review, fully structured** — title, star rating, *what they like best*, *what they dislike*, *what problem it solves*, reviewer job title, industry and company size, validation method, incentive and review-source flags, dates and permanent review URL.
- **One product row per product** — average rating, total reviews, 5★→1★ breakdown, pros/cons themes with mention counts, AI review summary, pricing plans, vendor, categories, languages, integrations count, top alternatives and how its reviewers split by company size, role, industry and region.
- **Category rankings** — every product in a G2 category in G2's ranking order, with vendor, rating, review count, price range, free-trial flag and AI summary. Optionally with each product's reviews.
- **Filters G2 itself offers** — star rating, reviewer company size, keyword in the review text, and five sort orders (most recent, most helpful, highest/lowest rated, G2 default).

Tested on the platform on 2026-10-10: **1,500 unique reviews from a single product and 1,200 from four products — 0 duplicates, 0 lost pages.**

### What can you do with G2 review data?

| Use case | What you use |
|---|---|
| **Competitive intelligence** | Pull your competitors' last 300 reviews every week; track their `consThemes`, `dislike` answers and rating trend. |
| **Product marketing & messaging** | Mine `likeBest` across your own reviews for the phrases customers use; turn them into landing-page copy. |
| **Win/loss & churn research** | Filter `starRatings: ["1","2"]` + `companySizes: ["enterprise"]` to read exactly why large customers leave a competitor. |
| **Sentiment analysis, NLP & LLM datasets** | `reviewText` is clean, de-duplicated and labelled with a star rating, segment and industry — ready for fine-tuning or evaluation sets. |
| **Sales prospecting & ABM** | `reviewerTitle`, `reviewerIndustry` and `reviewerCompanySegment` tell you which roles and industries use a competitor — build look-alike target lists. |
| **VC & M\&A due diligence** | Compare review velocity (`reviewDate`), rating distribution (`stars5`…`stars1`) and incentive share (`isIncentivized`) across a category. |
| **Market maps** | Category mode with reviews off lists a whole category (CRM alone has 1,719 products) with ratings and price ranges in minutes. |
| **Pricing research** | `pricingPlans`, `priceLow`/`priceHigh` and `freeTrialAvailable` across every product in a category. |

### How to use it

1. Open the **Input** tab.
2. Paste one or more **G2 product URLs** (or slugs) and/or **G2 category URLs** (or slugs).
3. Choose how many reviews per product you want, and optionally a star rating, company size or keyword filter.
4. Press **Start**. Rows appear in the **Output** tab as they are collected — the *Reviews* view shows review columns, the *Products* view product columns.
5. Download as **JSON, CSV, Excel, XML or HTML**, or pull it through the API.

No login, cookies or G2 account are needed. The Actor routes requests through Apify's **UNBLOCKER** proxy group automatically, because G2 is protected by DataDome and refuses ordinary datacenter and residential proxies.

### Input examples

**1. Reviews + product data for a few products**

```json
{
  "productUrls": [
    "https://www.g2.com/products/slack/reviews",
    "https://www.g2.com/products/hubspot-sales-hub/reviews",
    "clickup"
  ],
  "maxReviewsPerProduct": 300,
  "reviewSort": "most_recent",
  "maxItems": 1000
}
```

**2. A whole category ranking, products only (fast market map)**

```json
{
  "categoryUrls": ["https://www.g2.com/categories/crm"],
  "includeReviews": false,
  "maxProductsPerCategory": 0,
  "maxItems": 2000
}
```

**3. Complaints from large companies that mention a keyword**

```json
{
  "productUrls": ["slack"],
  "starRatings": ["1", "2"],
  "companySizes": ["enterprise", "mid-market"],
  "reviewKeyword": "notifications",
  "reviewSort": "lowest_rated",
  "maxReviewsPerProduct": 100
}
```

**4. Top 10 products of a category with 50 reviews each**

```json
{
  "categoryUrls": ["email-marketing"],
  "maxProductsPerCategory": 10,
  "maxReviewsPerProduct": 50
}
```

### Output

Every row has a `type` column: **`review`** or **`product`**. Review columns are empty on product rows and vice versa. Arrays (`badges`, `pricingPlans`, `prosThemes`, …) stay arrays in JSON and are flattened by the CSV/Excel export.

#### Example review row (real output, 2026-10-10)

```json
{
  "type": "review",
  "reviewId": "13704999",
  "reviewUrl": "https://www.g2.com/products/monday-ai-work-platform/reviews/monday-ai-work-platform-review-13704999",
  "productName": "monday AI Work Platform",
  "productSlug": "monday-ai-work-platform",
  "productId": "16194",
  "productUuid": "83f98d6d-52c5-4ef6-98c0-bc5bf6e1b043",
  "vendorId": "13646",
  "vendorName": "monday.com",
  "reviewTitle": "Visual, Easy-to-Adopt Project Management and Resource Alignment",
  "rating": 4.5,
  "likeBest": "The tool is so visual and that makes it easy to learn, adopt, and advance how we use the tool for project management and resource alignment.",
  "dislike": "This is less a dislike about the tool and more about how we need to integrate better with other tools like Canva.",
  "problemsSolved": "Alignment on priorities and deeper understanding of the work that is getting done and where we're spending on our time.",
  "recommendations": null,
  "otherAnswers": null,
  "reviewText": "The tool is so visual and that makes it easy to learn, adopt, and advance how we use the tool for project management and resource alignment.\n\nThis is less a dislike about the tool and more about how we need to integrate better with other tools like Canva.\n\nAlignment on priorities and deeper understanding of the work that is getting done and where we're spending on our time.",
  "reviewDate": "2026-10-05",
  "updatedDate": null,
  "reviewerName": "Lisa W.",
  "isAnonymousReviewer": false,
  "reviewerTitle": "President & Founder",
  "reviewerIndustry": "Marketing and Advertising",
  "reviewerCompanySize": "Mid-Market (51-1000 emp.)",
  "reviewerCompanySegment": "Mid-Market",
  "reviewerProfileUrl": "https://www.g2.com/users/9817c6ac-d15d-40d7-94f8-50b3684671a8",
  "reviewerId": "36681",
  "isCurrentUser": true,
  "isValidatedReviewer": true,
  "validationMethod": "LinkedIn",
  "isIncentivized": true,
  "reviewSource": "Seller invite",
  "reviewSourceDetail": "Invitation from a seller or affiliate. This reviewer was offered a nominal incentive as thanks for completing this review.",
  "isAiTranslated": false,
  "isVideoReview": false,
  "excludedFromScoresReason": null,
  "badges": [
    "Current User",
    "Validated Reviewer",
    "Incentivized",
    "Source: Seller invite"
  ],
  "publishedAt": "2026-10-05T11:10:35-05:00",
  "scrapedAt": "2026-10-10T18:25:24.206Z"
}
```

#### Example product row (real output, arrays shortened)

```json
{
  "type": "product",
  "productName": "HubSpot Sales Hub",
  "productSlug": "hubspot-sales-hub",
  "productId": "6227",
  "productUuid": "9f217935-02fc-440a-86e1-17c669016c7b",
  "productUrl": "https://www.g2.com/products/hubspot-sales-hub/reviews",
  "imageUrl": "https://images.g2crowd.com/uploads/product/image/92f791c125019514c13f2138425a640b/hubspot-sales-hub.png",
  "vendorName": "HubSpot",
  "vendorId": "316",
  "vendorSlug": "hubspot",
  "vendorUrl": "https://www.g2.com/sellers/hubspot",
  "rating": 4.4,
  "reviewCount": 14359,
  "stars5": 9679,
  "stars4": 3863,
  "stars3": 598,
  "stars2": 114,
  "stars1": 105,
  "description": "Sales Hub combines sales engagement tools, AI-powered productivity features, and workflow automation into a unified platform designed to help growing teams close deals faster.\n\nCor…",
  "aiSummary": "Users consistently praise the ease of use and intuitive interface of HubSpot Sales Hub, highlighting how it simplifies sales management and enhances productivity. The platform's ability to integrate various tools and automate tasks is particularly valued, allowing teams to focus on building relationships. However, some users note that costs can escalate quickly as teams grow, which may limit access to advanced features.",
  "prosThemes": [
    {
      "theme": "Ease of Use",
      "mentions": 1215
    },
    {
      "theme": "Features",
      "mentions": 702
    },
    {
      "theme": "Helpful",
      "mentions": 672
    }
  ],
  "consThemes": [
    {
      "theme": "Missing Features",
      "mentions": 435
    },
    {
      "theme": "Limited Features",
      "mentions": 409
    },
    {
      "theme": "Learning Curve",
      "mentions": 383
    }
  ],
  "categories": [
    "Conversation Intelligence",
    "Business Scheduling",
    "Sales Engagement"
  ],
  "primaryCategory": "CRM Software",
  "primaryCategoryUrl": "https://www.g2.com/categories/crm",
  "languagesSupported": "German, English, French, Italian, Japanese, Dutch, Portuguese, Spanish",
  "solutionType": "All-in-One",
  "pricingPlans": [
    {
      "plan": "Free HubSpot CRM",
      "price": "$0.00",
      "unit": null
    },
    {
      "plan": "Sales Hub Starter",
      "price": "$20.00",
      "unit": "1 Core Seat Per Month"
    },
    {
      "plan": "Sales Hub Professional",
      "price": "$100.00",
      "unit": "1 Sales Seat Per Month"
    }
  ],
  "priceLow": null,
  "priceHigh": null,
  "priceCurrency": null,
  "pricingPlansCount": 3,
  "freeTrialAvailable": null,
  "integrationsCount": 170,
  "videoReviewCount": 16,
  "featuredCustomers": [
    "The Knowledge Academy",
    "Amazon Nova",
    "Blip Billboards"
  ],
  "topAlternatives": [
    {
      "name": "Salesforce Sales Cloud",
      "rating": 4.4,
      "reviewCount": 27570,
      "url": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/reviews"
    },
    {
      "name": "Salesloft",
      "rating": 4.5,
      "reviewCount": 9908,
      "url": "https://www.g2.com/products/salesloft/reviews"
    },
    {
      "name": "Apollo.io",
      "rating": 4.7,
      "reviewCount": 9843,
      "url": "https://www.g2.com/products/apollo-io/reviews"
    }
  ],
  "comparedWith": [
    {
      "name": "Salesforce Sales Cloud",
      "rating": 4.4,
      "reviewCount": 27570
    },
    {
      "name": "Zoho",
      "rating": 4.1,
      "reviewCount": 2952
    },
    {
      "name": "Pipedrive",
      "rating": 4.3,
      "reviewCount": 5074
    }
  ],
  "reviewersByCompanySize": [
    {
      "label": "Small Business (50 or fewer emp.)",
      "reviews": 8608
    },
    {
      "label": "Mid-Market (51-1000 emp.)",
      "reviews": 5018
    },
    {
      "label": "Enterprise ( >1000 emp.)",
      "reviews": 562
    }
  ],
  "reviewersByRole": [
    {
      "label": "User",
      "reviews": 8958
    },
    {
      "label": "Administrator",
      "reviews": 3432
    },
    {
      "label": "Executive Sponsor",
      "reviews": 277
    }
  ],
  "reviewersByIndustry": [
    {
      "label": "Computer Software",
      "reviews": 2158
    },
    {
      "label": "Information Technology and Services",
      "reviews": 1675
    },
    {
      "label": "Marketing and Advertising",
      "reviews": 1476
    }
  ],
  "reviewersByRegion": [
    {
      "label": "North America",
      "reviews": 9403
    },
    {
      "label": "Europe",
      "reviews": 2080
    },
    {
      "label": "Asia",
      "reviews": 1500
    }
  ],
  "categoryName": null,
  "categoryUrl": null,
  "categoryRank": null,
  "isSponsored": null,
  "scrapedAt": "2026-10-10T18:25:18.309Z"
}
```

#### Review fields

Fill rates are measured on 1,200 reviews from Slack, HubSpot Sales Hub, monday.com and ClickUp. Fields below 100% are empty because the reviewer did not give that information, not because the Actor missed it — for example about 4 in 10 reviewers hide their name ("Verified User in …"), and then G2 shows no job title or profile.

| Field | Type | Filled | Description |
|---|---|---|---|
| `type` | string | 100% | "review" or "product". |
| `reviewId` | string | 100% | G2 review (survey response) ID — stable, use it to de-duplicate. |
| `reviewUrl` | string | 100% | Permanent link to the review on G2. |
| `productName` | string | 100% | Product name on G2. |
| `productSlug` | string | 100% | G2 product slug (the part after /products/). |
| `productId` | string | 100% | G2 numeric product ID. |
| `productUuid` | string | 100% | G2 product UUID. |
| `vendorId` | string | 100% | G2 vendor ID. |
| `vendorName` | string | 100% | Company that sells the product (G2 "Seller"). |
| `reviewTitle` | string | 99.8% | Headline the reviewer gave the review. |
| `rating` | number | 100% | Review: the reviewer's star rating (0–5, half stars). Product: average rating. |
| `likeBest` | string | 99.8% | Answer to "What do you like best about …?" |
| `dislike` | string | 99.8% | Answer to "What do you dislike about …?" |
| `problemsSolved` | string | 99.8% | Answer to "What problems is … solving and how is that benefiting you?" |
| `recommendations` | string | 7% | Answer to "Recommendations to others considering …" (older reviews only). |
| `otherAnswers` | array | <1% | Any other question/answer pairs on the review, as \[{question, answer}]. |
| `reviewText` | string | 100% | All answers joined, ready for sentiment analysis or LLMs. |
| `reviewDate` | string | 100% | Date the review was written (YYYY-MM-DD). |
| `updatedDate` | string | 12% | Date the reviewer updated the review, when G2 followed up (YYYY-MM-DD). |
| `publishedAt` | string | 99.8% | Exact submission timestamp with timezone (ISO 8601). |
| `reviewerName` | string | 100% | Reviewer display name (first name + initial), or "Verified User" when hidden. |
| `isAnonymousReviewer` | boolean | 100% | True when the reviewer chose to hide their name. |
| `reviewerTitle` | string | 49% | Job title the reviewer gave, when shown. |
| `reviewerIndustry` | string | 44% | Industry of the reviewer's company, when shown. |
| `reviewerCompanySize` | string | 99.6% | Company size band as G2 prints it, e.g. "Mid-Market (51-1000 emp.)". |
| `reviewerCompanySegment` | string | 99.6% | Normalised segment: Small-Business, Mid-Market or Enterprise. |
| `reviewerProfileUrl` | string | 59% | G2 profile URL (only for reviewers with a public profile). |
| `reviewerId` | string | 100% | G2 reviewer ID. |
| `isCurrentUser` | boolean | 100% | G2 verified the reviewer currently uses the product (screenshot or in-app review). |
| `isValidatedReviewer` | boolean | 100% | G2 validated the reviewer's identity. |
| `validationMethod` | string | 100% | How the identity was validated: LinkedIn, Business email, Google One Tap, Manual review by G2. |
| `isIncentivized` | boolean | 100% | Reviewer received a nominal incentive (e.g. gift card) for writing the review. |
| `reviewSource` | string | 100% | Organic, G2 invite, Seller invite, G2 invite on behalf of seller, Organic Review from User Profile … |
| `reviewSourceDetail` | string | 100% | G2's own explanation of the review source. |
| `isAiTranslated` | boolean | 100% | G2 machine-translated the review into English. |
| `isVideoReview` | boolean | 100% | The review includes a video. |
| `excludedFromScoresReason` | string | 11% | Why G2 leaves this review out of its scores (guest user, business partner …), when it does. |
| `badges` | array | 100% | All badges shown on the review, as G2 labels them. |
| `scrapedAt` | string | 100% | When this row was collected (ISO 8601). |

#### Product fields

All product-page fields were 100% filled on the test products. Fields marked *category mode* come from the category listing and are filled when the product was found through `categoryUrls`.

| Field | Type | Filled | Description |
|---|---|---|---|
| `type` | string | 100% | "review" or "product". |
| `productName` | string | 100% | Product name on G2. |
| `productSlug` | string | 100% | G2 product slug (the part after /products/). |
| `productId` | string | 100% | G2 numeric product ID. |
| `productUuid` | string | 100% | G2 product UUID. |
| `productUrl` | string | 100% | G2 reviews page of the product. |
| `imageUrl` | string | 100% | Product logo image URL. |
| `vendorName` | string | 100% | Company that sells the product (G2 "Seller"). |
| `vendorId` | string | 100% | G2 vendor ID. |
| `vendorSlug` | string | 100% | G2 seller slug. |
| `vendorUrl` | string | 100% | G2 seller page URL. |
| `rating` | number | 100% | Review: the reviewer's star rating (0–5, half stars). Product: average rating. |
| `reviewCount` | number | 100% | Total reviews of the product on G2. |
| `stars5` | number | 100% | Number of 5-star reviews. |
| `stars4` | number | 100% | Number of 4-star reviews. |
| `stars3` | number | 100% | Number of 3-star reviews. |
| `stars2` | number | 100% | Number of 2-star reviews. |
| `stars1` | number | 100% | Number of 1-star reviews. |
| `description` | string | 100% | Product description from G2. |
| `aiSummary` | string | 100% | G2's AI summary "What do users say?". |
| `prosThemes` | array | 100% | Top praised themes with mention counts, \[{theme, mentions}]. |
| `consThemes` | array | 100% | Top criticised themes with mention counts, \[{theme, mentions}]. |
| `categories` | array | 100% | Every G2 category the product is listed in. |
| `primaryCategory` | string | 100% | Category from the product breadcrumb. |
| `primaryCategoryUrl` | string | 100% | G2 URL of the primary category. |
| `languagesSupported` | string | 100% | Languages the product supports. |
| `solutionType` | string | 100% | All-in-One or Best-of-Breed. |
| `pricingPlans` | array | 100% | Plans published on G2, \[{plan, price, unit}]. |
| `priceLow` | number | category mode | Lowest plan price (category listing data). |
| `priceHigh` | number | category mode | Highest plan price (category listing data). |
| `priceCurrency` | string | category mode | Currency of priceLow/priceHigh. |
| `pricingPlansCount` | number | 100% | Number of priced plans. |
| `freeTrialAvailable` | boolean | category mode | Vendor offers a free trial ("Try for free" on G2). |
| `integrationsCount` | number | 100% | Number of integrations listed on G2. |
| `videoReviewCount` | number | 100% | Number of video reviews. |
| `featuredCustomers` | array | 100% | Companies G2 shows as using the product. |
| `topAlternatives` | array | 100% | G2's top-rated alternatives, \[{name, rating, reviewCount, url}]. |
| `comparedWith` | array | 100% | Products G2 compares it with, \[{name, rating, reviewCount}]. |
| `reviewersByCompanySize` | array | 100% | Review counts per company size, \[{label, reviews}]. |
| `reviewersByRole` | array | 100% | Review counts per user role, \[{label, reviews}]. |
| `reviewersByIndustry` | array | 100% | Review counts for the top industries and Other, \[{label, reviews}]. |
| `reviewersByRegion` | array | 100% | Review counts per region, \[{label, reviews}]. |
| `categoryName` | string | category mode | Category the product was found in (category mode). |
| `categoryUrl` | string | category mode | URL of that category. |
| `categoryRank` | number | category mode | Position in G2's category ranking (category mode). |
| `isSponsored` | boolean | category mode | Paid placement in the category listing. |
| `scrapedAt` | string | 100% | When this row was collected (ISO 8601). |

### How many results can I get?

**Products:** G2 lists 2,000+ categories and well over 100,000 software products. A category page holds 15 ranked products and the Actor reads as many pages as you allow — e.g. the CRM category had **1,719 products on 115 pages** on 2026-10-10. With reviews turned off you get a full market map of a category in a few minutes.

**Reviews:** G2 shows a visitor who is not logged in only **the first ten reviews of any view** — the page number in the URL is ignored and the pager asks you to log in. This Actor works around that without an account: every reviews page also tells how many reviews match each filter value *given the filters already applied*, so the Actor splits a product's reviews into non-overlapping views (5★, 5★ + small business, 5★ + small business + Europe, …), reads the first page of each and only splits views that still hold more than ten reviews. Leaf views that are still larger are re-read in other sort orders.

Measured on 2026-10-10:

| Run | Result |
|---|---|
| 1 product × 1,500 reviews (Slack; first-release engine, before the speed update) | **1,500 unique reviews + 1 product row**, 0 duplicates, 275 pages read — and the product was nowhere near exhausted |
| 4 products × 300 reviews (Slack, HubSpot Sales Hub, monday.com, ClickUp; first-release engine) | **1,200 unique reviews + 4 product rows**, 0 duplicates, 194 pages read |
| 1 product × 40 reviews (the prefilled example) | 41 rows in 50 s |
| 3 products × 366 reviews (default concurrency 48) | **1,100 rows in 251 s**, 0 duplicates, exactly `maxItems` rows |
| 5 products of a category × 20 reviews | 105 rows in under 4 minutes |
| Category ranking, reviews off | 15 products per page, ~30–60 s per page |

On average one page read returns about **6.5–7.5 new reviews** (views are planned so they rarely overlap), so a 1,000-review job takes roughly 140–170 page reads. Large products (Slack has 39,869 reviews, Zoom 56,391) yield **thousands of reviews per product** — 1,500 from Slack was measured and the Actor still had unread views queued; the exact ceiling depends on how G2's filters partition that product. For tens of thousands of reviews, run many products — for example the top 100 products of a category with `maxReviewsPerProduct: 300`.

### Speed and cost

G2 can only be reached through Apify's unblocking proxy, and every G2 page takes **25–70 seconds** to come back through it (the fastest answers in our tests were ~27–37 s). The Actor is built around that:

- **One wave instead of a ladder.** The first wave (main page, its twin in another sort order, and the star × company-size views) goes out at once; as soon as the first page answers, G2's own filter counts are used to plan every remaining view in one go instead of discovering them level by level.
- **About 48 pages in flight** by default (`concurrency`, max 50), so a whole wave loads in roughly one page time.
- **Over-provisioned, then cut.** ~30% more views than needed are sent; the run stops the moment the target is reached and drops the stragglers. A view that fails (G2/unblocker answers 502 on ~15–25% of attempts) gets a replacement planned immediately instead of waiting for its retry.
- **Rows stream in** as pages arrive; the status line shows progress every 10 seconds.

Measured on the platform on 2026-10-10 with default settings:

| Job | Time |
|---|---|
| Prefilled example (Slack, 40 reviews + product row) | **50 s** (first rows at 37 s) — was 112 s |
| 600 reviews from 3 products | **125 s** |
| 1,100 rows from 3 products (1,097 reviews) | **251 s** — 1,000th review at 192 s — was 590 s |
| same job while the unblocker was slow (median page 53 s, 28% errors) | 282 s — 1,000th review at 251 s |

Platform usage in these runs was **$0.22–0.24 per 1,000 reviews**; failed and dropped proxy requests are not billed. You only pay the per-result price shown on this page for the rows you receive, and `maxItems` is a hard ceiling on rows — the run never returns more than you asked for.

### Tips

- **Slugs are enough.** `slack`, `hubspot-sales-hub` and `https://www.g2.com/products/slack/reviews` all work. If G2 renamed a product (e.g. `monday-com` → `monday-ai-work-platform`), the old slug still works and the output uses the current one.
- **De-duplicate across runs with `reviewId`.** It is G2's own stable ID; schedule a weekly run and keep only new IDs to monitor fresh reviews.
- **For the newest reviews only**, use `reviewSort: "most_recent"` with a modest `maxReviewsPerProduct` (e.g. 50) on a schedule.
- **Balanced samples:** reviews are gathered view by view across star ratings, so a 300-review sample of a big product contains positive *and* negative reviews instead of 300 five-star ones.
- **Keyword filter** uses G2's own review search, so it finds reviews where the word appears in any answer.
- **Product rows only:** set `includeReviews: false` for fast category rankings; product URLs then return one rich row each.

### FAQ

**Do I need a G2 account, cookies or an API key?**
No. The Actor reads the public pages that any visitor can open. It never logs in and never asks for your credentials.

**G2 blocks scrapers — will this keep working?**
G2 uses DataDome bot protection. The Actor uses Apify's UNBLOCKER proxy group, which passes it; datacenter and residential proxies are answered with a captcha. Pages that fail (G2 sometimes answers 502) are retried automatically — the 1,200-review test hit 46 such errors and lost zero pages.

**Why does the first row take about half a minute?**
Every G2 page has to pass G2's bot protection through Apify's unblocking proxy, which takes 25–70 s per page — the fastest answer we have measured is ~27 s. The Actor loads dozens of pages in parallel, so after the first wave rows arrive continuously; a 40-review run finishes in about 50 s and 1,000 reviews take about 3–4 minutes.

**Why can't I just page through all reviews like in the browser?**
Because G2 only lets logged-in users page. Visitors get ten reviews per view. The Actor's view-splitting method (see *How many results can I get?*) is how it reaches hundreds or thousands of reviews per product without logging in.

**Are the reviews in date order?**
Each view is read in the order you choose (`reviewSort`), but the combined output comes from many views, so the dataset is not one global timeline. Sort by `publishedAt` or `reviewDate` after export if you need that.

**How do I get only new reviews every week?**
Schedule the Actor (Schedules tab) with `reviewSort: "most_recent"` and keep the `reviewId`s you already have; anything new is a fresh review.

**What does `isIncentivized` mean?**
G2 marks reviews where the reviewer received a nominal incentive (often a gift card) for writing it. `reviewSource` and `reviewSourceDetail` say who invited the reviewer (G2, the seller, organic, …).

**Why are some reviewer fields empty?**
Reviewers choose what to show. When they hide their name G2 displays "Verified User in <industry>", and there is no job title or profile link. Company size is almost always present.

**Can I export to Google Sheets, Excel or a database?**
Yes — download CSV/Excel/JSON from the Output tab, or use Apify integrations (Google Sheets, Make, Zapier, Airbyte, webhooks) and the API.

**What happens if I mistype a product?**
The run fails with a clear `NOT_FOUND` message naming the slug, instead of finishing "successfully" with zero rows. Every run also writes a `SUMMARY` record (key-value store) with per-product counts and the outcome.

**Can I scrape G2 categories with hundreds of products?**
Yes. Set `maxProductsPerCategory` to 0 for the whole category. With reviews on, also set `maxReviewsPerProduct` and `maxItems` to keep the run size under control.

**Is it legal to scrape G2?**
The Actor only collects information that G2 publishes openly to every visitor. Reviews contain names in "First L." form and job titles, which can be personal data — process them lawfully (e.g. under GDPR legitimate interest), do not re-publish them as your own content, and respect G2's terms. When in doubt, ask your lawyer.

### Use it from code

**JavaScript (apify-client)**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/g2-reviews-scraper').call({
    productUrls: ['https://www.g2.com/products/slack/reviews'],
    maxReviewsPerProduct: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const reviews = items.filter((r) => r.type === 'review');
console.log(reviews.length, reviews[0].likeBest);
```

**Python (apify-client)**

```python
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("logiover/g2-reviews-scraper").call(run_input={
    "categoryUrls": ["https://www.g2.com/categories/crm"],
    "includeReviews": False,
    "maxProductsPerCategory": 100,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["categoryRank"], row["productName"], row["rating"], row["reviewCount"])
```

**HTTP**

```bash
curl -X POST "https://api.apify.com/v2/acts/logiover~g2-reviews-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"productUrls":["clickup"],"maxReviewsPerProduct":50}'
```

### Related Actors

- [Trustpilot Reviews Scraper](https://apify.com/logiover/trustpilot-reviews-scraper) — consumer reviews of the same companies.
- [App Reviews Scraper](https://apify.com/logiover/app-reviews-scraper) — App Store and Google Play reviews of software products.
- [Company Firmographics Scraper](https://apify.com/logiover/company-firmographics-scraper) — revenue, headcount and competitors of the vendors you find on G2.
- [Clutch.co Scraper](https://apify.com/logiover/clutch-co-scraper) — B2B service providers and agency reviews.
- [GoodFirms Scraper](https://apify.com/logiover/goodfirms-scraper) — software and IT company directory with ratings.

### Legal & trademark

This Actor is an independent tool. It is not affiliated with, endorsed by or sponsored by G2.com, Inc. or any of its subsidiaries; "G2" and the G2 logo are trademarks of their owner. The Actor reads publicly available pages only, does not log in, does not bypass paywalls and does not collect anything G2 hides from visitors. You are responsible for using the data in line with G2's terms of use and applicable law, including GDPR/CCPA where reviewer names or job titles are personal data.

### Changelog

#### 2026-10-10

- First release: product reviews (with view-splitting past G2's ten-per-view limit), product details, category rankings, star/company-size/keyword filters, five sort orders, NOT_FOUND handling and a per-run `SUMMARY`.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/g2-reviews-scraper/changelog.md

# Actor input Schema

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

Products to scrape, e.g. https://www.g2.com/products/slack/reviews, https://www.g2.com/products/hubspot-sales-hub/reviews or just the slug (slack). Each product returns one product row plus its reviews.

## `categoryUrls` (type: `array`):

Categories to list, e.g. https://www.g2.com/categories/crm or crm. Products are taken in G2's ranking order (up to 'Max products per category'). With 'Include reviews' on, each product's reviews are collected too.

## `includeReviews` (type: `boolean`):

Collect reviews for every product (from your product URLs and from the categories). Turn off to get product rows only — much faster for category rankings.

## `includeProductDetails` (type: `boolean`):

Add one row per product: rating, review count, 5→1 star breakdown, pros/cons themes with mention counts, pricing plans, vendor, categories, languages, alternatives, reviewer company-size/role/industry/region breakdown.

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

How many unique reviews to collect per product. 0 = as many as G2 shows visitors (thousands for large products; see the README for how deep it goes).

## `maxProductsPerCategory` (type: `integer`):

How many products to take from each category, in G2's ranking order (15 per category page). 0 = the whole category.

## `reviewSort` (type: `string`):

Which reviews G2 shows first in each view. 'Most recent' is best for monitoring; 'Lowest rated' surfaces complaints first.

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

Only reviews with these star ratings. Leave empty for all ratings.

## `companySizes` (type: `array`):

Only reviews written by people at companies of this size. Leave empty for all sizes.

## `reviewKeyword` (type: `string`):

Only reviews that mention this word or phrase — G2's own review search, e.g. pricing, onboarding, customer support, Salesforce integration.

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

Stop after this many rows (reviews + products together). 0 = no limit. You pay per row, so this is also your cost ceiling.

## `concurrency` (type: `integer`):

How many G2 pages are loaded at the same time (max 50). Each page takes 25–70 s to come through the unblocking proxy, so the Actor keeps many in flight; 48 was the fastest stable setting in tests. Lower it only if you want a slower, gentler run.

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

Keep the UNBLOCKER group. G2 is protected by DataDome and answers ordinary datacenter and residential proxies with a captcha page. The Actor selects UNBLOCKER automatically unless you provide your own proxy URLs.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.g2.com/products/slack/reviews"
  ],
  "includeReviews": true,
  "includeProductDetails": true,
  "maxReviewsPerProduct": 40,
  "maxProductsPerCategory": 30,
  "reviewSort": "most_recent",
  "starRatings": [],
  "companySizes": [],
  "maxItems": 60,
  "concurrency": 48,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

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

All review or product rows collected in this run.

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

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

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

```

## MCP server setup

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