Property24 Scraper | South Africa avatar

Property24 Scraper | South Africa

Pricing

from $0.70 / 1,000 property listings

Go to Apify Store
Property24 Scraper | South Africa

Property24 Scraper | South Africa

Extract structured Real estate listings across South Africa from Property24.com with property details, agent profiles, full descriptions, media and more. Built for enterprise-grade real estate intelligence, lead enrichment, market analysis, and automated data pipelines.

Pricing

from $0.70 / 1,000 property listings

Rating

0.0

(0)

Developer

Fatih Tahta

Fatih Tahta

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Property24.com Scraper | Enterprise Grade

Slug: fatihtahta/property24-scraper-za

Overview

Property24 Scraper | South Africa collects structured property listing data from Property24, including listing details, prices, locations, property attributes, media references, agency information, agent profiles, and source metadata when available. Property24 is one of South Africa's major public property portals, making its listing data useful for market research, pricing analysis, lead enrichment, and operational reporting. The actor turns repeatable property searches into normalized JSON records that can be used in analytics tools, CRMs, data warehouses, and downstream APIs. It is designed for automated, recurring data acquisition workflows where consistent output shape and clear run configuration matter. Results reflect the public data available at run time and should be validated against your business requirements before being used in production workflows.

Why Use This Actor

  • Market research and analytics teams: build structured extraction workflows for property supply, pricing bands, location coverage, listing movement, and portfolio-level market intelligence.
  • Product and content teams: populate internal property experiences, comparison tools, editorial datasets, and search-quality reviews with normalized public listing attributes.
  • Developers and data engineering teams: deliver repeatable collection into downstream systems, enrichment pipelines, warehouses, and operational reporting without manual copy-and-paste work.
  • Lead generation and enrichment teams: create targeted prospect datasets using public listing, agency, and agent fields such as property category, area, price range, and contact-availability indicators.
  • Monitoring and competitive tracking teams: schedule recurring runs to observe pricing changes, new availability, listing mix, property features, and geographic coverage over time.

Common Use Cases

  • Market intelligence: monitor supply, pricing, availability, property types, locations, and feature distribution across South African property markets.
  • Lead generation: build targeted prospect lists from public property listings, agencies, and agent profiles.
  • Competitive monitoring: track listing activity, pricing bands, inventory changes, and agent or agency presence across selected locations.
  • Catalog and directory building: populate internal databases with structured public property records for review, search, or matching workflows.
  • Data enrichment: add current public property attributes, media references, and location details to existing CRM, BI, or analytics datasets.
  • Recurring reporting: schedule periodic runs for dashboards, alerts, historical trend analysis, and operational reporting.

Quick Start

  1. Add a required location value, such as Western Cape, Cape Town, or woodstock, cape town.
  2. Choose the deal_type that matches your market scope: sale listings, rental listings, or sold property records.
  3. Set a small limit for the first validation run, such as 10 or 25 results per location.
  4. Add only the filters that matter for the first run, such as price range, property type, bedrooms, or features.
  5. Run the actor in Apify Console and inspect the first dataset records to confirm the output shape.
  6. Increase coverage, refine filters, keep or disable enrich_data, or schedule recurring runs once the records match your workflow.

Input Parameters

The actor accepts Property24 location searches plus optional market, price, size, room, feature, sort, enrichment, limit, and connection settings.

