REST API
Real-time

The real estate data API
for teams that build on property data

Query 50M+ deduplicated listings from 1,500+ portals and agency sites through one JSON-LD endpoint. 50,000+ new listings detected per day, sub-200ms average latency, EU-hosted and GDPR compliant. France and Belgium live, expanding across Europe.

99.9% uptime SLA 50M+ listings EU-hosted GDPR compliant Free trial

What is a real estate data API?

A real estate data API is an HTTP interface that returns structured property listings and market data — price, surface, location, energy rating, publisher, and status — as JSON your software can query in real time. Instead of scraping portals yourself, you send a request with filters (location, budget, property type) and receive clean, deduplicated records plus optional webhooks when listings change.

Stream.Estate is a real estate data API for the European market. It aggregates 50M+ deduplicated listings from 1,500+ portals and agency sites, detects 50,000+ new listings per day, and exposes them through a single search endpoint with a Hydra JSON-LD response, geo and attribute filters, saved searches, and price/POI indicators. It runs on EU infrastructure with a 99.9% uptime SLA and sub-200ms average latency.

Why Stream.Estate

50M+ deduplicated listings

One deduplicated dataset

Listings from 1,500+ portals and agency sites are matched and merged into a single record per property, so you query one clean dataset instead of reconciling duplicates across sources.

50,000+ new listings per day

Real-time property data feed

New and updated listings are detected continuously — 50,000+ per day. Subscribe to webhooks for price, surface, picture, and expiry changes instead of re-crawling the market.

< 200ms average latency

Built for production

Sub-200ms average latency behind a 99.9% uptime SLA. EU-hosted and GDPR compliant, so the data layer holds up under real query load and real compliance review.

from €99 per month

Start on a free trial

Four plans from €99/month Starter through Enterprise. Begin with a free trial, no credit card required, and read the full reference at docs.stream.estate before you scale.

Integrate in a few lines

Standard REST, API-key auth, JSON-LD responses. Works with any language or framework.

Authenticate with the X-API-KEY header against https://api.stream.estate — no OAuth dance to reach the data.
Array filters use [] syntax: propertyTypes[], includedZipcodes[], includedCities[]=/cities/{id}, energyCategories[], publisherTypes[].
Responses are Hydra JSON-LD: read the hydra:member array, hydra:totalItems for the count, and hydra:view for pagination (max 30 items per page).
Each property carries price, pricePerMeter, surface, bedroom, room, city, locations, pictures[], and an adverts[] array with per-source price, energy, publisher, and URL.
For a live feed, POST /searches with eventEndpoint + subscribedEvents (e.g. ad.update.price, property.ad.create) to receive webhooks instead of polling.
python
import requests

API_KEY = "your_api_key"  # sent as the X-API-KEY header

# Search apartments for sale in Paris 11th (75011), most recent first.
resp = requests.get(
    "https://api.stream.estate/documents/properties",
    headers={"X-API-KEY": API_KEY},
    params={
        "transactionType": 0,          # 0 = Sell, 1 = Rent
        "propertyTypes[]": 0,          # 0 = Apartment (1=House, 2=Building, ...)
        "includedZipcodes[]": "75011",
        "budgetMin": 300000,
        "budgetMax": 900000,
        "surfaceMin": 40,
        "withCoherentPrice": "true",   # drop listings with incoherent pricing
        "orderByCreatedAt": "desc",
        "itemsPerPage": 30,            # max 30 per page
        "page": 1,
    },
    timeout=10,
)
resp.raise_for_status()
data = resp.json()  # Hydra JSON-LD

print(data["hydra:totalItems"], "matching properties")
for prop in data["hydra:member"]:
    print(
        prop["title"],
        f'{prop["price"]:.0f} EUR',
        f'{prop["pricePerMeter"]:.0f} EUR/m2',
        prop["city"]["name"],
    )

Data API vs the alternatives

How a managed data API compares to building your own scrapers or relying on open data.

