Private Property Scraper avatar

Private Property Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Private Property Scraper

Private Property Scraper

Scrape PrivateProperty.co.za - a major South African property portal. Search for-sale and to-rent listings by province, property type, price, and bedrooms/bathrooms, or fetch full listing detail pages: description, exact property details, room-by-room features, and photo galleries.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Crawler Bros

Crawler Bros

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Scrape Private Property, one of South Africa's major property portals — for-sale and to-rent listings across every province, property type (house, apartment, townhouse, vacant land, farm, commercial), price range, and bedroom/bathroom count. Fetch search results in bulk, or pull full listing detail pages: description, exact property details, room-by-room features, and photo galleries. No login, no cookies, no paid API key.

What this actor does

  • Two modes: search (browse/filter listings) and byUrls (exact lookup by listing URL)
  • All 9 South African provinces, or nationwide — Gauteng, Western Cape, KwaZulu-Natal, Eastern Cape, Free State, Limpopo, Mpumalanga, North West, Northern Cape, or "All of South Africa" to search the whole country in one run
  • 7 property types — house, apartment/flat, townhouse, vacant land/plot, farm/smallholding, commercial, or any
  • For sale or to rent
  • Bank-assisted sales & repossessions — search Private Property's dedicated repossessed-property category instead of the regular market
  • Filters: price range, minimum bedrooms, minimum bathrooms
  • Optional deep data: full description, exact property details table (listing number, property type, listing date, land/floor size), and every room-by-room feature (bedrooms, bathrooms, lounges, garages, pool, security, etc.)
  • Empty fields are omitted — you only ever see fields with real data

Output per listing

Always present (search mode):

  • listingId, listingUrl, sourceUrl
  • transactionType, propertyType
  • location, province
  • titleText, price (or priceOnApplication), pricePeriod (rentals only — perMonth/perDay/perWeek/perYear; standard rentals are perMonth, short-term/holiday lets are perDay/perWeek)
  • bedrooms, bathrooms, garages
  • imageUrl
  • isBankRepossession (only when bankRepossessionsOnly: true)
  • recordType: "propertyListing", scrapedAt

With includeFullDetails: true or mode: byUrls, additionally:

  • title, description
  • parkingSpaces, landSizeSqm, floorSizeSqm
  • propertyDetails — listing number, property type, listing date, land size, floor size, and any other fields the agent filled in (varies by listing type)
  • features — full room-by-room and amenity breakdown (bedrooms, bathrooms, lounges, dining areas, garage parking, pool, security, pet friendly, built-in braai, etc.) as reported by the agent
  • listingNumber
  • images[] — full gallery of listing photos
  • primaryImageUrl

Input

FieldTypeDefaultDescription
modestringsearchsearch / byUrls
transactionTypestringforSaleforSale / toRent
propertyTypestringanyany / house / apartment / townhouse / land / farm / commercial
provincestringgautengAny of the 9 SA provinces, or southAfrica for a nationwide search
priceMin / priceMaxintPrice range in ZAR
bedroomsMin / bathroomsMinintMinimum room counts
bankRepossessionsOnlyboolfalseSearch Private Property's Bank Assisted Sales & Repossessions category instead of the regular market (forces transactionType to forSale)
sortBystringdefaultdefault / priceLowToHigh / priceHighToLow / mostBedrooms
listingUrlsarrayPrivate Property listing URLs (mode=byUrls)
includeFullDetailsboolfalseFetch full detail page per listing (1 extra request each)
maxItemsint20Hard cap (1–500)

Example: 3+ bedroom houses for sale in Western Cape under R3.5M

{
"mode": "search",
"transactionType": "forSale",
"propertyType": "house",
"province": "westernCape",
"priceMax": 3500000,
"bedroomsMin": 3,
"includeFullDetails": true,
"maxItems": 50
}

Example: apartments to rent in Gauteng, cheapest first

{
"mode": "search",
"transactionType": "toRent",
"propertyType": "apartment",
"province": "gauteng",
"sortBy": "priceLowToHigh",
"maxItems": 30
}