ParameterTypeDescriptionDefault
locationstringRequired. City, suburb, neighborhood, area, or region to search. Use a name a Property24 user would naturally search for, such as Western Cape, Cape Town, or woodstock, cape town.
deal_typestringListing market to collect. Allowed values: Properties For Sale, Properties For Rent, Sold Properties.Properties For Rent
min_priceintegerMinimum listing price to include, in South African rand (ZAR). Use whole numbers without currency symbols.
max_priceintegerMaximum listing price to include, in South African rand (ZAR). Use whole numbers without currency symbols.
min_property_areaintegerMinimum floor area to include, in square meters.
max_property_areaintegerMaximum floor area to include, in square meters.
min_land_areaintegerMinimum land area to include, in square meters.
max_land_areaintegerMaximum land area to include, in square meters.
min_bedroomintegerMinimum number of bedrooms required.
min_bathroomintegerMinimum number of bathrooms required.
min_parkingstringMinimum number of parking spaces. Allowed values: 1, 2, 3, 4, 5.
furnishedstringFurnishing filter. Allowed values: furnished_only, unfurnished_only. Leave empty to include both where available.
property_typearray of stringsProperty categories to include. Allowed values: house, apartment_flat, townhouse, vacant_land_plot, farm, commercial_property, industrial_property.
featuresarray of stringsRequired listing features. Allowed values: pet_friendly, garden, pool, flatlet.
rental_termarray of stringsRental billing terms to include when collecting rental listings. Allowed values: monthly, weekly, daily, yearly, per_square_metre.
sort_bystringResult ordering before collection. Allowed values: default, lowest_price, highest_price, most_recent, available_date_ascending, available_date_descending, property_type, size.
enrich_databooleanWhen enabled, collects richer listing-level records when available, including descriptions, property overview details, media, agency, agent, and feature information.true
limitintegerMaximum number of listings to save per provided location or input.
proxyConfigurationobjectApify proxy or custom proxy configuration for connection behavior. The default is suitable for most runs.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Choosing Inputs

Use location as the primary required scope control. Broader locations, such as Western Cape or large cities like Cape Town, improve discovery and are useful for market scans; narrower suburbs or neighborhoods, such as woodstock, cape town, produce more targeted datasets for local analysis.

Choose deal_type first because sale, rental, and sold-property records represent different market contexts. Add filters such as min_price, max_price, area ranges, bedrooms, bathrooms, parking, property_type, features, furnished, and rental_term when you need a focused segment. Narrower filters reduce noise and improve segmentation, while broader filters help you discover more inventory.

Use sort_by to prioritize which records are collected first when a limit is set. Start with a small limit to validate record shape and coverage, then increase it after confirming the dataset is suitable for your workflow. enrich_data is enabled by default for detailed listing records; turn it off for quick validation runs or summary-level collection.

Example Inputs

Scenario: Rental Market Validation Run

{
"location": "Cape Town City Centre",
"deal_type": "Properties For Rent",
"min_price": 12000,
"max_price": 35000,
"property_type": ["apartment_flat"],
"sort_by": "most_recent",
"limit": 25
}

Scenario: For-Sale Family Homes

{
"location": "Sandton",
"deal_type": "Properties For Sale",
"min_price": 2500000,
"max_price": 8000000,
"min_bedroom": 3,
"min_bathroom": 2,
"property_type": ["house", "townhouse"],
"limit": 50
}

Scenario: Furnished Apartments With Detailed Records

{
"location": "Umhlanga",
"deal_type": "Properties For Rent",
"furnished": "furnished_only",
"features": ["pool"],
"rental_term": ["monthly"],
"enrich_data": true,
"limit": 40
}

Output

9.1 Output Destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs with minimal post-processing.

When multiple entity types or record shapes exist, this README documents each shape separately based on the provided Example Output. The provided output contains one listing record shape.

9.2 Record Envelope And Stable Identifiers

Each dataset item represents a Property24 listing record with listing-level fields, nested pricing, location, property detail, media, agency, agent, and source context objects where available. The recommended idempotency key is listing_id; if your storage system requires a URL-based key, use url as a secondary stable identifier. Use source_context.fingerprint as an additional run-safe deduplication aid when comparing repeated collections.

For deduplication and upserts, store records by listing_id and update mutable fields such as price, media count, listing attributes, and source_context.scraped_time on later runs. Stable identifiers make records easier to merge, deduplicate, and sync across repeated runs. source_context.source_url, source_context.loaded_url, and source_context.detail_url document the public source context used for the record, while source_context.fingerprint provides a compact content-derived identifier for comparison workflows.

9.3 Examples

Example: listing

