Property24 Scraper & New-Listing Monitor - South Africa avatar

Property24 Scraper & New-Listing Monitor - South Africa

Pricing

from $0.57 / 1,000 listing returneds

Go to Apify Store
Property24 Scraper & New-Listing Monitor - South Africa

Property24 Scraper & New-Listing Monitor - South Africa

For property investment screening, agency lead lists and market reports: Property24.com listings as flat rows with price and what it means, bedrooms, bathrooms, floor and erf size, and suburb. Cape Town had 3,600 homes for sale and 7,213 to rent on 2026-09-05. Monitoring returns only new ones.

Pricing

from $0.57 / 1,000 listing returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

Property24 Scraper - South Africa Homes for Sale & Rent

For property investment screening, South African market reports and agency lead lists: Property24.com — South Africa's largest property portal — as flat rows — the price as a number with its meaning, bedrooms, bathrooms, parking, floor and erf size, suburb, city and province, the agency, Property24's badges and the main image, for sale or to rent.

Pricing update (from 6 November 2026): the price of an ordinary listing row does not change. Two new optional features get their own price: includeDetails (levies, rates and taxes, listing date, days on market, full description and every photo, charged as a listing with details) and emitRemovedListings (a row when a monitored listing is taken down). Both are off unless you switch them on, so an existing run or schedule costs exactly what it did before.

South Africa in numbers, measured on 2026-09-05: 3,600 homes for sale in Cape Town (180 pages of results) and 7,213 to rent (361 pages).

Every Property24 list page carries one listing tile that visitors never see — pushed thousands of pixels off-screen by a stylesheet rule with a random class name (measured on all four pages fetched on 2026-09-05). A scraper that reads the HTML in order silently delivers it as a normal listing. This one knows about it.

The price says what kind of price it is. priceType is sale, monthly-rent or rent-per-sqm — commercial and industrial space is often let per square metre (4 of the 42 rentals measured), and a per-m² figure in a monthly-rent column is a wrong number, not a small one. The URL's suburb, city, province and Property24 area id come back as their own columns, so a search across a city can be split by suburb without parsing anything.

Monitoring reads the newest first, not the paid placements. Property24's default order puts promoted listings first; in monitoring mode this Actor asks for Property24's own newest-first order instead, and each run returns only the listings it has not returned before. No API key. Reads the same public pages a visitor sees. Export as JSON, CSV or Excel.

Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Property24. All product names are trademarks of their respective owners.


Run it tomorrow and you only get what is new

Schedule this Actor with monitoringMode: true and each run returns only the listings it has not returned before. Not "here is everything again, please de-duplicate it yourself" — the Actor remembers what it already gave you, so a daily feed of a 4,000-listing search costs you the handful of new homes, not 4,000 rows every morning. You are never charged for the same property twice.

Listings your filters removed are remembered too, so widening a filter later does not resurrect them as false "new" listings. Listings that did not fit under your limit are not remembered, so they are still waiting on the next run instead of being silently lost.


Why this one is different

The decoy tiles are dropped

Every Property24 list page carries one listing tile that visitors never see: it is pushed thousands of pixels off-screen by a stylesheet rule with a random class name (measured on all four pages fetched on 2026-09-05, one hidden tile each). A scraper that reads the raw HTML returns it as if it were a real listing — and marks itself as a scraper. This Actor reads the stylesheet, finds those rules and drops the hidden tiles before anything is delivered or charged.

Both tile layouts are read

Property24 renders two different tiles: a promotional layout (most of page one) that carries the price only as text, and a standard layout (most of page two onward) that carries the price as structured data plus the street address, an excerpt of the description and the agency name. The tile containers carry random, shuffled class names. This Actor reads both layouts by their meaning rather than by position — measured on 65 live tiles, every one came back with an id, heading, URL, type, price text, suburb, city, province and image.

The price means what it says

