Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
G2 Reviews Scraper icon

G2 Reviews Scraper

Scrape G2 software reviews at $1.70 per 1,000: rating, title, full text, reviewer, date and URL. Works on any product. No G2 account or API key.

130 runs on Apify $0.0017 per review ($1.7 / 1,000)
Run this in the cloudRun on Apify →

Reviews & Reputation Data

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust productUrls, starRatings, regions (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0017 per review = $1.7 per 1,000

You are charged forWhenPrice
Review returnedCharged once per genuine review row. Blocked, empty and sample runs are never charged.$0.0017

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-07, and they are what you are actually charged.

Inputs

FieldWhat it doesType
productUrlsOne entry per product. A full review URL (https://www.g2.com/products/slack/reviews), a product URL (https://www.g2.com/products/slack) or the bare slug (slack) all work. The slug is the part of the G2 URL right after /products/ - copy it from the address bar, because it often differs from the product's display name. Renamed products are followed automatically (zoom -> zoom-workplace).array
starRatingsOptional. Keep only reviews with these star ratings. Leave empty for all ratings. Each rating you pick costs one extra request per product.array
regionsOptional. Keep only reviewers from these regions. Leave empty for worldwide. G2 accepts these six continents and nothing else, country names are rejected. Each region you pick costs one extra request per product.array
publishedAfterOptional. Keep only reviews published on or after this day, written as YYYY-MM-DD. Older reviews are left out and not charged. G2's feed is mostly but not strictly newest first, so a review inside the window can sit beyond what a run reads. Leave it empty to use the last-days field instead.string
lookbackDaysOptional. Keep only reviews published in the last N days, counted back from the start of the run. Used only when Published on or after is empty. Older reviews are left out and not charged.integer
maxReviewsPerProductHard cap on billable review rows for each product. You are charged per review returned, so this is also your budget cap. Reviews come back newest first. G2's feed serves at most 100 reviews per request, so 100 or less is a single request; above that the actor merges extra star-rating and region slices of the same feed until it has enough or the slices run out. How deep that reaches depends on the product - large products yield well over a thousand, small ones return everything they have from the first request.integer
includeProductSummaryOn by default. Adds one extra, never-charged row per product with the average star rating, the 1-5 star breakdown, the review count collected and the newest/oldest review dates.boolean

What you get

A structured dataset — each result includes fields like:

productNamereviewIdtitleratingreviewerNamereviewerRolecompanySizeprosconspublishedAtreviewUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Ready-made automation using this tool

A finished workflow you can import into n8n and run — this tool does the data-gathering inside it. Free, and yours to change.

Collect what customers complain about into one board

Your customers already say what is wrong with your product — on Reddit, on review sites, in app stores. This reads one of those places, pulls out the actual complaint in their own words, groups the wording into consistent themes, and files it. Swap the source without rebuilding anything.

All automations →

Related tools in Reviews & Reputation Data

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Capterra Reviews Scraper iconReviews & Reputation Data

Capterra Reviews Scraper

Scrape Capterra reviews with no API key or login: ratings, pros, cons, sub-scores, reviewer profile. JSON, CSV or Excel. $0.85 per 1,000 reviews.

Ready to run — no setup

Tripadvisor Reviews Scraper iconReviews & Reputation Data

Tripadvisor Reviews Scraper

Scrape Tripadvisor reviews for hotels, restaurants and attractions. Get rating, full text, reviewer, hometown, trip type and owner reply. $0.25/1,000.

1 use cases

Booking.com Reviews Scraper iconReviews & Reputation Data

Booking.com Reviews Scraper

Scrape Booking.com guest reviews. Get the score, title, liked and disliked text, reviewer name, country and stay dates. $1.50 per 1,000 reviews.

Ready to run — no setup

Google Play Reviews Scraper iconApp Store Data

Google Play Reviews Scraper

Google Play reviews by app ID or URL: score, text, reviewer, date, developer reply. Any country. Up to 5,000 per app. $0.09 per 1,000.

Ready to run — no setup

2GIS Reviews Scraper iconMaps & Local Lead Generation

2GIS Reviews Scraper

Scrape 2GIS reviews by place URL or city: rating, text, author, date, photos, owner replies. No API key. $0.50 per 1,000.

Ready to run — no setup

Yelp Scraper iconMaps & Local Lead Generation

Yelp Scraper

Scrape Yelp businesses and reviews through Yelp's official Fusion API. Get rating, review count, price, phone, address, GPS and text. Bring your own key.

Ready to run — no setup

See all Reviews & Reputation Data →

G2 Reviews Scraper: full software reviews with the pros, cons and reviewer, no API key

Give it a G2 product and get its reviews back as rows: the star rating, the title, the answer to each of G2's questions kept as its own field, the reviewer, their role, their company size, the date and the review's own URL. Mostly newest first.

Expect fewer than you asked for on a big product. G2's review feed hands out at most 100 reviews per request, and the extra slices this merges to go deeper run out long before the 5,000 the input will let you type.

InputG2 product URLs or slugs
OutputOne row per review, plus an optional summary row per product
Ceiling5,000 reviews per product
Account neededNone, and no G2 API key
Price$1.70 per 1,000 reviews, flat on every plan

🔍 What G2 Reviews Scraper does

Paste whatever form of the product you have. A review URL, a product URL, or the bare slug on its own. The slug is the part right after /products/, and copying it out of the address bar matters because it is often not the display name. G2 also renames products, and a rename is followed for you: ask for zoom and you land on zoom-workplace.

Ask for 100 or fewer and that is one request, the newest 100. Ask for more and it goes deeper by merging star-rating and region slices of the same feed, deduplicating as it goes, until it has enough or the slices stop producing anything new.

G2 reviews are structured as answers to fixed questions, and that structure is kept. pros, cons, problemsSolved and recommendations come through as separate fields, with reviewText holding the whole thing in one block if you would rather have it that way.

📥 What you give it

{
  "productUrls": ["slack", "https://www.g2.com/products/notion/reviews"],
  "maxReviewsPerProduct": 300,
  "starRatings": ["1", "2"],
  "includeProductSummary": true
}
FieldDefaultWhat it is
productUrlsbox starts at the Slack reviews URLOne entry per product. Review URL, product URL or bare slug. Leave it empty and you get one labelled sample row instead of a real run.
starRatingsall ratingsKeep only these star ratings, 1 to 5. Each one you pick costs an extra request per product.
regionsworldwideNorth America, Europe, Latin America, Asia, Africa or Middle East. G2 takes those six continents and rejects country names.
publishedAfternoneKeep only reviews published on or after this day, written YYYY-MM-DD. Older ones are read and left out, never charged. A product reads no more requests than it would without a date, and stops early when its first request holds nothing inside the window, when that request already held the whole feed, or once five slices in a row add nothing new inside it.
lookbackDaysnoneThe same window as a number of days, counted back from the start of the run. Used only when publishedAfter is empty.
maxReviewsPerProduct100Review rows per product, up to 5,000. This is also your spending cap.
includeProductSummaryonAdds one free row per product with the rating breakdown, the date range and how complete the set is.
proxyConfigurationoffOptional. Your own servers, used exactly as given.

Filters and depth pull against each other. When you pick star ratings or regions, only those slices are read, so a filtered request for 500 reviews can honestly return 90. That is the filter working, not the run failing.

📤 What you get back

A real row from a recent run:

{
  "ok": true,
  "productSlug": "slack",
  "productName": "Slack",
  "productUrl": "https://www.g2.com/products/slack/reviews",
  "reviewId": "slack-review-13501744",
  "reviewNumericId": 13501744,
  "reviewUrl": "https://www.g2.com/products/slack/reviews/slack-review-13501744",
  "title": "Powerful Tool Packed with Helpful Insights",
  "publishedAt": "2026-09-17T21:55:03.000Z",
  "publishedAtRaw": "Thu, 17 Sep 2026 16:55:03 -0500",
  "reviewerName": "Anupama V.",
  "rating": 4.5,
  "reviewerRole": "G2 User",
  "companySize": null,
  "pros": "Its too powerful and gives lots of helpful insights",
  "cons": "Nothing at all its great and sometimes it may get overwhelming",
  "problemsSolved": "We dont have slack yet in our company",
  "recommendations": null,
  "reviewText": "What do you like best about Slack?\nIts too powerful and gives lots of helpful insights\n\nWhat do you dislike about Slack?\nNothing at all its great and sometimes it may get overwhelming\n\n...",
  "source": "g2-review-feed",
  "scrapedAt": "2026-09-20T07:02:51.911Z"
}

reviewText on that row is cut short here. The real field holds every answer block.

FieldWhat it is
ratingA number, and it can be fractional. 4.5 is a real value, not a rounding error.
pros, cons, problemsSolved, recommendationsG2's four questions, each kept separate. Any of them is null when the reviewer skipped it.
reviewerRoleThe reviewer's job title, or G2 User when they did not publish one.
companySizenull whenever G2 did not publish it, which happens often enough to plan for.
reviewerNameG2 publishes a first name and an initial. There is no full name to get.
reviewIdThe stable slug-based id, with reviewNumericId beside it. Use either to dedupe across runs.
publishedAtAn ISO timestamp, with G2's original wording kept in publishedAtRaw.

🧾 Reading the output

Four kinds of row can land in your dataset.

RowHow to spot itCharged
A reviewa reviewId and none of the flags belowyes
The product summary_summary: trueno
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

Filter on the three flags, not on ok. The summary and sample rows both carry ok: true.

The summary row is where you check whether you got everything:

FieldWhat it tells you
reviewsCollectedHow many reviews came back for that product.
isCompleteReviewHistorytrue only when G2's plain feed fitted in one response, meaning there was genuinely nothing more to fetch.
samplingnewest-first, sliced or filtered, which is how the set was gathered.
averageRatingA real mean on a newest-first run. Deliberately null on a sliced run, because merging equal-sized slices of each star rating produces a number that looks like a G2 score and is not one.
ratingBreakdownThe counts per star, describing what was actually returned.
newestReviewAt, oldestReviewAtThe date range you ended up with.
requestsUsed, resolvedFeedUrlHow much work it took, and where the feed finally resolved after any rename.
publishedAfter, reviewsOutsideWindowOnly with a date set: the cutoff used, and how many older reviews were read and left out.
CodeWhat it means
BAD_INPUTNone of the entries looked like a G2 product (the row lists what was rejected), or the date could not be read. A bad date stops the run before anything is read.
NOT_FOUNDG2 has no product at that slug. Open the product on g2.com and copy the slug out of the URL.
BLOCKEDG2 refused the feed for that product. Try again shortly.
FETCH_FAILEDThe feed answered with something other than a usable response.
NO_RESULTSThe feed loaded and held no reviews for that product, or none of the reviews read fell inside your date window.

▶️ How to run it

1. Open G2 Reviews Scraper and click Try for free. 2. Put your products into G2 product URLs or slugs, one per line. 3. Set Maximum reviews per product. Start at 100 to see the row shape in a single request. 4. Add star ratings or regions only if you want them narrowed, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$1.70 per 1,000 reviews. Flat on every Apify plan, no volume tiers.

You pay per review row delivered. Summary rows, the sample row, diagnostic rows, reviews outside your date window and reviews already seen in the same run are all free, and a product that returns nothing is not charged.

💡 What people use it for

  • Reading every one and two star review of a competitor to find what its customers keep complaining

about.

  • Pulling the problemsSolved field across a category, which is the closest thing to buyers

describing their own use case.

  • Watching your own product on a schedule with lookbackDays set to the gap between runs, deduping

on reviewId so each run is only what is new.

  • Comparing the rating breakdown of several products in one run, using the summary rows.
  • Feeding pros and cons to a model separately, so it does not have to split a wall of text first.

🚧 What it does not do

  • No product search. Give it slugs or URLs for products you already have.
  • No sort order. G2's feed ignores sort settings and comes in its own order: mostly newest

first, with a few older reviews mixed in. That is also why a date window can miss a review sitting deeper in the feed than a run reads.

  • No vendor replies. G2 publishes them on the page, not in the feed this reads.
  • No full history on a large product. The feed's depth runs out, and

isCompleteReviewHistory tells you when that happened.

  • No full reviewer names. G2 publishes a first name and an initial, and that is all there is.
  • companySize and reviewerRole are often missing, because reviewers leave them blank.
  • No G2 score, no grid position, no category ranking.
  • A sliced run gives no average rating on purpose. Use ratingBreakdown instead.
  • Rows for a product arrive only after all its requests finish, so a run that stops partway

delivers nothing for the product it was mid-way through.

  • Rows are a snapshot. Reviews get edited and removed, and scrapedAt records when yours was

read.

🧭 Which review scraper do you need?

If you wantUse
G2 software reviews with pros and cons split outThis one
Software reviews from CapterraCapterra Reviews Scraper
Company reviews from TrustpilotTrustpilot Scraper
What employees say about a companyGlassdoor Reviews Scraper
Mobile app reviewsGoogle Play Reviews Scraper

❓ Questions people ask

Do I need a G2 account or API key? No. It reads the public review feed.

What do I put in the field? The product's slug, the part of the G2 URL after /products/. A full review URL works too. The field is productUrls.

Why did I get 100 reviews when I asked for 500? Either the product genuinely has around that many, or the deeper slices stopped returning anything new. Check isCompleteReviewHistory on the summary row.

Why is averageRating empty? Because that set was gathered by slicing across star ratings, and a mean over equal-sized slices would look like a product score without being one.

Can I get only the bad reviews? Yes. Put 1 and 2 in Only these star ratings.

Is scraping reviews legal? These are public reviews on public pages. They carry personal data all the same, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the slug you used. The errorCode on the diagnostic row usually names the problem on its own.