G2 Category Scraper — Ranked Software Listings avatar

G2 Category Scraper — Ranked Software Listings

Pricing

from $3.40 / 1,000 product listeds

Go to Apify Store
G2 Category Scraper — Ranked Software Listings

G2 Category Scraper — Ranked Software Listings

Export a software category in its ranked order, with every product's name, rank, aggregate rating, review count and price band. Each row also carries what reviewers praise and complain about, summarised — a field published on the category listing and on no product page.

Pricing

from $3.40 / 1,000 product listeds

Rating

0.0

(0)

Developer

The Netaji

The Netaji

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

3 days ago

Last modified

Share

G2 Category Scraper

A software category's ranked listing, exported as a spreadsheet of products. Each row carries the product's rank within the category, its name and slug, its aggregate rating and review count, the published price band, its logo and its page address — and the two fields that make the listing worth reading in its own right: what reviewers praise the product for, and what they complain about, each summarised as a short list of traits.

Those two summaries are published on the category listing and on no product page. A run that opens every product individually will not find them.

Accepted input

categorySlugs is required and takes one or more category slugs, one per line, such as crm. A pasted category page link works too and is reduced to the slug inside it. A slug is lowercase and carries no spaces and no query string; the page to start from is a separate field rather than something appended to the slug, because a slug with ?page=2 on the end would be reduced to the plain slug and quietly serve page 1.

maxItems bounds each category separately and defaults to 45. Products arrive fifteen to a page, so 45 is three pages per category and 0 removes the bound. The cap is per category rather than per run because a run given five categories is asking for a comparable slice of each; a single shared cap would return the first category and nothing else.

startPage sets the page each category begins at and defaults to 1. It resumes a walk that stopped and splits a large category across several runs.

{
"categorySlugs": ["crm", "marketing-automation"],
"maxItems": 45,
"startPage": 1
}

Response fields

{
"category_slug": "crm",
"category_name": "Best CRM Software",
"category_url": "https://www.g2.com/categories/crm",
"page": 1,
"position": 1,
"name": "Pipedrive",
"slug": "pipedrive",
"url": "https://www.g2.com/products/pipedrive/reviews",
"image": "https://images.g2crowd.com/uploads/product/image/pipedrive.png",
"application_category": "BusinessApplication",
"rating": 4.3,
"rating_best": 5,
"review_count": 3118,
"rating_count": 3118,
"liked_for": ["Ease of Use", "Features", "Lead Management"],
"disliked_for": ["Learning Curve", "Expensive"],
"price_currency": "USD",
"price_low": "25",
"price_high": "330",
"price_offer_count": 4
}

Fields absent from a listing are returned as null rather than omitted, so every row has the same shape. liked_for and disliked_for are empty lists rather than null when G2 states none.

slug is the key. It is the exact value G2 Reviews Scraper accepts, which is what makes the two Actors compose: a category is walked here, and any product's reviews are then read there without a link ever being constructed. That is not a convenience. G2 slugs run to agentforce-sales-formerly-salesforce-sales-cloud, so a slug guessed from a product's name is a slug that does not exist, and a run built on twenty guesses returns nothing while looking like a fault.

rating is stated on the scale rating_best names, and it is not rescaled. On a category listing that scale is 5. On a product's own review page the same aggregate is stated out of 10. Both are G2's own numbers, which is why the top of the scale travels beside every rating in this family rather than being assumed.

position is the rank within its own page, counting from 1. Page 2 therefore starts again at 1, and page is the field that separates them.

price_low and price_high are strings, because that is how the price band is stated. A product with no published pricing — common for enterprise software — returns nulls rather than zeros.

Behaviour on partial results

A category slug that G2 serves nothing for is logged and skipped, and the run continues with the next one. A category that exists and lists no products returns a successful run with no rows for it.

The walk over a category ends when a page comes back with fewer than fifteen products, and that is the only signal there is: this listing states no total and publishes no next control. Pages do not overlap — measured, page 2 of a category held fifteen products, none of them on page 1 — so a full page is genuinely fifteen new products and the walk continues.

Frequently asked questions

Why did the first row take so much longer than the rest? Because the first request of a run is where G2 checks the connection before it will serve anything, and that check takes time. Measured on 2026-08-22, a first category read answered in 23.1 seconds and the read that followed it answered in 15.5. A run that appears to sit still for twenty seconds before its first row is behaving normally, not stalling.

How many products does one category hold? G2 does not say, and neither does this Actor. There is no stated total anywhere on the listing, so the honest answer is that a category is as long as it turns out to be: the walk asks for the next page until one comes back short. Setting maxItems to 0 walks a category to its end.

Why is rating_best sometimes 5 and sometimes 10? Because G2 states the same product's aggregate on two different scales depending on where it is published — 5 on a category listing, 10 on the product's own review page — and an individual review is stated out of 5 alongside a product aggregate out of 10 in one response. Nothing here is rescaled, because rescaling would publish a figure G2 never stated. Divide rating by rating_best for a comparable number.

Where do liked_for and disliked_for come from, and why are they empty on some rows? They are G2's own summary of what reviewers say, derived across all of a product's reviews and published on the category listing. They are empty when G2 states none, which happens on products with few reviews. They are not available from a product's own pages, so a category run is the only way to collect them.

Can a product be found without knowing its category? Not through this Actor. A category listing is the discovery surface here, and the related_categories a category links to are printed in the run log at the start of each category so the next slug to try is visible without another request. Once a product's slug is known, G2 Reviews Scraper takes it directly.

Is a G2 account, cookie or API key required? No. No account, session cookie or key of any kind is supplied to the Actor or needed by it.

G2 Reviews Scraper reads any product's reviews from the slug on any row here, with the reviewer's job title and company size band on every review and the three questions behind each one kept apart. It is the evidence behind the summaries this Actor publishes.