# Israel Real Estate Scraper - Yad2 & Madlan Listings (`leadproof/israel-real-estate`) Actor

Scrape Israeli apartments, houses and commercial property from Yad2 and Madlan in one run. One row per apartment, price history, price drops, neighborhood scores and new-listings-only monitoring.

- **URL**: https://apify.com/leadproof/israel-real-estate.md
- **Developed by:** [Lead Proof](https://apify.com/leadproof) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 listings

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Israel Real Estate Scraper - Yad2 & Madlan Listings

Search Israel's biggest property sites, Yad2 and Madlan, plus Homeless if you want it, in one run. Get apartments, houses and commercial property for rent or sale as one clean dataset: one row per apartment even when it is listed on both sites, with prices, full addresses and coordinates, price history, price drops and neighborhood scores. Export JSON, CSV or Excel, or connect the Actor to the Apify API, n8n, Make or Zapier.

### Why this Actor

- **Two sites, one list.** Yad2 and Madlan carry different listings. Searching both finds more of the market, and the same apartment on both sites is delivered once and charged once.
- **More than a listing.** Madlan rows add every price change with its date and neighborhood scores for schools, parks, quiet streets and transport. Yad2 rows show the previous price on a price drop.
- **Fast and light.** Searches run in parallel from Israeli residential IPs and read the compact data the sites use themselves, so thousands of listings arrive in about a minute at low platform cost.
- **Homeless too.** Add `homeless` to **Sources** to include homeless.co.il boards (private rentals, broker rentals, sales and commercial). Homeless pages are read in a real Chrome window, one fresh session per page, so it is slower than the other two sites; give such runs at least 1024 MB of memory.
- **Monitoring built in.** Turn on **Only new or changed listings** and schedule the Actor: each run delivers just the new listings and price changes since the last one.

### Quick start

1. Choose **Transaction**: Rent, Sale or Commercial.
2. Keep both **Sources** or pick one site.
3. Fill the **Filters** you need, such as city, price and rooms, and set **Maximum results**.
4. Run, then download the dataset or read it through the API.

#### 3-room apartments for rent in Tel Aviv

```json
{
  "transactionType": "rent",
  "sources": ["yad2", "madlan"],
  "filters": {"city": "Tel Aviv", "rooms": 3, "maxPrice": 8000},
  "maxResults": 1000
}
```

#### Price drops in Haifa, 4 rooms or more

```json
{
  "transactionType": "sale",
  "filters": {"city": "חיפה", "minRooms": 4, "priceDropped": true},
  "maxResults": 1000
}
```

#### Daily watch on several moshavim

```json
{
  "transactionType": "sale",
  "filters": {"city": "צפרירים, אביעזר, נס הרים, גפן"},
  "maxResults": 500,
  "onlyNewListings": true,
  "monitorName": "ella-valley"
}
```

### Filters

| Filter | Yad2 | Madlan |
| --- | --- | --- |
| City or locality (several, comma separated) | Applied by the site | Applied by the site |
| Price, rooms, size in sqm | Applied by the site | Applied by the site |
| Property type | Apartment applied by the site, others checked on each row | Applied by the site |
| Floor | Checked on each row | Applied by the site |
| Parking, elevator | Needs **Read listing details** | Applied by the site |
| Price dropped | Checked on each row | Applied by the site |
| Area (Yad2 grouping) | Applied by the site | Not available |

Homeless applies city, price and rooms itself; the other filters are checked on each row. Homeless rows carry the board's columns: property type, city, neighborhood, street and number, rooms, floor, price, entry date and last update.

Every filter is also checked on every returned row, so a row that does not match is never delivered. City names are the Hebrew names the sites show; common English names such as Tel Aviv, Jerusalem and Haifa work too, and small localities work.

### Output

Each row has the same fields whichever site it came from:

| Field | Description |
| --- | --- |
| `id`, `url`, `source` | Listing ID, listing URL, and `yad2`, `madlan` or `homeless` |
| `transactionType` | `rent`, `sale` or `commercial` |
| `title`, `description` | Property type, street and city; description with details (Madlan commercial rows include it) |
| `price`, `currency`, `previousPrice` | Price in ILS (null when shown as "price on request") and the earlier price after a drop |
| `location` | Street and number, neighborhood and city |
| `images` | Public image URLs |
| `seller` | `private` or `agency`, with agency name and licence when public |
| `attributes` | City, area, neighborhood, street, house number, latitude and longitude, floor, total floors, property type, rooms, size, condition, parking, elevator, amenities, entry date |
| `publishedAt`, `updatedAt` | Listing dates |
| `changeType` | Monitoring mode: `new` or `price_changed` |

Madlan rows add `attributes.priceHistory` (every listed price with its date), `attributes.neighborhoodScores` and `attributes.buildingYear`. Values a site does not show stay null. Private sellers' names and phone numbers are not collected.

### One row per apartment

With **One row per apartment** on (the default), a Madlan listing and a Yad2 listing with the same city, street, house number, rooms and floor, and prices within 5% of each other, count as one apartment: the first one found is delivered and the other is skipped and not charged. Listings without a street number are never merged. SUMMARY reports how many duplicates were skipped. Turn the option off to receive every site's listing.

### Monitoring new listings

With **Only new or changed listings** on, the Actor remembers each delivered listing and its price in a named key-value store in your account. The next run with the same search delivers only listings it has not delivered before, plus listings whose price changed, each marked in `changeType`. Use **Monitor name** to keep several watches apart.

### Pricing

**$3 per 1,000 delivered listings ($0.003 each), plus Apify platform usage. No start fee.** Duplicates, including the same apartment on both sites, are removed before delivery and never charged. Platform usage is small: the Actor runs in 512 MB and transfers compact data.

### Limits and run status

`maxResults` is a ceiling, not a promise; page, request and time budgets are sized from it automatically. Madlan answers are split into price ranges automatically when a search is larger than the site's page limit. Listings without a price are then only found in searches small enough to need no split.

Read **SUMMARY** in the run's key-value store for delivered, scanned, filtered, duplicate and cross-site duplicate counts, the site totals per search, network use and the stop reason. A run is `partial` when a limit stopped it or a page could not be loaded on several IPs; delivered rows are kept.

### Related LeadProof actors

- [Yad2 All-in-One Scraper](https://apify.com/leadproof/yad2-all) for Yad2 cars, motorcycles, trucks, boats and Yad2 Market items as well.
- [Google Maps Scraper](https://apify.com/leadproof/google-maps-scraper) for Israeli real-estate agencies and other businesses.
- All actors: [apify.com/leadproof](https://apify.com/leadproof).

Unofficial tool, not affiliated with Yad2, Madlan or Homeless. Use public information responsibly and comply with applicable source terms.

Built by [LeadProof](https://leadproof.co).

# Actor input Schema

## `transactionType` (type: `string`):

For real\_estate only. Rent is the default. Commercial covers offices, shops and other business property.

## `sources` (type: `array`):

Sites to search. Results from all sites share one output format, each row names its site, and the same apartment listed on several sites is delivered once. Homeless is read in a real Chrome window and is slower; give runs with Homeless at least 1024 MB of memory.

## `maxResults` (type: `integer`):

Maximum delivered listings across all sites and searches.

## `filters` (type: `object`):

Real-estate filters. Every filter is checked on every row; most are also applied by the sites themselves.

## `includeDetails` (type: `boolean`):

Reads each Yad2 listing page for description, dates, amenities and broker licence (one extra small request per Yad2 listing). Madlan rows already carry their data.

## `dedupeAcrossSites` (type: `boolean`):

The same apartment on Yad2 and Madlan (same city, street, number, rooms and floor, price within 5%) is delivered once and charged once. Turn off to receive every site listing.

## `onlyNewListings` (type: `boolean`):

Remembers every delivered listing and its price in a named key-value store. Later runs with the same search deliver only new listings and price changes, marked in changeType. Ideal for scheduled monitoring.

## `monitorName` (type: `string`):

Optional name for the memory of Only new or changed listings, for example haifa-rentals. Without it the memory is keyed to the search itself. Setting it turns the mode on.

## `maxPages` (type: `integer`):

Total search-page limit across all searches. Leave empty to size it to Maximum results.

## `maxRequests` (type: `integer`):

Hard request budget including details and retries. Leave empty to size it to Maximum results.

## `maxRunSeconds` (type: `integer`):

Crawler time limit across checkpoint resumes. Leave empty for at least 240 seconds, more for very large runs.

## `maxConcurrency` (type: `integer`):

Requests in flight at once, each from its own IP. 20 is fast and gentle on the source.

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

Israeli residential proxy by default. Every request uses a new session (IP); requests flagged by the source are retried from other IPs.

## Actor input object example

```json
{
  "transactionType": "rent",
  "sources": [
    "yad2",
    "madlan"
  ],
  "maxResults": 5,
  "includeDetails": false,
  "dedupeAcrossSites": true,
  "onlyNewListings": false,
  "maxConcurrency": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IL"
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Unified dataset records.

## `csv` (type: `string`):

Export listings in CSV format.

## `summary` (type: `string`):

Results, coverage limits, detail failures and stop reason.

## `checkpoint` (type: `string`):

Internal resume state tied to this input and dataset.

# 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 = {
    "sources": [
        "yad2",
        "madlan"
    ],
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("leadproof/israel-real-estate").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 = {
    "sources": [
        "yad2",
        "madlan",
    ],
    "maxResults": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("leadproof/israel-real-estate").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 '{
  "sources": [
    "yad2",
    "madlan"
  ],
  "maxResults": 5
}' |
apify call leadproof/israel-real-estate --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leadproof/israel-real-estate"
        }
    }
}
```

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/V1QSNLq0gSQGpfpez/builds/dqF3zq3Y4cKNaeake/openapi.json
