# Israel New Listings Monitor - Yad2 and Madlan in One Feed (`leadproof/israel-new-listings-monitor`) Actor

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

## Pricing

from $1.40 / 1,000 new listing or price changes

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

## Israel New Listings Monitor

Watch one Israeli real-estate search on Yad2 and Madlan together and get only the listings published after the monitor starts, plus price changes, in one feed. The same apartment listed on both sites is delivered once. Schedule it every 15 minutes, every hour or once a day: each run is one check.

### Why this Actor

- **Both big Israeli sites, one feed.** One search (city, price, rooms, size, property type) is watched on Yad2 and on Madlan. Rows from both sites share one format and name their site.
- **One row per apartment.** An apartment listed on both sites is delivered once. A listing that is new on one site but has been on the other site already is not new to the market, so it is not delivered or charged.
- **Only new listings, never old ones sent as new.** The first run remembers the current listings and delivers nothing. After that, a Yad2 listing is new when its ad number is above every ad number of the first check, and a Madlan listing when Madlan first saw it after the monitor started. A refreshed or bumped listing is never charged as new.
- **Price changes.** A price drop or rise since the previous check is delivered with the previous price; the same change on both sites comes once.
- **One check at a time.** Two runs of the same monitor never overlap: a run that starts while another is still checking steps back without charging.
- **Alerts.** Give a webhook URL and get a POST whenever a check is partial or fails.

### Quick start

1. Set **Transaction** and a **City**, and any of price, rooms, size and property type.
2. Give the watch a **Monitor name**, for example `tlv-rent`.
3. Run it once. That first run remembers the current listings.
4. Schedule the Actor, for example every hour, and connect the dataset to email, Slack, a sheet or your own system.

```json
{
  "transactionType": "rent",
  "filters": {"city": "תל אביב יפו", "minRooms": 3, "maxPrice": 9000},
  "monitorName": "tlv-rent-3-rooms",
  "webhookUrl": "https://example.com/apartment-alerts"
}
```

### How a check works

The two sites are read at the same time, each the way its own LeadProof monitor reads it:

- **Yad2:** the map view answers up to 200 listings per call, read in price bands, plus the top of the results where new listings land. A check sees the whole search.
- **Madlan:** the search sorted newest first, read from the front until a whole page is older than the previous check (with a three-hour overlap).

Then every listing is matched to an apartment by city, street, house number, rooms and floor (prices within 5%). Listings without a house number are never merged.

If one site cannot be read in a check, the other site's listings are still delivered and the check is marked partial; the next check covers the missed site.

### Output

One row per new listing or price change:

| Field | Meaning |
|---|---|
| `changeType` | `new` or `price_changed` |
| `source`, `id`, `url` | `yad2` or `madlan`, the listing ID and link |
| `title`, `description` | Property type, street and city; description when the site shows one |
| `price`, `previousPrice` | Price in ILS; for a price change, the price before |
| `location`, `attributes` | Street, house number, neighborhood, city, coordinates, rooms, size, floor, property type, amenities |
| `images` | Public image URLs (not downloaded) |
| `publishedAt`, `updatedAt` | When the listing was published or first seen, and when it was last updated |
| `seller` | `private` or `agency`, with agency name and broker licence when public. No private names or phone numbers |
| `monitor` | `changeType`, `monitorName`, `checkedAt` |

Each run also writes a `SUMMARY` record: status (`baseline`, `succeeded`, `partial`, `skipped`, `failed`), per site the listings checked and new listings, price changes, and how many apartments on both sites were delivered once.

### Pricing

Pay per event, platform usage included:

- **Check:** a small fee per search checked on each site.
- **Listings checked:** a fee per 100 listings read in a check.
- **New listing or price change:** per delivered row. Duplicates across the two sites are not charged.

The first run of a monitor is charged as a check and delivers nothing. The exact prices are on the Pricing tab. Narrower searches and less frequent checks cost less.