price is a number in rand; priceType says whether it is a sale price, a monthly-rent, a rent-per-sqm (commercial and industrial space is often let per square metre — 4 of the 42 rentals measured — and that unit is read from the tile, never assumed to be a month), a weekly, daily or yearly rent, or a development's sale-range / rent-range, which comes back as priceFrom / priceTo with the number of units. rentalTerm carries the unit for every rental. Price filters compare monthly rents and sale prices only; a per-m² rent is never compared with a monthly budget. A listing marked POA keeps price: null and priceText: "POA" — it is never turned into a zero. Medians in the 63 priced listings measured: R 2,822,500 for sale, R 40,000 a month to rent.

No agent's personal name

Standard tiles carry the listing agent's personal name and photo. This Actor returns the agency name only (agencyName, when Property24 writes it as text — on 28 of the 65 tiles measured; a tile that shows only a logo has agencyName: null and the logo URL), never the person. Phone numbers and e-mail addresses written into the excerpt are removed.

Suburb, city and province from the address, not the caption

Each listing's URL carries the suburb, city, province and Property24's area id (/for-sale/sea-point/cape-town/western-cape/11021/117538814). Those are returned as suburb, city, province and areaId — so a search across a whole city still tells you the suburb of every home, and the area id is exactly what you need to search that suburb next.

One property, five agencies — counted, not repeated

When several agencies list the same property, Property24 shows it once with a "grouped listings" link. This Actor returns that listing once and reports agentsListingSameProperty (5 in the measured case) so you can tell a sole mandate from a widely listed home.

Filters run here

Every filter — price, bedrooms, bathrooms, parking, floor and erf size, property type, suburb, auction, reduced, on show, developments, keywords, agency — runs on the rows already fetched. Only the place is sent to Property24 (plus the newest-first sort in monitoring mode). Nothing extra is requested and nothing extra is charged. A listing is never dropped for a value Property24 did not publish.


Input

Either paste a Property24 listing page URL, or build one from the fields below.

FieldTypeDefaultDescription
searchUrlstring—e.g. https://www.property24.com/for-sale/cape-town/western-cape/432. Only the place is kept; sort and price parameters are dropped
channelstringsalesale (/for-sale) or rent (/to-rent)
locationstringcape-townA city Property24 lists on its home page (cape-town, johannesburg, pretoria, durban, sandton, centurion, stellenbosch, gqeberha …) or an area path with its id copied from any Property24 address, e.g. sea-point/cape-town/western-cape/11021. Property24 answers 404 without the id, so an unknown city is refused before anything is requested
maxListingsinteger201-1000. One listing = one row = one charged event. 20 listings per page; Cape Town for sale runs to 180 pages
maxPagesinteger0Hard cap on requests; 0 = decide from maxListings (up to 60 pages when filters or monitoring mode are on). Reading pages is free
useProxybooleanfalseOff by default — Property24 answers Apify's network directly. Switches on by itself if blocked
keywords / keywordMatch / excludeKeywordsarray / string / array—Match on heading, type, suburb, city, province, agency and price text
agencyNamesarray—Keep only these agencies (partial match; tiles without a written agency name are kept)
minPrice / maxPriceinteger0ZAR. Sale price or monthly rent. A POA listing is kept, a per-m² / weekly / daily rent is kept (not comparable), and a development is kept whenever any part of its range fits
requirePricebooleanfalseDrop POA listings
minBedrooms / maxBedroomsinteger-1-1 = off. Property24 lists studios as 0.5 bedrooms. An unpublished count is kept
minBathroomsnumber0Half bathrooms exist (3.5)
minParkingSpacesinteger0
minFloorSizeSqm / maxFloorSizeSqminteger0m²
minErfSizeSqm / maxErfSizeSqminteger0m² (erf = plot)
propertyTypesarray—Partial match on Property24's words: Apartment, House, Townhouse, Vacant Land, Farm, Commercial Property, Industrial Property (house also matches Townhouse)
suburbsarray—Partial match on the suburb from the listing address
excludeDevelopmentsbooleanfalseDrop development tiles (a block of units with a From/To range)
excludeAuctionsbooleanfalseDrop listings with the AUCTION badge
onlyReducedbooleanfalseKeep only listings with the Reduced banner
onlyOnShowbooleanfalseKeep only listings with an On Show banner (the date comes back as onShowDate)
dropUnknownValuesbooleanfalseKeep only listings whose published values prove they match every filter you set (by default a listing with no bedroom count, floor size or comparable price is kept)
monitoringModebooleanfalseRead newest-first and return only listings not returned on a previous run
resetMonitoringStatebooleanfalseOne-shot: forget what was already returned
includeDetailsbooleanfalseAlso open each returned listing's own page: listing date, days on market, levies, rates and taxes, price per m², pets, furnished, full description, the overview table and every gallery photo
maxDetailsinteger1000-1000. Details for the first rows up to this number; the rest come back as ordinary listings
emitRemovedListingsbooleanfalseMonitoring mode only: also return listings that Property24 now answers with "Listing Not Found", with how many days they were listed
{ "channel": "sale", "location": "sea-point/cape-town/western-cape/11021", "maxListings": 100,
"minBedrooms": 2, "maxPrice": 6000000, "excludeAuctions": true, "excludeDevelopments": true }

