# Property24 Scraper | Kenya (`fatihtahta/property24-scraper-ke`) Actor

Extract structured Real estate listings across Kenya 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.

- **URL**: https://apify.com/fatihtahta/property24-scraper-ke.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Real estate, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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 Scraper | Enterprise Grade

**Slug:** `fatihtahta/property24-scraper-ke`

### Overview

Property24 Scraper | Enterprise Grade collects structured Kenya property listing records, including listing identity, title, property type, pricing, location, property attributes, media, agency details, agent details, and source context when available. [Property24 Kenya](https://www.property24.co.ke) publishes public real estate listings across sale, rental, and sold-property markets, making the data useful for market analysis, sourcing, monitoring, and operational reporting. The actor converts repeatable Property24 Kenya searches into structured JSON output that can be consumed by analytics tools, CRMs, warehouses, enrichment workflows, and downstream APIs. It is designed for dependable recurring data acquisition where automation, repeatability, and consistent record shape matter. Results reflect publicly available information at run time and should be validated against the needs of each production workflow.

### Why Use This Actor

- **Market research and analytics teams:** build structured extraction workflows for pricing bands, location coverage, inventory supply, listing movement, and market intelligence across Kenya property segments.
- **Product and content teams:** populate internal property experiences, comparison tools, editorial datasets, and listing review queues with normalized public property attributes.
- **Developers and data engineering teams:** deliver repeatable collection into downstream systems, ETL jobs, enrichment pipelines, data warehouses, and operational reporting.
- **Lead generation and enrichment teams:** create targeted prospect datasets from public listings, agencies, and agent records using location, property category, budget, and amenity filters.
- **Monitoring and competitive tracking teams:** schedule recurring runs to observe new availability, pricing movement, listing mix, feature coverage, and agency presence over time.

### Common Use Cases

- **Market intelligence:** monitor supply, pricing, availability, property types, locations, and feature distribution across selected Kenya markets.
- **Lead generation:** build targeted prospect lists from public property listings, agency profiles, and agent records.
- **Competitive monitoring:** track listing activity, price positioning, inventory changes, and agency or agent presence across selected locations.
- **Catalog and directory building:** populate internal databases with structured public property records for search, review, matching, or workflow automation.
- **Data enrichment:** add current public property attributes, media URLs, location details, and agency metadata to CRM, BI, or analytics datasets.
- **Recurring reporting:** schedule periodic runs for dashboards, alerts, market trend analysis, and operational reporting.

### Quick Start

1. Enter a required `location` value such as `Nairobi`, `Kilimani, Nairobi`, `Karen`, or `West Pokot`.
2. Choose the `deal_type` that matches the market scope: active sale listings, active rental listings, or sold property records.
3. Set a small `limit` for the first validation run, such as 10 or 25 records per input.
4. Add only the filters needed for the first run, such as price range, property type, bedrooms, bathrooms, parking, furnishing, or listing features.
5. Run the actor in Apify Console and inspect the first dataset records to confirm the output shape fits your workflow.
6. Increase coverage, refine filters, adjust `enrich_data`, or schedule recurring runs after the output has been verified.

### Input Parameters

The actor requires one Kenya `location` and supports optional market, price, size, room, amenity, rental-term, sort, enrichment, limit, and connection configuration fields.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `location` | string | Required. Kenya location to search, such as a county, city, suburb, neighborhood, town, or area. Examples: `Nairobi`, `Kilimani, Nairobi`, `Karen`, or `West Pokot`. | - |
| `deal_type` | string | Listing market to collect. Allowed values: `Properties For Sale`, `Properties For Rent`, `Sold Properties`. | `Properties For Sale` |
| `min_price` | integer | Minimum listing price to include, in Kenyan shillings (KES). Use whole numbers without currency symbols. | - |
| `max_price` | integer | Maximum listing price to include, in Kenyan shillings (KES). Use whole numbers without currency symbols. | - |
| `min_property_area` | integer | Minimum floor area to include, in square meters. | - |
| `max_property_area` | integer | Maximum floor area to include, in square meters. | - |
| `min_land_area` | integer | Minimum land area to include, in square meters. | - |
| `max_land_area` | integer | Maximum land area to include, in square meters. | - |
| `min_bedroom` | integer | Minimum number of bedrooms required. | - |
| `min_bathroom` | integer | Minimum number of bathrooms required. | - |
| `min_parking` | string | Minimum number of parking spaces. Allowed values: `1`, `2`, `3`, `4`, `5`. | - |
| `furnished` | string | Furnishing filter. Allowed values: `furnished_only`, `unfurnished_only`. Leave empty to include both where available. | - |
| `property_type` | array of strings | Property categories to include. Allowed values: `house`, `apartment_flat`, `townhouse`, `vacant_land_plot`, `farm`, `commercial_property`, `industrial_property`. | - |
| `features` | array of strings | Required listing features. Allowed values: `pet_friendly`, `garden`, `pool`, `flatlet`. | - |
| `rental_term` | array of strings | Rental billing terms to include when collecting rental listings. Allowed values: `monthly`, `weekly`, `daily`, `yearly`, `per_square_metre`. | - |
| `sort_by` | string | Result ordering before collection. Allowed values: `default`, `lowest_price`, `highest_price`, `most_recent`, `available_date_ascending`, `available_date_descending`, `property_type`, `size`. | - |
| `enrich_data` | boolean | When enabled, collects richer listing records when available, including full descriptions, overview attributes, room counts, sizes, listing dates, media URLs, agency details, agent details, and listing features. | `true` |
| `limit` | integer | Maximum number of listings to save for each provided location or input. Minimum value: `1`. | - |
| `proxyConfiguration` | object | Apify connection configuration for controlled network behavior. Keep the default unless your organization requires a different connection configuration. | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` |

### Choosing Inputs

Use `location` as the primary scope control. Broader values such as `Nairobi` improve discovery and are useful for market scans, while narrower values such as `Kilimani, Nairobi` or `Karen` produce more targeted datasets for local analysis.

Choose `deal_type` before adding filters because sale listings, rental listings, and sold property records represent different market contexts. Price, area, room, parking, furnishing, property type, feature, and rental-term filters narrow the result set; use them when you need cleaner segmentation or a specific sourcing profile. Leave optional filters empty when the goal is broad discovery.

Use `sort_by` to prioritize which records are collected first when `limit` is set. Start with a small `limit` to validate shape, coverage, and business fit, then increase it once the dataset looks correct. Keep `enrich_data` enabled when downstream workflows need detail-rich records, and disable it for faster validation or summary-level collection.

### Example Inputs

#### Scenario: Broad Discovery Run

```json
{
  "location": "Nairobi",
  "deal_type": "Properties For Sale",
  "sort_by": "most_recent",
  "limit": 25,
  "enrich_data": false
}
````

#### Scenario: Targeted Family Homes

```json
{
  "location": "Karen, Nairobi",
  "deal_type": "Properties For Sale",
  "min_price": 50000000,
  "max_price": 200000000,
  "min_bedroom": 4,
  "property_type": ["house", "townhouse"],
  "limit": 50
}
```

#### Scenario: Rental Market Monitoring

```json
{
  "location": "Kilimani, Nairobi",
  "deal_type": "Properties For Rent",
  "property_type": ["apartment_flat"],
  "rental_term": ["monthly"],
  "sort_by": "most_recent",
  "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, the 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 Kenya listing record with listing-level fields and nested pricing, location, property detail, media, agency, agent, and source context objects where available. The recommended idempotency key is `listing_id`; use `url` or `source_context.detail_url` as secondary stable identifiers when a URL-based key is preferred. Use `source_context.fingerprint` as an additional comparison key when evaluating repeated collections.

For deduplication and upserts, store records by `listing_id` and update mutable fields such as pricing, listing details, media, agency data, 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 for the record, while `source_context.fingerprint` provides a compact identifier for comparison workflows.

#### 9.3 Examples

##### Example: listing record

```json
{
  "listing_id": "117182527",
  "url": "https://www.property24.co.ke/5-bedroom-townhouse-for-sale-in-karen-117182527",
  "title": "5 Bedroom Townhouse for Sale in Karen",
  "property_type": "Townhouse",
  "description": "Samsara - Bespoke Luxury Villas in Karen Karen, Nairobi | The Very Pinnacle of Prestige Project Overview: 8 Exclusive Villas 5 Bedrooms | 5 Bathrooms 2 Servant's Quarters Private Lap Pool Gym / Office 6 Car Parks Central Courtyard with Entrance Pond Double Height Dining & Kitchen (4.2m ceilings) Private Gardens & Terraces Price: From Kshs 150M Highlights: > Designed by Torrens Studio & visualized by Karim CG Visuals > Seamless indoor-outdoor living with lush greenery & water features > Natural materials - stone, wood & marble finishes > Spacious, airy interiors with abundant natural light > Exclusive gated community in Karen - luxury meets tranquility Call/WhatsApp: +254 721 514314 Samsara - The Essence of Luxury Living in Karen.",
  "pricing": {
    "display_price": "KSh 150 000 000",
    "amount": 150000000,
    "currency": "KES",
    "service_charge": {
      "display": "KSh 30 000",
      "amount": 30000,
      "currency": "KES"
    }
  },
  "location": {
    "display": "Karen",
    "address": "Windy Ridge Karen, Karen, Nairobi"
  },
  "property_details": {
    "bedrooms": 5,
    "bathrooms": 6.5,
    "garages": 4,
    "parking_spaces": 4,
    "floor_size": {
      "display": "800 m²",
      "value": 800,
      "unit": "m²"
    },
    "land_size": {
      "display": "2 100 m²",
      "value": 2100,
      "unit": "m²"
    },
    "listed_date": "2026-05-04",
    "listed_date_text": "04 May 2026",
    "description_title": "For sale: 5 bedroom villa all ensuite + 2 dsq",
    "pets_allowed": true,
    "features": {
      "pet_friendly": true,
      "garden": true
    }
  },
  "media": {
    "primary_image_url": "https://images.prop24.com/uo3dk7uc7cj2i4zduetmhsrvhu/Crop600x400",
    "image_urls": [
      "https://images.prop24.com/uo3dk7uc7cj2i4zduetmhsrvhu/Crop600x400",
      "https://images.prop24.com/uo3dk7uc7cj2i4zduetmhsrvhu/Ensure1280x720",
      "https://images.prop24.com/xbt3c7lh7byqwz3kwnopgkbz7e/Ensure1280x720",
      "https://images.prop24.com/2d7x37ef7czypviduhkk7kzhyq/Ensure1280x720",
      "https://images.prop24.com/gsm5ur4nyukkc5i46u3ialjdqu/Ensure1280x720",
      "https://images.prop24.com/attbzyo6ghhetjcprjmgyzfjve/Ensure1280x720",
      "https://images.prop24.com/zlgd4e5algbx6nlxqy3zkmzbji/Ensure1280x720",
      "https://images.prop24.com/zpe53zhsqm6g5lwxa6zcmajciq/Ensure1280x720",
      "https://images.prop24.com/nfagptmxuynnez5yyxqxppizlu/Ensure1280x720",
      "https://images.prop24.com/nhsqvskos5aseieooirzz7c2oa/Ensure1280x720",
      "https://images.prop24.com/fauuirewa3qhrvgq72zhq3fwue/Ensure1280x720",
      "https://images.prop24.com/bdcbzguepzcnvmm7w27fk3zhm4/Ensure1280x720",
      "https://images.prop24.com/ch4aqlm7yjavngm54cojlq7rbq/Ensure1280x720",
      "https://images.prop24.com/w5cmrhyhfywqfgcj5ffh3ehiey/Ensure1280x720",
      "https://images.prop24.com/nezgg73fwabzuo6wn5qiahaxgq/Ensure1280x720",
      "https://images.prop24.com/2is5w6poumru7wyvhpgygruo4m/Ensure1280x720",
      "https://images.prop24.com/kplr2vx2h2qghuzyfcvnofdapi/Ensure1280x720",
      "https://images.prop24.com/l5s7se5eqies6rxmrcpi2gzksi/Ensure1280x720",
      "https://images.prop24.com/t7spe6uxrmivpauyl3pph6hoxm/Ensure1280x720",
      "https://images.prop24.com/kzdzdtlq3f2dlhntpniow3yqhm/Ensure1280x720",
      "https://images.prop24.com/b2qfirocllthfha4lsyq47zxmm/Ensure1280x720",
      "https://images.prop24.com/iw3k7xb5lzplt7lsl6wlc4gq3m/Ensure1280x720",
      "https://images.prop24.com/uozc23ziukao3cx5ktn7wh4idi/Ensure1280x720",
      "https://images.prop24.com/6tvk33hmubtzjgpb3mg5gffhou/Ensure1280x720",
      "https://images.prop24.com/uo3dk7uc7cj2i4zduetmhsrvhu/Crop676x507"
    ],
    "image_count": 25,
    "video_url": "https://www.youtube.com/embed/Yi5tqTH2iDE?rel=0&showinfo=0"
  },
  "agency": {
    "name": "Villa Lee Properties",
    "url": "https://www.property24.co.ke/property-for-sale-by-villa-lee-properties-ag26667",
    "image_url": "https://images.prop24.com/94483906/Fit450x225"
  },
  "agents": [
    {
      "id": "154315",
      "name": "Eric Mwenje",
      "image_url": "https://images.prop24.com/212323318/Crop204x306"
    }
  ],
  "source_context": {
    "source": "Property24",
    "domain": "www.property24.co.ke",
    "source_url": "https://www.property24.co.ke/property-for-sale-in-nairobi-p95",
    "loaded_url": "https://www.property24.co.ke/property-for-sale-in-nairobi-p95",
    "detail_url": "https://www.property24.co.ke/5-bedroom-townhouse-for-sale-in-karen-117182527",
    "scraped_time": "2026-05-05T15:23:09.008514Z",
    "fingerprint": "d39773ccf1b93338d067",
    "seed": {
      "id": "77d3d8a892bc",
      "type": "query",
      "value": "Nairobi"
    },
    "page_index": 1
  }
}
```

### Field Reference

#### Listing Record

**listing\_id** *(string, required)*: Stable Property24 listing identifier.

**url** *(string, required)*: Public listing URL.

**title** *(string, required)*: Listing title.

**property\_type** *(string, optional)*: Property category shown for the listing.

**description** *(string, optional)*: Public listing description text.

**pricing.display\_price** *(string, optional)*: Human-readable listing price.

**pricing.amount** *(number, optional)*: Numeric listing price.

**pricing.currency** *(string, optional)*: ISO-style currency code, such as `KES`.

**pricing.service\_charge.display** *(string, optional)*: Human-readable service charge.

**pricing.service\_charge.amount** *(number, optional)*: Numeric service charge amount.

**pricing.service\_charge.currency** *(string, optional)*: Service charge currency code.

**location.display** *(string, optional)*: Display location for the listing.

**location.address** *(string, optional)*: Public address or area text when provided.

**property\_details.bedrooms** *(number, optional)*: Bedroom count.

**property\_details.bathrooms** *(number, optional)*: Bathroom count.

**property\_details.garages** *(number, optional)*: Garage count.

**property\_details.parking\_spaces** *(number, optional)*: Parking space count.

**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, such as `m²`.

**property\_details.land\_size.display** *(string, optional)*: Human-readable land size.

**property\_details.land\_size.value** *(number, optional)*: Numeric land size.

**property\_details.land\_size.unit** *(string, optional)*: Land size unit, such as `m²`.

**property\_details.listed\_date** *(string, optional)*: Listing date in ISO date format when available.

**property\_details.listed\_date\_text** *(string, optional)*: Listing date as displayed by the source.

**property\_details.description\_title** *(string, optional)*: Detail-page description heading or subtitle.

**property\_details.pets\_allowed** *(boolean, optional)*: Whether pets are indicated as allowed.

**property\_details.features.pet\_friendly** *(boolean, optional)*: Whether the listing indicates pet-friendly status.

**property\_details.features.garden** *(boolean, optional)*: Whether the listing indicates a garden.

**media.primary\_image\_url** *(string, optional)*: Primary listing image URL.

**media.image\_urls** *(array of strings, optional)*: Image URLs associated with the listing.

**media.image\_count** *(number, optional)*: Count of image URLs captured for the listing.

**media.video\_url** *(string, optional)*: Public video URL when available.

**agency.name** *(string, optional)*: Agency name associated with the listing.

**agency.url** *(string, optional)*: Public agency 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\[].image\_url** *(string, optional)*: Agent image URL.

**source\_context.source** *(string, required)*: Source label.

**source\_context.domain** *(string, required)*: Source domain.

**source\_context.source\_url** *(string, optional)*: Public source URL for the collection context.

**source\_context.loaded\_url** *(string, optional)*: Public URL represented by the collected result set.

**source\_context.detail\_url** *(string, optional)*: Public listing detail URL.

**source\_context.scraped\_time** *(string, required)*: UTC timestamp for when the record was collected.

**source\_context.fingerprint** *(string, optional)*: Compact identifier useful for repeated-run comparison.

**source\_context.seed.id** *(string, optional)*: Input seed identifier.

**source\_context.seed.type** *(string, optional)*: Input seed type, such as `query`.

**source\_context.seed.value** *(string, optional)*: Input seed value used for the run.

**source\_context.page\_index** *(number, optional)*: 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, and source-side presentation changes.
- **Optional fields:** null-check optional values in downstream code, especially media, agency, agent, size, service charge, feature, and date fields.
- **Deduplication:** use `listing_id` as the strongest stable key, with `url`, `source_context.detail_url`, or `source_context.fingerprint` as secondary comparison fields.
- **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 other long-lived systems.

### Tips For Best Results

- Start with a small `limit` to validate the output shape before scaling up.
- Use one geography or market segment per run when you need cleaner reporting and easier comparison.
- Leave optional filters empty when the goal is broad discovery.
- Add filters gradually to understand how each field changes coverage.
- Use `sort_by` with `limit` when you need the newest, lowest-priced, highest-priced, or size-prioritized records first.
- Keep `enrich_data` enabled for detail-rich records when your workflow needs descriptions, media, agency, agent, size, date, or feature 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 location and market scope.
3. Set the maximum number of outputs to collect with `limit`.
4. Click **Start** and wait for the run to finish.
5. Inspect the dataset records in Apify Console.
6. Download results in JSON, CSV, Excel, or other supported formats.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

You can schedule recurring runs to keep Property24 Kenya datasets fresh for monitoring, reporting, and enrichment workflows. Use separate schedules for distinct locations or market segments when you need clean time-series comparisons.

- 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

- **CRM enrichment:** sync public listing, agency, agent, price, and location attributes into account, lead, or opportunity records.
- **BI dashboards:** monitor pricing, availability, property type movement, feature coverage, and geographic inventory over time.
- **Warehouses and ETL pipelines:** load normalized JSON records into analytical storage for historical reporting and modeling.
- **Google Sheets or Airtable:** review smaller market samples, validate target segments, and coordinate lightweight sourcing workflows.
- **Webhooks:** trigger ingestion, validation, notification, or alerting workflows after each completed run.
- **Alerts and scheduled reporting:** notify teams when new listings, price bands, or target property segments appear in monitored locations.

### Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems for operational review, automated ingestion, and historical analysis.

- **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.co.ke> publicly exposes at run time.
- Some optional fields may be missing on sparse listings or records with limited public detail.
- Very broad searches may take longer or require higher `limit` values to collect sufficient coverage.
- Target-side changes can affect field availability, naming, or formatting.
- Regional, account, or availability differences may change visible results.
- Sold-property records, rental listings, and sale listings may expose different combinations of fields.

### Troubleshooting

- **No results returned:** check filters, location spelling, selected market, and whether Property24 Kenya has matching public records.
- **Fewer results than expected:** broaden filters, raise `limit`, or verify that the target location contains enough matching records.
- **Some fields are empty:** optional fields depend on what each listing publicly provides.
- **Run takes longer than expected:** reduce scope, lower `limit` for validation, or split broad collection into smaller location or market 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 Kenya listing records, including listing identifiers, URLs, titles, property types, descriptions, prices, locations, property details, media, agency data, agent data, and source context when available.

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

Yes. The required `location` field controls geography, while `deal_type`, price range, area range, bedroom, bathroom, parking, furnishing, `property_type`, `features`, `rental_term`, and `sort_by` help refine scope.

#### Can I filter by date?

There is no direct date-window input. Use `sort_by` values such as `most_recent`, `available_date_ascending`, or `available_date_descending` where they match your workflow.

#### Why did I receive fewer results than my limit?

The `limit` is a maximum, not a guarantee. You may receive fewer records when the selected location, market, and filters have fewer matching public listings.

#### Can I schedule recurring runs?

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

#### How do I avoid duplicates across runs?

Use `listing_id` as the primary deduplication and upsert key. You can also compare `url`, `source_context.detail_url`, and `source_context.fingerprint` for additional validation.

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

Yes. Apify datasets support JSON, CSV, Excel, and other export formats suitable for manual review and automated ingestion.

#### Does this actor collect private data?

The actor is intended to collect publicly available Property24 Kenya listing information. Users are responsible for ensuring their use of the data complies with applicable laws, regulations, and platform terms.

#### 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 available. Redact any sensitive information before sharing.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available property listing information from **https://www.property24.co.ke** for legitimate business purposes, including:

- **Real estate** research and market analysis
- **Property sourcing, monitoring, and operational reporting**
- **CRM, BI, and data enrichment workflows**

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

#### 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. Include the input used, with sensitive values redacted if applicable, the run ID, expected versus actual behavior, and a small output sample when useful. Avoid sharing unnecessary personal information in support requests.

# Actor input Schema

## `location` (type: `string`):

Required. Enter a location name in a shape that Property24 Kenya recognizes. Accepted shapes include county, city, suburb, neighborhood, town, or area. Examples: "Nairobi", "Kilimani, Nairobi", or "West Pokot".

## `deal_type` (type: `string`):

Choose whether the run should collect properties for sale, properties for rent, or sold property records for the locations you entered.

## `min_price` (type: `integer`):

Enter the lowest listing price to include, using whole numbers without currency symbols. Leaving this empty includes listings below any chosen maximum.

## `max_price` (type: `integer`):

Enter the highest listing price to include, using whole numbers without currency symbols. Leaving this empty includes listings above any chosen minimum.

## `min_property_area` (type: `integer`):

Enter the smallest property floor area to include, in square meters. Leave empty when floor area should not narrow the results.

## `max_property_area` (type: `integer`):

Enter the largest property floor area to include, in square meters. Use this with a minimum area for a defined floor-size range.

## `min_land_area` (type: `integer`):

Enter the smallest land area to include, in square meters. This is useful when plot size matters more than interior floor area.

## `max_land_area` (type: `integer`):

Enter the largest land area to include, in square meters. Leave empty when larger plots should remain eligible.

## `min_bedroom` (type: `integer`):

Enter the minimum number of bedrooms a listing must have. Leave empty to include studio, one-bedroom, and other smaller configurations.

## `min_bathroom` (type: `integer`):

Enter the minimum number of bathrooms a listing must have. Use this with bedroom filters when you need a specific layout profile.

## `min_parking` (type: `string`):

Choose the minimum number of parking spaces required for each listing. Leave blank when parking should not affect the search.

## `furnished` (type: `string`):

Choose furnished-only or unfurnished-only results when furnishing status is a required part of the brief. Leave blank to include both where available.

## `property_type` (type: `array`):

Select one or more property types to include. Leave empty to keep the search open across all supported property categories.

## `features` (type: `array`):

Select required features such as pet friendly, garden, pool, or flatlet. Each selected feature narrows the results toward listings that match those requirements.

## `rental_term` (type: `array`):

Select rental billing terms to include when collecting rental listings. This setting is most useful when the selected market is Properties For Rent.

## `sort_by` (type: `string`):

Select the ordering that best matches the workflow, such as newest listings first, price order, availability date, property type, or size.

## `enrich_data` (type: `boolean`):

Enable this for more complete property listing records. This may make the run slower because the actor may spend more time collecting details for each result. Turn it off for faster runs when the standard result fields are enough.

## `limit` (type: `integer`):

Enter the maximum number of listings to save for each provided location or input. Leave empty to collect without this per-input cap.

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

Choose an Apify proxy or custom proxy configuration when you need more controlled connection behavior. Keep the default unless your organization requires a different setup.

## Actor input object example

```json
{
  "location": "Nairobi",
  "deal_type": "Properties For Sale",
  "enrich_data": true,
  "limit": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "location": "Nairobi",
    "limit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/property24-scraper-ke").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 = {
    "location": "Nairobi",
    "limit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/property24-scraper-ke").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 '{
  "location": "Nairobi",
  "limit": 100
}' |
apify call fatihtahta/property24-scraper-ke --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Property24 Scraper | Kenya",
        "description": "Extract structured Real estate listings across Kenya 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.",
        "version": "0.0",
        "x-build-id": "Un07Puw23xRV62fwc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~property24-scraper-ke/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-property24-scraper-ke",
                "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/fatihtahta~property24-scraper-ke/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-property24-scraper-ke",
                "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/fatihtahta~property24-scraper-ke/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-property24-scraper-ke",
                "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",
                "required": [
                    "location"
                ],
                "properties": {
                    "location": {
                        "title": "Add Search Location",
                        "minLength": 1,
                        "type": "string",
                        "description": "Required. Enter a location name in a shape that Property24 Kenya recognizes. Accepted shapes include county, city, suburb, neighborhood, town, or area. Examples: \"Nairobi\", \"Kilimani, Nairobi\", or \"West Pokot\"."
                    },
                    "deal_type": {
                        "title": "Select Listing Market",
                        "enum": [
                            "Properties For Sale",
                            "Properties For Rent",
                            "Sold Properties"
                        ],
                        "type": "string",
                        "description": "Choose whether the run should collect properties for sale, properties for rent, or sold property records for the locations you entered.",
                        "default": "Properties For Sale"
                    },
                    "min_price": {
                        "title": "Set Minimum Price",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the lowest listing price to include, using whole numbers without currency symbols. Leaving this empty includes listings below any chosen maximum."
                    },
                    "max_price": {
                        "title": "Set Maximum Price",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the highest listing price to include, using whole numbers without currency symbols. Leaving this empty includes listings above any chosen minimum."
                    },
                    "min_property_area": {
                        "title": "Set Minimum Floor Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the smallest property floor area to include, in square meters. Leave empty when floor area should not narrow the results."
                    },
                    "max_property_area": {
                        "title": "Set Maximum Floor Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the largest property floor area to include, in square meters. Use this with a minimum area for a defined floor-size range."
                    },
                    "min_land_area": {
                        "title": "Set Minimum Land Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the smallest land area to include, in square meters. This is useful when plot size matters more than interior floor area."
                    },
                    "max_land_area": {
                        "title": "Set Maximum Land Area",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the largest land area to include, in square meters. Leave empty when larger plots should remain eligible."
                    },
                    "min_bedroom": {
                        "title": "Set Minimum Bedrooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the minimum number of bedrooms a listing must have. Leave empty to include studio, one-bedroom, and other smaller configurations."
                    },
                    "min_bathroom": {
                        "title": "Set Minimum Bathrooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the minimum number of bathrooms a listing must have. Use this with bedroom filters when you need a specific layout profile."
                    },
                    "min_parking": {
                        "title": "Set Minimum Parking Spaces",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5"
                        ],
                        "type": "string",
                        "description": "Choose the minimum number of parking spaces required for each listing. Leave blank when parking should not affect the search."
                    },
                    "furnished": {
                        "title": "Filter Furnishing Status",
                        "enum": [
                            "furnished_only",
                            "unfurnished_only"
                        ],
                        "type": "string",
                        "description": "Choose furnished-only or unfurnished-only results when furnishing status is a required part of the brief. Leave blank to include both where available."
                    },
                    "property_type": {
                        "title": "Choose Property Types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select one or more property types to include. Leave empty to keep the search open across all supported property categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "house",
                                "apartment_flat",
                                "townhouse",
                                "vacant_land_plot",
                                "farm",
                                "commercial_property",
                                "industrial_property"
                            ],
                            "enumTitles": [
                                "House",
                                "Apartment / Flat",
                                "Townhouse",
                                "Vacant Land / Plot",
                                "Farm",
                                "Commercial Property",
                                "Industrial Property"
                            ]
                        }
                    },
                    "features": {
                        "title": "Choose Listing Features",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select required features such as pet friendly, garden, pool, or flatlet. Each selected feature narrows the results toward listings that match those requirements.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pet_friendly",
                                "garden",
                                "pool",
                                "flatlet"
                            ],
                            "enumTitles": [
                                "Pet friendly",
                                "Garden",
                                "Pool",
                                "Flatlet"
                            ]
                        }
                    },
                    "rental_term": {
                        "title": "Choose Rental Terms",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Select rental billing terms to include when collecting rental listings. This setting is most useful when the selected market is Properties For Rent.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "monthly",
                                "weekly",
                                "daily",
                                "yearly",
                                "per_square_metre"
                            ],
                            "enumTitles": [
                                "Monthly",
                                "Weekly",
                                "Daily",
                                "Yearly",
                                "Per square metre"
                            ]
                        }
                    },
                    "sort_by": {
                        "title": "Choose Sort Order",
                        "enum": [
                            "default",
                            "lowest_price",
                            "highest_price",
                            "most_recent",
                            "available_date_ascending",
                            "available_date_descending",
                            "property_type",
                            "size"
                        ],
                        "type": "string",
                        "description": "Select the ordering that best matches the workflow, such as newest listings first, price order, availability date, property type, or size."
                    },
                    "enrich_data": {
                        "title": "Collect Richer Real Estate Listing Details",
                        "type": "boolean",
                        "description": "Enable this for more complete property listing records. This may make the run slower because the actor may spend more time collecting details for each result. Turn it off for faster runs when the standard result fields are enough.",
                        "default": true
                    },
                    "limit": {
                        "title": "Set Maximum Results per Input",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Enter the maximum number of listings to save for each provided location or input. Leave empty to collect without this per-input cap."
                    },
                    "proxyConfiguration": {
                        "title": "Set Up Proxy Connection",
                        "type": "object",
                        "description": "Choose an Apify proxy or custom proxy configuration when you need more controlled connection behavior. Keep the default unless your organization requires a different setup.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
