# G2 Scraper — Reviews by Product Name · AI Insights + Emails (`memo23/g2-scraper`) Actor

Scrape G2.com software reviews — search by product name (Slack, HubSpot) or by category, no G2 URL needed. Get ratings, pros and cons, verified-reviewer details, star and date filters, deterministic review insights, opt-in AI pain-point analysis and contact-email enrichment. $1.50 per 1,000 reviews.

- **URL**: https://apify.com/memo23/g2-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 451 total users, 112 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 4.33 out of 5 stars

## Pricing

from $1.50 / 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?

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.com Software Scraper

### How it works

<p align="center"><img src="https://api.apify.com/v2/key-value-stores/kfhOjcH2i0WGbrGGn/records/how-it-works-g2.png" width="900" alt="How the G2 scraper works"></p>

**Unlock the Full Power of G2.com Data** — The only scraper you need to track, analyze, and understand the software landscape on G2.com with enterprise-grade reliability and precision. Whether you're benchmarking competitors, building a vendor shortlist, or monitoring user sentiment, our scraper turns G2's catalog into a structured dataset you can act on.

*"From product listings to verified user reviews, we turn G2.com's data into your competitive advantage."*

### 🧠 NEW: AI Pain-Point Analysis — reviews → product intel

Flip on **`painPointAnalysis`** and the scraper doesn't just return reviews — it tells you **what to fix and build next**. After scraping, one AI pass per product clusters every complaint into ranked themes and surfaces the features users keep asking for:

> *Postman, real run →* **Performance degradation & increasing bloat** (severity 4, 30% of reviews) · **Steep learning curve for advanced features** (30%) · **UI/UX complexity & feature bloat** (20%) · missing: *lightweight mode, performance optimization*.

One `painPointAnalysis` row per product, straight from real G2 reviews — no prompts, no second tool. Paid plans only, billed per product analyzed.

### 📊 Review Insights — instant digest per product (no AI)

Prefer a deterministic summary without AI? Flip on **`reviewInsights`** and every product gets one extra `review_insights` row: rating breakdown and sentiment split, the recurring complaint themes (bugs, pricing, support, missing features, onboarding, integrations…), top negative-review terms, and feature-request snippets. Instant, no AI credits or keys required — billed per product analyzed.

### 📧 Contact Emails + payment qualification

Turn on **`enrichEmails`** and each result is enriched with a contact email discovered from the vendor's own website — added as `contactEmail` + `contactWebsite` columns plus a detailed `emailEnrichment` object. You're only billed per email actually found, never for misses. Perfect for turning G2 research into an outreach list in one run.

Stack **`qualifyByPayment`** on top (requires `enrichEmails`) and the scraper also flags which vendors take money online — `takesPayments`, `paymentProcessors` (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more), and `stripeLiveKey` — at no extra cost, reusing the pages already fetched for email discovery.

### 🔄 Switching from another G2 scraper?

Most G2 actors on Apify only do one thing: pull reviews for a product URL you already have. If that's where you're coming from, here's what changes when you switch:

| What you're used to | What this scraper does |
|---|---|
| Paste a product URL, get reviews | Type a product **name** (`"Slack"`, `"HubSpot"`) — the scraper finds the product itself. URLs and slugs work too. |
| Reviews only | **Nine G2 page types**: reviews, search, categories, competitor lists, product details, vendor profiles, pricing tabs, compare pages, single reviews — mix them in one run |
| Filter by star rating | Same here (`starFilterValue` + condition), plus sort order and a `lookbackDays` window for recent-only pulls |
| Re-scrape everything to catch new reviews | **`onlyNewReviews`** — incremental monitoring that returns only what's new since your last run |
| Raw reviews, analysis is your problem | Optional **`reviewInsights`** digest per product, or full **AI pain-point analysis** that clusters complaints into ranked themes |
| Reviews stop at G2 | **`enrichEmails`** adds a vendor contact email from their own website; `qualifyByPayment` flags who takes money online |
| Runs die when G2 blocks | Browser-warmed Datadome session pool + three TLS-impersonating clients raced in parallel — the anti-bot layer is the product |

Your existing "product URL in, reviews out" workflow runs here unchanged — drop the URL into `startUrls` and go. Everything above is opt-in on top.

### Overview

