{
  "openapi": "3.0.1",
  "info": {
    "title": "HiPages Scraper - Business Listings, Contacts & Reviews",
    "description": "Scrape business listings from HiPages Australia by category, location, or URL. Extract business names, contact details, ratings, customer reviews, images, service areas, and other structured business information.",
    "version": "0.3",
    "x-build-id": "8Q8BMnSuNsaVcgIKR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~hipages-business-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-hipages-business-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~hipages-business-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-hipages-business-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~hipages-business-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-hipages-business-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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Choose search mode to enter category and location, or URL mode to paste HiPages search URLs.",
            "default": "search"
          },
          "category": {
            "title": "Category",
            "enum": [
              "air_conditioning",
              "antenna_services",
              "appliance_installation",
              "appliance_repairs",
              "arborists",
              "architects",
              "asbestos_removal",
              "awning_suppliers",
              "awnings",
              "balustrades",
              "bamboo_flooring",
              "bath_resurfacing",
              "bathroom_accessories",
              "bathroom_renovations",
              "blinds",
              "bricklayers",
              "builders",
              "building_certifiers",
              "building_consultants",
              "building_designers",
              "inspection_services",
              "building_suppliers",
              "building_surveyors",
              "cabinet_makers",
              "carpenters",
              "carpet_cleaning",
              "carpet_layers",
              "carpets",
              "carports",
              "ceilings",
              "chimney_sweepers",
              "cladding",
              "commercial_cleaning",
              "concrete_kerbs",
              "concrete_resurfacing",
              "concretors",
              "construction_project_management",
              "curtains",
              "custom_furniture",
              "damp_proofing",
              "decking",
              "demolition",
              "door_suppliers",
              "doors",
              "drafters",
              "ev_charger_installation",
              "electricians",
              "equipment_hire",
              "excavation",
              "fences",
              "floor_coatings",
              "floor_sanding",
              "flyscreens",
              "garages",
              "garden_designer",
              "garden_maintenance",
              "gas_fitters",
              "gates",
              "gazebo",
              "glass_glazier",
              "gutter_cleaning",
              "guttering",
              "handrails",
              "handyman",
              "heaters",
              "heating_systems",
              "home_automation",
              "home_renovations",
              "security",
              "home_theatre",
              "homewares",
              "hot_water_systems",
              "cleaning_services",
              "render",
              "insulation",
              "interior_decorator",
              "interior_designer",
              "irrigation_systems",
              "joiners",
              "interior_designer_kitchen_design",
              "kitchen_renovations",
              "landscape_architect",
              "landscaper_gardener",
              "lawn_turf",
              "lawn_mowing",
              "lighting",
              "locksmiths",
              "painters",
              "patios",
              "paver",
              "pergola",
              "pest_control",
              "pest_inspections",
              "plastering",
              "plumbers",
              "pool_fencing",
              "pool_heating",
              "pool_maintenance",
              "pressure_cleaner",
              "privacy_screens",
              "professional_organisers",
              "furniture_removal",
              "renderer",
              "retaining_walls",
              "roller_shutters",
              "roof_repairs",
              "roofing",
              "rubbish_remover",
              "scaffolding",
              "security_screens_doors",
              "shades_sails",
              "sheds",
              "shop_fitters",
              "shower_screens",
              "skylights",
              "solar_panel_cleaners",
              "solar_power",
              "splashbacks",
              "stained_glass",
              "staircases_handrails",
              "stonemasons",
              "storage",
              "structural_engineer",
              "surveyor",
              "pools",
              "tilers",
              "timber_flooring",
              "architectural_town_planning_services",
              "tree_fellers",
              "heating_systems_underfloor_heating",
              "underpinning",
              "upholstery_repair",
              "ventilation",
              "verandahs",
              "all",
              "vinyl_laminate",
              "wallpaperers",
              "wardrobes",
              "skip_truck_hire",
              "waterproofers",
              "window_cleaners",
              "window_repairs",
              "window_shutters",
              "window_tinting",
              "windows"
            ],
            "type": "string",
            "description": "Service category to search for. Used in search mode.",
            "default": "excavation"
          },
          "state": {
            "title": "State",
            "enum": [
              "nsw",
              "vic",
              "qld",
              "sa",
              "wa",
              "tas",
              "nt",
              "act"
            ],
            "type": "string",
            "description": "Australian state code. Used in search mode.",
            "default": "vic"
          },
          "suburb": {
            "title": "Suburb",
            "type": "string",
            "description": "Suburb name. Used in search mode. Examples: Clayton, Glen Waverley, or 'Clayton VIC 3168' (the state in the text is used when State is not set).",
            "default": "clayton"
          },
          "postcode": {
            "title": "Postcode",
            "minimum": 200,
            "maximum": 9999,
            "type": "integer",
            "description": "Optional Australian postcode, e.g. 2213. Used in search mode: when set, results are filtered by postcode and State/Suburb are ignored."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "Rating",
              "Total Hired",
              "Total Recommendations"
            ],
            "type": "string",
            "description": "Optional. Sorts the collected businesses best-first by Rating, Total Hired or Total Recommendations. The site returns its own order, so up to 1000 businesses of the search are collected and sorted here before Max Businesses is applied. Empty keeps the site order."
          },
          "urls": {
            "title": "HiPages search URLs",
            "type": "array",
            "description": "Paste HiPages search result URLs: a suburb (https://hipages.com.au/find/excavation/vic/clayton), a whole state (https://hipages.com.au/find/excavation/vic) or a whole category across Australia (https://hipages.com.au/find/excavation). A business profile page is not a search URL and is not supported. A ?page= parameter is ignored (results start from the first page). Used only in URL mode.",
            "default": [
              {
                "url": "https://hipages.com.au/find/excavation/vic/clayton"
              },
              {
                "url": "https://hipages.com.au/find/excavation/vic"
              },
              {
                "url": "https://hipages.com.au/find/excavation"
              }
            ],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxBusinesses": {
            "title": "Maximum Businesses",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum number of businesses to scrape",
            "default": 5
          },
          "pageLimit": {
            "title": "Page Limit",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of results per API request (max 10)",
            "default": 10
          },
          "scrapeDetails": {
            "title": "Scrape Business Details",
            "type": "boolean",
            "description": "If enabled, scrape detailed information from each business profile page (slower but more comprehensive) Each delivered business whose profile page is read is charged as one detail-page event on top of the per-result charge; businesses whose profile page is refused, and businesses incremental mode suppresses as unchanged, are not charged.",
            "default": false
          },
          "scrapeRecommendations": {
            "title": "Scrape All Recommendations",
            "type": "boolean",
            "description": "If enabled (requires scrapeDetails to be true), extract all customer recommendations and reviews from each business profile page The recommendations read folds into the per-business detail-page event unit (see Scrape Business Details).",
            "default": false
          },
          "maxRecommendations": {
            "title": "Max Recommendations per Business",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Used with Scrape All Recommendations: the most recommendations returned per business, newest first. Higher values take longer.",
            "default": 20
          },
          "proxy": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Connection settings. The default uses Apify Proxy without a paid proxy group selected.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": []
            }
          },
          "resumeFromRunId": {
            "title": "Resume from a previous run (delta)",
            "type": "string",
            "description": "Optional. ID of a previous run of this actor (or a dataset ID) to continue ONE interrupted crawl. Businesses already in that dataset are skipped, so this run returns only NEW businesses (a delta). Combine both runs' datasets for the full set. For a search you run on a RECURRING schedule, use Incremental mode below instead — it remembers state itself so you don't paste an id every time."
          },
          "incrementalMode": {
            "title": "Incremental mode (recurring monitoring)",
            "type": "boolean",
            "description": "For a search you run repeatedly on a schedule. When ON, the actor remembers the previous run of the SAME search itself (see Resume above instead for a one-off continuation by id) and adds changeType (NEW/UPDATED/REAPPEARED/EXPIRED/UNCHANGED) + changedFields/firstSeenAt/lastSeenAt to every business. A business counts as UPDATED when any returned field changes (name, phone, service area, star rating, recommendation counts and latest recommendation, gallery, licence flags, distance, and the detailed info / recommendations when those are scraped). The search position is excluded because it shifts whenever other businesses move, and any fields you list under 'Ignore fields when detecting changes' are excluded too; excluded fields still appear in the output but never trigger UPDATED or appear in changedFields. UNCHANGED businesses are neither pushed nor billed unless 'Emit unchanged businesses' is on. Off by default — existing schedules and output are unaffected.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, Incremental mode only)",
            "type": "string",
            "description": "Only used when Incremental mode is on. Name this monitoring campaign so its baseline is tracked separately from any other search. Leave empty to auto-derive a key from category/state/suburb/postcode and detail settings — two differently-configured searches never share a baseline either way."
          },
          "emitUnchanged": {
            "title": "Emit unchanged businesses (Incremental mode only)",
            "type": "boolean",
            "description": "Only used when Incremental mode is on. When ON, businesses with no change since the last run are still pushed to the dataset (changeType=UNCHANGED) and billed like any other row. Off by default, so a recurring run returns and bills only what actually changed.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired businesses (Incremental mode only)",
            "type": "boolean",
            "description": "Only used when Incremental mode is on. When ON, and this run scans the tracked search to completion, businesses that were previously tracked but no longer appear are pushed once with changeType=EXPIRED (and billed). Off by default. Never fires on a capped, resumed, or otherwise partial run.",
            "default": false
          },
          "ignoreFieldsForChanges": {
            "title": "Ignore fields when detecting changes (incremental mode only)",
            "type": "array",
            "description": "Only used when Incremental mode is on. Field names to leave out when deciding whether a business changed, so noisy fields do not turn a business into UPDATED. Supports nested paths with dots and * wildcards, for example phone, starRating.totalRatings, detailedInfo.* or searchContext.*. Ignored fields are still returned in the output, just not compared and never listed in changedFields.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "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
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}