# Property24 South Africa Scraper 🏠 (`shahidirfan/property24-south-africa-scraper`) Actor

Scrape live property listings from South Africa's #1 real estate platform. Extract prices, addresses, descriptions, agent details & photos. Ideal for investment analytics, market research, competitor tracking, price benchmarking & real estate AI datasets. Structured JSON ready.

- **URL**: https://apify.com/shahidirfan/property24-south-africa-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 South Africa Scraper

Extract property and real estate listings from Property24 South Africa with ease. Collect pricing, location, property features, listing URLs, and images from search result pages. Perfect for real estate market research, investment analysis, and property trend monitoring.

---

### Features

- **Direct Location and Category Crawling** - Collect listings from any Property24 search results URL.
- **Smart Keyword Search Resolution** - Converts location keywords into matching listing areas automatically.
- **Clean Property Records** - Includes listing identifiers, prices, locations, images, and normalized feature values.
- **Duplicate Filtering** - Removes repeated listings by listing identity and URL.
- **Fast Search Collection** - Handles multi-page extraction with result and page limits.

---

### Use Cases

#### Real Estate Market Analysis
Monitor listing prices and property sizes in specific suburbs of South Africa. Track changes over time to identify emerging high-value zones.

#### Investment Property Scouting
Filter and scan listing attributes like bedrooms, bathrooms, and floor sizes to discover undervalued properties that fit your portfolio criteria.

#### Agency Competitor Intelligence
Analyze which real estate agencies and agents are most active in particular regions and track their listings.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | - | Start scraping from a specific search results URL. |
| `keyword` | String | No | - | Location keyword used when `startUrl` is not provided. |
| `results_wanted` | Integer | No | `20` | Maximum number of property listings to collect. |
| `max_pages` | Integer | No | `10` | Safety cap on the number of search result pages to visit. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": true }` | Proxy configuration options. |

---

### Output Data

Each property listing contains:

| Field | Type | Description |
|-------|------|-------------|
| `listing_id` | String | Listing identifier from the listing URL |
| `title` | String | Property name or title |
| `url` | String | Direct property listing URL |
| `price` | Number | Property price value |
| `currency` | String | Price currency (ZAR) |
| `property_type` | String | Property category (e.g. House, Apartment) |
| `bedrooms` | Number | Number of bedrooms |
| `bathrooms` | Number | Number of bathrooms |
| `parking_spaces` | Number | Number of parking spaces |
| `floor_size` | Number | Floor size value |
| `floor_size_unit` | String | Unit of floor size (e.g. m²) |
| `erf_size` | Number | Erf or land size value |
| `erf_size_unit` | String | Unit of erf or land size |
| `locality` | String | Locality or suburb name |
| `city` | String | City or municipality path value |
| `region` | String | Region or province name |
| `latitude` | Number | Listing latitude |
| `longitude` | Number | Listing longitude |
| `agency_name` | String | Real estate agency name |
| `agent_name` | String | Listing agent name |
| `agency_logo_url` | String | Agency logo image URL when available |
| `image_urls` | Array | Listing image URL collection |
| `features` | Object | Parsed feature map from listing cards |
| `source` | String | Source page type used for the record |

---

### Usage Examples

#### Search by Location Keyword
To search for listings in a specific suburb:

```json
{
  "keyword": "Mandalay",
  "results_wanted": 20
}
````

#### Crawl a Specific Search URL

To extract listings from a pre-filtered category page:

```json
{
  "startUrl": "https://www.property24.com/for-sale/western-cape/9",
  "results_wanted": 50
}
```

***

### Sample Output

```json
{
  "listing_id": "117400230",
  "title": "4 Bedroom House",
  "url": "https://www.property24.com/for-sale/wilderness-central/wilderness/western-cape/17495/117400230",
  "price": 15000000,
  "currency": "ZAR",
  "transaction_type": "for-sale",
  "locality": "Wilderness Central",
  "city": "wilderness",
  "region": "western-cape",
  "bedrooms": 4,
  "bathrooms": 4.5,
  "parking_spaces": 4,
  "floor_size": 971,
  "floor_size_unit": "m²",
  "erf_size": 6971,
  "erf_size_unit": "m²",
  "agency_name": "Jawitz Properties Wilderness",
  "image_urls": [
    "https://images.prop24.com/382793673/Crop600x400"
  ],
  "features": {
    "bedrooms": 4,
    "bathrooms": 4.5,
    "parking_spaces": 4,
    "floor_size": 971,
    "erf_size": 6971,
    "erf_size_unit": "m²"
  },
  "source": "listing_page"
}
```

***

### Tips for Best Results

- **Use Precise Location Keywords** - Use specific suburb names rather than broad terms to match the platform's categorization.
- **Enable Residential Proxies** - For high volume runs, use residential proxies to reduce rate limits and blocking.
- **Test with Smaller Datasets First** - Start with 20 results to confirm listing patterns before collecting larger datasets.

***

### Integrations

Connect your scraped data to third-party tools:

- **Google Sheets** - Export directly to spreadsheets.
- **Airtable** - Build property databases.
- **Slack** - Get alerts for new properties.
- **Webhooks** - Send results to your own system.

***

### Frequently Asked Questions

#### Can I scrape multiple pages?

Yes, the scraper automatically handles pagination (via next-page links) until the results limit is reached.

#### What if some fields are missing?

The scraper removes null and empty values dynamically. Some listings may lack features like floor size or agent details.

***

### Support

For issues or feature requests, contact support via the Apify Console.

***

### Legal Notice

This scraper is designed for legitimate data collection. Users are responsible for complying with the website terms of service and relevant local privacy laws.

# Actor input Schema

## `startUrl` (type: `string`):

Property24 search results URL (e.g., https://www.property24.com/for-sale/western-cape/9). If provided, it overrides the keyword.

## `keyword` (type: `string`):

Location or keyword to search (e.g. 'Mandalay', 'Western Cape').

## `results_wanted` (type: `integer`):

The maximum number of property listings to collect.

## `max_pages` (type: `integer`):

A safety cap on the number of search result pages to visit.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy for reliable scraping.

## Actor input object example

```json
{
  "keyword": "Mandalay",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "keyword": "Mandalay",
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/property24-south-africa-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 = {
    "keyword": "Mandalay",
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/property24-south-africa-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keyword": "Mandalay",
  "results_wanted": 20
}' |
apify call shahidirfan/property24-south-africa-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/property24-south-africa-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Property24 South Africa Scraper 🏠",
        "description": "Scrape live property listings from South Africa's #1 real estate platform. Extract prices, addresses, descriptions, agent details & photos. Ideal for investment analytics, market research, competitor tracking, price benchmarking & real estate AI datasets. Structured JSON ready.",
        "version": "0.0",
        "x-build-id": "5Nrm4CPBVMves1dtO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~property24-south-africa-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-property24-south-africa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/shahidirfan~property24-south-africa-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-property24-south-africa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/shahidirfan~property24-south-africa-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-property24-south-africa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrl": {
                        "title": "Start URL",
                        "type": "string",
                        "description": "Property24 search results URL (e.g., https://www.property24.com/for-sale/western-cape/9). If provided, it overrides the keyword."
                    },
                    "keyword": {
                        "title": "Keyword / Location",
                        "type": "string",
                        "description": "Location or keyword to search (e.g. 'Mandalay', 'Western Cape')."
                    },
                    "results_wanted": {
                        "title": "Maximum number of results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "The maximum number of property listings to collect.",
                        "default": 20
                    },
                    "max_pages": {
                        "title": "Maximum number of pages",
                        "minimum": 1,
                        "type": "integer",
                        "description": "A safety cap on the number of search result pages to visit.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy for reliable scraping.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