The G2.com Software Scraper is your one-stop tool for extracting product, vendor, and review data from [G2.com](https://www.g2.com/). Ideal for product managers, market analysts, sales teams, and researchers, it captures product metadata, ratings, review counts, vendor profiles, pricing indicators, category memberships, and full user reviews across thousands of software products. With easy setup and multiple export formats (JSON, CSV), it's perfect for anyone needing comprehensive G2 data at scale.

### What does the G2 Software Scraper do?

The scraper supports five different G2 URL patterns out of the box and emits row-types you can split on:

#### Comprehensive Data Collection

- **Search Results** — extract product cards from G2 keyword searches
  - Product name, vendor, rating, review count, categories, sponsorship status, thumbnail
- **Product Reviews** — paginate through a product's full review feed
  - Reviewer profile, rating, publish date, written content, structured Q\&A pairs
- **Category Listings** — paginate through `/categories/{slug}` rankings
  - Same product card data as search PLUS position rank, entry-level price, list type
- **Competitor Lists** — extract a product's "Top 10 Alternatives & Competitors" page
  - Ranked alternatives with name, vendor, rating, review count, description, pricing
- **Product Detail Pages** — extract a single product's full profile
  - Full marketing description, aggregate rating, pricing tiers, vendor info, screenshot URLs, features text

#### Advanced Scraping Capabilities

- **Search Scraping**: Process G2 keyword searches and extract all matching products with full pagination
- **Reviews Scraping**: Hit a product's review URL → get every review with author + Q\&A structure
- **Category Scraping**: Walk an entire G2 category (or subcategory) and extract its ranked product list
- **Competitor Scraping**: Hit `/products/{slug}/competitors` → get G2's curated Top 10 alternatives
- **Product Detail Scraping**: Hit `/products/{slug}` → one row per product with full description, pricing tiers, images, and aggregate rating
- **Smart Anti-Bot Handling**: Three TLS-impersonating clients race in parallel (impers, impit, got-scraping). Browser-quality session pool keeps Datadome/Cloudflare cookies fresh.
- **Smart Pagination**: Follows G2's "Next" links automatically and stops cleanly on the last page
- **Humanlike Pacing**: 8-15s jittered delays between page fetches to stay under rate limits

#### Flexible Scraping Options

- **Search URLs**: `https://www.g2.com/search?query=crm`
- **Product Reviews URLs**: `https://www.g2.com/products/postman/reviews`
- **Category URLs**: `https://www.g2.com/categories/crm` (also subcategories like `/categories/crm/sales-acceleration`)
- **Competitors URLs**: `https://www.g2.com/products/postman/competitors` (also accepts `/competitors/alternatives`)
- **Product Detail URLs**: `https://www.g2.com/products/postman` (the bare product page — one row of rich metadata per product)

This tool is ideal for:

- Competitive intelligence and vendor shortlisting
- Market research across entire G2 categories
- Customer-voice analysis from verified reviews
- Lead generation by category or search keyword
- Sentiment monitoring over time on specific products

### Features

- **Five URL Types Supported**: Search, individual product reviews, category listings, competitor lists, and product detail pages — each with its own optimized parser
- **Full Anti-Bot Resilience**:
  - Browser-warmed session pool with rotating Datadome cookies
  - Three independent TLS-impersonating HTTP clients raced in parallel
  - Automatic session rotation, per-session usage tracking
  - Falls back to legacy DataDome-cookie service if pool is empty
- **Comprehensive Data Extraction**: Detailed product metadata, ratings, full reviews, vendor profiles, category memberships, pricing
- **Flexible Input**: Mix all three URL types in a single run
- **Automatic Pagination**: Walks multi-page results until your `maxItems` cap or the last page
- **Structured Output**: One row per product or per review, discriminated by a `type` field for easy downstream filtering
- **Reliable Performance**: Built-in retry mechanisms, exponential back-off, residential proxy support

### Supported URL Types

The G2.com Software Scraper handles nine URL patterns. Mix them freely in a single `startUrls` array.

#### 1. Search Result URLs

Extract products matching a keyword query, with automatic pagination.

- Example: `https://www.g2.com/search?query=databricks`
- Example: `https://www.g2.com/search?query=crm+software`
- Output row shape: `itemType: "Software"` (no `type` field — historical schema)

#### 2. Product Reviews URLs

Extract every review for a specific product. Walks G2's reviews\_and\_filters Turbo Frame endpoint with pagination. Emits one `type: "review_summary"` row up front (AI summary + top Pros/Cons with mention counts) followed by `type: "review"` rows for each individual review.

- Example: `https://www.g2.com/products/postman/reviews`
- Example: `https://www.g2.com/products/azure-databricks/reviews`
- **Alias-redirect resolution**: input slug may be a G2 alias (e.g. `/products/salesforce/reviews` resolves to `/products/salesforce-customer-success/reviews`); the scraper transparently follows.
- **Filter passthrough**: append G2's own filter query params and they're forwarded verbatim. Examples:
  - `https://www.g2.com/products/postman/reviews?filters[ratings]=5` — lead with 5-star
  - `https://www.g2.com/products/postman/reviews?filters[company_size][]=Enterprise&order=most_recent`
  - Whitelisted families: `filters[*]`, `order`, `state`, `lang_iso`, `time`, `tag_ids[]`, `media_type`
- Output row shapes: `type: "review_summary"` (one per URL, skipped when filters are used) + `type: "review"` (one per review)

#### 3. Category Listing URLs

Walk an entire G2 category page (and any subcategory under it), ranked by G2 score. Each product row now carries a `situationalAwards` array — G2 Grid®-style quadrant winners ("Leader", "Highest Performer", "Easiest to Use", "Top Trending", "Best Free Software") for that category, pulled from the page's analytics markup.

- Example: `https://www.g2.com/categories/crm`
- Example: `https://www.g2.com/categories/crm/sales-acceleration`
- Output row shape: `type: "category_product"` (with `situationalAwards: [...]`)

#### 4. Competitor Lists URLs

Pull G2's curated "Top N Alternatives & Competitors" for a specific product. Fixed-size list (no pagination).

- Example: `https://www.g2.com/products/postman/competitors`
- Example: `https://www.g2.com/products/salesforce-sales-cloud/competitors/alternatives` (canonical form — both are accepted and normalized)
- Output row shape: `type: "competitor"`

#### 5. Product Detail URLs

Extract the full profile for a single product — one row per product. Includes the full marketing description (not just a snippet), all pricing tiers, screenshot URLs, vendor profile, and aggregate rating.

- Example: `https://www.g2.com/products/postman`
- Example: `https://www.g2.com/products/salesforce-sales-cloud`
- Output row shape: `type: "product"`

#### 6. Vendor / Seller Profile URLs

Extract a vendor's company profile and their entire product portfolio (rating + review count per product). One row per vendor, with an embedded `products` array — including the company's own **website URL** and **LinkedIn page** as rendered on the seller profile.

- Example: `https://www.g2.com/sellers/salesforce`
- Example: `https://www.g2.com/sellers/postman`
- Output row shape: `type: "vendor"`

#### 7. Pricing Tab URLs

Extract a product's structured pricing — per-tier prices (with currency), the G2-curated "Key Insights" summary paragraph, and the pricing FAQs (Q\&A pairs).

- Example: `https://www.g2.com/products/postman/pricing`
- Example: `https://www.g2.com/products/slack/pricing`
- Output row shape: `type: "pricing"`

#### 8. Compare URLs

Head-to-head product comparison: pulls each product's metadata (name, vendor, aggregate rating, review count) plus the full per-criterion ratings table (Meets Requirements, Ease of Use, Ease of Setup, Ease of Admin, Quality of Support, etc.) with score + sample size for each side, and the list of alternatives G2 surfaces.

- Example: `https://www.g2.com/compare/postman-vs-mulesoft-anypoint-platform`
- Multi-way comparisons are also supported: `https://www.g2.com/compare/a-vs-b-vs-c`
- Output row shape: `type: "compare"`

#### 9. Single Review URLs

Fetch one specific review as a single `type: "review"` row — same shape as the bulk review rows, parsed from the page's schema.org microdata.

- Example: `https://www.g2.com/products/postman/reviews/postman-review-9104210`
- Output row shape: `type: "review"` (one row)

#### Input shortcuts

- **Bare product slugs**: skip URL building entirely — set `"productSlugs": ["postman", "hubspot-marketing-hub"]` (or paste a bare slug as a start URL) and each maps to that product's reviews page.
- **Regional domains**: `fr.g2.com`, `de.g2.com`, and any other regional G2 host are normalized to `www.g2.com` automatically.

Paste any G2 URL — product, reviews, category, compare, vendor or search. The actor fetches it over plain HTTP (a managed unblocker clears Cloudflare + DataDome — no headless browser, no third-party CAPTCHA service), parses the page into typed rows (reviews, products, vendors, pricing, competitors, categories), and streams clean records to the dataset in JSON, CSV or Excel.

### Quick Start

1. **Sign up for Apify**: Create your free account at [apify.com](https://apify.com)
2. **Find the Scraper**: Search for "G2.com Software Scraper" in the Apify Store
3. **Configure Input**: Provide one or more G2 URLs (any of the nine supported types — search, reviews, single review, categories, competitors, product detail, vendor profile, pricing tab, or head-to-head compare)
4. **Run the Scraper**: Execute the scraper on the Apify platform
5. **Download Data**: Export results in JSON, CSV, or Excel

### Input Configuration

Here's an example mixing the URL types in one run:

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/search?query=databricks" },
        { "url": "https://www.g2.com/products/postman/reviews" },
        { "url": "https://www.g2.com/categories/crm" },
        { "url": "https://www.g2.com/products/postman/competitors" },
        { "url": "https://www.g2.com/products/postman" },
        { "url": "https://www.g2.com/sellers/salesforce" },
        { "url": "https://www.g2.com/products/postman/pricing" },
        { "url": "https://www.g2.com/compare/postman-vs-mulesoft-anypoint-platform" }
    ],
    "productSlugs": ["hubspot-marketing-hub"],
    "sortOrder": "most_recent",
    "starFilterCondition": "minimum",
    "starFilterValue": 4,
    "lookbackDays": 90,
    "maxItems": 1000,
    "maxReviews": 200,
    "maxConcurrency": 1,
    "minConcurrency": 1,
    "maxRequestRetries": 5,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    },
    "slowMode": true
}
```

#### Input Fields Explanation

- **`startUrls`** (array, required): G2 URLs to scrape. Each entry is an object with a `url` field. You can mix search, reviews, and category URLs freely. Bare slugs and regional (`fr.g2.com`, …) URLs are accepted and normalized.
- **`productSlugs`** (array of strings, optional): shortcut — bare G2 product slugs (e.g. `"postman"`), each expands to that product's reviews URL. Used in addition to `startUrls`.
- **`sortOrder`** (string, optional): review ordering — `g2_default` | `most_recent` | `most_helpful` | `highest_rated` | `lowest_rated`. Combine with a low `maxReviews` to grab e.g. "the 50 most recent reviews". A `?order=` param pasted in a URL wins for that URL.
- **`starFilterCondition`** + **`starFilterValue`** (optional): star filter for review rows. `exactly` / `minimum` / `maximum` + a 1–5 value, e.g. minimum + 4 → only 4★ and 5★ reviews. (G2's star buckets include half-stars: the 4★ bucket spans 3.5–4.0.)
- **`lookbackDays`** (integer, optional): only reviews published in the last N days. Forces most-recent ordering and stops paginating at the cutoff — you pay only for pages inside the window.
- **`maxItems`** (integer, optional): Hard cap on total rows emitted across all `startUrls`. Default `100`. Applies to product rows from search + category URLs, and (separately, when `maxReviews` is not set) to review rows.
- **`maxReviews`** (integer, optional): Cap on review rows per product URL. Default falls back to `maxItems` if unset. Only applies to `/products/.../reviews` URLs.
- **`maxConcurrency`** (integer, optional): Maximum concurrent page fetches. Default `1`. **Keep low** (1-3) for G2 because DataDome rate-limits aggressively per cookie.
- **`minConcurrency`** (integer, optional): Minimum concurrent page fetches. Default `1`.
- **`maxRequestRetries`** (integer, optional): Number of retries for failed requests. Default `5`.
- **`proxy`** (object, optional): Proxy configuration. **Residential proxies strongly recommended** for G2 — Datadome/Cloudflare flag datacenter IPs immediately.
  - `useApifyProxy`: Use Apify's residential proxy service (recommended: `true`)
  - `apifyProxyGroups`: Proxy groups (recommended: `["RESIDENTIAL"]`)
- **`slowMode`** (boolean, optional): When `true`, adds extra warm-up delays and longer back-off between pages. Default `true`. Set to `false` only if you've verified your proxy + IPs are clean.
- **`pageConcurrency`** (integer, optional): How many list pages (reviews, search, category) to fetch in parallel. Default `3`. Higher = faster; keep within your unblocker plan's concurrent-request limit (excess requests get a 429 and are auto-retried with back-off).
- **`pageDelayMs`** (integer, optional): Pause between parallel page batches, in milliseconds. Default `0` (fastest). Raise only if you want to be extra gentle.
- **`reviewInsights`** (boolean, optional): Adds one deterministic `review_insights` row per product — rating breakdown, sentiment split, complaint themes, top negative terms, feature requests. No AI involved. Billed per product analyzed. Default `false`.
- **`painPointAnalysis`** (boolean, optional): Adds one AI-generated `painPointAnalysis` row per product — complaints clustered into ranked themes with severity + share of reviews, plus missing features. Paid Apify plans only; billed per product analyzed. Default `false`.
- **`enrichEmails`** (boolean, optional): Finds a contact email for each result from the vendor's own website and adds `contactEmail`, `contactWebsite`, and an `emailEnrichment` object. Billed per email found — never charged for misses. Default `false`.
- **`qualifyByPayment`** (boolean, optional): Requires `enrichEmails`. Flags vendors that take money online: `takesPayments`, `paymentProcessors`, `stripeLiveKey`. No extra charge — reuses the pages already fetched for email discovery. Default `false`.

#### Pricing

This actor uses the **pay-per-event** model:

| Event | Trigger | Price |
|---|---|---|
| **Actor start** | Once per run (per GB of memory) | $0.005 |
| **Result** | Every dataset row pushed (product, review, vendor, …) | $1.50 / 1000 |
| **Review insights** (opt-in) | Per product analyzed when `reviewInsights: true` | $0.02 |
| **AI pain-point analysis** (opt-in) | Per product analyzed when `painPointAnalysis: true` | $0.05 |
| **Contact email** (opt-in) | Per email actually found when `enrichEmails: true` — never charged for misses | $0.0075 |

Example run — 100 products from search + 50 reviews each (5,100 rows total): start $0.005 + 5,100 × $0.0015 ≈ **$7.66**. Add `reviewInsights` for all 100 products and it's ≈ $9.66; the full AI pain-point pass on all 100 adds $5.00 more.

### Output Structure

The scraper writes nine row types to the dataset, distinguished by where the data came from:

| Source URL | Row marker | Description |
|---|---|---|
| `/search?query=...` | `itemType: "Software"` | One row per product card in search results |
| `/products/{slug}/reviews` | `type: "review_summary"` + `type: "review"` | One summary row (AI text + Pros/Cons) per URL, then one row per individual review |
| `/categories/{slug}` | `type: "category_product"` | One row per product in a category listing (with `situationalAwards: [...]`) |
| `/products/{slug}/competitors` | `type: "competitor"` | One row per competing product (Top N) |
| `/products/{slug}` | `type: "product"` | One row per product detail page (full profile) |
| `/sellers/{slug}` | `type: "vendor"` | One row per vendor with embedded products portfolio |
| `/products/{slug}/pricing` | `type: "pricing"` | One row per product with pricing tiers + key insights + FAQs |
| `/compare/{a}-vs-{b}` | `type: "compare"` | One row per comparison with per-criterion ratings |
| opt-in: `reviewInsights: true` | `rowType: "review_insights"` | One deterministic digest row per product (rating breakdown, complaint themes, feature requests) |
| opt-in: `painPointAnalysis: true` | `rowType: "painPointAnalysis"` | One AI analysis row per product (ranked pain-point themes + missing features) |

You can split the dataset by these markers downstream, or use the join keys (`productSlug`, `productUuid`, `vendorId`) to merge across row types.

#### Sample Search Result Row

URL: `https://www.g2.com/search?query=databricks`

