# ProductReview.com.au Reviews Scraper (`automation-lab/productreview-australia-reviews-scraper`) Actor

🇦🇺 Export public ProductReview.com.au customer reviews with ratings, reviewer context, verified/incentive badges, images, and business replies—ready for monitoring and analysis.

- **URL**: https://apify.com/automation-lab/productreview-australia-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## ProductReview.com.au Reviews Scraper

Export public Australian customer reviews from ProductReview.com.au into a clean dataset.
Start with a business listing or a category, choose a limit, and receive one review per row.

The scraper captures more than star ratings and text.
It also preserves public reviewer context, verified and fair-incentive signals, review images, listing aggregates, and company replies.
That makes the output useful for recurring reputation monitoring, customer-experience research, and competitor benchmarking.

- 🇦🇺 Built specifically for ProductReview.com.au
- ⭐ One structured review per dataset row
- ✅ Verified and Fair Incentive badges
- 💬 Company response text and timestamps
- 🖼️ Public review attachment URLs
- 📄 Bounded review pagination
- 🔗 Category discovery or direct listing inputs
- ⚡ HTTP-only extraction with no browser overhead

### What does ProductReview.com.au Reviews Scraper do?

The Actor reads server-rendered public ProductReview.com.au pages.
It can begin from either:

1. a category URL such as `https://www.productreview.com.au/c/online-shops`; or
2. a listing URL such as `https://www.productreview.com.au/listings/booktopia`.

For a category, it discovers listing links and visits the requested number of businesses.
For a listing, it follows review pages directly.
Results are deduplicated by ProductReview review ID and stop at your global review limit.

No ProductReview login, browser session, or private API credential is required.

### Who is it for?

#### Brand and reputation teams

Monitor new feedback, verification badges, incentive signals, and public company responses.
Export the same listing regularly and compare review IDs or dates with your previous dataset.

#### Customer-experience teams

Analyze recurring complaints, praise, product themes, response coverage, and response timing.
Company reply fields stay alongside the original review.

#### Agencies

Collect consistent review records across several client or competitor listings.
Category discovery helps build an initial benchmark set quickly.

#### Ecommerce researchers

Compare public sentiment, ratings, review volume, reviewer context, and response behavior across Australian businesses.

#### Data and AI teams

Feed normalized text and metadata to sentiment analysis, topic classification, dashboards, warehouses, or LLM workflows.

### Why use this ProductReview review extractor?

Copying reviews manually is slow and loses context.
Generic page scrapers often return a block of text without stable IDs, dates, badges, listing aggregates, or response fields.

This Actor provides:

- stable review identifiers for incremental monitoring;
- typed ratings and counts instead of formatted strings;
- ISO timestamps for sorting and time-series analysis;
- canonical listing and review URLs for traceability;
- explicit boolean badge fields;
- review and reply text in the same record;
- configurable listing, page, and dataset limits;
- direct HTTP extraction for low runtime and memory use.

### What ProductReview.com.au data can you extract?

| Field | Type | Description |
|---|---|---|
| `reviewId` | string | Stable ProductReview review identifier |
| `entityName` | string | Reviewed business, service, or product name |
| `entityUrl` | URL | Canonical ProductReview listing URL |
| `category` | string | Most specific public breadcrumb category |
| `aggregateRating` | number | Listing's aggregate rating |
| `entityReviewCount` | number | Listing's public review count |
| `reviewerName` | string | Public reviewer display name |
| `reviewerLocation` | string | Public location label when shown |
| `reviewerPostCount` | number | Public reviewer post count when shown |
| `reviewerAvatarUrl` | URL | Public avatar URL when shown |
| `rating` | number | Individual review rating from 1 to 5 |
| `reviewDate` | date | Review publication timestamp |
| `reviewTitle` | string | Review headline when supplied by the source |
| `reviewBody` | string | Server-rendered review text |
| `verified` | boolean | Whether ProductReview marks the review Verified |
| `fairIncentive` | boolean | Whether ProductReview marks a Fair Incentive |
| `images` | URL[] | Public review attachment image URLs |
| `companyReplyAuthor` | string | Public responder name |
| `companyReplyText` | string | Public company response text |
| `companyReplyDate` | date | Public company response timestamp |
| `sourceUrl` | URL | Canonical review anchor URL |
| `pageUrl` | URL | Review page fetched by the Actor |
| `scrapedAt` | date | Extraction timestamp |

