G2 Reviews Scraper avatar

G2 Reviews Scraper

Under maintenance

Pricing

from $2.50 / 1,000 results

Go to Apify Store
G2 Reviews Scraper

G2 Reviews Scraper

Under maintenance

Scrape the 10 most recent G2 reviews for any software product: star rating, headline, pros and cons kept as two fields rather than one merged body, reviewerRole, companySegment of Small-Business, Mid-Market or Enterprise, industry, the Validated Reviewer flag, publishedAt and a permalink per review.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

String

String

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

17 days ago

Last modified

Categories

Share

What does the G2 Reviews Scraper do?

Give this Actor a G2 product slug such as slack and it returns the 10 most recent reviews for that product. Each row has the star rating, the review headline, the two survey answers G2 asks everyone ("What do you like best?" and "What do you dislike?") kept as separate pros and cons fields, and the reviewer's job title, company segment and industry where they disclosed them.

The company segment is the field that makes G2 worth reading. Small-Business, Mid-Market and Enterprise sit on every review, so you can ask whether a complaint about scale comes from people operating at scale, rather than averaging a 40-person agency's opinion together with a bank's.

  • pros and cons separated at the source, so no splitting a merged review body afterwards
  • companySegment and industry for slicing sentiment by buyer type
  • isValidated flags G2's "Validated Reviewer" badge, letting you weight verified feedback
  • reviewUrl is a real permalink to the individual review
  • No G2 account, cookie or API key anywhere in the run

What data does it extract?

FieldTypeDescription
reviewIdstringG2's own review ID, stable across runs. Use it to de-duplicate
productSlugstringThe G2 product slug requested, e.g. slack
productNamestringG2's display name for the product
titlestringThe review headline, with G2's wrapping quotes stripped
ratingnumberStars out of 5, e.g. 4.5
prosstringThe answer to "What do you like best?"
consstringThe answer to "What do you dislike?"
reviewerNamestringnull where G2 publishes the reviewer as "Verified User"
reviewerRolestringThe reviewer's job title, where they disclosed one
companySegmentstringSmall-Business, Mid-Market or Enterprise
industrystringThe reviewer's industry, where disclosed
isValidatedbooleantrue when the review carries G2's "Validated Reviewer" badge
publishedAtstringReview date as YYYY-MM-DD
reviewUrlstringPermalink to that single G2 review
sourceUrlstringThe G2 URL the row was read from
collectedAtstringISO timestamp of the fetch

An anonymous reviewer still contributes a usable row. G2 renders them as "Verified User in Computer Software", so reviewerName is null while industry keeps the part they did disclose.

Why scrape G2?

  • Track what buyers say about every product in your category and where the complaints cluster, week over week
  • Lift cons verbatim into win/loss notes and battlecards, since a customer's own words land better in a sales conversation than a feature matrix
  • Filter to Enterprise before concluding a product does not scale, and to Small-Business before concluding it is too expensive
  • Point it at your own product on a schedule and diff by reviewId to catch new reviews the day they appear
  • Feed the review text into a topic model with the segment, industry and date already attached to each row

How to use it

  1. Click Try for free above, or add the Actor to your Apify account.
  2. Put your product slugs in the Product slugs or URLs field, one per line. The slug is the last path segment of a G2 product URL: slack from https://www.g2.com/products/slack/reviews.
  3. Full G2 product URLs work too, and a slug and its URL collapse to a single fetch.
  4. Set Maximum results for a ceiling on the dataset, and Concurrency if you are running a long product list.
  5. Click Start, then export from the Dataset tab as JSON, CSV or Excel.
  6. The run's SUMMARY record lists any product that failed and the error behind it.

Input

FieldTypeDefaultDescription
productsarray of stringsrequiredG2 product slugs (slack) or full g2.com/products/... URLs. Between 1 and 100 entries. Duplicates collapse to one fetch
maxItemsinteger1000Ceiling on dataset rows, 1 to 50000
concurrencyinteger3Products fetched in parallel, 1 to 5
{
"products": ["slack", "https://www.g2.com/products/asana/reviews", "notion"],
"maxItems": 1000,
"concurrency": 3
}

A URL on any host other than g2.com is rejected and reported as a failed target rather than fetched, so a bad paste in a long list does not cost you the run.

Output

One row per review. The shape below is illustrative — it shows the fields and their types, not a captured run.

{
"reviewId": "10842771",
"productSlug": "slack",
"productName": "Slack",
"title": "The fastest way to kill internal email",
"rating": 4.5,
"pros": "Channels keep every project conversation in one searchable place, and the integrations mean I stop switching tabs.",
"cons": "Notification settings are fiddly enough that most of my team never gets them right.",
"reviewerName": null,
"reviewerRole": "Product Manager",
"companySegment": "Mid-Market",
"industry": "Computer Software",
"isValidated": true,
"publishedAt": "2026-07-25",
"reviewUrl": "https://www.g2.com/products/slack/reviews/slack-review-10842771",
"sourceUrl": "https://www.g2.com/products/slack/reviews_and_filters?order=most_recent",
"collectedAt": "2026-08-21T09:14:03.512Z"
}

