Stream EstateStream Estate
Concepts

Property

The core entity of the Stream Estate API

A Property represents a unique real-estate asset, aggregated from one or more sources. It groups the set of listings (published ads) referencing it.

Aggregation & deduplication

A property groups several listings (ads) crawled from different sources. The response aggregates them into a canonical property view, deduplicates publishers into publishers[] (grouped by id), and keeps per-listing variants in listings[] — each carrying its source.

raw listings · multiple sources
Listing
src Apub X
Listing
src Bpub Y
Listing
src Cpub X
aggregate + dedupe
Property
propertyaggregated canonical view
publishers[]→ pub X, pub Y (2 distinct)deduped
listings[]per-listing variants — each carries its source

One property can therefore carry several listings and several publishers: a flat advertised by two agencies, or by one agency on two portals, yields a single Property, one Listing per source ad (with its URL, dates, and any price or area deviation) and one Publisher per distinct advertiser. This is not a duplicate: the asset is the same, the ads differ.

Two representations

The API returns a property in JSON:API format by default, or "flat" with the Accept: application/json header. The same property in both formats, on GET /properties/{id}:

The consolidated view sits under data.attributes. data.relationships.listings and data.relationships.publishers only hold references (type + id); the full Listing, Publisher and Source objects live in the top-level included array, with one PropertyPublisher per publisher for its mandate, reference and contact on this property.

{
  "data": {
    "type": "Property",
    "id": "019fe5b2-001f-78c9-8ed3-968ddffbb712",
    "attributes": { "propertyType": "FLAT", "…": "…" },
    "relationships": {
      "listings":   { "data": [ { "type": "Listing",   "id": "019fe5b1-c448-7b00-a993-feacc6966090" } ] },
      "publishers": { "data": [ { "type": "Publisher", "id": "019eff3c-28d9-7c10-8a44-9f2f00329980" } ] },
      "propertyPublishers": { "data": [ { "type": "PropertyPublisher", "id": "5b1f7c2e-8a41-5d3b-9c6e-2f4a1b7d9e01" } ] }
    }
  },
  "included": [
    { "type": "Listing",   "id": "019fe5b1-c448-7b00-a993-feacc6966090", "attributes": { "url": "…", "…": "…" } },
    { "type": "Publisher", "id": "019eff3c-28d9-7c10-8a44-9f2f00329980", "attributes": { "agencyName": "…", "…": "…" } },
    { "type": "PropertyPublisher", "id": "5b1f7c2e-8a41-5d3b-9c6e-2f4a1b7d9e01", "attributes": { "mandate": "EXCLUSIVE", "reference": "…", "contact": { "…": "…" } } }
  ]
}

Details, mapping table and resolution snippet: Response format.

Schema

Flat format (Accept: application/json), PropertySearchResult:

FieldTypeDescription
idstring (UUID)Public stable identifier of the property
propertyobjectAggregated canonical view (PropertySection): createdAt, updatedAt, expired, propertyType, constructionStatus, transaction, area, unit, building, amenities, body, pricing, location, pictures, changes
publishersarrayPublishers deduplicated across all listings (PublisherSection[])
listingsarrayPer-listing entries (ListingSection[]), with only the variants that diverge from the canonical view

Canonical details (area, rooms, type, transaction, etc.) live under property. listings[] only carries variants specific to each ad (title, URL, publisher, publication dates, and any field that diverges from the canonical view).

Endpoints

  • POST /properties — search via a criteria tree (see Filtering). Each result is a complete property, identical to the GET /properties/{id} response.
  • GET /properties/{id} — a property whose id you already know. No need to call it to complete a search result.

See also

  • Response format — JSON:API (relationships / included) or flat JSON via Accept
Version 0.14.289Last updated

On this page