{
"listing_id": "116494344",
"url": "https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138/116494344",
"title": "2 Bedroom Apartment / Flat for sale in Cape Town City Centre",
"property_type": "apartment_flat",
"transaction_type": "for_sale",
"description": "Wake up to breathtaking harbour and mountain views in this exquisitely renovated corner apartment at Harbour Arch, the perfect balance of luxury, comfort, and city sophistication. This two-bedroom, two-bathroom residence is designed for effortless modern living. Both spacious bedrooms feature stylish en-suite bathrooms, while floor-to-ceiling windows frame uninterrupted views and flood the apartment with natural light. Every detail has been considered, from the sleek electric curtains to the brand new appliances including a washer-dryer, dishwasher, and fridge that make day-to-day living seamless. The refined finishes and thoughtful layout create a home that is both elegant and practical. Life at Harbour Arch comes with access to world-class amenities: a state-of-the-art gym, sparkling outdoor pool, laundromat, and a communal workspace with a convenient coffee station. Round-the-clock security provides complete peace of mind, while the building’s policy against short-term rentals ensures a calm, private, and community-focused atmosphere that is perfect for those who value stability and quiet luxury in the heart of Cape Town. This is more than just an apartment, it is a lifestyle investment in one of the city’s most iconic developments.",
"pricing": {
"display_price": "R 3 900 000",
"amount": 3900000,
"currency": "ZAR",
"price_per_square_meter": {
"display": "R 53 425",
"amount": 53425,
"currency": "ZAR"
},
"levies": {
"display": "R 3 500",
"amount": 3500,
"currency": "ZAR"
},
"rates_and_taxes": {
"display": "R 2 300",
"amount": 2300,
"currency": "ZAR"
}
},
"location": {
"locality": "Cape Town City Centre",
"region": "Western Cape",
"country": "South Africa",
"display": "Cape Town City Centre",
"address": "Cape Town City Centre, Cape Town"
},
"property_details": {
"bedrooms": 2,
"bathrooms": 2,
"kitchens": 1,
"reception_rooms": 1,
"floor_size": {
"display": "73 m²",
"value": 73,
"unit": "m²"
},
"listed_date": "2025-10-01",
"listed_date_text": "01 October 2025",
"description_title": "Luxury Sky-High Living | Renovated 2-Bed, 2-Bath Corner Unit | Harbour Arch",
"pets_allowed": false,
"furnished": true,
"features": {
"pool": true
}
},
"media": {
"primary_image_url": "https://images.prop24.com/354768597/Crop526x328",
"image_urls": [
"https://images.prop24.com/354768611/Ensure1280x720",
"https://images.prop24.com/354768611",
"https://images.prop24.com/354768610/Ensure1280x720",
"https://images.prop24.com/354768610",
"https://images.prop24.com/354768613/Ensure1280x720",
"https://images.prop24.com/354768613",
"https://images.prop24.com/354768612/Ensure1280x720",
"https://images.prop24.com/354768612",
"https://images.prop24.com/354768614/Ensure1280x720",
"https://images.prop24.com/354768614",
"https://images.prop24.com/354768615/Ensure1280x720",
"https://images.prop24.com/354768615",
"https://images.prop24.com/354768616/Ensure1280x720",
"https://images.prop24.com/354768616",
"https://images.prop24.com/354768617/Ensure1280x720",
"https://images.prop24.com/354768617",
"https://images.prop24.com/354768618/Ensure1280x720",
"https://images.prop24.com/354768618",
"https://images.prop24.com/354768625/Ensure1280x720",
"https://images.prop24.com/354768625",
"https://images.prop24.com/354768623/Ensure1280x720",
"https://images.prop24.com/354768623",
"https://images.prop24.com/354768621/Ensure1280x720",
"https://images.prop24.com/354768621",
"https://images.prop24.com/354768627/Ensure1280x720",
"https://images.prop24.com/354768627",
"https://images.prop24.com/354768632/Ensure1280x720",
"https://images.prop24.com/354768632",
"https://images.prop24.com/354768630/Ensure1280x720",
"https://images.prop24.com/354768630"
],
"image_count": 63
},
"agency": {
"name": "Sotheby's International Realty - Atlantic Seaboard & City Bowl",
"url": "https://www.property24.com/estate-agents/sothebys-international-realty-atlantic-seaboard-and-city-bowl/33627",
"image_url": "https://images.prop24.com/369545662/Fit450x225"
},
"agents": [
{
"id": "348161",
"name": "Ben Gross",
"job_title": "Candidate Property Practitioner",
"profile_url": "https://www.property24.com/estate-agents/sothebys-international-realty-atlantic-seaboard-and-city-bowl/ben-gross/348161",
"image_url": "https://images.prop24.com/287530573/UpperCrop200x200",
"published": true,
"has_contact_number": true,
"can_show_whatsapp": true
},
{
"id": "471169",
"name": "Christy Watson",
"job_title": "Candidate Property Practitioner",
"profile_url": "https://www.property24.com/estate-agents/sothebys-international-realty-atlantic-seaboard-and-city-bowl/christy-watson/471169",
"image_url": "https://images.prop24.com/315040879/UpperCrop200x200",
"published": true,
"has_contact_number": true,
"can_show_whatsapp": true
},
{
"id": "516154",
"name": "The City Centre Administrator",
"job_title": "Personal Assistant",
"profile_url": "https://www.property24.com/estate-agents/sothebys-international-realty-atlantic-seaboard-and-city-bowl/the-city-centre-administrator/516154",
"image_url": "https://images.prop24.com/346423443/UpperCrop200x200",
"published": true,
"has_contact_number": true,
"can_show_whatsapp": true
}
],
"source_context": {
"source": "Property24",
"domain": "www.property24.com",
"source_url": "https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138",
"loaded_url": "https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138",
"detail_url": "https://www.property24.com/for-sale/cape-town-city-centre/cape-town/western-cape/9138/116494344",
"scraped_time": "2026-05-05T13:11:13.863684Z",
"fingerprint": "ef18e121d66773b3f391",
"seed": {
"id": "cdc8fab7df8a",
"type": "query",
"value": "Cape Town City Centre"
},
"page_index": 1
}
}