Monitoring mode turns this into a daily feed

Property24's default order puts paid placements first, not the newest listings. In monitoring mode this Actor reads the search in Property24's own newest-first order (?sp=so%3dNewest; on 2026-09-05 only one of the 22 tiles on the default first page was among the 22 newest) and returns only the listings it has not returned before, reading on past the ones it already knows — up to 60 pages, or maxPages — until it has maxListings new ones. Listings removed by your filters are remembered too, so changing a filter later does not resurrect them as false "new" listings — and listings that simply did not fit under maxListings, or were cut off by the run's charge limit, are not remembered, so they are still waiting for you on the next run rather than being silently lost.

Measured on 2026-09-05: 3,600 homes for sale in Cape Town (180 pages); 7,213 to rent (361 pages).

Details: levies, rates and taxes, listing date and every photo

Turn on includeDetails and each returned row also carries what is only on the listing's own page: listingDate and daysOnMarket, levies and ratesAndTaxes (monthly, ZAR, as numbers), pricePerSqm, petsAllowed, furnished, the fullDescription, Property24's overview table as propertyOverview, and every gallery photo as photoUrls with photoCount. That is what an investment screen needs — the monthly running cost next to the price — without opening the listings one by one.

  • Details are read for the first maxDetails rows (default 100), and only for as many rows as the run's charge limit can pay for.
  • Every row says what happened in detailsStatus: ok, not-requested (past maxDetails or the charge limit), unreadable (the page did not answer) or listing-not-found. Only an ok row is charged as a listing with details; the others keep the ordinary listing price.
  • Each detail page is one more request, read a second or two apart, so a run with details takes longer.
  • Agent names, emails and phone numbers are not returned, from the list or from the detail page.

Removed listings: what sold or was withdrawn, and after how many days