```json
{
    "scrapedAt": "2026-05-11T11:33:14.012Z",
    "searchUrl": "https://www.g2.com/search?query=databricks",
    "query": "databricks",
    "itemType": "Software",
    "resultRank": 1,
    "foundVia": "g2",
    "isSponsored": false,
    "pricingType": null,
    "productName": "Azure Databricks",
    "productId": 67962,
    "productUuid": "f326c17a-5165-4436-ae44-948c44a6ad31",
    "productUrl": "https://www.g2.com/products/azure-databricks/reviews",
    "reviewsUrl": "https://www.g2.com/products/azure-databricks/reviews",
    "thumbImageUrl": "https://images.g2crowd.com/uploads/vendor/image/359/13bbb369c8268754a786f3dce328f6ce.jpeg",
    "descriptionSnippet": "Azure Databricks is a unified, open analytics platform developed collaboratively by Microsoft and Databricks. Built on the lakehouse architecture, it seamlessly integrates data engineering, data science, and machine learning within the Azure ecosystem...",
    "vendorName": "Microsoft",
    "vendorId": 359,
    "sellerName": "Microsoft",
    "sellerUrl": "https://www.g2.com/sellers/microsoft",
    "ratingOutOfFive": 4.5,
    "ratingOutOfTen": 9,
    "reviewCount": 228,
    "relatedCategories": ["Big Data Analytics"],
    "categoriesDetailed": [
        {
            "id": 1041,
            "name": "Big Data Analytics",
            "url": "https://www.g2.com/categories/big-data-analytics"
        }
    ]
}
```

#### Sample Review Row

URL: `https://www.g2.com/products/postman/reviews`

```json
{
    "type": "review",
    "review_id": 12743757,
    "review_title": null,
    "review_content": "Honestly, Postman has made my work so much easier. Before using it, testing APIs felt like a chore — now it's straightforward and intuitive. The UI is clean, the request builder is powerful, and the way it handles environments and variables saves me hours every week.",
    "review_question_answers": {
        "What do you like best about Postman?": "Honestly, Postman has made my work so much easier. The UI is clean, the request builder is powerful, and the way it handles environments and variables saves me hours every week.",
        "What do you dislike about Postman?": "The free tier limits on collaborators and monitors can be restrictive for small teams. Occasionally the desktop app gets sluggish with very large collections."
    },
    "review_rating": 4.5,
    "reviewer": {
        "reviewer_id": 6952123,
        "reviewer_name": "Suraj J.",
        "reviewer_job_title": "Junior AI Engineer",
        "business_size": "Small-Business(50 or fewer emp.)"
    },
    "publish_date": "2026-05-04",
    "video_review": false,
    "product_slug": "postman",
    "product_name": "Postman",
    "product_id": 20238,
    "product_uuid": "06ab3e14-7ed4-4cc9-b6a6-12b92b7fe34c",
    "vendor_id": 16505,
    "review_link": "https://www.g2.com/products/postman/reviews/postman-review-12743757",
    "company_domain": "postman.com",
    "company_website": "https://postman.com/"
}
```

#### Sample Product Detail Row

URL: `https://www.g2.com/products/postman`

```json
{
    "type": "product",
    "scrapedAt": "2026-05-11T13:26:01.482Z",
    "productName": "Postman",
    "productSlug": "postman",
    "productUrl": "https://www.g2.com/products/postman",
    "reviewsUrl": "https://www.g2.com/products/postman/reviews",
    "competitorsUrl": "https://www.g2.com/products/postman/competitors/alternatives",
    "vendorName": "Postman",
    "vendorSlug": "postman",
    "vendorUrl": "https://www.g2.com/sellers/postman",
    "companyDomain": "postman.com",
    "companyWebsite": "https://postman.com/",
    "description": "Postman is the world's leading API platform, used by more than 40 million developers and 500,000 organizations to build, test, and ship better APIs faster. Postman delivers an integrated set of tools that helps every team—from individual developers to large enterprises—streamline the API lifecycle across design, testing, documentation, monitoring, and collaboration...",
    "ratingOutOfFive": 4.6,
    "ratingOutOfTen": 9.2,
    "reviewCount": 1760,
    "pricingTiers": ["Free Plan", "Basic Plan", "Professional Plan"],
    "featuresText": "Postman FeaturesAPI Construction\nAPI Testing\nData Security\nOrchestrationAPI Management\nLogs/Documentation\nAPI Monitoring\nCollaboration...",
    "images": [
        "https://images.g2crowd.com/uploads/product/hd_favicon/7b4d7d3f13ff9a655c3e07b1ab.png",
        "https://images.g2crowd.com/uploads/product/large_detail/screenshot_2.png",
        "https://images.g2crowd.com/uploads/product/large_detail/screenshot_3.png"
    ],
    "imageCount": 6,
    "status": "SUCCEEDED"
}
```

#### Sample Competitor Row

URL: `https://www.g2.com/products/postman/competitors`

```json
{
    "type": "competitor",
    "scrapedAt": "2026-05-11T13:13:01.482Z",
    "sourceProductSlug": "postman",
    "competitorRank": 1,
    "productName": "MuleSoft Anypoint Platform",
    "productSlug": "mulesoft-anypoint-platform",
    "productUrl": "https://www.g2.com/products/mulesoft-anypoint-platform/reviews",
    "reviewsUrl": "https://www.g2.com/products/mulesoft-anypoint-platform/reviews",
    "thumbImageUrl": "https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_mule.png",
    "descriptionSnippet": "MuleSoft Anypoint Platform is the industry's only complete API and integration platform. Anypoint Platform delivers AI-powered automation that helps teams build, govern, and manage APIs and integrations 10x faster — across any system or LLM...",
    "vendorName": "Salesforce",
    "ratingOutOfFive": 4.5,
    "ratingOutOfTen": 9,
    "reviewCount": 733,
    "entryLevelPrice": "Free"
}
```

