# Madlan Property Listings Extractor (`kawsar/madlan-property-listings-extractor`) Actor

Extract Madlan real estate listings by search URL, with price, rooms, size, address, coordinates, photos, and price history, exported to JSON, CSV, or Excel for property research and market tracking.

- **URL**: https://apify.com/kawsar/madlan-property-listings-extractor.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Madlan Property Listings Extractor

Turn any Madlan search into a clean dataset. Paste a search URL from madlan.co.il, run the actor, and get every property on that search as structured rows you can open in Excel, load into a database, or pipe into your own tools.

Madlan is one of the biggest real estate portals in Israel, covering apartments, houses, and new developments for sale and for rent across the country. The website loads listings through infinite scroll, which makes copying data by hand slow and error prone. This actor does the scrolling for you and returns the full result set in one run.

### What you get

For each listing the actor collects the asking price, number of rooms, floor, size in square meters, build year, condition, full street address, map coordinates, photos, seller type, and the price history when Madlan shows it. Every record also carries a direct link back to the listing so you can open it in one click.

The actor keeps paging through the search until it reaches the limit you set, so you are not stuck with only the first screen of results.

### Key features

- Works with any Madlan search: for sale, for rent, any city, neighbourhood, or street
- Follows filters you apply on the site, such as price range, rooms, and size
- Pages through results automatically up to your chosen limit
- Removes duplicates so the same listing never appears twice
- Returns full-size image URLs and a direct listing link for every property
- Accepts several search URLs in one run to cover multiple areas at once
- Exports to JSON, CSV, Excel, HTML table, or via the API
- Handles Hebrew addresses and text correctly

### How to use it

