G2 Reviews Scraper - Likes, Dislikes & Reviewer Role, No Login
Pricing
$4.99 / 1,000 reviews
G2 Reviews Scraper - Likes, Dislikes & Reviewer Role, No Login
G2 software reviews by product URL: star rating, title, what reviewers like and dislike, problems solved, reviewer role, industry and company size (never names), plus product rating, review count, vendor and categories. No login or cookies. Partial results are marked, never shown as empty.
Pricing
$4.99 / 1,000 reviews
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Security
Limited permissionsShare
G2 Reviews Scraper
A Lantern Lab Actor. Give it G2 product URLs and get the public software reviews back: star rating, title, what reviewers like and dislike, the problems the product solves for them, and the reviewer's role, industry and company size. Each product also gets its G2 star rating, review count, vendor and categories. No G2 login, no cookies.
Price: you pay per review collected. Product rows, status rows and the run summary are free, and so is a URL that finds nothing.
Quick example
Input:
{"productUrls": ["https://www.g2.com/products/notion/reviews"],"maxReviewsPerProduct": 100,"sort": "most_recent"}
One review row (recordType: "review", shortened):
{"recordType": "review","reviewId": "13469971","reviewUrl": "https://www.g2.com/products/notion/reviews/notion-review-13469971","productName": "Notion","rating": 5,"title": "Notion Replaced Three Tools with One Powerful, Fast Workspace","likes": "Notion replaced three separate tools for us: wiki, task tracker and CRM with one workspace. ...","dislikes": "Permissions are still coarse - sharing a single database view with a client without exposing the rest of the workspace takes more workarounds than it should. ...","problemsSolved": "Notion gives each of our client client one page with brief, lead lists and results linked together, ...","reviewerRole": "Founder","reviewerIndustry": "Computer Software","companySize": "Small-Business (50 or fewer emp.)","reviewSource": "Organic","incentivized": false,"validatedReviewer": true,"publishedAt": "2026-09-15","updatedAt": null,"partial": false,"collectedAt": "2026-10-23T17:05:12.408Z"}
One product row (recordType: "product", free):
{"recordType": "product","name": "Notion","vendor": "Notion","category": "AI Chatbots","categories": ["AI Chatbots", "Knowledge Base", "Note-Taking Software", "Project Management", "..."],"rating": 4.6,"reviewCount": 13885,"url": "https://www.g2.com/products/notion/reviews","reviewsAvailable": 100,"reviewsReturned": 100,"partial": false,"statusText": "Collected 100 review(s) of 13885 on G2."}
Limits
- Up to 100 reviews per product in each order. G2 shows a signed-out visitor 10 pages of 10 reviews; asking for page 11 returns page 10 again. Choose the order (
most_recent,most_helpful,highest_rated,lowest_ratedor G2's default) to decide which 100. - Public data only. The reviewer's name, avatar and profile link are never collected, even where G2 shows them. A reviewer who hid their name appears on G2 as "Verified User in
- G2 shows role, industry and company size only when the reviewer gave them, so any of the three can be
null. When G2 shows a single line besides the company size it is written asreviewerRole. - Each G2 page takes 20-50 seconds to load through the anti-bot layer; a product with 100 reviews took about 4 minutes in our test runs. Products are collected one after another.
- Vendor name and categories come from G2's full product page, which for a few products (Canva, for example) is too slow to load through the anti-bot layer. Those products are still collected in full from the review list - name, rating, review count and every review - with
vendorandcategoriesnullandprofileComplete: false. most_recentis G2's own order, by the date a review was last updated: a 2023 review the reviewer refreshed this month is near the top, withpublishedAt2023 andupdatedAtthis month.- English G2 pages only. No vendor responses, screenshots, pricing, feature scores, comparisons or G2 Grid data.
- No scheduling or monitoring built in; use Apify schedules.
What it does
- Accepts product URLs (
https://www.g2.com/products/<product>/reviews, with or without/reviews, or just the slug). - Returns the three answers of a G2 review as their own fields (
likes,dislikes,problemsSolved), all of them as onetext, andsectionswith each question and answer in page order. The full answer is returned, not the "Show More" preview. - Keeps G2's own review signals:
reviewSource(for exampleOrganic,Seller invite,G2 invite),incentivized,validatedReviewer,currentUser,aiTranslatedand the rawbadgeslist. - Deduplicates across the whole run: a product reached by two URLs is collected once, and a review is written and charged once.
- Keeps the source identifier (
reviewId), G2's review date and update date (publishedAt,updatedAt) and our collection time (collectedAt) as separate fields. - Says what happened to every input and product. A product with no reviews, a URL that is not a product, and a product that was cut short are different records and are never confused: a cut-short product is marked
partial: truewith the reason. - Gets past G2's bot protection (DataDome) through Apify's Unblocker proxy, and retries a refused or failed page up to 5 times, with a short wait in between.
- Caps itself:
maxUpstreamRequestsis a hard ceiling on requests to G2 for the whole run, retries included, derived from your input when you leave it empty, so a run is never unbounded.
Input
| Field | Default | Meaning |
|---|---|---|
productUrls | — | G2 product URLs or slugs, one per line. |
maxReviewsPerProduct | 100 | Upper bound on reviews per product. 0 collects only the product profile. Max 100 (what G2 shows a signed-out visitor). |
sort | most_recent | most_recent, g2_default, most_helpful, highest_rated or lowest_rated. Decides which reviews a limit keeps. |
maxUpstreamRequests | derived | Hard ceiling on requests to G2 for the whole run, retries included. |
Output
One row per review, recordType: "review", charged:
| Field | Meaning |
|---|---|
reviewId, reviewUrl | G2's own review ID (the dedupe key) and the public review page. |
productId, productName, productSlug | The product reviewed. |
rating | Star rating out of 5, in half stars. |
title | The review headline. |
likes, dislikes | "What do you like best about ...?" and "What do you dislike about ...?" |
problemsSolved | "What problems is ... solving and how is that benefiting you?" |
text, sections | Every answer as one text, and as {question, answer} pairs. |
reviewerRole, reviewerIndustry, companySize | The reviewer's role and company profile, as G2 shows them. Never the name. |
reviewSource, incentivized, validatedReviewer, currentUser, aiTranslated, badges | G2's review signals. |
publishedAt, updatedAt | The review's date and, when the reviewer updated it, the update date (YYYY-MM-DD). |
partial, partialReason | Always false / null on a review row: the row exists because the review was collected. |
collectedAt | Our own collection time. |
One row per product, recordType: "product", free: name, vendor, vendorId, category (the first of categories), categories, rating (average stars out of 5), reviewCount (all reviews G2 counts), url, profileComplete (false when the product page did not load and vendor / categories are null), then reviewsAvailable (what G2 shows a signed-out visitor, at most 100) / reviewsRequested / reviewsReturned / duplicatesSkipped, and partial / partialReason (upstream_request_cap, charge_limit_reached, blocked, upstream_error, not_collected) with statusText.
One row per product URL, recordType: "input_status", free: outcome is found, not_found (no such product on G2), invalid_url (not a G2 product URL) or partial, with productSlug and statusText.
The last row is recordType: "RUN_SUMMARY" — what the inputs resolved to, products and reviews collected and charged, products with no review, partial products by reason, requests sent (retries included) and why collection stopped. The same object is also in the run's key-value store under RUN_SUMMARY.