# Hipages Scraper \[$0.90/1K💰] | AU Tradie Leads & Reviews (`ahmed_jasarevic/hipages-scraper`) Actor

Scrape hipages.com.au tradie profiles: trade categories, service areas, phone, email, ABN, licences and ratings, plus a separate reviews dataset. Ideal for Australian home-services lead generation and review monitoring.

- **URL**: https://apify.com/ahmed_jasarevic/hipages-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.88 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hipages Scraper: Australian Tradie & Home-Services Data

Scrape **hipages.com.au**, Australia's largest home-services marketplace, and export tradie business profiles with trade categories, service areas, phone, email, website, ABN, licences, ratings and quote links as clean structured JSON. Individual review texts go to a separate, separately priced **reviews** dataset. It reads hipages' own turbo-stream JSON endpoints, so there is no browser and no Cloudflare challenge.

Built for Australian home-services lead generation, franchise-expansion research, tradie-competitor intelligence, and review-monitoring teams.

### Main use cases

- **Lead generation australia**: build targeted lists of tradies by trade, state and suburb, with phone, email and quote links.
- **Tradie competitor intelligence**: compare ratings, recommendation counts, hired counts and service areas across trades.
- **Franchise and market-expansion research**: measure how many businesses of a trade operate in each state or capital city.
- **Review monitoring**: track hipages and Google review volume and sentiment by category over time (separate `reviews` dataset).
- **Vendor and procurement sourcing**: shortlist licensed, insured tradies with verified licence and insurance data.
- **Home-improvement market datasets**: assemble structured Australian home-services records for analytics.

### How it works

hipages.com.au is a **React Router 7 (Remix-style) app**. Every route exposes its server loader data as a **turbo-stream `.data` payload**: structured JSON with no HTML, no cookies and no Cloudflare challenge. This actor queries those internal endpoints directly with plain HTTP (`CheerioCrawler`, no browser):

| Surface | Endpoint | Returns |
|---|---|---|
| Listing (search results) | `https://hipages.com.au/find/<category>/<state>/<suburb>.data` | `{ businesses: [{ key, name, ... }], ... }` |
| Business profile | `https://hipages.com.au/connect/<profile-key>.data` | `{ site, page, hipagesReviews, reviewsSummary, insurances, ... }` |
| Reviews pagination | `https://hipages.com.au/api/profile-reviews.data?slug=<key>&source=<hipages\|google>&page=<n>&pageSize=<n>&sort=recent_desc` | `{ ok, items: [review...], page: { index, size, total, hasMore } }` (pageSize <= 50) |

The payload is a turbo-stream flat array (objects whose keys look like `_<n>` reference chunk `n`; negative indexes are `undefined`/`null` sentinels), decoded by a dependency-free decoder and mapped into flat dataset rows. Because the `.data` endpoints return the exact loader JSON the site renders from, every field (ratings, all review texts, licences, service-area links, phones) is available without executing JavaScript, solving CAPTCHAs, or paying for an anti-bot service.

### Extract Australian Tradie Leads For Lead Generation

For every business found on a listing page, the actor returns a full profile row: business name, profile key and URL, request-a-quote URL, primary category plus all categories, service areas (suburb/state/postcode), phone, mobile, email, website, ABN, address, suburb and state, hipages star rating and rating count, hired count, recommendation counts (yes/no/total), Google rating and count, licence details (authority, number, verification URL), review count, insurance data, description, headline, join date and image URL.

### Build A Tradie Directory Without A hipages API

No public or open hipages API is documented; the site is JavaScript-driven and its listing data is not present in the served HTML. This actor sidesteps that by reading hipages' own internal `.data` loader endpoints, which return structured JSON directly. The reverse-engineering order considered was: embedded JSON blob (not applicable, the data is not in the HTML) then third-party search backend (none found, no Algolia/Meilisearch/Elasticsearch in the page JS) then the internal `.data` JSON API (used) then static HTML then Playwright (not needed).

If hipages ever changes its format, the first place to look is the site's JS bundle for the single-fetch route modules (`routes/_connect.connect.$profile`, `routes/_banner.find.*`) and the `.data` suffix convention.

**Cost notes**

- Cheerio/JSON actor, 256 MB memory, no browser and no paid anti-bot API needed.
- Requests are capped (`maxRequestsPerCrawl`, concurrency 20, 3 retries) so runs stay fast and cheap; the `.data` endpoints are lightweight JSON.
- Set `includeReviews` to `false` or `maxReviewsPerBusiness` to `0` to skip reviews entirely.