With monitoringMode and emitRemovedListings on, each run reads the whole search and compares it with the previous run. A listing that has left the search is opened on Property24, and only one that Property24 now answers with "Listing Not Found" comes back as a row with status: "removed" — its last known title, price, suburb and agency, firstSeenAt / lastSeenAt, removedDetectedAt, and daysListed (from Property24's listing date when the Actor has seen it, otherwise from the first run that saw it; daysListedFrom says which).

  • A listing that only dropped out of your search but is still on Property24 is not reported as removed. One whose page could not be read is checked again on the next run.
  • The first run with this option only remembers the search; removals are reported from the second run.
  • The search has to be read to the end (up to 60 pages, or maxPages). When it cannot be, the run returns one free row with status: "removed-check-skipped" saying why, and nothing is reported as removed on that run.
  • Up to 100 listings are checked per run, and only as many as the run's charge limit can still pay for; the rest are checked on the next run.

Output

One row per listing:

{
"source": "property24.com",
"status": "ok",
"listingId": "117560550",
"title": "0.5 Bedroom Apartment / flat on auction in Gardens - Cape Town",
"url": "https://www.property24.com/for-sale/gardens/cape-town/western-cape/9145/117560550",
"searchedLocation": "Cape Town, Western Cape",
"transactionType": "sale",
"propertyType": "Apartment",
"isDevelopment": false,
"developmentUnits": null,
"listingTier": "boosted",
"agentsListingSameProperty": null,
"description": "Certified and Transparent Non-Distressed Auction Platform. Live Auction 17 September 2026 at 10am. No Buyer Commission. Make an offer to stop the auction or register to bid on ...",
"price": 1995000,
"priceCurrency": "ZAR",
"priceType": "sale",
"priceFrom": null,
"priceTo": null,
"priceText": "R 1 995 000",
"rentalTerm": null,
"bedrooms": 0.5,
"bathrooms": 1,
"parkingSpaces": null,
"floorSizeSqm": 26,
"erfSizeSqm": null,
"address": "506 72 On Kloof, 5 Nicol",
"suburb": "Gardens",
"city": "Cape Town",
"province": "Western Cape",
"areaId": "9145",
"labels": ["AUCTION", "On Show"],
"isOnShow": true,
"onShowDate": "06 SEP",
"isReduced": false,
"isAuction": true,
"hasNoTransferDuty": false,
"agencyName": "Harcourts Atlantic",
"agencyLogoUrl": "https://images.prop24.com/213885973/Ensure528x153",
"mainImageUrl": "https://images.prop24.com/385418221/Crop600x400",
"scrapedAt": "2026-09-05T10:17:08.708Z"
}

Measured across 65 live tiles (63 distinct listings — a premium placement can repeat a listing) on 2026-09-05 — 42 homes for sale and 21 to rent in Cape Town plus 2 developments: id, heading, URL, type, price text, suburb, city, province, area id and image on 65 of 65; a price as a number on 63 (the two developments carry a range instead); bedrooms on 50 and bathrooms on 51 (commercial and industrial listings, and a few flats, have none); parking on 40; floor size on 41; erf size on 13; a street address on 18 and a description excerpt on 23 (standard tiles only); an agency name written as text on 28; a logo on 57. A development tile comes back with isDevelopment: true, priceType: "sale-range" (or "rent-range" on a rental search), priceFrom / priceTo and developmentUnits.

Rows that are never charged

statuswhen
no-resultsProperty24 reports zero listings for this search. That is its answer, not a failure
no-such-searchProperty24 answered HTTP 404 — what it does for an area path or id it does not know. Not a claim that there is nothing there
no-filter-matchListings were read, but your filters removed all of them. The row says how many were read
no-new-listingsMonitoring mode: nothing new since the previous run
unreadableThe page could not be read, its tiles were missing, or it claimed a total above zero while yielding nothing
removed-check-skippedemitRemovedListings: the search could not be read to the end on this run, so no listing was checked for removal

Pricing

The ordinary listing price is unchanged by the 6 November 2026 update; only the two optional features below add new events. Pay per listing returned. With includeDetails, a row whose detail page was read is charged as a listing with details instead (one event per row, not two); a row without its details keeps the ordinary listing price. With emitRemovedListings, each removed-listing row is one removed-listing event. The prices are on the Pricing tab. Rows that report an empty search, an unknown area, a filter that matched nothing, or a page that could not be read are not charged. Hidden decoy tiles are dropped before delivery and never charged.


Notes

  • robots.txt was read in full on 2026-09-05. It disallows the advanced-search pages, autocomplete, grouped-listing and map handlers, agent zone, login and account pages. This Actor requests only /for-sale/... or /to-rent/... listing pages with their page number and, in monitoring mode, the newest-first sort — and, only when includeDetails or emitRemovedListings is on, the listing's own public page (read again on 2026-10-24: allowed). It never calls the contact-email or contact-number handlers, which robots.txt disallows.
  • Only public pages are read. No login, no API key.

Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

  • Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
  • Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.