Optional fields are omitted when ProductReview does not display them.

### How to scrape ProductReview.com.au reviews

1. Open the Actor input page.
2. Add at least one ProductReview.com.au category or listing URL.
3. Set **Maximum reviews** to your desired dataset size.
4. For category inputs, choose **Listings per category**.
5. Choose how many **Review pages per listing** to follow.
6. Leave proxy disabled unless your network needs it.
7. Click **Start**.
8. Preview the dataset or export JSON, CSV, Excel, XML, or RSS.

The prefilled Booktopia example collects ten reviews from one page and normally completes well under two minutes.

### Input parameters

#### Category or listing URLs

`startUrls` is required.
Each URL must use `productreview.com.au` and begin with `/c/` or `/listings/`.
Unsupported hosts and unrelated source routes fail closed.

#### Maximum reviews

`maxItems` is a global cap across all supplied URLs.
Use a small number for a quick sample and a larger number for analysis or backfills.

#### Listings per category

`maxListingsPerCategory` applies only to category inputs.
It controls how many listing pages the Actor selects from each category.

#### Review pages per listing

`maxPagesPerListing` bounds pagination for each listing.
One ProductReview listing page often contains many detailed review records.

#### Proxy configuration

Direct access is the default because the public pages are server-rendered.
You can enable Apify Proxy or supply custom proxies if your environment encounters a temporary block.

### Input example

```json
{
  "startUrls": [
    { "url": "https://www.productreview.com.au/listings/booktopia" },
    { "url": "https://www.productreview.com.au/listings/vpa" }
  ],
  "maxItems": 100,
  "maxListingsPerCategory": 1,
  "maxPagesPerListing": 3,
  "proxyConfiguration": { "useApifyProxy": false }
}
````

For category discovery, replace the listing URLs with a URL such as:

```text
https://www.productreview.com.au/c/online-shops
```

### Output example

```json
{
  "reviewId": "6c4e997d-6515-5e87-8116-f20aa572846c",
  "entityName": "Booktopia",
  "entityUrl": "https://www.productreview.com.au/listings/booktopia",
  "category": "Best Book Shops",
  "aggregateRating": 4.7,
  "entityReviewCount": 33001,
  "reviewerName": "John Adams",
  "reviewerPostCount": 10,
  "rating": 1,
  "reviewDate": "2026-07-14T03:27:29.000Z",
  "reviewBody": "This company has been sending me unsolicited emails...",
  "verified": false,
  "fairIncentive": false,
  "images": [],
  "companyReplyAuthor": "Booktopia",
  "companyReplyText": "Hi John, Please note that you do not need to sign in...",
  "companyReplyDate": "2026-07-15T01:00:32.000Z",
  "sourceUrl": "https://www.productreview.com.au/listings/booktopia#review-6c4e997d-6515-5e87-8116-f20aa572846c",
  "pageUrl": "https://www.productreview.com.au/listings/booktopia",
  "scrapedAt": "2026-07-18T05:31:57.007Z"
}
```

Source content changes over time, so this example illustrates the schema rather than promising a specific live review.

### How much does it cost to scrape ProductReview.com.au reviews?

This Actor uses pay-per-event pricing.
A small one-time start event covers setup, and a review event is charged only for each record saved.
Review prices use Apify plan-based volume tiers, so higher plans receive lower per-review rates.

Before a larger job:

1. run a 10-review sample;
2. inspect the run cost shown by Apify;
3. estimate the larger export from your expected review count; and
4. use `maxItems` and page limits to keep the crawl bounded.

The Actor uses 256 MB by default and does not launch a browser, which keeps compute requirements low.

### Monitoring new ProductReview reviews

ProductReview pages can be exported on a schedule using Apify Tasks and Schedules.
Use stable `reviewId` values as your deduplication key.

A typical monitoring workflow is:

1. create a Task with one or more listing URLs;
2. schedule it daily or weekly;
3. send each dataset to your storage or automation platform;
4. keep only review IDs not seen in earlier runs; and
5. alert on low ratings, selected themes, or missing company replies.

The Actor does not maintain cross-run state automatically, so your destination remains the source of truth for historical deduplication.

### Tips for reliable exports

- 🎯 Prefer direct listing URLs when you already know the brands to monitor.
- 📉 Keep category listing limits low for routine monitoring.
- 📄 Increase page limits gradually for historical backfills.
- 🔁 Overlapping input URLs are safe because review IDs are deduplicated within a run.
- 🧾 Keep `sourceUrl` with every downstream record for auditability.
- 🕒 Compare `reviewDate`, not `scrapedAt`, when charting review activity.
- 🌐 Enable a proxy only when direct traffic is blocked from your environment.
- ⚠️ A review or response can be truncated when the public server-rendered source itself shows a “Read more” preview.

### Integrations

#### Google Sheets and Airtable

Use Zapier or Make to append each dataset row to a review tracker.
Deduplicate on `reviewId` and create a view for ratings below your threshold.

#### Slack and email alerts

Trigger an alert when `rating` is low, `verified` is true, or `companyReplyText` is absent after your response-time target.

#### BigQuery, Snowflake, and data warehouses

Export datasets to object storage or use the Apify API to load normalized review rows into your warehouse.
Partition by `reviewDate` and cluster by `entityName` or `reviewId`.

#### Sentiment and topic analysis

Send `reviewBody` and optional `companyReplyText` to your preferred NLP model.
Retain ratings, badges, listing context, and source URLs as structured dimensions.

#### Webhooks

Configure an Actor run webhook to notify your service when a scheduled run succeeds or fails.
Then fetch the default dataset through its API URL.

### API usage from Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/productreview-australia-reviews-scraper').call({
  startUrls: [{ url: 'https://www.productreview.com.au/listings/booktopia' }],
  maxItems: 20,
  maxPagesPerListing: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use the Actor from Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/productreview-australia-reviews-scraper').call(run_input={
    'startUrls': [{'url': 'https://www.productreview.com.au/listings/booktopia'}],
    'maxItems': 20,
    'maxPagesPerListing': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use the Actor with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~productreview-australia-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://www.productreview.com.au/listings/booktopia"}],
    "maxItems": 20,
    "maxPagesPerListing": 1
  }'
```