#### Sample Category Product Row

URL: `https://www.g2.com/categories/crm`

```json
{
    "type": "category_product",
    "scrapedAt": "2026-05-11T11:49:33.728Z",
    "categorySlug": "crm",
    "page": 1,
    "position": 1,
    "listType": null,
    "isSponsored": false,
    "productId": 3196,
    "productUuid": "fb6a4f51-8e3f-4a01-9f04-3c2c8a8a9e1d",
    "productName": "Agentforce Sales (formerly Salesforce Sales Cloud)",
    "productSlug": "agentforce-sales-formerly-salesforce-sales-cloud",
    "productUrl": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/reviews",
    "productCategory": "CRM",
    "productCategoryId": 179,
    "vendorId": 26,
    "vendorSlug": "salesforce",
    "vendorName": "Salesforce",
    "ratingOutOfFive": 4.4,
    "ratingOutOfTen": 8.8,
    "reviewCount": 25754,
    "entryLevelPrice": "Starting at $25.00 Per User Per Month",
    "descriptionSnippet": "Accelerate revenue from pipeline to paycheck with Salesforce Sales Cloud - your complete sales platform for the AI era. Unify your data and sales processes...",
    "thumbImageUrl": "https://images.g2crowd.com/uploads/product/image/large_detail/large_detail_1234.png"
}
```

#### Sample Vendor Row

URL: `https://www.g2.com/sellers/salesforce`

```json
{
    "type": "vendor",
    "scrapedAt": "2026-05-11T13:50:12.402Z",
    "vendorName": "Salesforce",
    "vendorSlug": "salesforce",
    "vendorUrl": "https://www.g2.com/sellers/salesforce",
    "linkedinUrl": "https://www.linkedin.com/company/3185/",
    "websiteUrl": "https://www.salesforce.com/",
    "websiteDomain": "salesforce.com",
    "companyDomain": "salesforce.com",
    "companyWebsite": "https://www.salesforce.com/",
    "description": "Salesforce is the #1 AI CRM, where humans with agents drive customer success together with AI, data, and Customer 360 apps on a single, trusted platform...",
    "companyDetails": {
        "founded": "1999",
        "hqLocation": "San Francisco, CA",
        "ownership": "NYSE:CRM",
        "totalRevenue": null,
        "employees": null,
        "phone": "+1 (800) 667-6389"
    },
    "products": [
        {
            "productSlug": "agentforce-sales-formerly-salesforce-sales-cloud",
            "productName": "Agentforce Sales (formerly Salesforce Sales Cloud)",
            "productUrl": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/reviews",
            "ratingOutOfFive": 4.5,
            "reviewCount": 25754,
            "descriptionSnippet": ""
        },
        {
            "productSlug": "slack",
            "productName": "Slack",
            "productUrl": "https://www.g2.com/products/slack/reviews",
            "ratingOutOfFive": 4.5,
            "reviewCount": 38833,
            "descriptionSnippet": ""
        },
        {
            "productSlug": "tableau",
            "productName": "Tableau",
            "productUrl": "https://www.g2.com/products/tableau/reviews",
            "ratingOutOfFive": 4.4,
            "reviewCount": 2280,
            "descriptionSnippet": ""
        }
    ],
    "productCount": 9,
    "totalReviewsAcrossProducts": 94372,
    "status": "SUCCEEDED"
}
```

#### Sample Review Summary Row

URL: `https://www.g2.com/products/postman/reviews` (emitted once, before individual review rows)

```json
{
    "type": "review_summary",
    "scrapedAt": "2026-05-11T21:35:12.506Z",
    "productSlug": "postman",
    "productUrl": "https://www.g2.com/products/postman/reviews",
    "summaryText": "Users consistently praise Postman for its intuitive interface and collaboration features, which streamline API testing and development. The platform simplifies the process of creating, testing, and managing APIs, making it accessible for both beginners and experienced developers. However, some users note that it can become resource-heavy when handling large collections.",
    "pros": [
        { "label": "Ease of Use",         "mentions": 464 },
        { "label": "API Testing",         "mentions": 398 },
        { "label": "API Management",      "mentions": 308 },
        { "label": "Testing",             "mentions": 280 },
        { "label": "Testing Efficiency",  "mentions": 277 }
    ],
    "cons": [
        { "label": "Slow Performance",    "mentions": 220 },
        { "label": "Performance Issues",  "mentions": 201 },
        { "label": "Slow Loading",        "mentions": 144 },
        { "label": "Resource Limitations","mentions": 132 },
        { "label": "Limited Features",    "mentions": 122 }
    ],
    "aggregateRating": 4.6,
    "totalReviews": 1760,
    "status": "SUCCEEDED"
}
```

#### Sample Pricing Row

URL: `https://www.g2.com/products/postman/pricing`

```json
{
    "type": "pricing",
    "scrapedAt": "2026-05-12T09:04:08.608Z",
    "productSlug": "postman",
    "productName": "Postman",
    "productUrl": "https://www.g2.com/products/postman",
    "pricingUrl": "https://www.g2.com/products/postman/pricing",
    "tiers": [
        { "tierName": "Free Plan",         "price": 0,  "currency": "USD", "rawPrice": "$0" },
        { "tierName": "Basic Plan",        "price": 14, "currency": "USD", "rawPrice": "$14 / 1 per user/month, billed annually" },
        { "tierName": "Professional Plan", "price": 29, "currency": "USD", "rawPrice": "$29 / 1 per user/month, billed annually" },
        { "tierName": "Enterprise Plan",   "price": 49, "currency": "USD", "rawPrice": "$49" }
    ],
    "tierCount": 4,
    "priceMin": 0,
    "priceMax": 49,
    "currency": "USD",
    "keyInsights": "Postman offers 4 pricing editions, starting from $0 to $49. Postman pricing tiers are designed to support different usage levels and team sizes. Postman also offers a free trial.",
    "faqs": [
        { "question": "Is Postman free, or does it offer a free trial?", "answer": "Yes. According to G2 data, Postman offers a free plan with limited features..." },
        { "question": "How much does Postman cost in 2026?",            "answer": "According to G2 data, Postman pricing in 2026 starts at $14.00 and can reach $49.00..." }
    ],
    "faqCount": 5,
    "status": "SUCCEEDED"
}
```

#### Sample Compare Row

URL: `https://www.g2.com/compare/postman-vs-mulesoft-anypoint-platform`

```json
{
    "type": "compare",
    "scrapedAt": "2026-05-12T13:20:42.123Z",
    "compareUrl": "https://www.g2.com/compare/postman-vs-mulesoft-anypoint-platform",
    "combinedSlug": "postman-vs-mulesoft-anypoint-platform",
    "products": [
        {
            "productSlug": "mulesoft-anypoint-platform",
            "productName": "MuleSoft Anypoint Platform",
            "productUrl": "https://www.g2.com/products/mulesoft-anypoint-platform",
            "vendorName": "Salesforce",
            "ratingOutOfFive": 4.5,
            "reviewCount": 733
        },
        {
            "productSlug": "postman",
            "productName": "Postman",
            "productUrl": "https://www.g2.com/products/postman",
            "vendorName": "Postman",
            "ratingOutOfFive": 4.6,
            "reviewCount": 1760
        }
    ],
    "productCount": 2,
    "ratings": [
        { "criterion": "Meets Requirements",   "perProduct": [{ "score": 8.8, "sampleSize": 506,  "note": null }, { "score": 9.3, "sampleSize": 1376, "note": null }] },
        { "criterion": "Ease of Use",          "perProduct": [{ "score": 8.6, "sampleSize": 517,  "note": null }, { "score": 9.1, "sampleSize": 1395, "note": null }] },
        { "criterion": "Ease of Setup",        "perProduct": [{ "score": 8.6, "sampleSize": 335,  "note": null }, { "score": 9.3, "sampleSize": 646,  "note": null }] },
        { "criterion": "Ease of Admin",        "perProduct": [{ "score": 8.4, "sampleSize": 282,  "note": null }, { "score": 8.9, "sampleSize": 185,  "note": null }] },
        { "criterion": "Quality of Support",   "perProduct": [{ "score": 8.2, "sampleSize": 463,  "note": null }, { "score": 8.7, "sampleSize": 1140, "note": null }] }
    ],
    "ratingsCount": 7,
    "alternativesShown": [
        { "productSlug": "workato",                "productName": "Workato" },
        { "productSlug": "boomi",                  "productName": "Boomi" },
        { "productSlug": "sap-integration-suite",  "productName": "SAP Integration Suite" },
        { "productSlug": "celigo",                 "productName": "Celigo" }
    ],
    "status": "SUCCEEDED"
}
```