### Input Parameters

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `category` | string | No | `plumbers` | hipages trade category key, e.g. `plumbers`, `electricians`, `painters`, `concretors`, `tilers`, `builders`, `handyman`, `pest_control`, `cleaning_services`, `air_conditioning`. |
| `location` | string | No | - | `state/suburb` (e.g. `nsw/sydney`, `vic/melbourne`) or a state key (`nsw`, `vic`, `qld`, `wa`, `sa`, `tas`, `act`, `nt`). Leave empty to scrape the major capital cities. |
| `startUrls` | array (requestListSources) | No | `[]` | Explicit hipages listing pages (`https://hipages.com.au/find/plumbers/nsw/sydney`) or business profiles (`https://hipages.com.au/connect/<key>`). Overrides `category`/`location`. |
| `maxBusinesses` | integer | No | `100` | Maximum number of business profiles to output. |
| `includeReviews` | boolean | No | `true` | Collect the individual review texts embedded in each profile into the separate `reviews` dataset. |
| `maxReviewsPerBusiness` | integer | No | `10` | Maximum reviews per business written to the `reviews` dataset. Higher values page through hipages' reviews API (up to 50 per page). `0` skips reviews entirely. |
| `proxy` | object (proxy) | No | `useApifyProxy: false` | Standard Apify proxy picker. Off by default; enable (residential) if hipages adds bot protection later. |

### Output Fields

#### Default dataset: one row per business

The default `overview` view shows Business, Trade, Suburb, State, Rating, Reviews, Phone and Website.

| Field | Type | Description |
|---|---|---|
| `businessName` | string | Business / tradie name. |
| `profileKey` | string | hipages profile key (slug). |
| `profileUrl` | string | hipages profile URL. |
| `quoteUrl` | string | URL of the request-a-quote page. |
| `primaryCategory` | string | Primary trade category. |
| `categories` | array | All trade categories / services. |
| `serviceAreas` | array | Suburbs/postcodes served (`{suburb, state, postcode}`). |
| `phone` | string | Business phone. |
| `mobile` | string | Mobile number. |
| `email` | string | Business email. |
| `website` | string | Business website. |
| `abn` | string | Australian Business Number. |
| `address` | string | Business address. |
| `suburb` | string | Suburb. |
| `state` | string | State. |
| `rating` | number | Average hipages star rating. |
| `ratingCount` | integer | Number of ratings. |
| `hiredCount` | integer | Number of jobs hired through hipages. |
| `recommendYes` | integer | Positive recommendations. |
| `recommendNo` | integer | Negative recommendations. |
| `totalRecommendations` | integer | Total recommendations. |
| `googleRating` | number | Google rating. |
| `googleRatingCount` | integer | Google rating count. |
| `licenses` | array | Licence authority, number and verification URL. |
| `reviewCount` | integer | Review count. |
| `insurance` | object | Insurance details. |
| `description` | string | Business description. |
| `headline` | string | Business headline. |
| `joinedDate` | string | Date the business joined hipages. |
| `imageUrl` | string | Profile image URL. |
| `scrapedAt` | string | ISO timestamp. |

#### `reviews` dataset: one row per review

`reviewId`, `source` (`hipages`/`google`), `reviewerName`, `rating`, `comment`, `date`, `location`, `category`, `hired`, `verified`, `reply` (`{comment, author, date}`), plus the owning business's `profileKey`, `profileUrl`, `businessName`, `primaryCategory` and `scrapedAt`, so each review row is self-contained and joinable back to the business.

### Example Input And Output

**Input**

```json
{
  "category": "plumbers",
  "location": "nsw/sydney",
  "maxBusinesses": 100,
  "includeReviews": true,
  "maxReviewsPerBusiness": 10
}
```

**Output (default dataset, one row)**