Reliability

Reviews are read from the reviews_and_filters frame rather than from /products/<slug>/reviews. The public reviews page is a shell: it lazily loads that frame and server-renders exactly one schema.org review node, so fetching it plainly yields a single review and no cards at all.

The frame carries the ten review cards plus its own JSON-LD copy of them, and the cards are the source because the JSON-LD is a strict subset. It has no review ID, it concatenates all three survey answers into one reviewBody instead of splitting pros from cons, and it omits the company segment, the industry and the validated badge. Six of the sixteen fields in this Actor's output exist only in the markup.

Two of those fields are recovered by position rather than by a label, because G2 renders the job title, the industry and the segment badge with one shared class. The segment badge is the last of the three, and a job title always renders above an industry, which is what the parse relies on. Neither is guaranteed present, and a missing one comes back as null.

A product that cannot be read is recorded in the run's SUMMARY under failures rather than quietly returning fewer rows, and a run where every product failed exits with an error. There are no retries: the String Unblocker behind this Actor owns proxy rotation and solver selection.

Limitations

One page of reviews per product, ordered most recent first. This is not a full review-history crawler and there is no date filter, rating filter or alternative sort. The third G2 survey answer ("What problems is the product solving and how is that benefiting you?") is not emitted, and no product-level fields are collected: no overall score, pricing, feature grid or competitor comparison. Only g2.com URLs are accepted.

How much does it cost?

Pricing is per event: one charge for each review row written to the dataset. A product that fails produces no rows and costs nothing. The current rate is in the pricing panel at the top of this page.

Runs started from an Apify free plan stop at 250 requests and 250 results and report the cap in the run's status message; any paid plan runs the full input and whatever maxItems you set. The cap exists because this Actor fetches through String's own infrastructure, which Apify does not reimburse on free-plan runs, and it binds on requests as well as rows so a long product list cannot spend those fetches on rows the run will not return.

Using it with the Apify API

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const run = await client.actor("usestring/g2-reviews").call({
products: ["slack", "notion", "asana"],
concurrency: 3
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const enterprise = items.filter((review) => review.companySegment === "Enterprise");
console.log(enterprise.map((review) => [review.productSlug, review.rating, review.cons]));
const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord("SUMMARY");
console.log(summary?.value);

The Actor reads the public review content a logged-out visitor sees. There is no account, no session cookie and no paywall. Scraping public web pages is broadly lawful in the US and the EU, and courts have repeatedly declined to treat reading a public page as unauthorised access.

Reviews are opinions their authors published under a display name or anonymously, and G2 shows them to any visitor. A displayed name is still personal data under GDPR when the reviewer is in the EU, so have a lawful basis before storing rows in Europe, and consider dropping reviewerName where your analysis does not need it — most of the value sits in the segment, the industry and the text. Review text belongs to its author and to G2, so analyse it rather than republishing it. None of this is legal advice.

  • Capterra Reviews Scraper — the sister listing. Capterra returns 25 reviews per product and scores ease of use, customer service and value for money separately, so the two together give both depth of sample and depth of rating.
  • Glassdoor Jobs Scraper — a competitor's open roles, which tend to telegraph the roadmap before the reviews do.
  • LinkedIn Profile Scraper — the people behind a competitor, by profile URL.
  • Yahoo Finance Quote Scraper — price, market cap and PE ratio for the listed vendors in your category.

FAQ

How do I scrape G2 reviews? Run this Actor with a list of G2 product slugs, which is the last path segment of a product's G2 URL. slack comes from https://www.g2.com/products/slack/reviews. Full product URLs also work.

How many reviews do I get per product? 10 — the most recent page, one G2 request per product. Ten products therefore return roughly 100 rows.

Does it page through every review on a product? No. It collects the first page of the most-recent ordering only, so it does not return a product's full review history.

Do I need a G2 account, API key or cookies? No. Only the public, logged-out review content is read.

Are pros and cons separate fields? Yes. pros and cons carry the two survey answers separately, so you never have to split one review body afterwards.

Why is reviewerName empty on some rows? G2 publishes those reviews under "Verified User" rather than a name. Where the reviewer disclosed an industry, G2 appends it to that placeholder and the Actor keeps it in industry.

How is this different from the Capterra Reviews Scraper? G2 gives you 10 recent reviews with a company segment, a validated-reviewer flag and a per-review permalink. Capterra gives you 25 with three separate sub-ratings and a company-size band. Different reviewer bases and different fields, so run both when the answer matters.

Feedback

If a product slug fails or a field parses wrong, open an issue from the Issues tab on this Actor's Store page and include the slug that reproduces it.