{
  "openapi": "3.0.1",
  "info": {
    "title": "Product Reviews AU [$1💰] Listings and Reviews Scraper",
    "description": "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.",
    "version": "2.1",
    "x-build-id": "CZiaLqrk6aNcWsRay"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~product-reviews-australia-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-product-reviews-australia-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/abotapi~product-reviews-australia-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-product-reviews-australia-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/abotapi~product-reviews-australia-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-product-reviews-australia-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",
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "How to discover listings. Filter mode = pick a category + filters; URL mode = paste explicit URLs (search/category/listing) and ignore filters.",
            "default": "search"
          },
          "outputType": {
            "title": "Output",
            "enum": [
              "listings",
              "reviews"
            ],
            "type": "string",
            "description": "What rows to emit. 'listings' = one row per listing with up to 10 preview reviews embedded. 'reviews' = one row per review with a sourceListing pointer (no listing rows).",
            "default": "listings"
          },
          "category": {
            "title": "Category Slug",
            "type": "string",
            "description": "ProductReview category slug, e.g. 'home-garden-shops' or 'lighting'. The actor builds /c/<slug>. If empty, defaults to 'home-garden-shops'.",
            "default": "home-garden-shops"
          },
          "searchQuery": {
            "title": "Search Query",
            "type": "string",
            "description": "Appended as ?q=. Narrows results within the chosen category."
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Location slug like 'victoria_au' or 'nsw_au'. Inserted as /c/<cat>/l/<loc>."
          },
          "showDiscontinued": {
            "title": "Show Discontinued",
            "type": "boolean",
            "description": "Include discontinued products/services in the results.",
            "default": false
          },
          "sortBy": {
            "title": "Sort Results By",
            "enum": [
              "",
              "relevance",
              "rating",
              "numberOfReviews",
              "popularity",
              "lowestPrice",
              "highestPrice"
            ],
            "type": "string",
            "description": "Sort key. Values match productreview.com.au's `availableSortingFields` SSR keys.",
            "default": ""
          },
          "urls": {
            "title": "URLs",
            "type": "array",
            "description": "Multi-URL list. Each URL can be a category page (/c/<cat>), a search page (/search?q=...), or a direct listing (/listings/<slug>). Filter-mode fields are ignored when Mode = URL. Auto-routed by URL shape.",
            "default": [
              "https://www.productreview.com.au/listings/the-lighting-outlet",
              "https://www.productreview.com.au/c/home-garden-shops",
              "https://www.productreview.com.au/search?q=lighting"
            ],
            "items": {
              "type": "string"
            }
          },
          "limit": {
            "title": "Max Output Rows",
            "minimum": 1,
            "type": "integer",
            "description": "Universal cap on dataset rows. In Listings output: max listings (search/category pages cap at 30 per URL). In Reviews output: max review rows; the actor walks review pages until this is reached, then stops.",
            "default": 20
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of in-flight requests. 2 is safe without proxy (the site throttles bursts from one IP). With an Apify residential proxy you can push 8–10.",
            "default": 4
          },
          "proxy": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Apify proxy. Defaults to datacenter (works on the free plan). For higher throughput or harder runs, switch to residential: apifyProxyGroups=['RESIDENTIAL'], apifyProxyCountry='AU'.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": []
            }
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "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)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run",
            "type": "string",
            "description": "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."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "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. 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.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "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."
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired rows (incremental mode only)",
            "type": "boolean",
            "description": "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.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}