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.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
productUrls,starRatings,regions(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export 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 for | When | Price |
|---|---|---|
| Review returned | Charged 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
| Field | What it does | Type |
|---|---|---|
productUrls | One 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 |
starRatings | Optional. Keep only reviews with these star ratings. Leave empty for all ratings. Each rating you pick costs one extra request per product. | array |
regions | Optional. 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 |
publishedAfter | Optional. 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 |
lookbackDays | Optional. 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 |
maxReviewsPerProduct | Hard 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 |
includeProductSummary | On 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:
productNamereviewIdtitleratingreviewerNamereviewerRolecompanySizeprosconspublishedAtreviewUrlExport 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.
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
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.
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.
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.
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.
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.
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.
Where this tool sits
- Categories
- Reviews & Reputation Data Ad Intelligence & Competitor Research
- Platforms
- G2 & Capterra
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.
| Input | G2 product URLs or slugs |
| Output | One row per review, plus an optional summary row per product |
| Ceiling | 5,000 reviews per product |
| Account needed | None, 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
}
| Field | Default | What it is |
|---|---|---|
productUrls | box starts at the Slack reviews URL | One 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. |
starRatings | all ratings | Keep only these star ratings, 1 to 5. Each one you pick costs an extra request per product. |
regions | worldwide | North America, Europe, Latin America, Asia, Africa or Middle East. G2 takes those six continents and rejects country names. |
publishedAfter | none | Keep 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. |
lookbackDays | none | The same window as a number of days, counted back from the start of the run. Used only when publishedAfter is empty. |
maxReviewsPerProduct | 100 | Review rows per product, up to 5,000. This is also your spending cap. |
includeProductSummary | on | Adds one free row per product with the rating breakdown, the date range and how complete the set is. |
proxyConfiguration | off | Optional. 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.
| Field | What it is |
|---|---|
rating | A number, and it can be fractional. 4.5 is a real value, not a rounding error. |
pros, cons, problemsSolved, recommendations | G2's four questions, each kept separate. Any of them is null when the reviewer skipped it. |
reviewerRole | The reviewer's job title, or G2 User when they did not publish one. |
companySize | null whenever G2 did not publish it, which happens often enough to plan for. |
reviewerName | G2 publishes a first name and an initial. There is no full name to get. |
reviewId | The stable slug-based id, with reviewNumericId beside it. Use either to dedupe across runs. |
publishedAt | An ISO timestamp, with G2's original wording kept in publishedAtRaw. |
🧾 Reading the output
Four kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A review | a reviewId and none of the flags below | yes |
| The product summary | _summary: true | no |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
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:
| Field | What it tells you |
|---|---|
reviewsCollected | How many reviews came back for that product. |
isCompleteReviewHistory | true only when G2's plain feed fitted in one response, meaning there was genuinely nothing more to fetch. |
sampling | newest-first, sliced or filtered, which is how the set was gathered. |
averageRating | A 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. |
ratingBreakdown | The counts per star, describing what was actually returned. |
newestReviewAt, oldestReviewAt | The date range you ended up with. |
requestsUsed, resolvedFeedUrl | How much work it took, and where the feed finally resolved after any rename. |
publishedAfter, reviewsOutsideWindow | Only with a date set: the cutoff used, and how many older reviews were read and left out. |
| Code | What it means |
|---|---|
BAD_INPUT | None 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_FOUND | G2 has no product at that slug. Open the product on g2.com and copy the slug out of the URL. |
BLOCKED | G2 refused the feed for that product. Try again shortly. |
FETCH_FAILED | The feed answered with something other than a usable response. |
NO_RESULTS | The 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
problemsSolvedfield across a category, which is the closest thing to buyers
describing their own use case.
- Watching your own product on a schedule with
lookbackDaysset 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.
companySizeandreviewerRoleare 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
ratingBreakdowninstead. - 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
scrapedAtrecords when yours was
read.
🧭 Which review scraper do you need?
| If you want | Use |
|---|---|
| G2 software reviews with pros and cons split out | This one |
| Software reviews from Capterra | Capterra Reviews Scraper |
| Company reviews from Trustpilot | Trustpilot Scraper |
| What employees say about a company | Glassdoor Reviews Scraper |
| Mobile app reviews | Google 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.