### Output Fields Detailed Explanation

#### Common Fields (all row types)

- **`scrapedAt`** (string): ISO 8601 timestamp of when this row was extracted.
- **`productName`** (string): Official product name on G2.
- **`productSlug`** / **`productUrl`** / **`reviewsUrl`**: URL components for cross-linking back to G2 or joining rows together.
- **`thumbImageUrl`** (string | null): Product logo URL from G2's CDN. Some category-page images load lazily as SVG placeholders — those resolve to `null`.

#### Search-Specific Fields (`itemType: "Software"`)

- **`searchUrl`** (string): The G2 search URL used.
- **`query`** (string): Keyword that produced this result.
- **`resultRank`** (number): Position in the search results (1 = top).
- **`itemType`** (string): Almost always `"Software"` — `"Service"` occasionally.
- **`foundVia`** (string): Static `"g2"` source marker.
- **`isSponsored`** (boolean): `true` if this is a paid promotion.
- **`pricingType`** (string | null): Pricing indicator like `"Free Trial"`, `"Free"`, etc.
- **`productId`** / **`productUuid`**: G2's internal numeric ID and UUID.
- **`descriptionSnippet`** (string): First ~500 chars of the marketing description.
- **`vendorName`** / **`vendorId`** / **`sellerName`** / **`sellerUrl`**: Vendor profile data.
- **`ratingOutOfFive`** (number): 0-5 star rating (e.g., `4.5`).
- **`ratingOutOfTen`** (number): Same rating normalized to 0-10.
- **`reviewCount`** (number): Total review count.
- **`relatedCategories`** (array of strings): Category names this product belongs to.
- **`categoriesDetailed`** (array of objects): `{ id, name, url }` for each category.

#### Review-Specific Fields (`type: "review"`)

