G2 Reviews Scraper
Under maintenancePricing
from $2.50 / 1,000 results
G2 Reviews Scraper
Under maintenanceScrape the 10 most recent G2 reviews for any software product: star rating, headline, pros and cons kept as two fields rather than one merged body, reviewerRole, companySegment of Small-Business, Mid-Market or Enterprise, industry, the Validated Reviewer flag, publishedAt and a permalink per review.
What does the G2 Reviews Scraper do?
Give this Actor a G2 product slug such as slack and it returns the 10 most recent reviews for that
product. Each row has the star rating, the review headline, the two survey answers G2 asks everyone
("What do you like best?" and "What do you dislike?") kept as separate pros and cons fields, and
the reviewer's job title, company segment and industry where they disclosed them.
The company segment is the field that makes G2 worth reading. Small-Business, Mid-Market and
Enterprise sit on every review, so you can ask whether a complaint about scale comes from people
operating at scale, rather than averaging a 40-person agency's opinion together with a bank's.
prosandconsseparated at the source, so no splitting a merged review body afterwardscompanySegmentandindustryfor slicing sentiment by buyer typeisValidatedflags G2's "Validated Reviewer" badge, letting you weight verified feedbackreviewUrlis a real permalink to the individual review- No G2 account, cookie or API key anywhere in the run
What data does it extract?
| Field | Type | Description |
|---|---|---|
reviewId | string | G2's own review ID, stable across runs. Use it to de-duplicate |
productSlug | string | The G2 product slug requested, e.g. slack |
productName | string | G2's display name for the product |
title | string | The review headline, with G2's wrapping quotes stripped |
rating | number | Stars out of 5, e.g. 4.5 |
pros | string | The answer to "What do you like best?" |
cons | string | The answer to "What do you dislike?" |
reviewerName | string | null where G2 publishes the reviewer as "Verified User" |
reviewerRole | string | The reviewer's job title, where they disclosed one |
companySegment | string | Small-Business, Mid-Market or Enterprise |
industry | string | The reviewer's industry, where disclosed |
isValidated | boolean | true when the review carries G2's "Validated Reviewer" badge |
publishedAt | string | Review date as YYYY-MM-DD |
reviewUrl | string | Permalink to that single G2 review |
sourceUrl | string | The G2 URL the row was read from |
collectedAt | string | ISO timestamp of the fetch |
An anonymous reviewer still contributes a usable row. G2 renders them as "Verified User in Computer
Software", so reviewerName is null while industry keeps the part they did disclose.
Why scrape G2?
- Track what buyers say about every product in your category and where the complaints cluster, week over week
- Lift
consverbatim into win/loss notes and battlecards, since a customer's own words land better in a sales conversation than a feature matrix - Filter to
Enterprisebefore concluding a product does not scale, and toSmall-Businessbefore concluding it is too expensive - Point it at your own product on a schedule and diff by
reviewIdto catch new reviews the day they appear - Feed the review text into a topic model with the segment, industry and date already attached to each row
How to use it
- Click Try for free above, or add the Actor to your Apify account.
- Put your product slugs in the Product slugs or URLs field, one per line. The slug is the last
path segment of a G2 product URL:
slackfromhttps://www.g2.com/products/slack/reviews. - Full G2 product URLs work too, and a slug and its URL collapse to a single fetch.
- Set Maximum results for a ceiling on the dataset, and Concurrency if you are running a long product list.
- Click Start, then export from the Dataset tab as JSON, CSV or Excel.
- The run's
SUMMARYrecord lists any product that failed and the error behind it.
Input
| Field | Type | Default | Description |
|---|---|---|---|
products | array of strings | required | G2 product slugs (slack) or full g2.com/products/... URLs. Between 1 and 100 entries. Duplicates collapse to one fetch |
maxItems | integer | 1000 | Ceiling on dataset rows, 1 to 50000 |
concurrency | integer | 3 | Products fetched in parallel, 1 to 5 |
{"products": ["slack", "https://www.g2.com/products/asana/reviews", "notion"],"maxItems": 1000,"concurrency": 3}
A URL on any host other than g2.com is rejected and reported as a failed target rather than
fetched, so a bad paste in a long list does not cost you the run.
Output
One row per review. The shape below is illustrative — it shows the fields and their types, not a captured run.
{"reviewId": "10842771","productSlug": "slack","productName": "Slack","title": "The fastest way to kill internal email","rating": 4.5,"pros": "Channels keep every project conversation in one searchable place, and the integrations mean I stop switching tabs.","cons": "Notification settings are fiddly enough that most of my team never gets them right.","reviewerName": null,"reviewerRole": "Product Manager","companySegment": "Mid-Market","industry": "Computer Software","isValidated": true,"publishedAt": "2026-07-25","reviewUrl": "https://www.g2.com/products/slack/reviews/slack-review-10842771","sourceUrl": "https://www.g2.com/products/slack/reviews_and_filters?order=most_recent","collectedAt": "2026-08-21T09:14:03.512Z"}
Reliability
Reviews are read from the reviews_and_filters frame rather than from /products/<slug>/reviews.
The public reviews page is a shell: it lazily loads that frame and server-renders exactly one
schema.org review node, so fetching it plainly yields a single review and no cards at all.
The frame carries the ten review cards plus its own JSON-LD copy of them, and the cards are the
source because the JSON-LD is a strict subset. It has no review ID, it concatenates all three survey
answers into one reviewBody instead of splitting pros from cons, and it omits the company segment,
the industry and the validated badge. Six of the sixteen fields in this Actor's output exist only in
the markup.
Two of those fields are recovered by position rather than by a label, because G2 renders the job
title, the industry and the segment badge with one shared class. The segment badge is the last of
the three, and a job title always renders above an industry, which is what the parse relies on.
Neither is guaranteed present, and a missing one comes back as null.
A product that cannot be read is recorded in the run's SUMMARY under failures rather than
quietly returning fewer rows, and a run where every product failed exits with an error. There are no
retries: the String Unblocker behind this Actor owns proxy rotation and solver selection.
Limitations
One page of reviews per product, ordered most recent first. This is not a full review-history
crawler and there is no date filter, rating filter or alternative sort. The third G2 survey answer
("What problems is the product solving and how is that benefiting you?") is not emitted, and no
product-level fields are collected: no overall score, pricing, feature grid or competitor
comparison. Only g2.com URLs are accepted.
How much does it cost?
Pricing is per event: one charge for each review row written to the dataset. A product that fails produces no rows and costs nothing. The current rate is in the pricing panel at the top of this page.
Runs started from an Apify free plan stop at 250 requests and 250 results and report the cap in the
run's status message; any paid plan runs the full input and whatever maxItems you set. The cap
exists because this Actor fetches through String's own infrastructure, which Apify does not
reimburse on free-plan runs, and it binds on requests as well as rows so a long product list cannot
spend those fetches on rows the run will not return.
Using it with the Apify API
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });const run = await client.actor("usestring/g2-reviews").call({products: ["slack", "notion", "asana"],concurrency: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();const enterprise = items.filter((review) => review.companySegment === "Enterprise");console.log(enterprise.map((review) => [review.productSlug, review.rating, review.cons]));const summary = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord("SUMMARY");console.log(summary?.value);
Is it legal to scrape G2?
The Actor reads the public review content a logged-out visitor sees. There is no account, no session cookie and no paywall. Scraping public web pages is broadly lawful in the US and the EU, and courts have repeatedly declined to treat reading a public page as unauthorised access.
Reviews are opinions their authors published under a display name or anonymously, and G2 shows them
to any visitor. A displayed name is still personal data under GDPR when the reviewer is in the EU,
so have a lawful basis before storing rows in Europe, and consider dropping reviewerName where
your analysis does not need it — most of the value sits in the segment, the industry and the text.
Review text belongs to its author and to G2, so analyse it rather than republishing it. None of this
is legal advice.
Related actors
- Capterra Reviews Scraper — the sister listing. Capterra returns 25 reviews per product and scores ease of use, customer service and value for money separately, so the two together give both depth of sample and depth of rating.
- Glassdoor Jobs Scraper — a competitor's open roles, which tend to telegraph the roadmap before the reviews do.
- LinkedIn Profile Scraper — the people behind a competitor, by profile URL.
- Yahoo Finance Quote Scraper — price, market cap and PE ratio for the listed vendors in your category.
FAQ
How do I scrape G2 reviews?
Run this Actor with a list of G2 product slugs, which is the last path segment of a product's G2
URL. slack comes from https://www.g2.com/products/slack/reviews. Full product URLs also work.
How many reviews do I get per product? 10 — the most recent page, one G2 request per product. Ten products therefore return roughly 100 rows.
Does it page through every review on a product? No. It collects the first page of the most-recent ordering only, so it does not return a product's full review history.
Do I need a G2 account, API key or cookies? No. Only the public, logged-out review content is read.
Are pros and cons separate fields?
Yes. pros and cons carry the two survey answers separately, so you never have to split one
review body afterwards.
Why is reviewerName empty on some rows?
G2 publishes those reviews under "Verified User" rather than a name. Where the reviewer disclosed an
industry, G2 appends it to that placeholder and the Actor keeps it in industry.
How is this different from the Capterra Reviews Scraper? G2 gives you 10 recent reviews with a company segment, a validated-reviewer flag and a per-review permalink. Capterra gives you 25 with three separate sub-ratings and a company-size band. Different reviewer bases and different fields, so run both when the answer matters.
Feedback
If a product slug fails or a field parses wrong, open an issue from the Issues tab on this Actor's Store page and include the slug that reproduces it.