1. Open [madlan.co.il](https://www.madlan.co.il) and search for what you want.
2. Pick for sale or for rent, choose a city, neighbourhood, or street, and apply any filters.
3. Copy the URL from your browser address bar.
4. Paste it into the `searchUrls` field, set `maxItems`, and run.

You can paste more than one URL. For example, one search for Tel Aviv and another for Jerusalem in the same run.

### Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `searchUrls` | array of strings | Yes | Tel Aviv for sale | Madlan search result pages to extract. Paste one or more URLs from madlan.co.il. |
| `maxItems` | integer | No | 30 | How many listings to save across the whole run. The actor pages through results until it hits this number or runs out of listings. Maximum 1000. |
| `requestTimeoutSecs` | integer | No | 45 | Timeout for each request, in seconds. |

#### Example input

```json
{
    "searchUrls": [
        "https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל"
    ],
    "maxItems": 100,
    "requestTimeoutSecs": 45
}
```

#### Tips for better results

- Narrow the search on Madlan with filters before copying the URL. A tighter search means the listings you actually care about come first.
- To collect a whole city, raise `maxItems`. The actor will keep paging until it reaches that number.
- Sort options and filters you set on the site are part of the URL, so they carry over into the run.

### Output

Each listing is saved as one item in the dataset. Here is a real example.

```json
{
    "id": "zMbqVUatMLq",
    "listingUrl": "https://www.madlan.co.il/bulletin/zMbqVUatMLq",
    "dealType": "unitBuy",
    "address": "קלצ'קין 3, תל אביב יפו",
    "city": "תל אביב יפו",
    "neighbourhood": "אפקה",
    "streetName": "קלצ'קין",
    "streetNumber": "3",
    "district": "מחוז תל אביב",
    "zipcode": null,
    "price": 4350000,
    "beds": 5,
    "baths": null,
    "areaSqm": 112,
    "floor": "2",
    "buildingYear": 1927,
    "propertyCondition": "preserved",
    "buildingClass": "flat",
    "urbanRenewalStatus": 4,
    "latitude": 32.118292,
    "longitude": 34.802077,
    "sellerType": "private",
    "images": [
        "https://images2.madlan.co.il/t:nonce:v=5;resize:height=800;convert:type=webp/bulletins/IMG_8526-8386e3c9.jpeg"
    ],
    "imageCount": 1,
    "neighbourhoodScores": {
        "bestSchool": 5,
        "safety": null,
        "parkAccess": 0,
        "quietStreet": 2,
        "dogPark": 5,
        "familyFriendly": 0,
        "lightRail": 2,
        "commute": 7
    },
    "priceHistory": [
        { "eventType": "new", "price": 4350000, "date": "2026-09-20T05:56:17Z" }
    ],
    "firstTimeSeen": "2026-09-20T05:56:13.000Z",
    "lastUpdated": "Sun Sep 20 05:56:13 GMT 2026",
    "sourceUrl": "https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל",
    "scrapedAt": "2026-09-20T06:10:00.000000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Madlan listing identifier |
| `listingUrl` | string | Direct link to the listing page |
| `dealType` | string | Type of deal, for example `unitBuy` or `unitRent` |
| `address` | string | Full street address as shown on Madlan |
| `city` | string | City |
| `neighbourhood` | string | Neighbourhood |
| `streetName` | string | Street name |
| `streetNumber` | string | Street number |
| `district` | string | Administrative district |
| `zipcode` | string | Postal code when available |
| `price` | number | Asking price in shekels |
| `beds` | number | Number of rooms |
| `baths` | number | Number of bathrooms when listed |
| `areaSqm` | number | Floor area in square meters |
| `floor` | string | Floor of the unit |
| `buildingYear` | number | Year the building was constructed |
| `propertyCondition` | string | Condition, for example `new`, `renovated`, `preserved` |
| `buildingClass` | string | Property class, for example `flat` or `house` |
| `urbanRenewalStatus` | number | Urban renewal status code when present |
| `latitude` | number | Map latitude |
| `longitude` | number | Map longitude |
| `sellerType` | string | `private` for a private seller, `agent` for an agency |
| `images` | array | Full-size image URLs |
| `imageCount` | number | Number of images |
| `neighbourhoodScores` | object | Livability scores such as schools, safety, dog parks, and commute |
| `priceHistory` | array | Price events with `eventType`, `price`, and `date` |
| `firstTimeSeen` | string | When the listing first appeared on Madlan |
| `lastUpdated` | string | When the listing was last updated |
| `sourceUrl` | string | The search URL this listing came from |
| `scrapedAt` | string | When the record was collected, in UTC |

Fields that Madlan does not provide for a given listing come back as `null`.

### Use cases

- Compare asking prices across neighbourhoods, cities, or building types
- Track new listings as they hit the market and watch how prices move over time
- Feed a valuation or investment model with current market data
- Build lead lists of private sellers or agent listings
- Power a property map or dashboard with live coordinates and prices
- Run market research for appraisals, mortgages, or development planning

### How pagination works

Madlan shows a limited set of listings per page and loads more as you scroll. The actor mirrors that behaviour: it requests the first results page, saves the listings, then moves to the next page and continues until it has collected `maxItems` records or there are no more results. Listings that appear on more than one page are saved only once.

If you want everything for a search, set `maxItems` high enough to cover the total number of matches shown on the site.

### Notes and limits

- The actor reads the listings Madlan returns for the search URL you provide. To reach a specific subset, apply filters on the site first.
- Very large searches can span thousands of results. Set `maxItems` to control run length and cost.
- Availability and prices reflect what Madlan shows at the moment of the run. Re-run the actor to refresh.

### Frequently asked questions

**Can I scrape rentals as well as sales?**
Yes. Paste a for-rent search URL and the actor handles it the same way.

**Can I extract more than one city in a single run?**
Yes. Add each city's search URL to `searchUrls`.

**Why did I get fewer results than `maxItems`?**
The search had fewer matching listings than your limit, so the actor saved everything available.

**In what formats can I download the data?**
JSON, CSV, Excel, and HTML table from the dataset, or straight from the Apify API.

# Actor input Schema

## `searchUrls` (type: `array`):

One or more Madlan search result pages to extract listings from. Open a search on madlan.co.il (for sale or for rent, in any city or neighbourhood) and paste the page URL here. You can add several URLs to cover multiple areas in a single run.

## `maxItems` (type: `integer`):

Maximum number of listings to save across the whole run. The actor pages through the search results until it reaches this number.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל"
  ],
  "maxItems": 30,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `properties` (type: `string`):

Property listings extracted from Madlan search pages.

# 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 = {
    "searchUrls": [
        "https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/madlan-property-listings-extractor").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 = { "searchUrls": ["https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל"] }

# Run the Actor and wait for it to finish
run = client.actor("kawsar/madlan-property-listings-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.madlan.co.il/for-sale/תל-אביב-יפו-ישראל"
  ]
}' |
apify call kawsar/madlan-property-listings-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kawsar/madlan-property-listings-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gav9sKGNW6ofqqhUM/builds/HmL3hdIPo9QZUaZnn/openapi.json