- **`type`** (string): Always `"review"` for this row type.
- **`review_id`** (number): Yelp-style internal review identifier (numeric).
- **`review_title`** (string | null): Review headline (frequently `null` — many G2 reviews don't have a separate title).
- **`review_content`** (string): Main body of the review — concatenated from the "What do you like best" answer if a structured Q\&A exists.
- **`review_question_answers`** (object | undefined): Structured Q\&A pairs G2 collects from reviewers. Typical keys: `"What do you like best about X?"`, `"What do you dislike about X?"`, `"What problems is X solving and how is that benefiting you?"`.
- **`review_rating`** (number): 1-5 star rating with half-star precision (e.g., `4.5`). *Note: numeric here, unlike the search row's `ratingOutOfFive` which is also numeric — review\_rating is per-review, not aggregate.*
- **`reviewer`** (object): Reviewer profile —
  - `reviewer_id` (number | undefined): G2's stable reviewer identifier — dedupe/join reviews by the same person
  - `reviewer_name` (string): "Suraj J." style abbreviated name
  - `reviewer_job_title` (string): "Junior AI Engineer"
  - `business_size` (string): "Small-Business(50 or fewer emp.)", "Mid-Market(51-1000 emp.)", "Enterprise(>1000 emp.)"
- **`publish_date`** (string): ISO date the review was published (e.g., `"2026-05-04"`).
- **`video_review`** (boolean | undefined): `true` when the reviewer submitted a video review.
- **`product_slug`** / **`product_name`**: Join keys back to the product.
- **`product_id`** / **`product_uuid`** / **`vendor_id`**: G2's internal product and vendor identifiers — stable join keys across row types and runs.
- **`review_link`** (string): Direct URL to the individual review on G2.
- **`company_domain`** (string | null): The company/product's own web domain (e.g., `"postman.com"`) — the join key for matching G2 data against your CRM or enrichment stack. G2 never renders vendor websites on-page, so this is resolved from the product name via a guarded company-name lookup; `null` when no confident match exists (never a wrong-company guess).
- **`company_website`** (string | null): Same as `company_domain`, as a full URL (e.g., `"https://postman.com/"`).

#### Product-Specific Fields (`type: "product"`)

- **`type`** (string): Always `"product"` for this row type.
- **`productName`** (string): Official product name (e.g., `"Postman"`).
- **`productSlug`** (string): URL slug (e.g., `"postman"`).
- **`productUrl`** (string): Canonical product page URL.
- **`reviewsUrl`** / **`competitorsUrl`** (string): Convenience cross-links to the other URL types you can scrape for the same product.
- **`vendorName`** / **`vendorSlug`** / **`vendorUrl`** (string | null): Vendor / seller profile (e.g., `"Postman"` → `/sellers/postman`).
- **`companyDomain`** / **`companyWebsite`** (string | null): The company's own domain and website URL (resolved from the product/vendor name; also present on search, category, competitor, vendor, pricing, and review-summary rows — review rows carry the snake\_case twins `company_domain` / `company_website`).
- **`description`** (string): Full marketing description — typically 400-2000 chars. Sourced from `[itemprop="description"]` then `<meta name="description">` as fallback.
- **`ratingOutOfFive`** / **`ratingOutOfTen`** (number): Aggregate star rating from `[itemprop="ratingValue"]`.
- **`reviewCount`** (number): Total review count from `[itemprop="reviewCount"]`.
- **`pricingTiers`** (array of strings): Names of pricing tiers G2 displays (e.g., `["Free Plan", "Basic Plan", "Professional Plan"]`). Extracted from `h3`/`h4` headings inside the pricing section, filtered to known tier keywords (Plan, Tier, Pro, Enterprise, etc.).
- **`featuresText`** (string | null): Raw text dump of the features section (~2000 chars cap). Caller can split/parse downstream.
- **`images`** (array of strings): G2-CDN image URLs (logo, screenshots). Badges and award icons are filtered out.
- **`imageCount`** (number): Length of `images`.
- **`status`** (string): `"SUCCEEDED"` on a successful parse.

*Note: categories aren't extracted from the product detail page because G2's nav menu mixes its global category list with the product's own categories. To get a product's categories, scrape its `/products/{slug}/reviews` URL (`type: "review"` rows don't carry them, but the search/category endpoints do) or use a `/categories/{slug}` listing.*

#### Competitor-Specific Fields (`type: "competitor"`)

- **`type`** (string): Always `"competitor"` for this row type.
- **`sourceProductSlug`** (string): The slug of the product whose competitors were scraped (e.g., `"postman"`). Lets you trace each row back to its source.
- **`competitorRank`** (number): Rank within the source product's competitors page (1 = top alternative). Numbers are clean 1..N — the source product itself is filtered out before ranking.
- **`productName`** / **`productSlug`** / **`productUrl`** / **`reviewsUrl`**: Standard product identifiers (same shape as in other row types).
- **`thumbImageUrl`** (string | null): Product logo URL. May be `null` for lazy-loaded placeholders.
- **`descriptionSnippet`** (string): First ~600 chars of the product's marketing description.
- **`vendorName`** (string | null): Company that produces the product (e.g., `"Salesforce"`, `"Microsoft"`).
- **`ratingOutOfFive`** / **`ratingOutOfTen`** (number): Aggregate star rating.
- **`reviewCount`** (number): Total review count.
- **`entryLevelPrice`** (string | null): Pricing string when displayed (`"$25.00 Per User Per Month"`, `"Free"`, `"Contact Us"`), `null` otherwise.

#### Category-Specific Fields (`type: "category_product"`)

- **`type`** (string): Always `"category_product"` for this row type.
- **`categorySlug`** (string): The category slug from the URL (e.g., `"crm"` or `"crm/sales-acceleration"`).
- **`page`** (number): Which paginated page this product was found on (1-based).
- **`position`** (number): G2-assigned rank position in the category (1 = highest-scoring).
- **`listType`** (string | null): G2's internal list classifier — `"sponsored"`, `"featured"`, etc., or `null` for standard listings.
- **`isSponsored`** (boolean): `true` if this listing is paid promotion.
- **`productId`** / **`productUuid`** / **`productName`** / **`productSlug`** / **`productUrl`**: Same as in other row types.
- **`productCategory`** / **`productCategoryId`** (string / number): Category name and G2's internal category ID.
- **`vendorId`** / **`vendorSlug`** / **`vendorName`**: Vendor profile.
- **`ratingOutOfFive`** (number): Star rating extracted from the `<div class="stars stars-N">` CSS class (N/2 = rating).
- **`ratingOutOfTen`** (number): Same rating normalized to 0-10.
- **`reviewCount`** (number): Total review count for the product.
- **`entryLevelPrice`** (string | null): Pricing string like `"Starting at $25.00 Per User Per Month"`, `"$15.00"`, `"Free"`, `"Contact Us"`, or `null` if pricing isn't displayed on the card.
- **`descriptionSnippet`** (string): First ~600 chars of the product's marketing description.

#### Vendor-Specific Fields (`type: "vendor"`)

- **`type`** (string): Always `"vendor"` for this row type.
- **`vendorName`** (string): Company name (e.g., `"Salesforce"`).
- **`vendorSlug`** (string): URL slug used by G2 (e.g., `"salesforce"`).
- **`vendorUrl`** (string): Canonical vendor page URL.
- **`linkedinUrl`** (string | null): The company's LinkedIn page URL, exactly as G2 renders it on the seller profile (e.g., `"https://www.linkedin.com/company/3185/"`).
- **`websiteUrl`** / **`websiteDomain`** (string | null): The company's own website as rendered on the seller page (e.g., `"https://www.salesforce.com/"`) and its bare domain (`"salesforce.com"`). `null` only when G2 doesn't display a website for that seller.
- **`socialLinks`** (object | undefined): Any additional `seller_page_*` external links G2 renders (keyed by network), for sellers that list more than website + LinkedIn.
- **`companyDomain`** / **`companyWebsite`** (string | null): Canonical join keys, consistent with every other row type — filled from the on-page website when present, otherwise resolved from the vendor name.
- **`description`** (string): About / company description, capped at 2000 chars. Falls back to `<meta name="description">` if no "About" section is present.
- **`companyDetails`** (object): Sidebar facts pulled from the "Details" panel. Each field can be `null` if G2 doesn't display it for that vendor.
  - `founded` (string | null): Year founded (e.g., `"1999"`).
  - `hqLocation` (string | null): Headquarters location (e.g., `"San Francisco, CA"`).
  - `ownership` (string | null): Ownership / ticker (e.g., `"NYSE:CRM"`, `"Private"`).
  - `totalRevenue` (string | null): Total revenue (USD mm), where shown.
  - `employees` (string | null): LinkedIn employee count, where shown.
  - `phone` (string | null): Contact phone number, where shown.
- **`products`** (array of objects): The vendor's product portfolio. Merges the "Featured Products" + "All Products & Services" sections, deduped by slug. Each entry:
  - `productSlug` (string)
  - `productName` (string)
  - `productUrl` (string) — links to `/products/{slug}/reviews`
  - `ratingOutOfFive` (number) — extracted from the `stars-N` CSS class (N/2)
  - `reviewCount` (number) — parsed from the "{N,NNN} reviews" text on the card
  - `descriptionSnippet` (string) — usually empty on vendor cards; use `/products/{slug}` for full marketing copy
- **`productCount`** (number): Length of `products`.
- **`totalReviewsAcrossProducts`** (number): Aggregate review count across all of the vendor's products. Sourced from the page title (`Read N Reviews on G2`) when present; falls back to summing each product's `reviewCount`.
- **`status`** (string): `"SUCCEEDED"` on a successful parse.

#### Review-Summary-Specific Fields (`type: "review_summary"`)

Emitted once at the start of each `/products/{slug}/reviews` walk (skipped when filters are supplied).

- **`type`** (string): Always `"review_summary"`.
- **`productSlug`** / **`productUrl`**: Identifiers for joining with `type: "review"` rows.
- **`summaryText`** (string): G2's AI-generated paragraph summarizing the review corpus. Capped at 2000 chars.
- **`pros`** (array of `{ label, mentions }`): Top mentioned positives, sorted by mention count.
- **`cons`** (array of `{ label, mentions }`): Top mentioned negatives, sorted by mention count.
- **`aggregateRating`** (number | null): Average star rating across all reviews (e.g., 4.6).
- **`totalReviews`** (number | null): Total review count from the schema.org markup.

#### Pricing-Specific Fields (`type: "pricing"`)

- **`type`** (string): Always `"pricing"`.
- **`productSlug`** / **`productName`** / **`productUrl`** / **`pricingUrl`**: Standard product identifiers + link to the pricing tab.
- **`tiers`** (array of objects): One entry per pricing edition G2 displays.
  - `tierName` (string): e.g., `"Free Plan"`, `"Basic Plan"`, `"Enterprise Plan"`.
  - `price` (number | null): Numeric price extracted from schema.org `<meta itemprop="price">`. `null` for "Contact Us"-style tiers.
  - `currency` (string | null): ISO currency code (e.g., `"USD"`).
  - `rawPrice` (string): Human-readable price chunk including billing cadence (e.g., `"$14 / 1 per user/month, billed annually"`).
- **`tierCount`** (number): Length of `tiers`.
- **`priceMin`** / **`priceMax`** (number | null): Min/max numeric price across all tiers — useful for quick range filtering.
- **`currency`** (string | null): Currency for `priceMin`/`priceMax`.
- **`keyInsights`** (string): G2's "Pricing Key Insights" paragraph (e.g., "X offers 4 pricing editions, starting from $0 to $49…"). Capped at 2000 chars.
- **`faqs`** (array of `{ question, answer }`): Pricing FAQs G2 displays at the bottom of the page, parsed from the schema.org `Question` / `acceptedAnswer` markup.
- **`faqCount`** (number): Length of `faqs`.

#### Compare-Specific Fields (`type: "compare"`)

- **`type`** (string): Always `"compare"`.
- **`compareUrl`** (string): Canonical compare URL (G2 may reorder slug segments).
- **`combinedSlug`** (string): Slug section from the URL (e.g., `"postman-vs-mulesoft-anypoint-platform"`).
- **`products`** (array of objects): One entry per product in the comparison.
  - `productSlug` / `productName` / `productUrl`
  - `vendorName` (string | null)
  - `ratingOutOfFive` (number) — aggregate G2 rating
  - `reviewCount` (number)
- **`productCount`** (number): Length of `products`.
- **`ratings`** (array of objects): One entry per ratings criterion shown on the page.
  - `criterion` (string): e.g., `"Meets Requirements"`, `"Ease of Use"`, `"Ease of Setup"`, `"Quality of Support"`.
  - `perProduct` (array): Aligned with the `products` array. Each entry has:
    - `score` (number | null): 0–10 score (e.g., 8.8). `null` if G2 shows "Not enough data".
    - `sampleSize` (number | null): Number of reviewers contributing to the score.
    - `note` (string | null): Optional annotation like `"won by default"` or `"Not enough data"`.
- **`ratingsCount`** (number): Length of `ratings`.
- **`alternativesShown`** (array of `{ productSlug, productName, productUrl }`): Products G2 surfaces in the sidebar as alternative comparisons.

#### `situationalAwards` (on `type: "category_product"`)

Array of strings — G2 Grid®-style quadrant winners for the source category. Possible values:

- `"Leader"` — top-right quadrant (high market presence + high satisfaction)
- `"Highest Performer"` — top-left quadrant (high satisfaction)
- `"Easiest to Use"` — top of the easiest-to-use list
- `"Top Trending"` — fastest-growing in the category
- `"Best Free Software"` — leader among free-plan offerings

Most products have an empty array; only a handful per category carry awards. Source: G2 marks these via `data-event-options` analytics payloads ("Situational Best / X: Product Card Clicked").

### Use Cases

#### 1. Competitive Vendor Shortlist

Walk a G2 category and rank vendors by review count + rating.

```json
{
    "startUrls": [{ "url": "https://www.g2.com/categories/crm" }],
    "maxItems": 100
}
```

#### 2. Customer-Voice Analysis on a Single Product

Pull every review for a product to feed into sentiment/NPS analysis.

```json
{
    "startUrls": [{ "url": "https://www.g2.com/products/postman/reviews" }],
    "maxReviews": 1000
}
```

#### 3. Market Research Across Subcategories

Aggregate everyone in a niche category.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/categories/crm/sales-acceleration" },
        { "url": "https://www.g2.com/categories/crm/inside-sales" }
    ],
    "maxItems": 200
}
```

#### 4. Brand Monitoring via Keyword Search

Track which products show up for specific search terms.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/search?query=enterprise+data+catalog" },
        { "url": "https://www.g2.com/search?query=data+lineage" }
    ],
    "maxItems": 500
}
```

#### 5. Competitor Discovery for a Specific Product

Pull G2's curated Top 10 alternatives to your product (or your competitor's).

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/products/postman/competitors" }
    ]
}
```

#### 6. Product Profile Extraction

Pull a single product's full profile (description, pricing, rating, screenshots) — useful as a feed source for product databases.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/products/postman" }
    ]
}
```

#### 7. Full Competitor Deep-Dive

