G2 Reviews Scraper - Software Reviews, No API Key avatar

G2 Reviews Scraper - Software Reviews, No API Key

Pricing

from $1.70 / 1,000 review returneds

Go to Apify Store
G2 Reviews Scraper - Software Reviews, No API Key

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

6 hours ago

Last modified

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.

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.
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.
CodeWhat it means
BAD_INPUTNone of the entries looked like a G2 product. The row lists what was rejected.
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.

▶️ 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 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 and 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 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.