ProductReview.com.au Scraper at a glance
ProductReview.com.au Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes source listing, id, listing name, slug and details url, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Lead Generation, AI
- Region
- Oceania
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 25 options
- Run success
- 98.8% of completed public runs in the last 30 days
Scrape ProductReview.com.au products, businesses and customer reviews. Search by location, category or custom query with advanced filters. Extract business details, ratings, review content and structured review insights.
What ProductReview.com.au Scraper can do
- Two ways to find listings. Filter mode picks a category plus location, sort and discontinued filters (type a plain name like 'Air Fryers'/'Victoria', or a raw site slug, either works). URL mode pastes explicit search, category or listing links, every shape the site has. No need to build URLs by hand.
- 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 pointer back to its listing. For listings and reviews from a single pass, keep Listings output and open the Listing reviews view in the Output tab (or ?view=listing-reviews on the dataset items API): it unwinds each listing's embedded reviews[] into one table row per review.
- Full company profile. Contact details, address, opening hours, description, FAQs and specifications come alongside the rating and review count.
- Full review detail. Rating, verified purchase flag, attached images, and any replies from the company or other users.
- Multi-URL in one run. Mix category pages, search pages and direct listing links in the same list. Each is auto-routed by its own shape.
- Built for schedules. Incremental mode tracks a search or URL list run after run and returns only what is new, updated or reappeared.
Choose what to collect
These inputs let you configure ProductReview.com.au Scraper - Products, Businesses & Reviews. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring | How to discover listings. Filter mode = pick a category + filters; URL mode = paste explicit URLs (search/category/listing) and ignore filters. |
outputTypestring | What rows to emit. Applies to both Filter and URL modes. 'listings' = one row per listing with up to 10 preview reviews embedded. 'reviews' = one row per review with a sourceListing pointer (no listing rows). |
categorystring | A ProductReview category slug ('home-garden-shops', 'air-fryers') or a plain category name ('Air Fryers'); a name is resolved to its slug via the site's own category search, and the run fails loudly if nothing matches. The actor builds /c/. If empty, defaults to 'home-garden-shops'. Filter mode only; ignored in URL mode. |
searchQuerystring | Appended as ?q=. Narrows results within the chosen category. |
locationstring | A ProductReview location slug ('victoria_au', 'sydney_nsw_au') or a plain location name ('Victoria', 'Sydney'); a name is resolved to its slug via the site's own location search, and the run fails loudly if nothing matches. Inserted as /c//l/. |
showDiscontinuedboolean | Include discontinued products/services in the results. |
sortBystring | Sort key for category/search results in Filter mode. Values match productreview.com.au's own sort options: relevance, rating, number of reviews (review_count is accepted as an alias of numberOfReviews), popularity, lowest/highest price, newest and oldest. Filter mode only; URL-pasted sort parameters override this. |
Show 18 more inputs
| Input | What it controls |
|---|---|
brandsarray | Only listings from these brands. Type the brand name or its slug as it appears in productreview.com.au brand-filter URLs (e.g. Breville, delonghi, philips-domestic-appliances). Several brands are combined with OR. If the site does not recognise a brand, the run says so in the log and never returns unfiltered results in its place. Leave empty for all brands. |
minRatinginteger | Only listings rated this many stars and up (1-4), using the site's own rating filter. This filters listings; to filter individual reviews by star rating use 'Only reviews with this rating' below. Leave empty for all ratings. |
urlsarray | Multi-URL list, one of: a listing (/listings/), a category (/c/), a category+location (/c//l/), a category with a sort param (/c/?sort=), a category with a search query (/c/?q=), a category with a brand filter (/c/?brand=), a search page (/search?q=...), a listing with a review filter (/listings/?rating=), a listing with a verified-reviews filter (/listings/?isVerified=true), a listing with a review page number (/listings/?page=N), a listing write-review link (/listings//write-review) or a category with a page number (/c/?page=N). A /listings//write-review link is normalized to the listing itself; a pasted page=N on a listing is ignored (reviews always start from the first page); a pasted page=N on a category is ignored too (the site serves its first page for it, so it is treated as page 1 of that category); a singular ?brand= on a category is rewritten to the site's own brands= filter; a literal "&" between query params (pasted from rendered page source) is decoded to "&". Brand pages (/brands/), /i/ and a listing's /questions sub-page are not supported and are skipped with a warning, never a silent empty result. Filter-mode fields are ignored when Mode = URL. Left untouched, URL mode scrapes the 12 example URLs of the default list (one per supported shape; the "Prefill example" shows the same 12 shapes), so clear the list or replace it with your own URLs to scrape only those. |
maxReviewsPerListinginteger | Caps how many reviews ONE listing contributes. Leave empty to use the mode default: in Listings output, 10 embedded preview reviews per listing (unchanged default; raise this to embed more); in Reviews output, no per-listing cap at all (only the overall Max Output Rows limit applies, so an existing single-listing task with a high limit is never silently truncated here). |
reviewRatinginteger | Narrow reviews to one star rating (1-5). Live-confirmed site filter; applied as ?rating= on the listing page. Leave empty for all ratings. A rating already present on a pasted URL (URL mode) always wins over this. |
reviewVerifiedOnlyboolean | Only include reviews the site marks as a verified purchase (?isVerified=true). Off by default (all reviews). |
reviewsWithAttachmentsOnlyboolean | Only include reviews that have at least one photo/attachment (?hasAttachments=true). Off by default (all reviews). |
reviewSortBystring | Order of a listing's reviews. Live-confirmed site filter (?sortBy= on the listing page, re-order verified against the site's own live response): 'overview' is the site's own default order, 'newest' = most recent first, 'ratingHighest'/'ratingLowest' = by star rating, 'mostLiked' = by helpful-vote count. Leave empty to keep the site's own default order. A 'sortBy' already present on a pasted URL (URL mode) always wins over this. |
limitinteger | Universal cap on dataset rows. Applies to both Filter and URL modes. In Listings output: max listings (search/category pages cap at 30 per URL). In Reviews output: max review rows; the actor reads further review pages until this is reached, then stops. |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of listings/reviews without returning or charging for rows already collected there. Use this after an interrupted run, or when continuing a large pull in another run. For recurring monitoring of the same search or URL list, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns everything as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED rows. Compared: every output field of the row, so a listing is UPDATED when its name, brand, rating or review counts, price, offers, specifications, business details or embedded reviews change, and a review row when its title, body, rating, votes, replies or author change; changedFields names what moved. Excluded from the comparison (still in every row): scrapedAt, searchUrl, and on review rows the parent listing's running counters sourceListing.rating and sourceListing.numberOfReviews, plus anything you add under "Ignore fields when detecting changes". A field this actor newly starts returning is never counted as a change. Turn on "Emit unchanged" or "Emit expired" only when you also want those rows returned (and billed). State is kept separately for each mode/category/query/location/sort/URL-list setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/category/query/location/sort/URL settings; different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return rows that have not changed since the last run, marked UNCHANGED. This returns (and bills) extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return rows that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search/URL list, not when Max output rows capped it, when Resume was used, or when the site's own pagination limit (this site does not page a category/search past its first ~30 results) cut a search short. This returns (and bills) extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Field names to exclude from change detection in Incremental mode, in addition to the ones this actor already ignores by default (currently "scrapedAt" the per-run scrape timestamp, "searchUrl" the search page a product was found on, and on review rows "sourceListing.rating" and "sourceListing.numberOfReviews", the parent listing's running counters; none is a real content change of the row). Use a nested field like "sourceListing.rating" to ignore it only at that exact path; a plain name like "numberOfQuestions" is ignored everywhere it appears, at any depth. An ignored field still appears in the output row, it just never causes UPDATED or shows up in changedFields. Changing this list does not re-flag your existing tracked records as UPDATED; only genuinely different fields do that. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
sourceListingSource Listing (object)idID (text)nameListing Name (text)slugSlug (text)detailsUrlDetails URL (link)brandBrand (object)statisticsStatistics (object)logoUrlLogo (image)pictureUrlPicture (image)isDiscontinuedDiscontinued (boolean)titleReview Title (text)bodyReview Body (text)Show 50 more fields
ratingRating (number)submittedAtSubmitted At (date)hasVerifiedPurchaseVerified Purchase (boolean)authorAuthor (object)scrapedAtScraped At (date)changeTypeChange type (incremental mode) (text)changedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen at (incremental mode) (date)lastSeenAtLast seen at (incremental mode) (date)statistics.ratingRating (number)statistics.numberOfReviewsReviews (number)lowestPriceFormattedLowest price (text)rrpPrice.textRRP (range) (text)sourceListing.idListing ID (text)sourceListing.nameListing (text)sourceListing.slugListing Slug (text)sourceListing.detailsUrlListing URL (link)firstPublishedAtFirst Published At (date)author.displayNameAuthor (text)author.locationNameAuthor Location (text)isVerifiedVerified Reviewer (boolean)numberOfLikesHelpful Votes (number)numberOfDislikesUnhelpful Votes (number)tagsTags (array)addressAddress (object)businessHoursBusiness Hours (array)descriptionDescription (text)faqsFAQs (array)specificationsSpecifications (object)reviewsSummaryReviews Summary (text)lowestPriceLowest Price (number)marketAvailabilityMarket Availability (object)awardYearsAward Years (array)reviews.idReview ID (text)reviews.titleTitle (text)reviews.bodyReview Body (text)reviews.ratingRating (number)reviews.submittedAtSubmitted At (date)reviews.firstPublishedAtFirst Published At (date)reviews.author.displayNameAuthor (text)reviews.author.locationNameAuthor Location (text)reviews.hasVerifiedPurchaseVerified Purchase (boolean)reviews.isVerifiedVerified Reviewer (boolean)reviews.numberOfLikesHelpful Votes (number)reviews.numberOfDislikesUnhelpful Votes (number)reviews.tagsTags (array)contact.emailEmail (text)contact.websiteWebsite (link)contact.phonePhone (text)address.formattedAddress (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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"
}Ways to use this data
- Reputation management teams: monitor new and updated reviews for your own company listing on a recurring schedule.
- Consumer research and comparison sites: pull ratings, review counts and company profiles across a whole category.
- Data science and NLP teams: build labeled sentiment or topic datasets from review text, ratings and verified purchase flags.
- Marketing and competitor analysis: track a competitor's rating trend and recent review volume over time.
- Company owners: export every review and reply for a single listing for reporting outside the site.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does ProductReview.com.au Scraper return?
The documented output for ProductReview.com.au Scraper includes source listing, id, listing name, slug, details url, brand, statistics and logo. Availability of each field depends on the source page and the selected mode.
How much does ProductReview.com.au Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Why do I get fewer listings than my Max Output Rows?
A ProductReview category or search page returns about 30 results in one page, and the site does not support paging past it. The actor logs when it hits this limit. Raising Max Output Rows further will not add more listings for the same search; narrow the category, add a location, or use a search query instead.
Why did my run fail instead of returning an empty dataset?
The run fails outright only in two cases: Resume from a previous run points at a run or dataset ID this account cannot read, or Incremental mode is combined with Resume from a previous run on a state key that already has saved history. If no page at all could be loaded (every request refused, rate limited or failing), the run also fails with a clear connection message rather than an empty dataset. A few individual pages failing is logged and the run still finishes, possibly with fewer rows.
Can I use this with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
