Product Reviews AU [$1πŸ’°] Listings and Reviews Scraper avatar

Product Reviews AU [$1πŸ’°] Listings and Reviews Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Product Reviews AU [$1πŸ’°] Listings and Reviews Scraper

Product Reviews AU [$1πŸ’°] Listings and Reviews Scraper

From $1/1K. Scrape and extract detailed product and business reviews from ProductReview.com.au with advanced filters, business info, and review insights. It supports location/category search, custom queries, proxy rotation, and flexible dataset outputs.

Pricing

from $1.00 / 1,000 results

Rating

5.0

(1)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

49

Total users

5

Monthly active users

20 hours ago

Last modified

Share

ProductReview.com.au Scraper

A fast, lean scraper for productreview.com.au, Australia's largest consumer reviews portal. Pulls listing summaries (rating, review counts, contact info, FAQs) and full review bodies with author, attachments, and replies. Costs a fraction of typical alternatives and finishes most runs in seconds.

Why This Scraper

  • Two input modes. Filter mode lets you pick a category plus filters. URL mode lets you paste explicit URLs (search, category, or direct listing) and ignores filters.
  • Two output shapes. Listings output emits one row per listing with up to 10 preview reviews embedded. Reviews output emits one row per review with a sourceListing pointer.
  • Multi-URL. URL mode accepts a list. Each URL is auto-routed by shape (/c/, /search, or /listings/<slug>).
  • Lightweight. Around 80 to 256 MB peak memory, well below typical scraper resource use.
  • Honest per-page cap. productreview.com.au caps category and search results at 30 per URL and doesn't paginate via URL grammar. The actor surfaces this in logs and caps limit accordingly in listings output.
  • Apify-native proxy. Optional Apify residential proxy lets you push concurrency without tripping per-IP throttles.

Data You Get

Sample shape. Values are illustrative placeholders, not from a live listing.

Listings output (one row per listing)

FieldExample
id00000000-0000-0000-0000-000000000001
nameSample Lighting Co.
slugsample-lighting-co
detailsUrlhttps://www.productreview.com.au/listings/sample-lighting-co
brand.nameSample Brand
categories[].nameLighting Shops
locations[].nameVictoria
statistics.rating4.5
statistics.numberOfReviews1234
isDiscontinuedfalse
featuredReview.titleSample featured review title
contact.emailsupport@example.com
contact.phone+61000000000
address.formattedSample St, Sample Suburb, VIC 0000, Australia
descriptionFull company description appears here.
faqs[].questionSample question?
logoUrlhttps://cdn.productreview.com.au/resize/brand-logo/00000000
pictureUrlhttps://cdn.productreview.com.au/resize/listing/00000000
totalReviews1234
pagesScraped1
reviewPages42
reviews[]up to 10 preview reviews from page 1

Reviews output (one row per review)

FieldExample
idaaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
rating5
titleSample review title
bodySample review body text.
submittedAt2026-01-01T00:00:00.000Z
hasVerifiedPurchasetrue
images[].urlhttps://cdn.productreview.com.au/resize/review-attachment/00000000
author.displayNameReviewer Name
author.locationNameSample City
comments[]array of replies and follow-ups
sourceListing.id00000000-0000-0000-0000-000000000001
sourceListing.nameSample Lighting Co.
sourceListing.slugsample-lighting-co
sourceListing.detailsUrlhttps://www.productreview.com.au/listings/sample-lighting-co
sourceListing.brandSample Brand
sourceListing.rating4.5
sourceListing.numberOfReviews1234

How to Use

1. Filter mode + listings output. Preview shops in a category.

{
"mode": "search",
"outputType": "listings",
"category": "home-garden-shops",
"limit": 20,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AU" }
}

2. Filter mode + reviews output. Top reviews from a filtered category.

{
"mode": "search",
"outputType": "reviews",
"category": "lighting",
"location": "victoria_au",
"sortBy": "rating",
"limit": 200,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AU" }
}

3. URL mode. Every review for one listing.

{
"mode": "url",
"outputType": "reviews",
"urls": ["https://www.productreview.com.au/listings/sample-lighting-co"],
"limit": 1000,
"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "AU" }
}

4. URL mode. Multi-URL with mixed shapes.

{
"mode": "url",
"outputType": "listings",
"urls": [
"https://www.productreview.com.au/c/home-garden-shops",
"https://www.productreview.com.au/search?q=lighting",
"https://www.productreview.com.au/listings/sample-lighting-co"
],
"limit": 10
}

URLs are auto-routed: /c/<cat> and /search are processed as search-result pages. /listings/<slug> skips straight to a listing detail. Filter-mode fields (category, searchQuery, location, etc.) are ignored in URL mode.

Input Parameters