Field Reference

Listing Record

listing_id (string, required): Stable Property24 listing identifier.

url (string, required): Public listing URL.

title (string, optional): Listing headline or title.

property_type (string, optional): Property category, such as apartment, house, townhouse, land, commercial, or industrial property.

transaction_type (string, optional): Transaction category, such as for_sale.

description (string, optional): Public listing description.

pricing.display_price (string, optional): Human-readable listing price.

pricing.amount (number, optional): Numeric price amount in pricing.currency.

pricing.currency (string, optional): Currency code, typically ZAR.

pricing.price_per_square_meter.display (string, optional): Human-readable price per square meter.

pricing.price_per_square_meter.amount (number, optional): Numeric price per square meter.

pricing.price_per_square_meter.currency (string, optional): Currency code for price per square meter.

pricing.levies.display (string, optional): Human-readable levy amount.

pricing.levies.amount (number, optional): Numeric levy amount.

pricing.levies.currency (string, optional): Currency code for levies.

pricing.rates_and_taxes.display (string, optional): Human-readable rates and taxes amount.

pricing.rates_and_taxes.amount (number, optional): Numeric rates and taxes amount.

pricing.rates_and_taxes.currency (string, optional): Currency code for rates and taxes.

location.locality (string, optional): Local area, suburb, or neighborhood.

location.region (string, optional): Province or broader region.

location.country (string, optional): Country name.

location.display (string, optional): Display location label.

location.address (string, optional): Public address or area-level address text.

property_details.bedrooms (number, optional): Number of bedrooms.

property_details.bathrooms (number, optional): Number of bathrooms.

property_details.kitchens (number, optional): Number of kitchens.

property_details.reception_rooms (number, optional): Number of reception rooms.

property_details.floor_size.display (string, optional): Human-readable floor size.

property_details.floor_size.value (number, optional): Numeric floor size.

property_details.floor_size.unit (string, optional): Floor-size unit, typically .

property_details.listed_date (string, optional): Listing date in ISO date format when available.

property_details.listed_date_text (string, optional): Listing date as shown by the source.

property_details.description_title (string, optional): Description heading or promotional listing subtitle.