Mix all nine URL types — category overview, search peer set, curated competitor list, product profile, vendor portfolio, review feed, pricing tab, and a head-to-head compare — in a single run.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/categories/crm" },
        { "url": "https://www.g2.com/search?query=salesforce+alternative" },
        { "url": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud" },
        { "url": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/competitors" },
        { "url": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/reviews" },
        { "url": "https://www.g2.com/sellers/salesforce" },
        { "url": "https://www.g2.com/products/agentforce-sales-formerly-salesforce-sales-cloud/pricing" },
        { "url": "https://www.g2.com/compare/agentforce-sales-formerly-salesforce-sales-cloud-vs-hubspot-sales-hub" }
    ],
    "maxItems": 200,
    "maxReviews": 500
}
```

#### 8. Vendor Portfolio Snapshot

Pull a vendor's full product portfolio in one row — company facts (HQ, ownership, phone) plus rating + review count for every product the vendor sells. Useful for competitive intelligence on multi-product vendors.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/sellers/salesforce" },
        { "url": "https://www.g2.com/sellers/microsoft" },
        { "url": "https://www.g2.com/sellers/atlassian" }
    ]
}
```

#### 9. Pricing Intelligence

Pull structured pricing tiers + key insights for a set of competitors. Each row gives you per-tier price, currency, billing cadence, and G2's curated pricing FAQs.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/products/postman/pricing" },
        { "url": "https://www.g2.com/products/mulesoft-anypoint-platform/pricing" },
        { "url": "https://www.g2.com/products/swaggerhub/pricing" }
    ]
}
```

#### 10. Head-to-Head Comparisons

Pull G2's per-criterion comparison data (Meets Requirements, Ease of Use, Ease of Setup, Quality of Support, etc.) for product matchups — same data G2 publishes on its `/compare/` pages.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/compare/postman-vs-mulesoft-anypoint-platform" },
        { "url": "https://www.g2.com/compare/slack-vs-microsoft-teams" }
    ]
}
```

#### 11. Filtered Review Slice

Use G2's native filter syntax to grab just the slice of reviews you need — e.g., enterprise reviewers only, 5-star only, latest first.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/products/postman/reviews?filters[ratings]=5&filters[company_size][]=Enterprise&order=most_recent" }
    ],
    "maxReviews": 200
}
```

#### 12. G2 Grid® Quadrant Awards by Category

Walk a category to capture which products are G2's "Leader", "Highest Performer", "Easiest to Use", "Top Trending", and "Best Free Software" — the same labels G2 displays on its Grid® reports.

```json
{
    "startUrls": [
        { "url": "https://www.g2.com/categories/crm" },
        { "url": "https://www.g2.com/categories/project-management" }
    ],
    "maxItems": 30
}
```

Filter the output by `situationalAwards.length > 0` to surface only the awarded products.

### Performance & Limits

- **Rate Limiting**: Built-in 8-15s jittered delays between page fetches. Don't set `maxConcurrency` higher than 3 — G2's DataDome rate-limits per cookie.
- **Pagination depth**: Tested cleanly to 100 pages on a single product reviews URL (1,000 reviews) with zero blocks.
- **Memory**: Each product row is ~1-3 KB; each review row is ~1-2 KB.
- **Speed**:
  - Search / category: ~5-7 products per page, ~10s per page → ~30-40 products/min
  - Reviews: ~10 reviews per page, ~10s per page → ~60 reviews/min
- **Proxy Requirement**: Residential proxies strongly recommended. Datacenter IPs are blocked on first request.

### Error Handling

The scraper includes comprehensive error handling:

- **Multi-Client TLS Race**: Three independent HTTP clients (impers/impit/got-scraping) race in parallel — different TLS fingerprints survive different blocks.
- **Session Pool with Rotation**: Pre-warmed browser sessions with valid Datadome cookies, automatically rotated round-robin to stay under per-cookie rate limits.
- **Legacy Fallback**: If the session pool is empty, falls back to a DataDome-cookie service flow that races the three clients with fresh fingerprints.
- **Exponential Back-off**: Failed requests back off exponentially (10s → 15s → 22s → ...) with jitter. Hard short-circuit after 10 consecutive blocks to avoid retry storms.
- **Automatic Retries**: Failed requests retry up to `maxRequestRetries` times.
- **Smart Pagination**: Stops automatically when reaching the last page or when no results appear.
- **Graceful Failures**: Continues scraping even if individual pages fail.

### Troubleshooting

#### No Results Returned

- Check the URL opens correctly in a browser — G2 occasionally redirects category slugs.
- Verify residential proxies are enabled.
- Lower `maxConcurrency` to `1` and try again.

#### Scraper Stops Early on Reviews

- Check the run's logs for `[fetchG2] anti-bot signal` patterns. If you see >5 in a row, the session pool is exhausted — the warmer schedule needs to fire to refresh it.
- Set `slowMode: true` for tighter rate-limit avoidance.

#### Missing or Mangled Fields

- `entryLevelPrice` is `null` when G2 doesn't display pricing on the category card.
- `review_title` is frequently `null` — G2's modern review layout doesn't have separate titles.
- `thumbImageUrl` is `null` for products whose images are still lazy-loaded SVG placeholders when the page renders.

### Free tier

You can run this scraper on a free Apify account before paying anything:

| | Free account |
|---|---|
| Results per run | up to **50** |
| Cost | nothing — the free plan includes monthly platform credit |

That is enough to check the field list and the data quality against your own URLs. Paid plans lift the cap; see [Apify pricing](https://apify.com/pricing).

### Support & Contact

For custom solutions, bulk scraping, or support:

- 📧 Email: <muhamed.didovic@gmail.com>
- 🌐 Website: <https://muhamed-didovic.github.io/>
- 🏪 Apify Store: Search for "G2.com Software Scraper"
- 💬 Apify Support: Contact through Apify platform

### Explore More Scrapers

If you found this Apify Scraper useful, be sure to check out our other powerful scrapers and actors at [memo23's Apify profile](https://apify.com/memo23). We offer a wide range of tools to enhance your web scraping and automation needs across various platforms and use cases.

### Legal & Ethical Use

- This scraper is intended for legitimate business and research purposes only.
- Respect [G2.com Terms of Service](https://documents.g2.com/legal/terms-of-use).
- Use responsibly and ethically.
- Do not overload servers with excessive requests.
- Consider using data for analysis and research within legal boundaries.

### FAQ

**Q: How many products / reviews can I scrape per run?**
A: Tested cleanly to 1,000+ reviews per product in a single run. Total run capacity scales with how many fresh sessions the warmer has populated in the pool. Free Apify users have a per-run row cap.

**Q: Do I need to provide DataDome cookies?**
A: No. The actor uses a self-managed session pool that pre-captures cookies via a headless browser warmer, refreshed every 10 minutes. The cookies are completely transparent to you.

**Q: Can I mix all five URL types in one run?**
A: Yes — that's exactly what `startUrls` supports. Each URL is dispatched to the correct handler based on its path.

**Q: How many competitors does each `/competitors` URL return?**
A: G2 renders a fixed "Top N" (typically 9-10) per source product. There's no pagination — one run per source product gives you the complete curated list.

**Q: Why is `review_title` always null?**
A: G2's modern review layout merged the title with the "What do you like best" Q\&A answer. The `review_question_answers.{"What do you like best about X?"}` field carries that content.

**Q: How fresh is the data?**
A: Real-time — every URL is fetched live on each run. No caching.

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/g2-scraper`).

**Purpose:** Scrapes G2.com into typed rows across nine URL kinds — search, product reviews, single review, categories, competitor lists, product detail, vendor profiles, pricing tabs, and head-to-head compare pages — over plain HTTP with a managed anti-bot unblocker (no headless browser needed on your side).

**Minimal input:**

```json
{
  "startUrls": [{ "url": "https://www.g2.com/products/postman/reviews" }],
  "maxItems": 50
}
```

Slug shortcut instead of URLs: `{ "productSlugs": ["postman"], "maxItems": 50 }` — each slug maps to that product's reviews page.

**Output:** row shape depends on the source URL, discriminated by `type` (search rows use `itemType: "Software"`) — review rows: review\_id, review\_title, review\_content, review\_question\_answers, review\_rating, reviewer {reviewer\_name, reviewer\_job\_title, business\_size}, publish\_date, product\_slug, review\_link, company\_domain, company\_website; search/category/competitor/product rows: productName, productSlug, productUrl, vendorName, companyDomain, companyWebsite, ratingOutOfFive, ratingOutOfTen, reviewCount, descriptionSnippet, entryLevelPrice, situationalAwards; other types: review\_summary (summaryText, pros, cons), vendor (companyDetails, products, linkedinUrl, websiteUrl, websiteDomain), pricing (tiers {tierName, price, currency, rawPrice}, keyInsights, faqs), compare (products, ratings per criterion). Every row type carries the company/product domain as a CRM-ready join key.

**Behaviors an agent should know:**

