Property24 Scraper - South Africa Property Data avatar

Property24 Scraper - South Africa Property Data

Pricing

from $0.88 / 1,000 property searches

Go to Apify Store
Property24 Scraper - South Africa Property Data

Property24 Scraper - South Africa Property Data

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.

Pricing

from $0.88 / 1,000 property searches

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Property24 Scraper - South Africa Property Data & API 🏘️

Store SIÁN Agency Store MENA Property Gateway Store Property Finder Store Zillow Property Detail

🎉 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 for the UAE, Saudi Arabia and Egypt. Use Zoopla Property Scraper for the United Kingdom, with EPC ratings and agent contacts. Use MagicBricks Property Scraper 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? 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, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — 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:

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.

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

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

FieldTypeRequiredDescription
operationstringNosearch (default) or detail
countrystringNoza, na, bw, zm, zw, mz or ke
listingTypestringNofor-sale (default) or to-rent
locationsarrayNoPlain place names. Empty list sweeps the whole country
maxResultsintegerNoStop after this many properties across all areas, up to 20,000
includeDetailsbooleanNoAdd descriptions, photos, agents, levies and rates
minPrice / maxPriceintegerNoPrice bounds in the edition's own currency, per month for rentals
minBedrooms / maxBedroomsintegerNoBedroom bounds. 0 means no bound
minBathroomsintegerNoFewest bathrooms to include
propertyTypestringNoHouse, Apartment / Flat, Townhouse, Vacant Land, Farm, Commercial Property, Industrial Property
sortBystringNodefault, newest, price-low, price-high or size
searchUrlsarrayNoPaste results URLs instead of filling the fields above. Over the API, pass them as [{"url": "..."}]
listingUrlsarrayNoProperty 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:

{
"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:

{
"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:

{
"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:

{
"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:

FieldTypeDescription
listingNumberstringProperty24's own listing number
urlstringLink back to the advert
propertyTitlestringHeadline as advertised, e.g. "3 Bedroom House"
propertyTypestringHouse, Apartment, Townhouse and so on
listingTypestringfor-sale or to-rent
pricenumberAsking price as a number, per month for rentals
currencystringThe currency the price was advertised in
priceTextstringThe price exactly as the page shows it
bedrooms / bathroomsnumberRoom counts
erfSize / erfSizeUnitnumber / stringLand size and its unit
floorSize / floorSizeUnitnumber / stringBuilding size and its unit
pricePerSqmnumberPrice per square metre
levies / ratesAndTaxesnumberMonthly levy and municipal rates
suburb / countrystringWhere the property sits
areaLatitude / areaLongitudenumberCoordinates of the searched area, not of the property
agencyName / agentNamestringAgency holding the mandate, and the listing agent
agentsarrayEvery named agent with job title and profile
isAuction / isOnShow / isRepossessedbooleanAuction, show day and bank-repossessed flags
descriptionText / featuresstring / arrayFull advert text and the feature list
imageUrl / photos / photoCountstring / array / numberFirst photo, all photos, and how many

Example row (a Cape Town search result):

{
"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

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

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

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
  • 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


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

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.


🤝 Support

Telegram Support

Join our active support community


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 | More Tools