property_details.pets_allowed (boolean, optional): Whether pets are indicated as allowed.

property_details.furnished (boolean, optional): Whether the listing is indicated as furnished.

property_details.features.pool (boolean, optional): Whether a pool is indicated in listing features.

media.primary_image_url (string, optional): Primary listing image URL.

media.image_urls (array of strings, optional): Listing image URLs.

media.image_count (number, optional): Number of images reported for the listing.

agency.name (string, optional): Agency name.

agency.url (string, optional): Public agency profile URL.

agency.image_url (string, optional): Agency image or logo URL.

agents (array of objects, optional): Public agent records associated with the listing.

agents.id (string, optional): Agent identifier.

agents.name (string, optional): Agent name.

agents.job_title (string, optional): Agent role or title.

agents.profile_url (string, optional): Public agent profile URL.

agents.image_url (string, optional): Agent image URL.

agents.published (boolean, optional): Whether the agent profile is publicly published.

agents.has_contact_number (boolean, optional): Whether the source indicates a contact number is available.

agents.can_show_whatsapp (boolean, optional): Whether the source indicates WhatsApp can be shown.

source_context.source (string, required): Source name.

source_context.domain (string, required): Source domain.

source_context.source_url (string, optional): Public source URL associated with the listing collection context.

source_context.loaded_url (string, optional): Public URL loaded for the source context.

source_context.detail_url (string, optional): Public listing detail URL.

source_context.scraped_time (string, required): UTC timestamp when the record was collected.

source_context.fingerprint (string, optional): Compact identifier useful for deduplication and repeated-run comparison.

source_context.seed.id (string, optional): Identifier for the input seed that produced the record.

source_context.seed.type (string, optional): Seed type, such as query.

source_context.seed.value (string, optional): Input seed value, such as the searched location.

source_context.page_index (number, optional): Source result page index associated with the record.

Data Quality, Guarantees, And Handling

  • Structured records: results are normalized into predictable JSON objects for downstream use.
  • Best-effort extraction: fields may vary by region, session, availability, listing type, source-side presentation, or public data quality.
  • Optional fields: null-check optional fields in downstream code, especially descriptions, media, agent details, fees, features, and listing-specific attributes.
  • Deduplication: use listing_id as the strongest stable key from the output, with url or source_context.fingerprint as supporting identifiers where useful.
  • Freshness: results reflect the publicly available data at run time.
  • Repeated runs: use the recommended idempotency key when syncing data into warehouses, CRMs, search indexes, or reporting systems.

Tips For Best Results

  • Start with a small limit to validate the output shape before scaling up.
  • Use one geography or segment per run when you need cleaner reporting and easier comparison.
  • Leave optional filters empty when the goal is broad discovery.
  • Add price, area, room, property type, and feature filters gradually to understand how each field changes coverage.
  • Use sort_by with limit when the order of collected results matters, such as newest listings or lowest price first.
  • Keep enrich_data enabled when your workflow needs detailed listing descriptions, media, agency, and agent fields.
  • Use listing_id for deduplication when storing results over time.

How To Run On Apify

  1. Open the Actor in Apify Console.
  2. Configure the available input fields for the target scope, starting with location and deal_type.
  3. Set the maximum number of outputs to collect with limit.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and review the first records.
  6. Download results in JSON, CSV, Excel, or other supported formats.

Scheduling & Automation

Scheduling

Automated Data Collection

Schedule runs to keep property datasets fresh for dashboards, market monitoring, and enrichment workflows. Use a cadence that matches how often your team needs to review changes in inventory, pricing, or listing availability.

  • Navigate to Schedules in Apify Console
  • Create a new schedule, such as daily, weekly, or custom cron
  • Configure input parameters
  • Enable notifications for run completion
  • Add webhooks for automated processing