Use the returned run's `defaultDatasetId` with the Apify dataset API to download results.

### Use with MCP and AI assistants

Apify's MCP server lets Claude Code, Claude Desktop, Cursor, or VS Code invoke the Actor as a tool.

For Claude Code:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/productreview-australia-reviews-scraper"
```

For Claude Desktop, Cursor, or VS Code, add an HTTP MCP server:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/productreview-australia-reviews-scraper"
    }
  }
}
```

Example prompts:

- “Export the latest 20 Booktopia reviews and summarize recurring complaints.”
- “Collect reviews from the online shops category and compare verified-review share by business.”
- “Find low-rating reviews without a visible company reply.”
- “Create a CSV-ready competitor review dataset from these ProductReview listing URLs.”

### Data quality and limitations

The Actor extracts what ProductReview.com.au renders publicly at run time.
Pages, ratings, review counts, badges, attachments, and responses can change.

Some public bodies or replies include a “Read more” preview in server-rendered HTML.
The Actor removes the UI label but cannot invent hidden text that is not present in that response.
Optional fields may be absent for anonymous reviewers, reviews without images, or businesses without replies.

Category mode selects listing links visible on the supplied category page and does not claim to enumerate every listing in a very large category.
Use direct listing URLs for complete control over monitored entities.

### Is it legal to scrape ProductReview.com.au?

This Actor accesses public pages without logging in or circumventing access controls.
Web scraping legality depends on your jurisdiction, intended use, volume, and handling of personal data.

You are responsible for:

- following applicable laws and contractual requirements;
- collecting only the data you need;
- respecting copyright and privacy rights;
- applying appropriate retention and access controls; and
- using conservative crawl limits.

This documentation is general information, not legal advice.

### FAQ

#### Does this Actor require a ProductReview account?

No. It reads public category and listing pages anonymously.

#### Can it scrape a category and individual listings in one run?

Yes. Mix `/c/...` and `/listings/...` URLs in `startUrls`.
Duplicate reviews are removed within that run.

#### How do I collect only one business?

Supply its canonical `/listings/...` URL and set `maxPagesPerListing` and `maxItems` to the depth you need.

#### Why is an optional field missing?