### Good to know

- A run needs 256 MB, enough for every listing of the biggest Israeli city search (all Tel Aviv sales, about 9,800 Yad2 listings: 218 MB at most). Watching several big cities in one monitor: give it 512 MB.
- Use one **Monitor name** per search. Changing the search under the same name keeps the old memory.
- Memory lives in the named key-value store `israel-new-listings-monitor` in your Apify account. Listings and apartments unseen for 60 days are dropped from it.
- Filters are the ones both sites apply themselves (city, price, rooms, size, property type), so both sites watch the same search. For parking, elevator or a single site, use [Yad2 New Listings Monitor](https://apify.com/leadproof/yad2-new-listings-monitor) or [Madlan New Listings Monitor](https://apify.com/leadproof/madlan-new-listings-monitor).
- The Actor reads public pages through Israeli residential proxies, retrying refused requests from other IPs. It has no official agreement with Yad2 or Madlan.

### Related LeadProof actors

- [Israel Real Estate Scraper](https://apify.com/leadproof/israel-real-estate): every current Yad2 and Madlan listing of a search in one run.
- [Yad2 New Listings Monitor](https://apify.com/leadproof/yad2-new-listings-monitor) and [Madlan New Listings Monitor](https://apify.com/leadproof/madlan-new-listings-monitor): the same watch on one site.

Questions or a custom watch: support@leadproof.co. Built by [LeadProof](https://leadproof.co).

# Actor input Schema

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

Which real-estate board to watch on both sites.

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

The search to watch on both sites. City is required. Both Yad2 and Madlan apply every filter here themselves.

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

Sites to watch. Rows from both share one format and name their site; the same apartment on both sites is delivered once.

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

Name of this watch, for example tlv-rent. Each name keeps its own memory, so use one name per search. Without a name the memory is keyed to the search itself.

## `includePriceChanges` (type: `boolean`):

Also deliver listings whose price went up or down since the previous check, marked changeType price_changed with previousPrice. Charged like a new listing.

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

Read each new Yad2 listing once for its publish date, description, amenities and broker licence. Madlan rows already carry theirs.

## `webhookUrl` (type: `string`):

Optional. Receives a JSON POST when a check is partial or fails, with the reason.

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

Israeli residential proxy by default. Every request uses a new IP.

## Actor input object example

```json
{
  "transactionType": "rent",
  "filters": {
    "city": "תל אביב יפו",
    "minRooms": 3
  },
  "sources": [
    "yad2",
    "madlan"
  ],
  "monitorName": "tlv-rent-3-rooms",
  "includePriceChanges": true,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IL"
  }
}
```

# Actor output Schema

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

New listings and price changes found by this check.

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

The same rows as CSV.

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

Status, listings checked and new listings per site, price changes, apartments on both sites delivered once.

# 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 = {
    "transactionType": "rent",
    "filters": {
        "city": "תל אביב יפו",
        "minRooms": 3
    },
    "sources": [
        "yad2",
        "madlan"
    ],
    "monitorName": "tlv-rent-3-rooms",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("leadproof/israel-new-listings-monitor").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 = {
    "transactionType": "rent",
    "filters": {
        "city": "תל אביב יפו",
        "minRooms": 3,
    },
    "sources": [
        "yad2",
        "madlan",
    ],
    "monitorName": "tlv-rent-3-rooms",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("leadproof/israel-new-listings-monitor").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 '{
  "transactionType": "rent",
  "filters": {
    "city": "תל אביב יפו",
    "minRooms": 3
  },
  "sources": [
    "yad2",
    "madlan"
  ],
  "monitorName": "tlv-rent-3-rooms",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IL"
  }
}' |
apify call leadproof/israel-new-listings-monitor --silent --output-dataset

```

## MCP server setup

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

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/0HNMXlc5z1c035mjP/builds/iX8Zz036ZHByEYisJ/openapi.json