Stream.EstateIn-house scrapingOpen data (DVF)
Coverage1,500+ portals + agency sites, deduplicatedEach source built and maintained by youNotary transactions only, no on-market listings
Data typeLive on-market listings (asking prices)Live listings, per site you scrapeClosed sale prices, historical
Freshness50,000+ new listings/day, near real-timeDepends on your crawl cadencePublished in periodic batches, months behind
DeduplicationYes — 50M+ records, one per propertyYou build the matching yourselfn/a (one row per transaction)
Change notificationsWebhooks on price/surface/pictures/expiryBuild diffing + delivery yourselfNone
MaintenanceZero — sources maintained for youHigh — breaks when sites changeLow — but you get static files
ComplianceEU-hosted, GDPR compliantYour legal and blocking riskPublic open data
Time to first resultMinutes (API key + one request)Weeks to monthsDays (download + model)

A property data API instead of a scraping pipeline

Most teams that need European listings start the same way: point a crawler at a portal, parse the HTML, and store the rows. It works for a week. Then the site changes its markup, adds bot protection, or rotates its URLs, and the pipeline turns into a maintenance job that never ends. Multiply that by the dozens of portals and thousands of agency sites you actually need, and the crawler becomes the product.

A property data API removes that layer. Stream.Estate already aggregates 1,500+ sources, matches listings that describe the same property, and merges them into 50M+ deduplicated records. You query one endpoint — GET /documents/properties — with the filters that matter to your use case (location, budget, surface, property type, energy rating, publisher type) and get back clean JSON-LD. The sources, the parsing, and the deduplication are maintained for you, so your engineers spend their time on your product, not on someone else's HTML.

The filter surface is built for real queries. Constrain by geography with includedCities[], includedDepartments[], includedInseeCodes[], includedZipcodes[], or a lat/lon/radius circle. Narrow by budgetMin/budgetMax, surfaceMin/surfaceMax, bedroomMin, roomMin, energyCategories[], and publisherTypes[]. Add withCoherentPrice=true to drop listings whose pricing looks wrong, and sort with orderByPrice or orderByCreatedAt.

A real-time real estate listings API with webhooks

Polling a market to find out what changed is expensive and slow. Stream.Estate detects 50,000+ new listings per day and exposes changes as events, so you can run a real estate listings API as a live feed instead of a nightly batch.

Create a saved search with POST /searches using the same filters as the search endpoint, then attach delivery. Set eventEndpoint with subscribedEvents to receive webhooks for events like property.ad.create, ad.update.price, ad.update.surface, ad.update.pictures, and ad.update.expired, with notificationEnabled: true. Your systems learn about a price drop or a new listing in a target zone within the freshness window, not on the next crawl.

This is the difference between a static export and a property data feed. Valuation models get fresh comparables, lead-generation systems get new inventory the moment it appears, and market-monitoring dashboards stay current without a scheduler. See market monitoring, lead generation, and valuation for how teams wire the events into their stack, and the complete guide to real estate data APIs in Europe for the wider picture.

Coverage, hosting, and what the data actually contains

Stream.Estate covers France — the primary market — and Belgium today, and is expanding progressively across Europe. Rather than claim a map it can't back up, the API is honest about where the data is dense: country-level pages for France and Belgium describe live coverage, and new markets are announced as they go live.

Every property record is richer than a portal card. Alongside title, price, pricePerMeter, surface, bedroom, room, propertyType, and transactionType, each record carries a nested city (name, zipcode, insee), precise locations (lat, lon), a pictures[] array, and an adverts[] array — one entry per source the listing was found on, with that source's price, description, energy rating, publisher (name, type), and url. That per-source detail is what makes deduplication auditable: you can see exactly which portals a property appeared on and how its asking price differed between them.

Beyond individual listings, GET /documents/properties/{id}/similar-properties returns comparable properties, and the indicator endpoints — GET /indicators/price_per_meter and GET /indicators/points_of_interest — return market and location context. Everything runs on EU infrastructure with a 99.9% uptime SLA and sub-200ms average latency. The full contract lives at docs.stream.estate; pricing starts at €99/month with a free trial and no credit card required at signup.

Use cases

< 200ms
Average latency
99.9%
Uptime SLA
EU
Hosted, GDPR
50K+
New listings / day

Transparent pricing

Plans for every stage, from first prototype to production scale.

From €99 /month
Starter Professional Business Enterprise — custom

Frequently asked questions

Build on European property data today

Free trial, full documentation, technical support. Ship in days, not months.