# G2 Scraper (Cheap) (`data_api/g2-scraper-cheap`) Actor

Extract software listings from G2.com category pages, including ratings, reviews, pricing, pros and cons highlights, market segment breakdowns, and direct product URLs.

- **URL**: https://apify.com/data\_api/g2-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Developer tools, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## G2 Software Scraper

![G2 Software Scraper](cover.jpg)

Comparing software on G2 one tab at a time gets old fast. The ratings, prices, pros and cons, and market-segment splits you actually want to line up are scattered across dozens of cards, and there is no download button. This scraper hands you the whole category as a clean table. Point it at any G2 category page and it walks every product, pulling the name, vendor, star rating, review count, starting price, the points reviewers love and hate, and who uses it — then gives you back rows you can sort, filter, and export.

### What you get

Each software product becomes one row with a steady set of columns. When a value is missing it comes back as `null` rather than disappearing, so your sheet or database stays rectangular. The fields fall into a few groups:

- **Identity** — `softwareName`, `softwareSlug`, `listingId`, `listingUuid`, `listingUrl`, `logoImage`, `vendorName`, `vendorUrl`
- **Ratings and pricing** — `starRating`, `reviewsTotal`, `startingPrice`
- **Reviewer signal** — `likedPoints`, `dislikedPoints`, `sentimentSummary`, `softwareSummary`
- **Audience** — `commonRoles`, `topIndustries`, `segmentBreakdown`
- **Context** — `categoryName`, `categoryNumber`, `pageIndex`, `sourceLink`, `partnersUrl`, `collectedAt`, `errorMessage`

### Quick start

1. Click **Try for free** and open the input form.
2. Paste one or more G2 category page URLs into **Category page URLs**.
3. Set a **Results limit** to control how many listings you collect.
4. Press **Start**, then export the results as JSON, CSV, Excel, or XML when the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Competitive research** — pull a whole category and compare ratings, pricing, and reviewer sentiment side by side
- **Market mapping** — see which vendors lead a category and how their review volume stacks up
- **Sales prospecting** — find the tools a target segment actually uses, then sort by company size
- **Product positioning** — read the `dislikedPoints` across rivals to spot gaps your product can fill
- **Analyst tracking** — schedule weekly runs and watch ratings and review counts move over time
- **Investment due diligence** — gauge how a software vendor is received before you write a check

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `categoryUrls` | array of strings | Yes | One or more G2 category page URLs to crawl. Each is paginated automatically. |
| `resultsLimit` | integer | No | Total listings to collect across all URLs. A category page holds 15, so 150 covers ten pages. Default `50`; ceiling `50000`. |
| `timeoutSeconds` | integer | No | Seconds to wait on a single request before dropping it. Default `45`; range 5 to 120. |

#### Example input

```json
{
    "categoryUrls": [
        "https://www.g2.com/categories/project-management",
        "https://www.g2.com/categories/help-desk"
    ],
    "resultsLimit": 50,
    "timeoutSeconds": 45
}
```

### Output

Every software listing becomes one row, and each field is always present — values that G2 does not show come back as `null` so the dataset stays clean.

#### Example output