- Mix any of the nine URL types freely in one `startUrls` array; each dispatches to its own parser. Bare product slugs and regional hosts (`fr.g2.com`, …) are normalized automatically.
- `maxItems` caps total rows across all URLs; `maxReviews` caps review rows per product URL (falls back to `maxItems` when unset); `lookbackDays` keeps only reviews from the last N days and stops paginating at the cutoff.
- Review controls apply to review URLs only: `sortOrder` (`g2_default` | `most_recent` | `most_helpful` | `highest_rated` | `lowest_rated`), `starFilterCondition` + `starFilterValue`; G2 filter params pasted directly in a URL win for that URL.
- The `review_summary` row is skipped when review filters are used; `/competitors` pages return a fixed Top ~10 list with no pagination.
- Opt-in extras (all default `false`): `reviewInsights` (deterministic digest per product), `painPointAnalysis` (AI, paid Apify plans only), `enrichEmails` + `qualifyByPayment` (contact email + payment-stack flags).
- Billing (pay-per-event): $0.005 actor start per GB, $1.50 / 1,000 dataset rows, $0.02 per product for review insights, $0.05 per product for AI pain-point analysis, $0.0075 per contact email actually found (misses are never charged).

***

### ⚠️ Disclaimer

This actor collects only **publicly available** information from G2.com. It does not log in, bypass authentication, or access private or personal data. You are responsible for ensuring your use of the scraped data complies with G2's Terms of Service, applicable robots directives, and all relevant laws and regulations (including data-protection laws such as GDPR and CCPA where personal data is involved). This is an **independent tool and is not affiliated with, endorsed by, or sponsored by G2.com, Inc.** "G2" and all related names and marks are trademarks of their respective owners and are used here for descriptive purposes only. Use this actor for lawful research, analytics, and market-intelligence purposes.

### SEO Keywords

g2 scraper, g2.com scraper, g2 reviews scraper, g2 software reviews, g2 ratings scraper, g2 product data, g2 vendor data, g2 category scraper, g2 pricing scraper, g2 compare scraper, g2 competitor analysis, software reviews api, saas reviews scraper, b2b software data, software market research, product reviews scraper, review aggregator scraper, g2 crowd scraper, software comparison data, vendor intelligence

***

**Built with ❤️ by Muhamed Didovic**

*Last Updated: June 2026*

### More Review Scrapers

Need reviews from other platforms? Same author, same export format:

- **Trustpilot** — business & product reviews: [apify.com/memo23/trustpilot-scraper-ppe](https://apify.com/memo23/trustpilot-scraper-ppe)
- **Capterra** — software reviews & product profiles: [apify.com/memo23/capterra-scraper](https://apify.com/memo23/capterra-scraper)
- **Gartner** — enterprise software reviews: [apify.com/memo23/apify-gartner-scraper-ppr](https://apify.com/memo23/apify-gartner-scraper-ppr)
- **Yelp** — local business reviews & ratings: [apify.com/memo23/yelp-scraper](https://apify.com/memo23/yelp-scraper)

***

### 🤖 Related MCP servers for AI agents

Building an AI agent, or using Claude, Cursor or ChatGPT? Skip the scraping setup — connect our hosted **MCP servers** (no API keys, billed per call):

- **[Reviews MCP Server](https://apify.com/memo23/reviews-mcp-server)** — search companies, read real Trustpilot review texts, and pull multi‑platform ratings (Trustpilot + App Store + Google Play) straight from your assistant.
- **[Reddit MCP Server](https://apify.com/memo23/reddit-mcp-server)** — search Reddit, browse subreddits, read comment threads.
- **[Email Finder & Verifier MCP](https://apify.com/memo23/email-mcp-server)** — find and verify company emails.
- **[Video Transcripts MCP](https://apify.com/memo23/transcripts-mcp-server)** — full YouTube & TikTok transcripts.

# Actor input Schema

## `searchQueries` (type: `array`):

Find products by name — e.g. `Slack`, `HubSpot`, `Salesforce` — and scrape their reviews. No need to know the G2 URL or slug. Each query runs its own G2 search; use **Max items** to cap results.

## `categorySlugs` (type: `array`):

Scrape every product in a G2 category. Accepts a category slug (`crm`, `project-management`), a subcategory path (`crm/sales-acceleration`), or a full `https://www.g2.com/categories/...` URL.

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

Optional — use instead of, or alongside, the search fields above. Accepts G2 product review URLs, search URLs (`https://www.g2.com/search?query=...`), category URLs, and vendor URLs.

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

Optional shortcut, used in addition to Start URLs: list bare G2 product slugs (e.g. <code>postman</code>, <code>hubspot-marketing-hub</code>) and each maps to that product's reviews page — no URL building needed. The review sorting & filter options below apply to these too.

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

Maximum results to scrape PER start URL — each URL you paste gets its own allowance (e.g. 3 search URLs × 100 = up to 300 rows). Total spend stays bounded by the run's cost limit.

## `maxReviews` (type: `integer`):

Cap on review rows per /products/{slug}/reviews URL. Falls back to Max Listings when unset. Only applies to review URLs.

## `sortOrder` (type: `string`):

How G2 orders the reviews before your Max Listings cap is applied. "Most recent" + a low cap = the freshest reviews only.

## `starFilterCondition` (type: `string`):

How the star value below is applied: exactly that star bucket, that many stars and above (minimum), or that many and below (maximum). Ignored unless a star value is set.

## `starFilterValue` (type: `integer`):

Only reviews in the selected star bucket(s). Example: condition "Minimum of" + 4 → only 4★ and 5★ reviews. Note G2's buckets include half-stars (the 4★ bucket spans 3.5–4.0).

## `lookbackDays` (type: `integer`):

Only reviews published within this many days. Forces most-recent ordering so the scraper can stop early at the cutoff — fewer pages fetched, faster and cheaper. Leave empty for all time.

## `maxConcurrency` (type: `integer`):

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times the crawler will retry a failed request before giving up.

## `proxy` (type: `object`):

Specifies proxy servers that will be used by the scraper in order to hide its origin.<br><br>For details, see <a href='https://apify.com/apify/web-scraper#proxy-configuration' target='_blank' rel='noopener'>Proxy configuration</a> in README.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

## `reviewInsights` (type: `boolean`):

Adds one `review_insights` row per product: rating breakdown & sentiment split, the recurring software complaint themes (bugs, pricing, support, missing features, onboarding, integrations…), top negative-review terms, and feature-request snippets. Deterministic — instant, no AI credits or keys required. Billed per product analyzed.

## `painPointAnalysis` (type: `boolean`):

Adds a single `painPointAnalysis` row per product alongside the reviews: the top complaint themes (each with a severity score and how often it recurs), the missing features users keep asking for, quick wins, overall sentiment, and a short summary — the 'what should we fix / build next' teardown, straight from real reviews. Analyzes up to 200 reviews per product. Requires a paid Apify plan; billed per product analyzed.

## `pageConcurrency` (type: `integer`):

How many list pages (product reviews, search results, or category listings) to fetch in parallel. Each page is an independent unblocker call (fresh IP + anti-bot bypass), so higher = faster with no extra credit cost — but keep it within your scrape.do plan's concurrent-request limit. If exceeded, requests get a 429 and are auto-retried with back-off (slower, but no data lost). Default 3 is safe for the current plan; raise it after upgrading scrape.do.

## `pageDelayMs` (type: `integer`):

Optional pause between parallel page batches. Leave at 0 for fastest scraping (the unblocker already rotates IPs and handles anti-bot per request). Raise it only if you want to be extra gentle.

## `slowMode` (type: `boolean`):

Adds extra warm-up delays and longer back-off between pages for DataDome evasion. Disable only if you've verified your proxy + IPs are clean.

## `useCachedData` (type: `boolean`):

Serve results instantly from our G2 database when we already hold a recent copy of the page (much faster, and no proxy cost). Cached rows are marked with servedFromCache and dataAsOf so you always see how old they are. Turn off to force a live scrape.

## `maxCacheAgeDays` (type: `integer`):

Only serve cached results newer than this many days. Lower = fresher but more live scraping. Defaults: sellers 90d, products 30d, reviews 14d.

## `onlyNewReviews` (type: `boolean`):

For repeat monitoring runs: emit only reviews we haven't already returned for this product, and stop paging once a page is entirely already-seen. Forces most-recent ordering. The first run pulls everything; later runs return just the new reviews and cost far fewer credits. Leave OFF for a full scrape on every run.

## Actor input object example

```json
{
  "searchQueries": [
    "Slack"
  ],
  "maxItems": 10000,
  "sortOrder": "g2_default",
  "starFilterCondition": "exactly",
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 100,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "enrichEmails": false,
  "qualifyByPayment": false,
  "reviewInsights": false,
  "painPointAnalysis": false,
  "pageConcurrency": 3,
  "pageDelayMs": 0,
  "slowMode": true,
  "useCachedData": true,
  "onlyNewReviews": false
}
```

# 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 = {
    "searchQueries": [
        "Slack"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["Slack"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

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