Skip to main content

pynadlan

Lightweight async helpers to fetch Israeli real-estate data including historical price trends, city/neighborhood statistics, and detailed transaction records from the dirobot.co.il API.

Installation

pip install -e .

Quickstart

import asyncio
from pynadlan.api import (
    get_avg_prices,
    get_rent_prices,
    get_cities_summary,
    get_neighborhoods_summary,
    get_city_timeseries,
    get_street_deals,
    get_locations_search,
    get_autocomplete_lists
)

async def main():
    # Location search - dynamic autocomplete with market data
    search = await get_locations_search("דיזנגוף", per_page=5)
    # => {"results": [...], "pagination": {...}, "summary": {...}}

    # Use search results to fetch detailed data
    location = search["results"][0]
    if location["type"] == "street":
        city_street = f"{location['city']}_{location['street']}"
        deals = await get_street_deals(city_street)
    elif location["type"] in ["neighborhood", "city"]:
        prices = await get_avg_prices(location["display_name"])

    # Historical price queries (histogram data)
    query = "רמת גן"
    sell_latest = await get_avg_prices(query)
    # => {"sell_2_price": 2500000, "sell_3_price": 3200000, ...}

    rent_latest = await get_rent_prices(query, rooms=[3, 4])
    # => {"rent_3_price": 7500, "rent_4_price": 9000}

    # Cities summary - median prices across all Israeli cities
    summary = await get_cities_summary(min_deals=100)
    # => {"total_cities": 303, "cities": [...], "total_deals_all_cities": 88081, ...}

    # Neighborhoods summary - breakdown for a specific city
    neighborhoods = await get_neighborhoods_summary(city="תל אביב יפו", min_deals=10)
    # => {"neighborhoods": [...], "average_median_price_overall": 2600725.6, ...}

    # City timeseries - historical price trends over time
    timeseries = await get_city_timeseries(city="תל אביב יפו", time_range="1year")
    # => {"timeSeriesByRooms": {...}, "summaries": {...}, "metadata": {...}}

    # Street deals - detailed transaction data for a specific street
    deals = await get_street_deals(city_street="תל אביב יפו_גורדון", per_page=100)
    # => {"deals": [...], "summary": {"medianPrice": ..., "totalDeals": ...}, ...}

    # Static autocomplete lists
    lists = get_autocomplete_lists()
    # => {"cities": [...], "cities_and_neighborhoods": [...]}

if __name__ == "__main__":
    asyncio.run(main())

API Reference

get_locations_search(query: str, page: int = 1, per_page: int = 20, min_deals: int | None = None, location_type: str = "all") -> dict

  • Search for locations (cities, neighborhoods, streets) matching a query string
  • Provides dynamic autocomplete with real-time market data
  • query: Search string in Hebrew or English
  • page: Page number for pagination (default: 1)
  • per_page: Results per page (default: 20)
  • min_deals: Optional minimum number of deals to filter results
  • location_type: Filter by type - "all", "city", "neighborhood", "street" (default: "all")
  • Returns: results array with location details, pagination info, summary statistics
  • Each result includes: type, name, display_name, city, neighborhood/street, median_price, total_deals, date_range

Recommended workflow:

# Search for locations
results = await get_locations_search("דיזנגוף")

# Get detailed data based on location type
location = results["results"][0]
if location["type"] == "street":
    deals = await get_street_deals(f"{location['city']}_{location['street']}")
elif location["type"] in ["neighborhood", "city"]:
    prices = await get_avg_prices(location["display_name"])

Historical Price Data (Histogram-based)

get_avg_prices(query: str, rooms: int | list[int] | None = None) -> dict

  • Returns the latest sell prices per room count for a city/neighborhood
  • Keyed by sell_{rooms}_price (e.g., sell_3_price, sell_4_price)
  • If rooms is omitted, returns all available room-based series
  • If rooms is provided but some series are missing, they are returned as None

get_rent_prices(query: str, rooms: int | list[int] | None = None) -> dict

  • Returns the latest rent prices per room count for a city/neighborhood
  • Keyed by rent_{rooms}_price (e.g., rent_3_price, rent_4_price)
  • Same filtering behavior as get_avg_prices

Aggregate Statistics

get_cities_summary(min_deals: int = 10) -> dict

  • Returns median prices and deal counts across all Israeli cities
  • Results include: total_cities, total_deals_all_cities, cities array
  • Each city includes: city_name, medianPrice, total_deals, date_range
  • Sorted by deal volume (most active cities first)

get_neighborhoods_summary(city: str, min_deals: int = 3) -> dict

  • Returns neighborhood-level statistics for a specific city
  • City name should be in Hebrew (e.g., "תל אביב יפו", "רעננה")
  • Results include: neighborhoods array, average_median_price_overall
  • Each neighborhood includes: neighborhood, median_price, total_deals, unique_streets

get_city_timeseries(city: str, property_type: str = "apartment", time_range: str = "1year") -> dict

  • Returns historical price trends over time for a city, broken down by room count
  • time_range options: "1year", "2years", "all"
  • Results include monthly data: marketValue, askingPrice, growth, transactionCount
  • Summary statistics per room category: avgPrice, minPrice, maxPrice, totalTransactions

Detailed Transaction Data

get_street_deals(city_street: str, per_page: int = 10000) -> dict

  • Returns detailed transaction/deal data for a specific street
  • city_street format: "city_street" in Hebrew (e.g., "תל אביב יפו_גורדון")
  • Results include individual deals with: buildYear, floor, price, rooms, saleDate, squareMeters (optional)
  • Summary statistics: avgPrice, medianPrice, totalDeals, avgPricePerSquareMeter
  • Includes pagination information

Utilities

get_autocomplete_lists() -> dict (synchronous)

  • Returns static lists for autocomplete functionality
  • Keys: cities (array of city names), cities_and_neighborhoods (combined array)

Notes

  • All data-fetching functions are async and must be awaited
  • Query parameters (city/neighborhood names) are URL-encoded automatically
  • Hebrew and English city names are supported where applicable
  • All prices are in ILS (Israeli Shekels)

Metadata

Release files for pynadlan 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pynadlan 0.2.1
File Size Uploaded Provenance Actions
pynadlan-0.2.1.tar.gz 24.4 kB Without provenance Details for pynadlan-0.2.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pynadlan 0.2.1
File Interpreter ABI Platform Actions
pynadlan-0.2.1-py3-none-any.whl Python 3 none any Details for pynadlan-0.2.1-py3-none-any.whl

Total release size: 46.6 kB

Release files / pynadlan-0.2.1.tar.gz

Download URL pynadlan-0.2.1.tar.gz
Size 24.4 kB
Tags Source
SHA-256 checksum
How to use checksums
7a6084d635786dfe11e311effa48fbf689a77bdc72bccf16c015229c45093a85
BLAKE2b-256 checksum
How to use checksums
aeefa7d20e90c2f57317d1cce14f19e662f8b22eb469d070fc223c9aa61f4a0d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Release files / pynadlan-0.2.1-py3-none-any.whl

Download URL pynadlan-0.2.1-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dab1b8ade68a04743bc942e996149b3bb21c82ea1224854d315d6b214e367c11
BLAKE2b-256 checksum
How to use checksums
e9cbad0200a22692fabfc8f230b2c8a8527b6ed0d9880fec869067cc622544fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.0

Security for pynadlan 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page