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.
curl -H "X-API-KEY: $STREAM_API_KEY" \ "https://api.stream.estate/documents/properties?transactionType=0&propertyTypes[]=0&includedZipcodes[]=75011&budgetMax=900000&withCoherentPrice=true&orderByCreatedAt=desc&itemsPerPage=30"
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.
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.
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.
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.
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.
Standard REST, API-key auth, JSON-LD responses. Works with any language or framework.
X-API-KEY header against https://api.stream.estate — no OAuth dance to reach the data.[] syntax: propertyTypes[], includedZipcodes[], includedCities[]=/cities/{id}, energyCategories[], publisherTypes[].hydra:member array, hydra:totalItems for the count, and hydra:view for pagination (max 30 items per page).price, pricePerMeter, surface, bedroom, room, city, locations, pictures[], and an adverts[] array with per-source price, energy, publisher, and URL.POST /searches with eventEndpoint + subscribedEvents (e.g. ad.update.price, property.ad.create) to receive webhooks instead of polling.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"],
)How a managed data API compares to building your own scrapers or relying on open data.
| Stream.Estate | In-house scraping | Open data (DVF) | |
|---|---|---|---|
| Coverage | 1,500+ portals + agency sites, deduplicated | Each source built and maintained by you | Notary transactions only, no on-market listings |
| Data type | Live on-market listings (asking prices) | Live listings, per site you scrape | Closed sale prices, historical |
| Freshness | 50,000+ new listings/day, near real-time | Depends on your crawl cadence | Published in periodic batches, months behind |
| Deduplication | Yes — 50M+ records, one per property | You build the matching yourself | n/a (one row per transaction) |
| Change notifications | Webhooks on price/surface/pictures/expiry | Build diffing + delivery yourself | None |
| Maintenance | Zero — sources maintained for you | High — breaks when sites change | Low — but you get static files |
| Compliance | EU-hosted, GDPR compliant | Your legal and blocking risk | Public open data |
| Time to first result | Minutes (API key + one request) | Weeks to months | Days (download + model) |
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.
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.
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.
Feed valuation models with exhaustive comparables and price-per-meter indicators.
Surface listings matching your buy-box the moment they appear, via webhooks.
Track prices, time-on-market and supply across your target zones in real time.
Mark positions and watch local supply by joining listings to your holdings.
Plans for every stage, from first prototype to production scale.
Free trial, full documentation, technical support. Ship in days, not months.