```json
{
  "businessName": "Hoppy's Plumbing",
  "profileKey": "hoppysplumbing",
  "profileUrl": "https://hipages.com.au/connect/hoppysplumbing",
  "quoteUrl": "https://hipages.com.au/connect/hoppysplumbing",
  "primaryCategory": "Plumbers",
  "categories": ["Plumbers", "Gas Fitters"],
  "serviceAreas": [{ "suburb": "Sydney", "state": "NSW", "postcode": "2000" }],
  "phone": "02 9000 0000",
  "mobile": "0400 000 000",
  "email": "info@hoppysplumbing.com.au",
  "website": "https://hoppysplumbing.com.au",
  "abn": "12 345 678 901",
  "address": "1 Example St, Sydney NSW 2000",
  "suburb": "Sydney",
  "state": "NSW",
  "rating": 4.9,
  "ratingCount": 128,
  "hiredCount": 96,
  "recommendYes": 120,
  "recommendNo": 3,
  "totalRecommendations": 123,
  "googleRating": 4.8,
  "googleRatingCount": 64,
  "licenses": [{ "authority": "NSW Fair Trading", "number": "123456C", "verified": true, "verifyUrl": "https://..." }],
  "reviewCount": 128,
  "insurance": { "publicLiability": true },
  "description": "Licensed plumber serving Sydney ...",
  "headline": "24/7 emergency plumbing",
  "joinedDate": "2018-05-01",
  "imageUrl": "https://.../logo.png",
  "scrapedAt": "2026-10-11T09:00:00.000Z"
}
```

**Output (`reviews` dataset, one row)**

```json
{
  "reviewId": "abc123",
  "source": "hipages",
  "reviewerName": "Sarah M.",
  "rating": 5,
  "comment": "Fast, tidy and well priced.",
  "date": "2026-08-20",
  "location": "Sydney",
  "category": "Plumbers",
  "hired": true,
  "verified": true,
  "reply": { "comment": "Thanks Sarah!", "author": "Hoppy's Plumbing", "date": "2026-08-21" },
  "profileKey": "hoppysplumbing",
  "profileUrl": "https://hipages.com.au/connect/hoppysplumbing",
  "businessName": "Hoppy's Plumbing",
  "primaryCategory": "Plumbers",
  "scrapedAt": "2026-10-11T09:00:00.000Z"
}
```

### Integrations & Automation

Every Apify actor is reachable through the **Apify API**, and this one plugs into **webhooks**, **Zapier** and **Make** so results can flow into a Google Sheet, Airtable base, CRM or data warehouse. For lead generation and review monitoring, run it on a **schedule**: a weekly snapshot of your target trades and cities keeps your lead list fresh and tracks rating and review changes, and recurring runs also improve the actor's Store recommendation signals.

### Related Actors