Integration Options

  • BI dashboards: monitor pricing, availability, property mix, geographic coverage, and listing counts over time.
  • Data warehouses: store normalized listing records for historical analysis, modeling, and operational reporting.
  • CRM enrichment: sync public property, agency, and agent attributes into account or lead records.
  • Google Sheets or Airtable: review smaller market segments, validate output samples, and coordinate lightweight sourcing workflows.
  • Webhooks: trigger ingestion, validation, alerting, or notification workflows after each completed run.
  • Data enrichment pipelines: combine Property24 listing records with internal CRM, portfolio, or market datasets.

Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems depending on your workflow and volume requirements.

  • JSON: for APIs, applications, and data pipelines
  • CSV or Excel: for spreadsheet workflows and manual review
  • API access: for automated ingestion into internal systems
  • BI and warehouses: for reporting, dashboards, and historical analysis

Performance

Estimated run times:

  • Small runs (< 1,000 outputs): ~3-5 minutes
  • Medium runs (1,000-5,000 outputs): ~5-15 minutes
  • Large runs (5,000+ outputs): ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

Limitations

  • Availability depends on what https://www.property24.com publicly exposes at run time.
  • Some optional fields may be missing on sparse listings, sold-property records, or records without full public details.
  • Very broad searches may take longer or require higher limit values to collect enough records.
  • Target-side changes can affect field availability, naming, or presentation.
  • Regional, account, availability, or listing-type differences may change visible results.
  • enrich_data can increase record detail and may also increase run time.

Troubleshooting

  • No results returned: check filters, location spelling, selected deal_type, and whether Property24 has matching public records for the requested scope.
  • Fewer results than expected: broaden filters, raise limit, or verify that the target contains enough matching listings.
  • Some fields are empty: optional fields depend on what each public listing provides.
  • Run takes longer than expected: reduce scope, lower limit for validation, or split broad collection into smaller location or property-type segments.
  • Output changed: compare the current output with the field reference and report a small sample if support is needed.

FAQ

What data does this actor collect?

It collects public Property24 listing data for South Africa, including listing identifiers, URLs, titles, transaction type, prices, locations, property details, media, agency information, agent information, and source context when available.

Can I filter by location, category, date, price, or other criteria?

You can filter by location, deal_type, price range, property area, land area, bedrooms, bathrooms, parking, furnishing status, property type, features, rental terms, and sort order. Date-specific input filters are not part of the current input schema.

Why did I receive fewer results than my limit?

The limit is a maximum, not a guaranteed count. A run may return fewer records when the selected location, market, filters, or public availability do not contain enough matching listings.

Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor on a daily, weekly, or custom cadence for monitoring, reporting, enrichment, or historical tracking.

How do I avoid duplicates across runs?

Use listing_id as the primary idempotency key. You can also store url and source_context.fingerprint to support validation, comparison, and audit workflows.

Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support exports including JSON, CSV, Excel, and other formats available in Apify Console.

Does this actor collect private data?

No. The actor is intended to collect publicly available information from Property24. Users are responsible for using the data in accordance with applicable laws, regulations, and the target site's terms.

How do I control detailed listing data?

enrich_data is enabled by default for fuller listing descriptions, media, agency information, and agent fields. Set it to false for faster validation runs or when summary-level output is sufficient.

What should I include when reporting an issue?

Include the input used, the run ID, expected versus actual behavior, and a small output sample when relevant. Redact any sensitive operational information before sharing.

Compliance & Ethics

Responsible Data Collection

This actor collects publicly available real estate listing information from https://www.property24.com for legitimate business purposes, including:

  • Real estate research and market analysis
  • Property inventory monitoring and pricing intelligence
  • CRM, BI, and operational data enrichment

Users are responsible for ensuring that their use of collected data complies with applicable laws, regulations, contractual obligations, and the target site's terms. This section is informational and not legal advice.

Best Practices

  • Use collected data in accordance with applicable laws, regulations, and the target site's terms
  • Respect individual privacy and personal information
  • Use data responsibly and avoid disruptive or excessive collection
  • Do not use this actor for spamming, harassment, or other harmful purposes
  • Follow relevant data protection requirements where applicable, such as GDPR and CCPA

Support

For help, use the actor page or Issues channel associated with this actor. Include the input used with sensitive values redacted, the Apify run ID, expected versus actual behavior, and a small output sample if it helps illustrate the issue.