# G2 Software Reviews, Product Info & Competitor Extractor (`dataspryva/g2-software-reviews-product-info-and-competitor`) Actor

Collects G2 software product reviews with ratings and pros/cons, product profile summaries, or competitor listings from any G2 product page.

- **URL**: https://apify.com/dataspryva/g2-software-reviews-product-info-and-competitor.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Software Reviews, Product Info & Competitor Extractor

Scrape **G2** — the B2B software marketplace with millions of verified user reviews — for any product. Pull reviews with ratings, pros, cons and reviewer context; collect a product's profile summary (rating, review count, categories, pricing plans); or list the competitors G2 shows for a product. Works from a G2 product URL or just a slug, no account or setup required.

### What this actor does

- **Three modes:** collect reviews, product info, or competitor lists for any G2 product.
- **Review filters:** star rating, reviewer company size, reviewer role, reviewer region, and publication date range.
- **Deep review coverage:** goes beyond the handful of reviews G2 shows by default — request hundreds or thousands per product.
- **Any input shape:** full G2 URLs or bare slugs (`notion`, `slack`, `hubspot-marketing-hub`), mixed freely in one run.
- Empty fields are omitted — every record only contains values G2 actually provides.

### Output per review (mode = `reviews`)

- `reviewId` — unique G2 review ID
- `reviewTitle` — headline of the review
- `reviewUrl` — direct link to the review on G2
- `rating` — the reviewer's star value on G2's 0–5 scale (halves included)
- `starRating` — the review's star bucket, 1–5
- `authorName` — reviewer display name (as published by G2)
- `authorRole` — reviewer's stated role, e.g. Administrator
- `companySize` — reviewer's company size segment
- `publishDate` — publication date from G2
- `pros`, `cons`, `useCase` — the reviewer's "like best", "dislike" and "problems solved" answers
- `productName`, `productSlug`, `productUrl` — product identity
- `recordType: "review"`, `scrapedAt`

### Output per product (mode = `productInfo`)

- `productName`, `productSlug`, `url`
- `description` — the product summary from its G2 page
- `rating` — average rating, `reviewCount` — total reviews
- `category` and `categories[]` — G2 category listings
- `imageUrl` — product logo
- `pricing` — array of `{plan, price, currency}` plans G2 publishes
- `operatingSystem`
- `vendorName`, `vendorUrl` — the vendor (seller) shown on the product page
- `recordType: "product"`, `scrapedAt`

### Output per competitor (mode = `competitors`)

