G2 Reviews Scraper - Software Reviews, No API Key
Pricing
from $1.70 / 1,000 review returneds
G2 Reviews Scraper - Software Reviews, No API Key
Scrape G2 reviews for any software product. Each review comes back in full: rating, title, the whole text, reviewer, date and review URL. You need no G2 account and no API key. $1.70 per 1,000 reviews, the same flat price on every plan.
Pricing
from $1.70 / 1,000 review returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
6 hours ago
Last modified
Categories
Share
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. 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. |
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. |
| Code | What it means |
|---|---|
BAD_INPUT | None of the entries looked like a G2 product. The row lists what was rejected. |
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. |
▶️ How to run it
- Open G2 Reviews Scraper and click Try for free.
- Put your products into G2 product URLs or slugs, one per line.
- Set Maximum reviews per product. Start at 100 to see the row shape in a single request.
- Add star ratings or regions only if you want them narrowed, then click Start.
- 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 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 and deduping on
reviewIdso 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 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
isCompleteReviewHistorytells 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.