# Property24 Scraper - South Africa Property Data (`sian.agency/property24-property-scraper`) Actor

Scrape Property24 listings across South Africa, Namibia, Botswana, Zambia, Zimbabwe, Mozambique and Kenya: price, beds, baths, erf and floor size, levies, rates, suburb, agency and agent. For sale and to rent. JSON, CSV or Excel.

- **URL**: https://apify.com/sian.agency/property24-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.88 / 1,000 property searches

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Property24 Scraper - South Africa Property Data & API 🏘️

[![Store SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store MENA Property Gateway](https://img.shields.io/badge/Store-MENA%20Property%20Gateway-93D500)](https://apify.com/sian.agency/mena-property-gateway?fpr=sian) [![Store Property Finder](https://img.shields.io/badge/Store-Property%20Finder-1AE392)](https://apify.com/sian.agency/propertyfinder-property-scraper?fpr=sian) [![Store Zillow Property Detail](https://img.shields.io/badge/Store-Zillow%20Property%20Detail-1F4E79)](https://apify.com/sian.agency/zillow-property-detail-scraper?fpr=sian)

#### 🎉 Seven Property24 country sites in one Actor. About 21 properties per request, from $1.00 per 1,000 rows.

##### For South African market analysts, estate agencies, buy-to-let investors and anyone tracking Cape Town, Johannesburg, Pretoria or Durban asking prices

Property24 advertises roughly 222,000 South African homes for sale and 86,000 to rent, and it publishes no API. This Actor reads the site's own results pages and hands back every advert as a flat row: price as a number, bedrooms, bathrooms, erf and floor size, suburb, and the agency holding the mandate. You type a place name and press Start. The same run works on the Namibian, Botswanan, Zambian, Zimbabwean, Mozambican and Kenyan editions, which no other Property24 Actor on the Store documents.

***

### 🔎 What is the Property24 Scraper — and when should you use it?

The **Property24 Scraper** turns any Property24 search across South Africa and its six African editions into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** asking prices as numbers with the currency alongside, bedrooms, bathrooms, parking, erf size and floor size each with their own unit, and the suburb and agency on every row. Listings for sale and to rent are both covered, on property24.com and on the Namibian, Botswanan, Zambian, Zimbabwean, Mozambican and Kenyan editions of the same platform. Turning on the listing detail adds the full advert text, every photo, the agency and each named agent with their job title and profile link, the listing date, levies, rates and taxes, and price per square metre. Auction, show-day and bank-repossessed adverts are flagged on the row.

**Use something else when:** the property is outside Southern and East Africa. Use [Bayut Scraper](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian) for the UAE, Saudi Arabia and Egypt. Use [Zoopla Property Scraper](https://apify.com/sian.agency/zoopla-property-scraper?fpr=sian) for the United Kingdom, with EPC ratings and agent contacts. Use [MagicBricks Property Scraper](https://apify.com/sian.agency/magicbricks-property-scraper?fpr=sian) for India, with carpet area and RERA registration. This actor reads live Property24 adverts only. It does not return sold-price history or points of interest, which Property24 keeps on separate pages, and it returns no per-property GPS pin because Property24 publishes none — `areaLatitude` and `areaLongitude` are the centre of the area that was searched, not the building. For a second South African portal, PrivateProperty and Pam Golding are not covered by any SIÁN actor yet.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/property24-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want to research the South African property market, or any of the six African markets Property24 also runs using the Apify Actor `sian.agency/property24-property-scraper`.

Use it when I need: asking prices as numbers with the currency alongside, bedrooms, bathrooms, parking, erf size and floor size each with their own unit, and the suburb and agency on every row. Listings for sale and to rent are both covered, on property24.com and on the Namibian, Botswanan, Zambian, Zimbabwean, Mozambican and Kenyan editions of the same platform. Turning on the listing detail adds the full advert text, every photo, the agency and each named agent with their job title and profile link, the listing date, levies, rates and taxes, and price per square metre. Auction, show-day and bank-repossessed adverts are flagged on the row.

Don't use it when: the property is outside Southern and East Africa — use bayut-property-scraper or zoopla-property-scraper or magicbricks-property-scraper instead.

How to call it: give `locations` a list of plain place names written the way a person says them — `Cape Town`, `Sandton`, `Pretoria`, `Durban`, `Stellenbosch`, or `Windhoek` and `Nairobi` on the other editions — and each one is matched against Property24's own browse index before the search runs, so no numeric area id is needed. Write `Suburb, City` to go a level deeper, for example `Sea Point, Cape Town`. Set `country` to one of `za`, `na`, `bw`, `zm`, `zw`, `mz` or `ke`, and `listingType` to `for-sale` or `to-rent`. Narrow with `minPrice`, `maxPrice`, `minBedrooms`, `maxBedrooms`, `minBathrooms` and `propertyType` (`House`, `Apartment / Flat`, `Townhouse`, `Vacant Land`, `Farm`, `Commercial Property`, `Industrial Property`), order the results with `sortBy`, and cap the run with `maxResults`. `includeDetails` opens each property's own page for the full description, every photo, the agents, levies and rates, at an extra charge per property. To expand listings you already have, set `operation` to `detail` and pass `listingUrls` as `[{"url": "…"}]`; to reuse a search you built on the site itself, paste it into `searchUrls` in the same shape — URLs from different editions can be mixed in one run.

Start with this input:
{
  "country": "za",
  "listingType": "for-sale",
  "locations": [
    "Cape Town",
    "Sandton"
  ],
  "propertyType": "House",
  "minBedrooms": 3,
  "maxResults": 120
}

Ask me which areas they want, whether they are buying or renting, and which of the seven Property24 country sites they mean, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every three-bedroom house for sale in Sandton over R5 million and tell me which agency is holding the most stock.*
- *Compare asking rent per square metre for apartments in Sea Point against Green Point and say which is better value.*
- *Find bank-repossessed and on-auction listings across Gauteng this week and give me the agency contact for each.*
- *Run the same search for houses in Windhoek and Nairobi, and show the prices side by side with their own currencies.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/property24-property-scraper.md](https://apify.com/sian.agency/property24-property-scraper.md).

### 📋 Overview

**South Africa's housing market runs on one website, and that website has no public API.** This Actor reads Property24's own results pages and returns every live advert as a flat row. For sale and to rent, from a single suburb up to a whole province, on all seven country sites.

**Why professionals choose it:**

- ✅ **Seven editions, one row shape**: South Africa plus Namibia, Botswana, Zambia, Zimbabwe, Mozambique and Kenya. Kenya's index alone reports about 157,000 listings.
- ⚡ **About 21 properties per request**, up to 20,000 in a run. A whole city is one job.
- 🎯 **Place names instead of area ids**: "Cape Town", "Sandton", "Western Cape" or "Sea Point, Cape Town". The site's internal area number is looked up for you.
- 💰 **$1.00 per 1,000 properties**, charged per row delivered and never for a failed one.
- 💎 **Numbers arrive as numbers**: price, bedrooms, bathrooms, erf size, floor size, levies, rates and price per square metre. No parsing "R 3 150 000" on your side.
- 🔨 **Auction, on-show and repossessed flags** on every row, so distressed stock is a filter rather than a reading exercise.
- 💱 **The currency is stamped on each row**, so one dataset can hold Sandton, Windhoek and Nairobi without the prices colliding.

***

### ✨ Features

- 🌍 **Country picker**: property24.com plus the Namibian, Botswanan, Zambian, Zimbabwean, Mozambican and Kenyan sites.
- 🏷️ **For sale and to rent** on every edition, with rentals priced per month.
- 📍 **Suburb, city or province** in one field. Write "Umhlanga, Durban" to go a level deeper, or leave the list empty to sweep the country.
- 🎛️ **Filters that run before you are billed**: price band, bedrooms, bathrooms and property type. Rows you excluded are never written and never charged.
- 🆕 **Sort by most recent** and run it daily. New adverts land on page one.
- 📄 **Detail option**: full advert text, every photo, the agency and each named agent, listing date, levies, rates and taxes, and price per square metre.
- 📐 **Sizes carry their own unit**, because Kenya quotes land in acres where South Africa uses square metres.
- 🔗 **Paste a search URL** built on the site itself and every filter on it is kept. Links from different editions can be mixed in one run.
- 🧭 **Zero infrastructure settings**: no proxy picker, no concurrency dial, no retry count.
- 📊 **Flat JSON rows**: export as CSV, Excel or JSON, or pull them over the API.

***

### 🎬 Quick Start

Pick a country, type a place name, press Start. Rows land in the dataset as they are found, and a run report is written to the key-value store. Nothing else to configure.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~property24-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","country":"za","listingType":"for-sale","locations":["Cape Town"],"maxResults":100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose the country

South Africa is the default and the largest. Switch to Namibia, Botswana, Zambia, Zimbabwe, Mozambique or Kenya from the same dropdown.

#### Step 2: Name your areas

Type plain place names: "Cape Town", "Sandton", "Stellenbosch", "Windhoek", "Nairobi". A suburb goes in as "Sea Point, Cape Town". A province works too. An empty list sweeps the whole country.

#### Step 3: Press Start

Add a price band, a bedroom count or a property type if you want them. Switch on the detail option when you need descriptions, photos, agents, levies and rates.

**That's it. Within a minute or two you'll have:**

- Every matching property as a spreadsheet row
- The agency holding each mandate, with auction and repossession flags
- A run report showing what was found and what it cost

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|---|---|---|---|
| `operation` | string | No | `search` (default) or `detail` |
| `country` | string | No | `za`, `na`, `bw`, `zm`, `zw`, `mz` or `ke` |
| `listingType` | string | No | `for-sale` (default) or `to-rent` |
| `locations` | array | No | Plain place names. Empty list sweeps the whole country |
| `maxResults` | integer | No | Stop after this many properties across all areas, up to 20,000 |
| `includeDetails` | boolean | No | Add descriptions, photos, agents, levies and rates |
| `minPrice` / `maxPrice` | integer | No | Price bounds in the edition's own currency, per month for rentals |
| `minBedrooms` / `maxBedrooms` | integer | No | Bedroom bounds. 0 means no bound |
| `minBathrooms` | integer | No | Fewest bathrooms to include |
| `propertyType` | string | No | House, Apartment / Flat, Townhouse, Vacant Land, Farm, Commercial Property, Industrial Property |
| `sortBy` | string | No | `default`, `newest`, `price-low`, `price-high` or `size` |
| `searchUrls` | array | No | Paste results URLs instead of filling the fields above. Over the API, pass them as `[{"url": "..."}]` |
| `listingUrls` | array | No | Property URLs to expand with the `detail` operation. Over the API, pass them as `[{"url": "..."}]` |

**Example — three-bedroom houses for sale in Cape Town between R2m and R5m:**

```json
{
  "operation": "search",
  "country": "za",
  "listingType": "for-sale",
  "locations": ["Cape Town"],
  "propertyType": "House",
  "minPrice": 2000000,
  "maxPrice": 5000000,
  "minBedrooms": 3,
  "maxResults": 200
}
```

**Example — new rentals in two Johannesburg suburbs, with levies and rates:**

```json
{
  "operation": "search",
  "country": "za",
  "listingType": "to-rent",
  "locations": ["Bryanston, Sandton", "Rosebank, Johannesburg"],
  "sortBy": "newest",
  "includeDetails": true,
  "maxResults": 100
}
```

**Example — Kenya and Namibia in one run, from pasted search URLs:**

```json
{
  "operation": "search",
  "searchUrls": [
    { "url": "https://www.property24.co.ke/property-for-sale-in-nairobi-c1890" },
    { "url": "https://www.property24.co.na/property-for-sale-in-windhoek-c2268" }
  ],
  "maxResults": 300
}
```

**Example — expand properties you already have:**

```json
{
  "operation": "detail",
  "listingUrls": [
    { "url": "https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138/117401013" }
  ]
}
```

***

### 📤 Output

Every row is flat JSON with **55 fields**. The ones people use most:

| Field | Type | Description |
|---|---|---|
| `listingNumber` | string | Property24's own listing number |
| `url` | string | Link back to the advert |
| `propertyTitle` | string | Headline as advertised, e.g. "3 Bedroom House" |
| `propertyType` | string | House, Apartment, Townhouse and so on |
| `listingType` | string | `for-sale` or `to-rent` |
| `price` | number | Asking price as a number, per month for rentals |
| `currency` | string | The currency the price was advertised in |
| `priceText` | string | The price exactly as the page shows it |
| `bedrooms` / `bathrooms` | number | Room counts |
| `erfSize` / `erfSizeUnit` | number / string | Land size and its unit |
| `floorSize` / `floorSizeUnit` | number / string | Building size and its unit |
| `pricePerSqm` | number | Price per square metre |
| `levies` / `ratesAndTaxes` | number | Monthly levy and municipal rates |
| `suburb` / `country` | string | Where the property sits |
| `areaLatitude` / `areaLongitude` | number | Coordinates of the searched area, not of the property |
| `agencyName` / `agentName` | string | Agency holding the mandate, and the listing agent |
| `agents` | array | Every named agent with job title and profile |
| `isAuction` / `isOnShow` / `isRepossessed` | boolean | Auction, show day and bank-repossessed flags |
| `descriptionText` / `features` | string / array | Full advert text and the feature list |
| `imageUrl` / `photos` / `photoCount` | string / array / number | First photo, all photos, and how many |

**Example row (a Cape Town search result):**

```json
{
  "listingNumber": "117319818",
  "url": "https://www.property24.com/for-sale/fresnaye/cape-town/western-cape/11016/117319818",
  "propertyTitle": "3 Bedroom House",
  "propertyType": "House",
  "listingType": "for-sale",
  "price": 24000000,
  "priceText": "R 24 000 000",
  "currency": "R",
  "bedrooms": 3,
  "bathrooms": 3,
  "erfSize": 597,
  "erfSizeUnit": "m²",
  "suburb": "Fresnaye",
  "country": "za",
  "areaLatitude": -33.9249,
  "areaLongitude": 18.4241,
  "agencyName": "Rawson Properties Camps Bay - Atlantic Seaboard",
  "isAuction": false,
  "isOnShow": false,
  "isRepossessed": false,
  "mandateId": "39880766",
  "imageUrl": "https://images.prop24.com/381319485/Crop525x350",
  "sourceUrl": "https://www.property24.com/for-sale/cape-town/western-cape/432",
  "scrapedAt": "2026-09-06T09:14:22.104Z"
}
```

Switching on the detail option fills in the rest of the row:

- **The advert itself**: `descriptionText`, `features`, `photos`, `photoCount`, `listingDate`, `breadcrumb`, `streetAddress`
- **The costs**: `pricePerSqm`, `levies`, `specialLevy`, `ratesAndTaxes`
- **The property**: `receptionRooms`, `garages`, `parking`, `garden`, `pool`, `petsAllowed`
- **The people**: `agents`, each with job title and profile
- **Rentals only**: `furnished`, `leasePeriod`, `availableFrom`, `deposit`

***

### 💼 Use Cases & Examples

#### 1. South African Property Market Analysis

**Analysts and economists tracking asking prices by suburb, city or province.**

**Input:** A city or province, the for-sale section, run weekly.
**Output:** Asking price, erf and floor size, price per square metre, levies and rates on every row, typed as numbers rather than as "R 3 150 000".
**Use:** Build a suburb-level price index. Run the same area again next week and the price movement is a subtraction.

#### 2. Estate Agent & Agency Lead Lists

**Sales teams selling software, photography or marketing to South African agencies.**

**Input:** An area and a price band, with the detail option on.
**Output:** The agency holding each mandate, plus every named agent with their job title and profile.
**Use:** See exactly who is transacting in a patch and how much stock each agency carries, then rank the call list by inventory.

#### 3. Rental Yield & Buy-to-Let Screening

**Investors and letting agents pricing a purchase against its rent.**

**Input:** The same suburb twice, once for sale and once to rent.
**Output:** Floor size, levies and rates on the for-sale rows; monthly asking rent on the rental rows.
**Use:** Put the two exports side by side and gross and net yield fall out of the arithmetic.

#### 4. Auction, On-Show and Repossession Watch

**Distressed-property buyers and bank mandate specialists.**

**Input:** A province sorted by most recent, on a daily schedule.
**Output:** Every row flagged for auction, show day and bank-repossessed stock.
**Use:** The properties that entered distress this week arrive on their own, without anyone refreshing a results page.

#### 5. Pan-African Portfolio Coverage

**Funds and developers holding property in more than one African market.**

**Input:** The same run shape against Namibia, Botswana, Zambia, Zimbabwe, Mozambique or Kenya.
**Output:** Rows stamped with their country and the currency the price was advertised in.
**Use:** One dataset can hold Windhoek, Nairobi and Sandton at once. Each price says what it is denominated in, so nothing has to be untangled after export.

#### 6. Relocation & Site Sourcing

**Relocating buyers, corporate mobility teams and developers comparing towns.**

**Input:** Several place names at once with a price band and a bedroom count.
**Output:** A shortlist with photos, suburb and size on every row.
**Use:** Compare Stellenbosch against Somerset West on price per square metre without opening a browser tab per town.

***

### 🔗 Integration Examples

#### JavaScript / Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/property24-property-scraper').call({
  operation: 'search',
  country: 'za',
  listingType: 'for-sale',
  locations: ['Cape Town', 'Sandton'],
  minBedrooms: 3,
  maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/property24-property-scraper').call(run_input={
    'operation': 'search',
    'country': 'za',
    'listingType': 'to-rent',
    'locations': ['Sea Point, Cape Town'],
    'includeDetails': True,
    'maxResults': 100,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['propertyTitle'], item['price'], item.get('suburb'))
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~property24-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","country":"ke","listingType":"for-sale","locations":["Nairobi"],"maxResults":200}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the Actor with the sort order set to most recent
3. **Process**: keep the rows that match your own criteria, such as the repossessed flag
4. **Action**: append to Google Sheets, push to a CRM, or send a Slack alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 properties** per run, with every field and every filter
- **10 expanded listings** per run on the detail operation
- No credit card needed. Enough to check the data is what you need

#### PAID Tier (Production Ready)

- **Unlimited** properties per run, up to the 20,000 cap you set yourself
- Pay per successful row. Failed items are never charged
- About 21 properties per request, following the site's own next-page link

💰 **$1.00 per 1,000 properties.** Expanding a property to its full description, photo set, agents, levies and rates costs $1.20 per 1,000 on top, and only when you ask for it. A small start fee applies per run.

🔗 [View current pricing](https://apify.com/sian.agency/property24-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions (FAQ)

**Q: Do I need an API key, a login, or a proxy?**
A: No. Choose a country, type a place name and press Start. The network path is handled inside the Actor and is priced into the per-result fee.

**Q: How do I search a suburb rather than a whole city?**
A: Write it as "Suburb, City": "Sea Point, Cape Town", "Umhlanga, Durban", "Bryanston, Sandton". The city is matched first, then the suburb inside that city's own list, so any suburb the site knows about works.

**Q: Which countries does this cover?**
A: All seven Property24 editions: South Africa, Namibia, Botswana, Zambia, Zimbabwe, Mozambique and Kenya. Pick one per run with the country field, or mix them freely by pasting search URLs from different editions.

**Q: Does it return the coordinates of each property?**
A: No, and no Actor honestly can. Property24 publishes no map pin on the listing page. What every row does carry is the latitude and longitude of the search area, named `areaLatitude` and `areaLongitude` so it is never mistaken for the building's own position.

**Q: Does it return sold prices?**
A: No. Property24 keeps sold-price history on separate suburb pages that this Actor does not read. Everything returned here is live, currently advertised stock. Points of interest are not returned for the same reason.

**Q: What is the difference between erf size and floor size?**
A: Erf size is the land, floor size is the building. South African adverts quote both in square metres. Kenyan adverts often quote land in acres, which is why every row carries the unit next to the number instead of assuming one.

**Q: Why do some rows have no agency or bedroom count?**
A: Because the advert does not carry one. Featured placements on the first results page omit the agency, and vacant land has no bedrooms. Switching on the detail option fills in the agency and the agents from the property's own page.

**Q: How many results can one run return?**
A: As many as you set with Max properties, up to 20,000. Rows are collected page by page, about 21 at a time, following the site's own next-page link. A whole city is a normal run rather than something that needs splitting.

**Q: Can I track properties that were taken down?**
A: Not directly. Run the same search on a schedule and compare two datasets on the listing number to see what has gone.

**Q: What output formats are available?**
A: JSON, CSV and Excel. Export straight from the dataset, or pull the rows over the API.

***

### 🐛 Troubleshooting

**"No properties matched" for an area**

- The filters are too narrow. Widen the price band or drop the bedroom minimum.
- Check the country: a Cape Town search on the Kenyan edition matches nothing.

**An area name was not recognised**

- The run log prints the alternatives that were actually found. Pick one of those.
- For a suburb, write it as "Suburb, City" so the city can be matched first.
- If in doubt, build the search on the site and paste the link into the search URLs field.

**Fewer rows than I asked for**

- The area genuinely has fewer live adverts than your limit. The run log prints the total the site advertises before it starts paging.
- On the FREE tier every search run stops at 25 rows, and the detail operation at 10.

**No descriptions, photos, agents, levies or rates**

- Those live on the property's own page. Switch on "Add descriptions, photos, agents, levies and rates".

**A run ends early or says it will retry**

- The site occasionally declines a burst of requests. The Actor paces itself and retries; if a run still ends short, start it again shortly afterwards.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue on the actor's [Issues tab](https://apify.com/sian.agency/property24-property-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

Property24 is a trademark of Property24.com (Pty) Ltd, part of the OLX Group. This actor is not affiliated with, endorsed by, or sponsored by Property24.

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search sweeps results pages and is where the value is — around 21 rows per request. Listing Detail opens a single property page for the full description, every photo, the agency and named agents, levies, rates and taxes, and price per square metre; it is billed as an add-on because it costs one request per property.

## `country` (type: `string`):

Which Property24 country site to search. South Africa is by far the largest, advertising roughly 222,000 listings for sale and 86,000 to rent; Kenya's index reports about 157,000 and Namibia about 6,000. Prices come back in that country's own currency and the currency is stamped on every row, so results from two editions can be told apart after export.

## `listingType` (type: `string`):

Whether to search properties for sale or properties to rent. Rental prices are per month. Both are available on all seven editions.

## `locations` (type: `array`):

Plain place names — Cape Town, Sandton, Durban, Pretoria, Stellenbosch, or Windhoek and Nairobi on the other editions. Each name is matched against Property24's own browse index before the search runs, so you never need the numeric area id the site uses in its URLs. Write 'Suburb, City' to go one level deeper, e.g. 'Sea Point, Cape Town' or 'Umhlanga, Durban'. A whole province works too — type Western Cape or Gauteng. Leave the list empty to sweep the entire country. One search runs per name,…

## `maxResults` (type: `integer`):

Stop after this many properties across all areas. Each results page returns about 21 rows, so the run stops at the first page that crosses your limit.

## `includeDetails` (type: `boolean`):

Open each property's own page to add the full advert text, the complete photo set, the agency and every named agent, the listing date, levies, rates and taxes, and price per square metre. Costs one extra request per property and bills the Listing Detail event on top of the search row.

## `minPrice` (type: `integer`):

Lowest price to include, in the edition's own currency. For rentals this is the monthly amount. 0 means no lower bound.

## `maxPrice` (type: `integer`):

Highest price to include, in the edition's own currency. For rentals this is the monthly amount. 0 means no upper bound.

## `minBedrooms` (type: `integer`):

Fewest bedrooms to include. Property24 lists studios as 0.5 bedrooms, so 1 excludes them. 0 means no lower bound.

## `maxBedrooms` (type: `integer`):

Most bedrooms to include. 0 means no upper bound.

## `minBathrooms` (type: `integer`):

Fewest bathrooms to include. 0 means no lower bound.

## `propertyType` (type: `string`):

Keep only this property type. The list is Property24's own category set, taken from the type breakdown it prints on every area page. Leave on Any type to include everything.

## `sortBy` (type: `string`):

How Property24 should order the results before this actor reads them. Most recent first is the one to use on a schedule: run it daily and the new ads are on page one.

## `searchUrls` (type: `array`):

Paste Property24 results URLs instead of filling in the fields above, e.g. https://www.property24.com/for-sale/cape-town/western-cape/432. Every filter already on the URL is kept exactly as you built it on the site, and the country and for-sale/to-rent are read off the link itself, so URLs from different editions can be mixed in one run.

## `listingUrls` (type: `array`):

Used by the Listing Detail operation: Property24 property URLs to expand, e.g. https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138/117401013. Any of the seven editions works.

## Actor input object example

```json
{
  "operation": "search",
  "country": "za",
  "listingType": "for-sale",
  "locations": [
    "Cape Town",
    "Sandton"
  ],
  "maxResults": 100,
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "minBathrooms": 0,
  "propertyType": "",
  "sortBy": "default",
  "searchUrls": [],
  "listingUrls": []
}
```

# Actor output Schema

## `property24Properties` (type: `string`):

Every property this run returned, with price, size, suburb, agency and the auction, on-show and repossessed flags.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "search",
    "country": "za",
    "listingType": "for-sale",
    "locations": [
        "Cape Town",
        "Sandton"
    ],
    "maxResults": 100,
    "includeDetails": false,
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "minBathrooms": 0,
    "propertyType": "",
    "sortBy": "default",
    "searchUrls": [],
    "listingUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/property24-property-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 = {
    "operation": "search",
    "country": "za",
    "listingType": "for-sale",
    "locations": [
        "Cape Town",
        "Sandton",
    ],
    "maxResults": 100,
    "includeDetails": False,
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "minBathrooms": 0,
    "propertyType": "",
    "sortBy": "default",
    "searchUrls": [],
    "listingUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/property24-property-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 '{
  "operation": "search",
  "country": "za",
  "listingType": "for-sale",
  "locations": [
    "Cape Town",
    "Sandton"
  ],
  "maxResults": 100,
  "includeDetails": false,
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "minBathrooms": 0,
  "propertyType": "",
  "sortBy": "default",
  "searchUrls": [],
  "listingUrls": []
}' |
apify call sian.agency/property24-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/property24-property-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/KkgddQj8WG6SvBFzv/builds/9Hvmh3xeRaRvINdHL/openapi.json