- [hipages-lead-extractor](https://apify.com/websift/hipages-lead-extractor): the largest hipages lead actor; a reference point for the topic cluster.
- [hipages-business-scraper](https://apify.com/abotapi/hipages-business-scraper): another hipages business scraper.
- [taskrabbit-scraper](https://apify.com/ahmed_jasarevic/taskrabbit-scraper): task and services marketplace data to widen coverage of the services cluster.
- [starofservice-scraper](https://apify.com/ahmed_jasarevic/starofservice-scraper): local-services marketplace data for multi-platform lead datasets.
- [checkatrade-scraper](https://apify.com/ahmed_jasarevic/checkatrade-scraper): UK verified-trades directory, a companion home-services source.

### FAQ

#### Is there an official hipages API?

No public or open hipages API is documented; the site is JavaScript-driven with a React Router 7 turbo-stream backend. This actor reads hipages' own internal `.data` loader endpoints, which return the same structured JSON the site's frontend renders from, so you get tradie data without an API key, a browser or an anti-bot service.

#### What are the alternatives to this actor / this data source?

For Australian home-services data you can combine this with Airtasker, ServiceSeeking or Yellow Pages Australia scrapers. hipages is the largest dedicated tradie marketplace, so it is worth having alongside general directory sources to widen coverage of trade businesses, licences and reviews.

#### How do I build a tradie lead list by trade and location?

Set `category` to the trade (e.g. `electricians`) and `location` to a state or `state/suburb` (e.g. `vic/melbourne`), then set `maxBusinesses`. The actor returns one row per tradie with phone, mobile, email, website, ABN, service areas and rating, ready for a spreadsheet or CRM.

#### Where do the review texts go?

Review texts are written to a separate `reviews` dataset, one row per review, so you can export them independently. Business rows in the default dataset and review rows are charged separately.

#### Why are some businesses missing a licence or email?

Only what hipages exposes on the profile is returned. Some tradies do not publish a licence, insurance record or email, so those fields can be empty for those rows.

#### Does hipages block scrapers?

The internal `.data` endpoints return plain JSON without cookies or a Cloudflare challenge, so scrapers work directly. If hipages adds bot protection later, enable the Apify proxy input (residential group) and re-test before scaling.

### SEO Keywords

hipages, hipages scraper, hipages api, tradie, tradies, home services australia, tradie directory, lead generation australia, plumber sydney, electrician melbourne, australian tradies, tradesman directory, home improvement australia, tradie reviews, abn builder leads, hipages alternative, hipages data, australia home services, tradie leads, tradie marketplace

### For AI Agents & LLM Apps

Purpose: return one structured Australian tradie business row per hipages profile for a given trade category and location, plus optional per-review rows in a separate dataset.

Minimal working input:

```json
{ "category": "plumbers", "location": "nsw/sydney", "maxBusinesses": 50 }
```

Output fields (default dataset): `businessName, profileKey, profileUrl, quoteUrl, primaryCategory, categories, serviceAreas, phone, mobile, email, website, abn, address, suburb, state, rating, ratingCount, hiredCount, recommendYes, recommendNo, totalRecommendations, googleRating, googleRatingCount, licenses, reviewCount, insurance, description, headline, joinedDate, imageUrl, scrapedAt`.

Output fields (`reviews` dataset): `reviewId, source, reviewerName, rating, comment, date, location, category, hired, verified, reply, profileKey, profileUrl, businessName, primaryCategory, scrapedAt`.

Behaviors an agent should know:

- `category` and `location` drive discovery; if `startUrls` is set, both are ignored and only those pages are scraped.
- `location` accepts `state/suburb` or a bare state key; empty means the five major capital cities.
- `maxBusinesses` defaults to **100**; free-plan runs are capped at 10 businesses.
- `includeReviews` defaults to `true`; reviews are written to a **separate dataset**, not into the business rows.
- `maxReviewsPerBusiness` defaults to **10**; higher values page through hipages' reviews API (up to 50 per page). `0` skips reviews entirely.
- The proxy is off by default; enable it only if hipages starts blocking.

Billing: pay-per-event: **$0.0009 per business result** ($0.90 / 1,000) via the default-dataset item event, **$0.0009 per review** ($0.90 / 1,000) via the custom `review` event, plus a $0.00005 actor-start event.

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by hipages**. It accesses only publicly available hipages pages and internal JSON surfaces; it does not log in, bypass authentication, or solve CAPTCHAs on anyone's behalf. Users are responsible for ensuring their use complies with hipages' Terms of Service and with applicable data-protection law (including the Australian Privacy Act). Where output includes business contact details such as phone numbers, mobiles or emails, it must not be used for unsolicited commercial outreach in violation of applicable law.

# Actor input Schema

## `category` (type: `string`):

hipages trade category key, e.g. plumbers, electricians, painters, concretors, tilers, builders, handyman, pest_control, cleaning_services, air_conditioning.

## `location` (type: `string`):

Optional location as 'state/suburb' (e.g. nsw/sydney, vic/melbourne) or a state key (nsw, vic, qld, wa, sa, tas, act, nt). Leave empty to scrape the major capital cities.

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

Optional explicit hipages listing pages (e.g. https://hipages.com.au/find/plumbers/nsw/sydney) or business profiles (e.g. https://hipages.com.au/connect/hoppysplumbing). When provided, category/location are ignored.

## `maxBusinesses` (type: `integer`):

Maximum number of business profiles to output.

## `includeReviews` (type: `boolean`):

Collect the individual review texts embedded in each profile (reviewer name, rating, date, location and business reply). Reviews are written to a separate 'reviews' dataset, independent from the businesses in the default dataset.

## `maxReviewsPerBusiness` (type: `integer`):

Maximum number of reviews per business written to the 'reviews' dataset. hipages embeds ~10 in the profile; higher values page through hipages' reviews API (up to 50 per page) until the cap or all reviews are collected. Set 0 to skip reviews entirely.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "category": "plumbers",
  "startUrls": [],
  "maxBusinesses": 100,
  "includeReviews": true,
  "maxReviewsPerBusiness": 10,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

No description

## `reviews` (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 = {
    "category": "plumbers",
    "startUrls": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/hipages-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 = {
    "category": "plumbers",
    "startUrls": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/hipages-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "category": "plumbers",
  "startUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/hipages-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/hipages-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/LWWfMUqfAYS4IKLO5/builds/fiLi1FoDxOP6NBRMs/openapi.json