- `competitorName`, `competitorSlug`, `competitorUrl`
- `rating`, `reviewCount` — the competitor's standing on G2
- `description` — G2's blurb for the competitor
- `sourceProduct` — slug of the product whose competitor list this came from
- `recordType: "competitor"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `reviews` | `reviews`, `productInfo`, or `competitors` |
| `startUrls` | array | – | G2 product URLs or bare slugs (`notion`, `slack`), one per product. Required. |
| `maxItems` | integer | 50 | Maximum records per product (1–50,000) |
| `starRatings` | array | – | Keep reviews with these star ratings (`1`–`5`). (mode=reviews) |
| `companySizes` | array | – | Keep reviews from these company sizes: `smallBusiness`, `midMarket`, `enterprise`. (mode=reviews) |
| `reviewerRoles` | array | – | Keep reviews by these reviewer roles, e.g. `administrator`. (mode=reviews) |
| `reviewerRegions` | array | – | Keep reviews from these regions, e.g. `northAmerica`. (mode=reviews) |
| `sortBy` | string | `newest` | `newest`, `oldest`, `highestRated`, `lowestRated` |
| `fromDate` | string | – | Only reviews published on or after this date (YYYY-MM-DD) |
| `toDate` | string | – | Only reviews published on or before this date (YYYY-MM-DD) |

#### Example: recent 5-star reviews

```json
{
  "mode": "reviews",
  "startUrls": ["https://www.g2.com/products/notion/reviews"],
  "maxItems": 100,
  "starRatings": [5],
  "sortBy": "newest"
}
```

#### Example: deep pull for competitive research

```json
{
  "mode": "reviews",
  "startUrls": ["slack", "microsoft-teams"],
  "maxItems": 1000,
  "companySizes": ["enterprise", "midMarket"],
  "sortBy": "highestRated"
}
```

#### Example: product profile

```json
{
  "mode": "productInfo",
  "startUrls": ["https://www.g2.com/products/hubspot-marketing-hub"]
}
```

#### Example: competitor lists for several products

```json
{
  "mode": "competitors",
  "startUrls": ["notion", "asana", "monday-com"],
  "maxItems": 20
}
```

### Use cases

- **Voice-of-customer research** — export raw pros/cons and use cases to feed qualitative analysis.
- **Competitive battlecards** — pull a product's listed alternatives with their ratings and review counts.
- **Review monitoring** — schedule runs with `fromDate` to collect only new reviews since the last run.
- **Vendor shortlisting** — compare profiles and pricing plans side by side before deeper evaluation.
- **Sentiment slices** — study how enterprise reviewers rate a product versus small-business reviewers.
- **LLM / RAG pipelines** — structured review text with metadata, ready for indexing.

### FAQ

#### Do I need a G2 account or API key?

No. The actor reads pages and feeds G2 already makes public.

#### Can I get more than the reviews G2 shows on a product page?

Yes. For `mode=reviews` the actor combines G2's own filter views (stars, company size, role, region) while de-duplicating results, so common products yield hundreds to thousands of distinct reviews per run. `maxItems` caps the output.

#### Why are some `companySize` or `authorRole` values missing?

G2 makes reviewer details optional when someone submits a review. Across a 400-review sample, company size is published for about 80% of reviews, and roughly one in four roles is G2's anonymised "G2 User" placeholder rather than a real job role. Missing values are omitted rather than guessed.

#### What does `rating` mean next to `starRating`?

`rating` is the exact value G2 publishes on its 0–5 scale (including halves like 4.5). `starRating` is the star bucket (1–5) the review belongs to — useful for grouping. A few reviews legitimately carry a 0.0 rating; that is G2's lowest value, not missing data.

#### Does each review include sub-ratings (ease of use, support) or "switched from" data?

No — G2 does not publish per-review sub-ratings, themes, or switching data on any public page; those appear only for signed-in users or through G2's enterprise API. This actor returns the complete public surface: rating, title, pros/cons/problems, reviewer context and dates.

#### Can I filter by date range?

Yes — set `fromDate` and/or `toDate` and only matching reviews are returned. Both are inclusive.

#### How fresh is the data?

Every run reads G2 live; nothing is cached between runs.

#### Do I need to set up a proxy?

No. The actor chooses a working connection to G2 automatically. Just fill in the input and run.

#### Is this affiliated with G2?

No. This actor reads publicly available G2 pages and feeds; it is not operated by or affiliated with G2.com.

# Actor input Schema

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

What to collect from G2.

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

G2 product URLs (e.g. https://www.g2.com/products/notion/reviews) or bare product slugs (e.g. notion). One entry per product.

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

Upper limit of records to collect for each product. (mode=reviews uses filtering to go far beyond G2's default review feed.)

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

Keep reviews with one of the selected star ratings. Leave empty for all ratings. (mode=reviews)

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

Keep reviews from companies of the selected sizes. Leave empty for all sizes. (mode=reviews)

## `reviewerRoles` (type: `array`):

Keep reviews written by reviewers with one of the selected roles. Leave empty for all roles. (mode=reviews)

## `reviewerRegions` (type: `array`):

Keep reviews from reviewers in the selected regions. Leave empty for all regions. (mode=reviews)

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

Order of the collected reviews. (mode=reviews)

## `fromDate` (type: `string`):

Only keep reviews published on or after this date. (mode=reviews)

## `toDate` (type: `string`):

Only keep reviews published on or before this date. (mode=reviews)

## Actor input object example

```json
{
  "mode": "reviews",
  "startUrls": [
    "https://www.g2.com/products/notion/reviews"
  ],
  "maxItems": 3,
  "starRatings": [],
  "companySizes": [],
  "reviewerRoles": [],
  "reviewerRegions": [],
  "sortBy": "newest"
}
```

# Actor output Schema

## `items` (type: `string`):

Dataset containing all scraped G2 reviews, product records, or competitor records.

# 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 = {
    "mode": "reviews",
    "startUrls": [
        "https://www.g2.com/products/notion/reviews"
    ],
    "maxItems": 3,
    "starRatings": [],
    "companySizes": [],
    "reviewerRoles": [],
    "reviewerRegions": [],
    "sortBy": "newest"
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/g2-software-reviews-product-info-and-competitor").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 = {
    "mode": "reviews",
    "startUrls": ["https://www.g2.com/products/notion/reviews"],
    "maxItems": 3,
    "starRatings": [],
    "companySizes": [],
    "reviewerRoles": [],
    "reviewerRegions": [],
    "sortBy": "newest",
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/g2-software-reviews-product-info-and-competitor").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 '{
  "mode": "reviews",
  "startUrls": [
    "https://www.g2.com/products/notion/reviews"
  ],
  "maxItems": 3,
  "starRatings": [],
  "companySizes": [],
  "reviewerRoles": [],
  "reviewerRegions": [],
  "sortBy": "newest"
}' |
apify call dataspryva/g2-software-reviews-product-info-and-competitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/g2-software-reviews-product-info-and-competitor"
        }
    }
}
```

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/AYL1CXwlY4oaFSyJ4/builds/SEfo3afTwaeYxU5xK/openapi.json