```json
{
    "listingId": 506,
    "listingUuid": "16e299ae-0256-44e3-8989-7647815550d4",
    "softwareName": "Agentforce Sales (formerly Salesforce Sales Cloud)",
    "softwareSlug": "agentforce-sales-formerly-salesforce-sales-cloud",
    "listingUrl": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/reviews",
    "logoImage": "https://images.g2crowd.com/uploads/product/hd_favicon/826ce87155a61f72d3dfd92c5283eed8/agentforce.svg",
    "vendorName": "Salesforce",
    "vendorUrl": "https://www.g2.com/sellers/salesforce",
    "starRating": 4.4,
    "reviewsTotal": 25619,
    "startingPrice": "$25.00",
    "softwareSummary": "Accelerate revenue from pipeline to paycheck with Salesforce Sales Cloud...",
    "likedPoints": ["Ease of Use", "Features", "Lead Management", "Customization"],
    "dislikedPoints": ["Learning Curve", "Pricing", "Complexity"],
    "sentimentSummary": "Reviewers appreciate Agentforce Sales for its powerful automation and customizable dashboards. Users reported that it can be complex to set up and has a steep learning curve.",
    "partnersUrl": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/imp",
    "commonRoles": "Account Executive, Account Manager, Sales Manager",
    "topIndustries": "Computer Software, Information Technology and Services",
    "segmentBreakdown": "46% Mid-Market, 34% Enterprise",
    "categoryName": "CRM",
    "categoryNumber": 179,
    "pageIndex": 1,
    "sourceLink": "https://www.g2.com/categories/crm",
    "collectedAt": "2026-04-19T10:00:00.000000+00:00",
    "errorMessage": null
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | integer | Numeric identifier G2 assigns to the product |
| `listingUuid` | string | The product's universally unique identifier on G2 |
| `softwareName` | string | Display name of the software product |
| `softwareSlug` | string | Slug used in the product's G2 web address |
| `listingUrl` | string | Direct link to the product's review page |
| `logoImage` | string | Link to the product's logo graphic |
| `vendorName` | string | Company or vendor behind the software |
| `vendorUrl` | string | Link to the vendor's page on G2 |
| `starRating` | number | Mean review score on a five-point scale |
| `reviewsTotal` | integer | How many user reviews the product has collected |
| `startingPrice` | string | Entry-level price text from the card |
| `softwareSummary` | string | Product description copy from the listing |
| `likedPoints` | array of strings | Aspects reviewers most often praise |
| `dislikedPoints` | array of strings | Aspects reviewers most often criticize |
| `sentimentSummary` | string | G2's recap of recurring reviewer themes |
| `partnersUrl` | string | Link to the product's implementation partners page |
| `commonRoles` | string | Job titles that most often use the product |
| `topIndustries` | string | Industries with the heaviest adoption |
| `segmentBreakdown` | string | Reviewer share by company size |
| `categoryName` | string | Name of the G2 category the listing came from |
| `categoryNumber` | integer | Numeric identifier of the G2 category |
| `pageIndex` | integer | Category page the listing was found on |
| `sourceLink` | string | The category URL that was crawled |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |
| `errorMessage` | string | Reason a row failed; `null` on success |

### Tips for best results

- **Run a small batch first.** Set `resultsLimit` to 15 to pull one page and confirm the category URL works before you scale up.
- **Know the math.** A G2 category page shows 15 products, so `resultsLimit: 150` collects ten pages. The actor reads the total page count and paginates on its own.
- **Expect some blanks in segment data.** `segmentBreakdown` only appears once enough reviewers from each company size weigh in, so newer products may return `null` there.
- **Treat liked and disliked points as themes.** They are G2's own aggregation of reviewer language, better for bulk comparison across a category than for reading individual opinions.
- **Raise `timeoutSeconds`** toward 60 if you see requests dropping on slower runs.

### How can I use G2 software data?

**How can I use the G2 Software Scraper to compare tools in a category?**
Paste the category page URL and the scraper returns every product with its star rating, review count, starting price, and the points reviewers liked and disliked. Sort by `starRating` or `reviewsTotal` to rank the field, or scan `dislikedPoints` to see where each option falls short — a full G2 software comparison without opening 30 tabs.

**How can I export G2 product listings to a spreadsheet?**
Run the actor on one or more category URLs, then export the dataset as CSV or Excel, or push it straight to Google Sheets through the Apify integration. Each software listing lands as its own row with consistent columns, so the data is ready for pivot tables, filters, and charts the moment it arrives.

**How can I track G2 ratings and reviews over time?**
Schedule the scraper to run on a category every week. Because each row carries `starRating`, `reviewsTotal`, and `collectedAt`, stacking the runs builds a time series you can use to watch a competitor's score climb or a newcomer rack up reviews before it shows up anywhere else.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `urls` (type: `array`):

One or more G2.com category page URLs to scrape. Use the category page URL, e.g. https://www.g2.com/categories/crm or https://www.g2.com/categories/marketing-automation

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

Maximum number of software listings to collect in total across all URLs. Each G2.com category page shows 15 listings, so 15 = 1 page, 150 = 10 pages. Maximum supported value is 50000.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## `enrichFromProductPage` (type: `boolean`):

Fetch each product's individual page to fill in entryLevelPrice, productDescription, full prosHighlights/consHighlights, and consultingServicesUrl. Doubles the number of HTTP requests but provides complete data. Disable to scrape faster with listing-page data only.

## Actor input object example

```json
{
  "urls": [
    "https://www.g2.com/categories/email-marketing"
  ],
  "maxItems": 25,
  "requestTimeoutSecs": 30,
  "enrichFromProductPage": false
}
```

# 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 = {
    "urls": [
        "https://www.g2.com/categories/crm"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/g2-scraper-cheap").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 = { "urls": ["https://www.g2.com/categories/crm"] }

# Run the Actor and wait for it to finish
run = client.actor("data_api/g2-scraper-cheap").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 '{
  "urls": [
    "https://www.g2.com/categories/crm"
  ]
}' |
apify call data_api/g2-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_api/g2-scraper-cheap"
        }
    }
}

```

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/T1aYEVZXW65HFf5ud/builds/SUtYsfMBofeCmJ3RX/openapi.json