Example: full details for a specific listing

{
"mode": "byUrls",
"listingUrls": [
"https://www.privateproperty.co.za/for-sale/gauteng/east-rand/alberton/alberton-north/T5580463"
]
}

Note: individual listings sell/get delisted over time — if a URL you saved earlier no longer resolves, the actor reports "None of the given listingUrls could be resolved" (0 records, no crash) rather than fabricating data. Re-run mode: search to get current listing URLs.

Example: bank-repossessed houses in KwaZulu-Natal

{
"mode": "search",
"bankRepossessionsOnly": true,
"propertyType": "house",
"province": "kwazuluNatal",
"maxItems": 30
}

Use cases

  • Real estate market research — track average prices and inventory by province and property type
  • Investment analysis — filter for yield-friendly price/bedroom combinations
  • Relocation / home search — build a shortlist of matching listings with full property details
  • Portfolio monitoring — re-run byUrls on saved listings to track price changes over time
  • Content & comparison sites — pull structured listing data (features, images, descriptions) for aggregation

Limitations

  • Agent/agency contact details are loaded by the live site via client-side JavaScript after the page renders, so they are not present in the server-rendered HTML the actor fetches and are not included in the output.
  • Price/bedroom/bathroom filters are applied by the actor after fetching listings (not sent as query parameters to Private Property) for reliability — the actor always fetches the plain, unfiltered category page and filters client-side.
  • Private Property's servers occasionally return a transient error on a specific page of results even after all retry tiers (automatic retries, Apify Proxy escalation, and a TLS-impersonating fallback client are all in place). When this happens the actor keeps whatever it already gathered and stops early rather than hanging or returning broken data.
  • imageUrl / images[] values are served by images.pp.co.za, which returns 405 Method Not Allowed for HEAD requests but 200 image/jpeg for normal GET requests (the same way a browser or <img> tag loads them) — this is a CDN quirk, not a broken link.
  • bedrooms/bathrooms are scraped faithfully from what the listing agent entered on Private Property. On rare listings the agent's own numeric entry is inconsistent with the listing's free-text description (e.g. a "3.5 bathrooms" description next to a raw bathroom count field the agent typed without the decimal point) — the actor reports the site's own structured value rather than guessing a corrected number from the description text.

FAQ

Is this official Private Property data? Yes — it's parsed directly from Private Property's own listing and search-result pages, including their structured Residence schema.org markup.

Do I need an account or API key? No. The actor requires no login, cookies, or user-supplied credentials.

Why do some listings show priceOnApplication instead of a price? Some sellers/agents list "Price on Application" or "Contact agent" instead of a fixed price — the actor reports this instead of guessing a number.

Why do some toRent listings have a pricePeriod of perDay or perWeek instead of perMonth? Most Private Property rentals are standard monthly leases, but a minority are short-term/holiday lets priced per day or per week — the actor reports the site's own period label so a R1,800/day short-let isn't mistaken for an ultra-cheap R1,800/month lease. priceMin/priceMax compare the raw number regardless of period, so mixed-period results are possible in toRent searches; check pricePeriod on each record before comparing prices across listings.

Why do propertyDetails/features fields vary between listings? Private Property lets agents fill in different fields per property type (e.g. "Land size" for houses, "Levies" for sectional-title units). The actor passes through whatever the agent actually filled in — no invented values.

What's the difference between search and byUrls? search browses/filters by province, property type, and price/bedrooms. byUrls does an exact lookup for listing URLs you already have (e.g. from a previous search run) and always includes full details.

What is bankRepossessionsOnly? Private Property runs a dedicated "Bank Assisted Sales & Repossessions" category for properties banks are selling after repossession — typically priced below market. Setting bankRepossessionsOnly: true searches that category instead of the regular market; listings themselves are otherwise normal for-sale properties (same detail pages, same fields), just tagged isBankRepossession: true.

How often does this data change? Private Property listings, prices, and availability are live — the actor always fetches current data, no caching.