ProductReview may not display it for that review.
For example, not every reviewer shows a location, not every review has images, and not every business has replied.

#### Why did my run reject a URL?

The product contract accepts only public ProductReview.com.au category and listing routes.
Use a URL beginning with `https://www.productreview.com.au/c/` or `https://www.productreview.com.au/listings/`.

#### Why did extraction fail with no records?

Confirm the listing still has public reviews and that the URL loads in your network.
If direct traffic is temporarily blocked, enable Apify Proxy and retry with a small limit.
The Actor intentionally fails rather than returning a misleading successful empty dataset.

#### Can I scrape all historical reviews?

Increase `maxPagesPerListing` and `maxItems` for a bounded backfill.
Very large histories should be split into controlled runs and monitored for source changes.

#### Does it support scheduled monitoring?

Yes. Save the input as an Apify Task, attach a Schedule, and deduplicate new datasets by `reviewId` downstream.

### Related scrapers

Build a broader public review and reputation workflow with other Automation Lab Actors:

- [Google Maps Reviews Scraper](https://apify.com/automation-lab/google-maps-reviews-scraper)
- [Trustpilot Scraper](https://apify.com/automation-lab/trustpilot-scraper)
- [Amazon Reviews Scraper](https://apify.com/automation-lab/amazon-reviews-scraper)

Use ProductReview.com.au Reviews Scraper when the target is the Australian ProductReview portal and combine sources only when their review definitions are appropriate for your analysis.

### Support

If a public ProductReview category or listing page no longer parses correctly, open an Actor issue with:

- the exact start URL;
- a safe copy of the input;
- the run ID;
- the expected record type; and
- the field or page that changed.

Do not include private credentials or unrelated personal data.
Clear reproduction details help distinguish a source layout change from an input-scope error.

# Actor input Schema

## `startUrls` (type: `array`):

Add one or more ProductReview.com.au /c/... category URLs or /listings/... listing URLs.

## `maxItems` (type: `integer`):

Stop after saving this many unique review records across all inputs.

## `maxListingsPerCategory` (type: `integer`):

When a category URL is supplied, scrape up to this many listing pages from it.

## `maxPagesPerListing` (type: `integer`):

Follow ProductReview.com.au review pagination up to this many pages for each listing.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy or custom proxies. Direct HTTP works for the normal public pages.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.productreview.com.au/listings/booktopia"
    }
  ],
  "maxItems": 10,
  "maxListingsPerCategory": 1,
  "maxPagesPerListing": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.productreview.com.au/listings/booktopia"
        }
    ],
    "maxItems": 10,
    "maxListingsPerCategory": 1,
    "maxPagesPerListing": 1,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/productreview-australia-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.productreview.com.au/listings/booktopia" }],
    "maxItems": 10,
    "maxListingsPerCategory": 1,
    "maxPagesPerListing": 1,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/productreview-australia-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.productreview.com.au/listings/booktopia"
    }
  ],
  "maxItems": 10,
  "maxListingsPerCategory": 1,
  "maxPagesPerListing": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/productreview-australia-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/productreview-australia-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ProductReview.com.au Reviews Scraper",
        "description": "🇦🇺 Export public ProductReview.com.au customer reviews with ratings, reviewer context, verified/incentive badges, images, and business replies—ready for monitoring and analysis.",
        "version": "0.1",
        "x-build-id": "urHjmwhFT2RLpaT8U"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~productreview-australia-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-productreview-australia-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~productreview-australia-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-productreview-australia-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~productreview-australia-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-productreview-australia-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "🔗 Category or listing URLs",
                        "type": "array",
                        "description": "Add one or more ProductReview.com.au /c/... category URLs or /listings/... listing URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum reviews",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Stop after saving this many unique review records across all inputs.",
                        "default": 20
                    },
                    "maxListingsPerCategory": {
                        "title": "Listings per category",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "When a category URL is supplied, scrape up to this many listing pages from it.",
                        "default": 3
                    },
                    "maxPagesPerListing": {
                        "title": "Review pages per listing",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Follow ProductReview.com.au review pagination up to this many pages for each listing.",
                        "default": 2
                    },
                    "proxyConfiguration": {
                        "title": "🌐 Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy or custom proxies. Direct HTTP works for the normal public pages.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