ParameterTypeDefaultDescription
modeenum search | urlsearchInput dispatch. search builds a URL from filters. url uses the urls[] list.
outputTypeenum listings | reviewslistingsRow shape. Listings is one row per listing with embedded preview reviews. Reviews is one row per review with sourceListing pointer.
categorystringhome-garden-shopsFilter mode only. Category slug. The actor builds /c/<slug>.
searchQuerystring(empty)Filter mode only. Appended as ?q=.
locationstring(empty)Filter mode only. Slug like victoria_au. Inserted as /c/<cat>/l/<loc>.
showDiscontinuedbooleanfalseFilter mode only. Include discontinued entries.
sortByenum(default)Filter mode only. One of relevance, rating, numberOfReviews, popularity, lowestPrice, highestPrice.
urlsstring[]one direct listing URLURL mode only. Each URL auto-routed by shape.
limitint20Universal cap on output rows. Listings: max listings (per-URL hard cap of 30 from the site). Reviews: max review rows.
maxConcurrencyint (1 to 50)4Max in-flight requests. With residential proxy you can push 8 to 10.
proxyobject(none)Apify proxy config. Recommended: RESIDENTIAL, country AU.
resumeFromRunIdstring(empty)Continue ONE specific interrupted run/dataset without re-returning or re-charging its rows.
incrementalModebooleanfalseRecurring monitoring of the same search/URL list. Later runs return only NEW/UPDATED/REAPPEARED rows by default.
stateKeystring(auto-derived)Incremental mode only. Name a monitoring campaign, or leave empty to derive one from the search/URL settings.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill) rows unchanged since the last run, marked UNCHANGED.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill) rows no longer found, marked EXPIRED. Only fires after a fully-scanned run (not capped, resumed, or truncated by this site's ~30-result-per-page pagination limit).

Resume & recurring updates (incremental mode)

Two different features, both under the input's "Resume & recurring updates" section:

  • resumeFromRunId continues ONE specific interrupted run β€” paste a previous run or dataset ID and this run appends only rows it hasn't already collected there.
  • incrementalMode is for scheduling this actor again and again against the SAME search or URL list. The actor remembers what it saw last time (keyed on mode + category/searchQuery/location/sortBy/showDiscontinued/urls β€” never on limit, proxy, or other connection settings) and classifies every row as NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED. Only NEW/UPDATED/REAPPEARED are returned by default; turn on emitUnchanged/emitExpired to also get (and be billed for) the rest.

EXPIRED rows are only produced once a run has fully scanned its tracked scope. Note that this site does not support paging a category/search past its first page (~30 results) β€” for a category larger than that, this actor can only ever see its first page, so EXPIRED will not fire for it regardless of limit; it fires for url mode and for searches small enough to fit on one page.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape β€” the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record β€” not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify β†’ Settings β†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Output Example

Sample shape. Values are illustrative placeholders.

Listings output

{
"id": "00000000-0000-0000-0000-000000000001",
"name": "Sample Lighting Co.",
"slug": "sample-lighting-co",
"detailsUrl": "https://www.productreview.com.au/listings/sample-lighting-co",
"brand": { "id": null, "name": "Sample Brand", "slug": "sample-brand", "url": "https://example.com", "isManaged": false },
"contact": { "email": "support@example.com", "phone": "+61000000000", "website": "https://example.com" },
"categories": [{ "name": "Lighting Shops", "level": "leaf", "hook": null, "ancestors": [] }],
"locations": [{ "name": "Victoria", "shortName": "VIC", "slug": "victoria_au", "level": "state" }],
"statistics": { "rating": 4.5, "numberOfReviews": 1234, "numberOfQuestions": 12, "ratingDistribution": [700, 300, 100, 80, 54] },
"isDiscontinued": false,
"featuredReview": null,
"highlightedReviews": [],
"address": { "streetAddress": "Sample St", "suburb": "Sample Suburb", "state": "VIC", "postcode": "0000", "country": "Australia", "formatted": "Sample St, Sample Suburb, VIC 0000, Australia" },
"businessHours": null,
"description": "Full company description appears here.",
"faqs": [],
"specifications": {},
"logoUrl": "https://cdn.productreview.com.au/resize/brand-logo/00000000",
"pictureUrl": "https://cdn.productreview.com.au/resize/listing/00000000",
"pictures": [],
"createdAt": "2020-01-01T00:00:00.000Z",
"totalReviews": 1234,
"reviewPages": 42,
"pagesScraped": 1,
"reviews": [],
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Reviews output

{
"id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"rating": 5,
"title": "Sample review title",
"body": "Sample review body text.",
"submittedAt": "2026-01-01T00:00:00.000Z",
"hasVerifiedPurchase": true,
"attachments": [],
"images": [],
"author": { "id": null, "displayName": "Reviewer Name", "locationName": "Sample City" },
"comments": [],
"sourceListing": {
"id": "00000000-0000-0000-0000-000000000001",
"name": "Sample Lighting Co.",
"slug": "sample-lighting-co",
"detailsUrl": "https://www.productreview.com.au/listings/sample-lighting-co",
"brand": "Sample Brand",
"rating": 4.5,
"numberOfReviews": 1234
}
}

Plan Requirement

Apify planDefault setupRecommended for larger runs
FreeDatacenter proxy (default). Fine for small runs at maxConcurrency: 2 to 4.(residential not available on free)
PaidDatacenter proxy (default).Switch to residential for higher throughput: apifyProxyGroups: ["RESIDENTIAL"], apifyProxyCountry: "AU". You can then push maxConcurrency: 8 to 10.

The site throttles bursts from a single IP, so datacenter (small IP pool) with high concurrency may trigger 403 retries. Residential (large pool) absorbs the burst.