# Authentication Source: https://docs.stream.estate/api-reference/authentication Welcome to the beginning of your journey with our API. This page will guide you through the initial steps of understanding and utilizing our API to its fullest potential. If you want to get an access and try out the API, please [sign up](https://stream.estate/signup) and create an API key in your settings. It is important to keep your API Key private and secure. ## Basic Example All API calls require the `X-API-KEY` header. For an example of how to do this, see the code snippet below: ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/documents/properties/{id}' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` # Concepts Source: https://docs.stream.estate/api-reference/concepts The Concepts section provides clear definitions and explanations of key terms and concepts used throughout the API documentation ```mermaid theme={null} graph TD P(Property) A1("Advert 1
agency1.com") A2("Advert 2
agency2.com") A3("Advert 3
agency3.com") E11("Event 1.1
Price decrease") E12("Event 1.2
New photos") E31("Event 3.1
Expired") P --> A1 P --> A2 P --> A3 A1 --> E11 A1 --> E12 A3 --> E31 ``` | Concept | Definition | | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Property | Refers to a specific real estate unit such as a house, apartment, or commercial space. Each property can have multiple adverts, which are different listings referring to the same unit. | | Advert | Unique listing associated with a property. It's a specific presentation or promotion of a property in the real estate market by an agency or an individual. | | Event | An event is a specific occurrence or action within the system, such as the creation, update, or expiration of adverts, which can be tracked and responded to via the API. | | Match | A match refers to a result that fulfills a user's saved search criteria, representing a new property that meets the specific conditions defined by the user in their search. | | Search | A search is a user-defined entity that is saved and that allows for the real time retrieval of properties or adverts based on specific criteria, such as location, price range, or property type. | | Webhook | A webhook is a tool that allows the API to send real-time data to a specified endpoint, such as notifying a user or system when a new advert matches a saved search criteria, or when an event occurs on a monitored search. | | lastCrawledAt | At property level, this field represents the date of the last update of the most recent advert, excluding expired ones. At the advert level, expired adverts are included. | # Cities Source: https://docs.stream.estate/api-reference/endpoint/indicators/cities GET /cities This endpoint returns cities matching the given criteria. ### Query parameters Set to true to exclude cities that have grouped cities under them. Example: `excludeGroupedCities=true` Filter by INSEE code. Filter by multiple INSEE codes. Filter by cities inside a given polygon defined by GPS coordinates. Example: `polygon=polygon[0][lat]=43.12&polygon[0][lon]=5.93&polygon[1][lat]=43.12&polygon[1][lon]=6.01&polygon[2][lat]=43.07&polygon[2][lon]=6.01&polygon[3][lat]=43.07&polygon[3][lon]=5.93` Filter by city label/display name. Filter by city name. Sort by name. Enum: `"asc"` `"desc"` The collection page number. Filter by city slug. Filter by zipcode. Filter by multiple zipcodes. ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/cities' \ --header 'Content-Type: application/json' --header 'X-API-KEY:' ``` ```json Example Response theme={null} { "hydra:member": [ { "@id": "/cities/1", "@type": "City", "zipcode": "01500", "insee": "01004", "article": "", "name": "Ambérieu-en-Bugey", "libelle": "AMBERIEU EN BUGEY", "department": "/departments/1", "cityParent": { "@id": "/cities/37152", "@type": "City", "zipcode": "01500", "insee": "01004", "article": "", "name": null, "libelle": null }, "originalName": "Ambérieu-en-Bugey" }, { "@id": "/cities/2", "@type": "City", "zipcode": "01330", "insee": "01005", "article": "", "name": "Ambérieux-en-Dombes", "libelle": "AMBERIEUX EN DOMBES", "department": "/departments/1", "cityParent": { "@id": "/cities/37153", "@type": "City", "zipcode": "01330", "insee": "01005", "article": "", "name": null, "libelle": null }, "originalName": "Ambérieux-en-Dombes" } ] } ``` # Locations Source: https://docs.stream.estate/api-reference/endpoint/indicators/locations GET /public/location-autocomplete This endpoint returns cities or departments matching the given criteria. ### Query parameters Query term to perform search. Exclude cities using their IRI. Exclude departments using their IRI. ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/public/location-autocomplete?query=paris' \ --header 'Content-Type: application/json' ``` ```json Example Response theme={null} { "hydra:member": [ { "@id": "/cities/37087", "@type": "City", "code": "string", "displayName": "Lille (toute la ville)", "groupedCityNames": [ "Capinghem", "Euralille", "Hellemmes lille", "Lezennes", "Lille", "Lomme" ], "groupedCityZipcodes": [ "59000", "59160", "59260", "59777", "59800" ], "id": "37087", "insee": "59350", "libelle": "Lille", "location": { "lat": 50.629059, "lon": 3.06038 }, "name": "Lille", "zipcode": "59000" } ] } ``` # Points of Interest Source: https://docs.stream.estate/api-reference/endpoint/indicators/points_of_interest GET /indicators/points_of_interest This endpoint returns the points of interests matching the given criterias. ### Query parameters Category of points of interest. Current available categories are `kindergarten`, `school`, `restaurant`, `hospital`, `parking`. Example: `facilities[]=kindergarten&facilities[]=school` Latitude. Longitude Distance expressed in kilometers. ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/indicators/points_of_interest?facilities[]=school&lat=48.8803424&lon=2.333215&radius=0.5' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' ``` ```json Example Response theme={null} { "@context": "/contexts/POIResource", "@id": "/indicators/points_of_interest", "@type": "hydra:Collection", "hydra:member": [ { "lat": 48.8830788, "lon": 2.3285289, "name": "École Maternelle Bruxelles", "type": "school", "attributes": { "schoolType": "maternelle", "operatorType": "public" } }, { "lat": 48.8832816, "lon": 2.3287396, "name": "École Élémentaire Bruxelles", "type": "school", "attributes": { "schoolType": "élémentaire", "operatorType": "public" } }, { "lat": 48.8780001, "lon": 2.3316352, "name": "École Maternelle", "type": "school", "attributes": { "schoolType": "maternelle", "operatorType": "public" } }, { "lat": 48.8787347, "lon": 2.3280864, "name": "École Francaise Privée des Hautes Études Commerciales", "type": "school", "attributes": { "schoolType": "lycée", "operatorType": "private" } }, { "lat": 48.8759626, "lon": 2.3322271, "name": "Collège privé pour handicapés Morvan", "type": "school", "attributes": { "schoolType": "collège", "operatorType": "private" } }, { "lat": 48.8760006, "lon": 2.3322204, "name": "Lycée privé pour handicapés Morvan", "type": "school", "attributes": { "schoolType": "secondaire", "operatorType": "private" } }, { "lat": 48.8809464, "lon": 2.3337578, "name": "École Primaire", "type": "school", "attributes": { "schoolType": "primaire", "operatorType": "public" } }, { "lat": 48.88098, "lon": 2.3336251, "name": "École Maternelle", "type": "school", "attributes": { "schoolType": "maternelle", "operatorType": "public" } }, { "lat": 48.8785422, "lon": 2.3350915, "name": "Cours Prive Hattemer", "type": "school", "attributes": { "schoolType": "lycée", "operatorType": "private" } }, { "lat": 48.8779341, "lon": 2.3289236, "name": "Neoma", "type": "school", "attributes": [] }, { "lat": 48.8839359, "lon": 2.329592, "name": "Lycée Jules Ferry", "type": "school", "attributes": { "schoolType": "lycée", "operatorType": "public" } }, { "lat": 48.8823203, "lon": 2.3352731, "name": "Section d'enseignement professionnel du Lycée polyvalent Edgar Quinet", "type": "school", "attributes": { "schoolType": "lycée", "operatorType": "public" } }, { "lat": 48.8813464, "lon": 2.3391817, "name": "Lycée Edgar Quinet", "type": "school", "attributes": { "schoolType": "lycée", "operatorType": "public" } }, { "lat": 48.8778096, "lon": 2.3307598, "name": "École élémentaire Clichy", "type": "school", "attributes": { "schoolType": "élémentaire", "operatorType": "public" } }, { "lat": 48.8780035, "lon": 2.331446, "name": "École primaire Blanche", "type": "school", "attributes": { "schoolType": "élémentaire", "operatorType": "public" } }, { "lat": 48.8781707, "lon": 2.3386731, "name": "École Notre-Dame de Lorette", "type": "school", "attributes": { "schoolType": "primaire" } }, { "lat": 48.8834526, "lon": 2.3381247, "name": "École primaire d'application Houdon", "type": "school", "attributes": { "schoolType": "élémentaire", "operatorType": "public" } }, { "lat": 48.880935, "lon": 2.3264026, "name": "Collège Condorcet", "type": "school", "attributes": { "schoolType": "collège", "operatorType": "public" } }, { "lat": 48.8790551, "lon": 2.3277605, "name": "École élémentaire privée La Trinité", "type": "school", "attributes": { "schoolType": "élémentaire", "operatorType": "private" } }, { "lat": 48.8792941, "lon": 2.3387309, "name": "École maternelle Clauzel", "type": "school", "attributes": { "schoolType": "maternelle", "operatorType": "public" } }, { "lat": 48.8832372, "lon": 2.3287064, "name": null, "type": "school", "attributes": [] } ], "hydra:totalItems": 21, "hydra:view": { "@id": "/indicators/points_of_interest?facilities%5B%5D=school&lat=48.8803424&lon=2.333215&radius=0.5", "@type": "hydra:PartialCollectionView" } } ``` # Price / Meter Evolution Source: https://docs.stream.estate/api-reference/endpoint/indicators/price_per_meter GET /indicators/price_per_meter This endpoint returns the price per meter `average`, `median` and `time series` of properties matching the given criteria. ### Query parameters Date histogram granularity for time series. Can be `month` or `year`. Maximum price of advert. Filters based on any non expired adverts prices. Minimum price of advert. Filters based on any non expired adverts prices. The maximum number of bedrooms in the property. The minimum number of bedrooms in the property. The maximum budget for the property. The minimum budget for the property. The maximum condominium fees for the property. The minimum condominium fees for the property. The maximum construction year of the property. The minimum construction year of the property. The energy efficiency categories of the property. The maximum energy value of the property. The minimum energy value of the property. The date from which an event of type price is created (inclusive). The maximum variation of an event of type price. Expressed in percent. The minimum variation of an event of type price. Expressed in percent. The date before which an event of type price is created (inclusive). The date from which an event of type surface is created (inclusive). The maximum variation of an event of type surface. Expressed in percent. The minimum variation of an event of type surface. Expressed in percent. The date before which an event of type surface is created (inclusive). Cities to be excluded. Insee codes to be excluded. Properties to be excluded. Zipcodes to be excluded. Filter for expired properties. Full text matching including/excluding words & phrases in the title or the description of the property. Example: `expressions[0][0][word]=travaux&expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=false&expressions[0][1][word]=lumineux&expressions[0][1][options][includes]=true&expressions[0][1][options][strict]=false` which will search for properties that contain both the keywords `lumineux` and `travaux`. The maximum percentage of fees. The minimum percentage of fees. Responsibility for fees (0 for seller, 1 for purchaser). The maximum number of floors in the property. The minimum number of floors in the property. The date from which the property is created (inclusive). The date from which the property is updated (inclusive). Filter for furnished properties. Filters properties by geocoding confidence level. Use `1` to keep only house-number level matches and `2` to include neighborhood-level approximations. Filters properties within specified geographic areas. Example: `geoShapes[0][0][0]=6.063201&geoShapes[0][0][1]=44.549092&geoShapes[0][1][0]=6.063201&geoShapes[0][1][1]=44.543009&geoShapes[0][2][0]=6.073453&geoShapes[0][2][1]=44.543293&geoShapes[0][3][0]=6.073453&geoShapes[0][3][1]=44.549092&geoShapes[0][4][0]=6.063201&geoShapes[0][4][1]=44.549092`. Green house gas performance letter array of the property. The maximum value of green house gas of the property. The minimum value of green house gas of the property. Located in given cities. Example: includedCities\[]=/cities/30953\&includedCities\[]=/cities/30952 Located in given departments. Example: includedDepartments\[]=includedDepartments\[]=/departments/77 Located in given insee codes. Example: includedInseeCodes\[]=75117\&includedInseeCodes\[]=75118 Located in given zipcodes. Example: includedZipcodes\[]=75017\&includedZipcodes\[]=75018 Lower than or equal to inventoryPriceMax. Example: inventoryPriceMax=500 Greater than or equal to inventoryPriceMin. Example: inventoryPriceMin=250 The number of items per page. Max is 30. Latitude. Used if radius & lat/lon are set. Example: lat=48.864716 Longitude. Used if radius & lat/lon are given. Example: lon=2.349014 Lower than or equal to lotCountMax. Example: lotCountMax=12 Greater than or equal to lotCountMin. Example: lotCountMin=4 Order properties by creation date. Order properties by update date. The collection page number. Lower than or equal to priceExcludingFeesMax. Example: priceExcludingFeesMax=427500 Greater than or equal to priceExcludingFeesMin. Example: priceExcludingFeesMin=405000 Lower than or equal to pricePerMeterMax. Example: pricePerMeterMax=11500 Greater than or equal to pricePerMeterMin. Example: pricePerMeterMin=9500 0: FLAT, 1: HOUSE, 2: BUILDING, 3: PARKING, 4: OFFICE, 5: LAND, 6: SHOP 0 : INDIVIDUAL, 1 : PROFESSIONAL Distance expressed in kilometers. Used if lat & lon are set. Example: radius=20 Lower than or equal to rentalChargesMax. Example: rentalChargesMax=100 Greater than or equal to rentalChargesMin. Example: rentalChargesMin=50 Lower than or equal to rentalPledgeMax. Example: rentalPledgeMax=800 Greater than or equal to rentalPledgeMin. Example: rentalPledgeMin=500 Lower than or equal to renterFeesMax. Example: renterFeesMax=80 Greater than or equal to renterFeesMin. Example: renterFeesMin=50 Having maximum x rooms. Example: roomMax=6 Having minimum x rooms. Example: roomMin=3 Property: fromDate/toDate criteria will be applied to property root object. Items will be sorted by property createdAt dates. Advert: fromDate/toDate criteria will be applied to adverts nested objects. Items will be sorted by advert createdAt dates. Example: sortMode=property Lower than or equal to surfaceMax. Example: surfaceMax=84 Greater than or equal to surfaceMin. Example: surfaceMin=42 To datetime (inclusive). Example: toDate=2021-05-07 12:42:42 Since datetime (inclusive). Example: toUpdatedAt=2021-05-07 12:42:42 0 : SELL, 1 : RENT Restrict results to properties that have a resolved location. Price coherence filter. `true` returns properties whose price passes our coherence checks; `false` returns properties flagged as incoherent — both also include properties whose price has not been assessed. Set to `null` (or send an empty value) to disable filtering. If omitted, defaults to `true`. Example: withCoherentPrice=true Having a virtual tour video link. Example: withVirtualTour=true ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/indicators/price_per_meter?includedDepartments[]=departments/77&fromDate=2020-01-10&propertyTypes[]=1&transactionType=0&withCoherentPrice=true&budgetMin=1800000&budgetMax=1900000' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' ``` ```json Example Response theme={null} { "hydra:member": [ { "average": 7532.48, "average_min": 6250.75, "average_max": 8814.21, "median": 7601.50, "series": { "2023-01": 7450.60, "2023-02": 7520.00, "2023-03": 7605.30, "2023-04": 7680.40, "2023-05": 7750.50, "2023-06": 7820.60, "2023-07": 7890.70, "2023-08": 7960.80, "2023-09": 8030.90, "2023-10": 8101.00, "2023-11": 8171.10, "2023-12": 8241.20 } } ], "hydra:totalItems": 0, "hydra:view": { "@id": "string", "@type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:next": "string" }, "hydra:search": { "@type": "string", "hydra:template": "string", "hydra:variableRepresentation": "string", "hydra:mapping": [ { "@type": "string", "variable": "string", "property": "string", "required": true } ] } } ``` # Properties Source: https://docs.stream.estate/api-reference/endpoint/properties/get_collection GET /documents/properties Returns a collection of properties matching given criteria. ### Query parameters Minimum price of advert. Filters properties based on any non expired adverts prices. Maximum price of advert. Filters properties based on any non expired adverts prices. Maximum number of bedrooms in the property. Minimum number of bedrooms in the property. Maximum budget for the property. Minimum budget for the property. Maximum condominium fees for the property. Minimum condominium fees for the property. Maximum construction year of the property. Minimum construction year of the property. The energy efficiency categories of the property. Can be: `A` `B` `C` `D` `E` `F` `G` Example: energyCategories\[]=A\&energyCategories\[]=B Maximum energy value of the property. Minimum energy value of the property. Date from which an event of type price is created — inclusive. Maximum percent variation of an event of type price. Minimum percent variation of an event of type price. Date before which an event of type price is created — inclusive. Date from which an event of type surface is created — inclusive. Maximum percent variation of an event of type surface. Minimum percent variation of an event of type surface. Date before which an event of type surface is created — inclusive. Cities to be excluded. Insee codes to be excluded. Properties to be excluded. Sources sites to be excluded. Zipcodes to be excluded. Whether to show properties that are expired. A property is considered expired when all its adverts are expired. Can be `true`, `false` or `null`. Default is `null` which returns all properties no matter if they're expired or not. Full text matching including/excluding words & phrases in the title or the description of the property. Example: `expressions[0][0][word]=travaux&expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=false&expressions[0][1][word]=lumineux&expressions[0][1][options][includes]=true&expressions[0][1][options][strict]=false` which will search for properties that contain both the keywords `lumineux` and `travaux`. Maximum percentage of fees. Minimum percentage of fees. Responsibility for fees. `0` for seller, `1` for buyer. Maximum number of floors in the property. Minimum number of floors in the property. Date from which the property is created — inclusive. Date from which the advert is expired — inclusive. Date from which the property is updated — inclusive. Filter for furnished properties. Filters properties by geographic accuracy level. "1" (HOUSE NUMBER - precise location at house number level), "2" (NEIGHBORHOOD - broader location within a neighborhood). Example: geoAccuracy\[]=0 Filters properties within specified geographic areas. Example: `geoShapes=geoShapes[0][0][0]=6.063201&geoShapes[0][0][1]=44.549092&geoShapes[0][1][0]=6.063201&geoShapes[0][1][1]=44.543009&geoShapes[0][2][0]=6.073453&geoShapes[0][2][1]=44.543293&geoShapes[0][3][0]=6.073453&geoShapes[0][3][1]=44.549092&geoShapes[0][4][0]=6.063201&geoShapes[0][4][1]=44.549092`. Green house gas performance letter array of the property. Maximum value of green house gas of the property. Minimum value of green house gas of the property. Located in given cities. Example: `includedCities[]=/cities/30953&includedCities[]=/cities/30952`. Use [locations](/api-reference/endpoint/indicators/locations) to get the desired city ids. Located in given departments. Example: `includedDepartments[]=/departments/77`. Use [locations](/api-reference/endpoint/indicators/locations) to get the desired department ids. Located in given insee codes. Example: `includedInseeCodes[]=75117&includedInseeCodes[]=75118` Sources sites to be included. Located in given zipcodes. Example: `includedZipcodes[]=75017&includedZipcodes[]=75018` Lower than or equal to given inventory price. Example: `inventoryPriceMax=500` Greater than or equal to given inventory price. Example: `inventoryPriceMin=250` The number of items per page. Max is `30`. Maximum land surface. Minimum land surface. Latitude. Will work if latitude exists in the property. Example: `lat=48.864716` Longitude. Will work if latitude exists in the property. Example: `lon=2.349014` Lower than or equal to given lot count. Example: `lotCountMax=12` Greater than or equal to given lot count. Example: `lotCountMin=4` Order properties by creation date. Can be `asc` or `desc`. Order properties by update date (API parameter name includes the double “d”). Can be `asc` or `desc`. Order properties by price per meter. Can be `asc` or `desc`. Order properties by price. Can be `asc` or `desc`. Order properties by surface. Can be `asc` or `desc`. Order properties by update date. Can be `asc` or `desc`. The collection page number. Lower than or equal to given price excluding fees. Example: `priceExcludingFeesMax=427500` Greater than or equal to given price excluding fees. Example: `priceExcludingFeesMin=405000` Lower than or equal to given price per meter. Example: `pricePerMeterMax=11500` Greater than or equal to given price per meter. Example: `pricePerMeterMin=9500` Type of property. Apartment `0`, House `1`, Building `2`, Parking `3`, Office `4`, Land `5`, Shop `6`. Example: `propertyTypes[]=0&propertyTypes[]=1` Type of publisher. Individual `0`, Professional `1`. Example: `publisherTypes[]=0&publisherTypes[]=1` Distance expressed in kilometers. Will work if latitude & longitude parameters are also set. Example: `radius=20`, `radius=0.5` Lower than or equal to given rental charges amount. Example: `rentalChargesMax=100` Greater than or equal to given rental charges amount. Example: `rentalChargesMin=50` Lower than or equal to given rental pledge amount. Example: `rentalPledgeMax=800` Greater than or equal to given rental pledge amount. Example: `rentalPledgeMin=500` Lower than or equal to given renter fees. Example: `renterFeesMax=80` Greater than or equal to given renter fees. Example: `renterFeesMin=50` Maximum rooms of the property. Example: `roomMax=6` Minimum rooms of the property. Example: `roomMin=3` Whether to sort results by properties or by adverts. If `property` is chosen, `fromDate` and `toDate` parameters will be ***overridden*** so that the results will be sorted by the `createdAt` of each `property`. If `advert` is chosen: `fromDate` and `toDate` parameters will be ***overridden*** so that the results will be sorted by `createdAt` of each `advert`. Example: `sortMode=property` Please check our [glossary](/glossary) for more information about the distinction between adverts and properties. Lower than or equal to given surface. Example: `surfaceMax=84` Greater than or equal to given surface. Example: `surfaceMin=42` Date until which the ***property*** is created — inclusive. Example: `toDate=2021-05-07 12:42:42` Date from which the ***advert*** is expired — inclusive. Example: `toExpiredAt=2021-05-07 12:42:42` Date until which the ***property*** is updated — inclusive. Example: `toUpdatedAt=2021-05-07 12:42:42` Type of transaction. Sell `0`, Rent `1`. Example: `transactionType=0` Price coherence filter. `true` returns properties whose price passes our coherence checks; `false` returns properties flagged as incoherent — both also include properties whose price has not been assessed. Set to `null` (or send an empty value) to disable filtering. If omitted, defaults to `true`. Example: `withCoherentPrice=true` Having a latitude and longitude. Example: `withLocation=true` Having a virtual tour video link. Example: `withVirtualTour=true` ```bash cURL theme={null} curl --location -g --request GET 'https://api.stream.estate/documents/properties?includedDepartments[]=departments/77&fromDate=2020-01-10&propertyTypes[]=1&transactionType=0&withCoherentPrice=true&budgetMin=1800000&budgetMax=1900000' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' ``` ```python Python theme={null} import requests import json url = "https://api.stream.estate/documents/properties" params = { 'includedDepartments[]': 'departments/77', 'fromDate': '2020-01-10', 'propertyTypes[]': '1', 'transactionType': '0', 'withCoherentPrice': 'true', 'budgetMin': '1800000', 'budgetMax': '1900000' } headers = { 'Content-Type': 'application/json', 'X-API-KEY': process.env.STREAMESTATE_API_KEY } response = requests.request("GET", url, headers=headers, params=params) print(response.json()) ``` ```json Example Response theme={null} { "hydra:member": [ { "@context": "/contexts/PropertyDocument", "@id": "/documents/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "@type": "PropertyDocument", "adverts": [ { "condominiumFees": 1200, "constructionYear": 1982, "contact": { "agency": "Agence Immo 2000", "email": "contact@agenceimmo2000.fr", "fax": "0120304050", "name": "Olivie Olivier", "phone": "0120304050", "reference": "B42042" }, "createdAt": "2023-05-23T23:48:47+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "energy": { "category": "C", "value": 117 }, "events": [ { "createdAt": "2023-05-23T23:48:47+02:00", "fieldName": "price", "fieldNewValue": "950", "fieldOldValue": "995", "percentVariation": -4.52 } ], "features": [ "Grand balcon", "Bâtiment de 5 étages", "Lumineux", "Coin cuisine" ], "feesPercentage": 10, "feesResponsibility": 0, "floor": 6, "floorQuantity": 6, "furnished": true, "greenHouseGas": { "category": "D", "value": 32 }, "inventoryPrice": 350, "landSurface": 300, "lastCrawledAt": "2023-05-23T23:48:47+02:00", "lotCount": 12, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "picturesRemote": [ "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_45D57CD0-7D18-4FA0-B463-060789202625.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_39192DB9-A503-4FD7-AEDB-3DEFFE35E42E.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_FDDEC9E3-8A85-4BE5-83B8-12005A2D4078.jpg" ], "price": 950, "priceExcludingFees": 1800000, "publisher": { "category": "Portails", "name": "Century21", "type": 1 }, "rentalCharges": 75, "rentalPledge": 1000, "renterFees": 60, "surface": 30, "title": "Appartement 2 pieces", "updatedAt": "2023-05-23T23:48:47+02:00", "url": "https://www.century21.fr/trouver_logement/detail/2424196788/", "uuid": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "virtualTour": "https://my.matterport.com/show/?m=9GnMTmZgY44" } ], "bedroom": 2, "city": { "cityParentId": 0, "country": { "code": "250", "id": 2, "name": "France" }, "department": { "code": "75", "id": 77, "name": "Paris" }, "groupedCityNames": [ "string" ], "groupedCityZipcodes": [ "string" ], "hasGroupedByName": false, "hasGroupedByZipcode": false, "id": 30950, "insee": "75116", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "name": "Paris 18e", "open": true, "originalName": "Paris 18e", "region": { "code": "11", "id": 7, "name": "Île-de-France" }, "zipcode": "75018" }, "createdAt": "2023-05-23T23:48:47+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "expired": true, "expiredAt": "2023-05-23T23:48:47+02:00", "floor": 6, "furnished": true, "landSurface": 300, "lastCrawledAdvert": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "lastCrawledAt": "2023-05-23T23:48:47+02:00", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "price": 950, "pricePerMeter": 31.66, "property": "/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "propertyType": 0, "publisherTypes": [ 1 ], "room": 3, "stations": [ { "id": 33, "lines": [ { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Jules Joffrin" }, { "id": 191, "lines": [ { "color": "#B94D9A", "id": 11, "name": "Ligne 4", "number": "4", "routeName": "Porte de Clignancourt ↔ Mairie de Montrouge" }, { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Marcadet-Poissonniers" } ], "surface": 30, "title": "Appartement 2 pieces", "transactionType": 1, "updatedAt": "2023-05-23T23:48:47+02:00", "uuid": "38cb65b9-2965-4bd0-bc9b-2b8a8be7c457" } ], "hydra:totalItems": 0, "hydra:view": { "@id": "string", "@type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:next": "string" }, "hydra:search": { "@type": "string", "hydra:template": "string", "hydra:variableRepresentation": "string", "hydra:mapping": [ { "@type": "string", "variable": "string", "property": "string", "required": true } ] } } ``` # Similar Properties Source: https://docs.stream.estate/api-reference/endpoint/properties/get_similar GET /documents/properties/{id}/similar-properties Returns a collection of properties similar to given property. ### Path parameters UUID of the selected property ### Query parameters Date from which the property is created — inclusive. The number of items per page. Max is `30`. Order properties by creation date. Can be `asc` or `desc`. Order properties by update date (API parameter name includes the double “d”). Can be `asc` or `desc`. Order properties by price per meter. Can be `asc` or `desc`. Order properties by price. Can be `asc` or `desc`. Order properties by surface. Can be `asc` or `desc`. Order properties by update date. Can be `asc` or `desc`. The collection page number. ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/documents/properties/{id}/similar-properties' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` ```json Example Response theme={null} { "hydra:member": [ { "@context": "/contexts/PropertyDocument", "@id": "/documents/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "@type": "PropertyDocument", "adverts": [ { "condominiumFees": 1200, "constructionYear": 1982, "contact": { "agency": "Agence Immo 2000", "email": "contact@agenceimmo2000.fr", "fax": "0120304050", "name": "Olivie Olivier", "phone": "0120304050", "reference": "B42042" }, "createdAt": "2023-06-28T18:03:13+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "energy": { "category": "C", "value": 117 }, "events": [ { "createdAt": "2023-06-28T18:03:13+02:00", "fieldName": "price", "fieldNewValue": "950", "fieldOldValue": "995", "percentVariation": -4.52 } ], "features": [ "Grand balcon", "Bâtiment de 5 étages", "Lumineux", "Coin cuisine" ], "feesPercentage": 10, "feesResponsibility": 0, "floor": 6, "floorQuantity": 6, "furnished": true, "greenHouseGas": { "category": "D", "value": 32 }, "inventoryPrice": 350, "landSurface": 300, "lastCrawledAt": "2023-06-28T18:03:13+02:00", "lotCount": 12, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "picturesRemote": [ "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_45D57CD0-7D18-4FA0-B463-060789202625.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_39192DB9-A503-4FD7-AEDB-3DEFFE35E42E.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_FDDEC9E3-8A85-4BE5-83B8-12005A2D4078.jpg" ], "price": 950, "priceExcludingFees": 1800000, "publisher": { "category": "Portails", "name": "Century21", "type": 1 }, "rentalCharges": 75, "rentalPledge": 1000, "renterFees": 60, "surface": 30, "title": "Appartement 2 pieces", "updatedAt": "2023-06-28T18:03:13+02:00", "url": "https://www.century21.fr/trouver_logement/detail/2424196788/", "uuid": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "virtualTour": "https://my.matterport.com/show/?m=9GnMTmZgY44" } ], "bedroom": 2, "city": { "cityParentId": 0, "country": { "code": "250", "id": 2, "name": "France" }, "department": { "code": "75", "id": 77, "name": "Paris" }, "groupedCityNames": [ "string" ], "groupedCityZipcodes": [ "string" ], "hasGroupedByName": false, "hasGroupedByZipcode": false, "id": 30950, "insee": "75116", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "name": "Paris 18e", "open": true, "originalName": "Paris 18e", "region": { "code": "11", "id": 7, "name": "Île-de-France" }, "zipcode": "75018" }, "createdAt": "2023-06-28T18:03:13+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "expired": true, "expiredAt": "2023-06-28T18:03:13+02:00", "floor": 6, "furnished": true, "landSurface": 300, "lastCrawledAdvert": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "lastCrawledAt": "2023-06-28T18:03:13+02:00", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "price": 950, "pricePerMeter": 31.66, "property": "/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "propertyType": 0, "publisherTypes": [ 1 ], "room": 3, "stations": [ { "id": 33, "lines": [ { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Jules Joffrin" }, { "id": 191, "lines": [ { "color": "#B94D9A", "id": 11, "name": "Ligne 4", "number": "4", "routeName": "Porte de Clignancourt ↔ Mairie de Montrouge" }, { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Marcadet-Poissonniers" } ], "surface": 30, "title": "Appartement 2 pieces", "transactionType": 1, "updatedAt": "2023-06-28T18:03:13+02:00", "uuid": "38cb65b9-2965-4bd0-bc9b-2b8a8be7c457" } ], "hydra:totalItems": 0, "hydra:view": { "@id": "string", "@type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:next": "string" }, "hydra:search": { "@type": "string", "hydra:template": "string", "hydra:variableRepresentation": "string", "hydra:mapping": [ { "@type": "string", "variable": "string", "property": "string", "required": true } ] } } ``` # Property Source: https://docs.stream.estate/api-reference/endpoint/properties/get_single GET /documents/properties/{id} Returns a single property matching the given id. ### Path parameters UUID of the selected property ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/documents/properties/{id}' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` ```json Example Response theme={null} { "@context": "/contexts/PropertyDocument", "@id": "/documents/properties/{id}", "@type": "PropertyDocument", "adverts": [ { "condominiumFees": 1200, "constructionYear": 1982, "contact": { "agency": "Agence Immo 2000", "email": "contact@agenceimmo2000.fr", "fax": "0120304050", "name": "Olivie Olivier", "phone": "0120304050", "reference": "B42042" }, "createdAt": "2023-05-24T09:29:17+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "energy": { "category": "C", "value": 117 }, "events": [ { "createdAt": "2023-05-24T09:29:17+02:00", "fieldName": "price", "fieldNewValue": "950", "fieldOldValue": "995", "percentVariation": -4.52 } ], "features": [ "Grand balcon", "Bâtiment de 5 étages", "Lumineux", "Coin cuisine" ], "feesPercentage": 10, "feesResponsibility": 0, "floor": 6, "floorQuantity": 6, "furnished": true, "greenHouseGas": { "category": "D", "value": 32 }, "inventoryPrice": 350, "landSurface": 300, "lastCrawledAt": "2023-05-24T09:29:17+02:00", "lotCount": 12, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "picturesRemote": [ "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_45D57CD0-7D18-4FA0-B463-060789202625.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_39192DB9-A503-4FD7-AEDB-3DEFFE35E42E.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_FDDEC9E3-8A85-4BE5-83B8-12005A2D4078.jpg" ], "price": 950, "priceExcludingFees": 1800000, "publisher": { "category": "Portails", "name": "Century21", "type": 1 }, "rentalCharges": 75, "rentalPledge": 1000, "renterFees": 60, "surface": 30, "title": "Appartement 2 pieces", "updatedAt": "2023-05-24T09:29:17+02:00", "url": "https://www.century21.fr/trouver_logement/detail/2424196788/", "uuid": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "virtualTour": "https://my.matterport.com/show/?m=9GnMTmZgY44" } ], "bedroom": 2, "city": { "cityParentId": 0, "country": { "code": "250", "id": 2, "name": "France" }, "department": { "code": "75", "id": 77, "name": "Paris" }, "groupedCityNames": [ "string" ], "groupedCityZipcodes": [ "string" ], "hasGroupedByName": false, "hasGroupedByZipcode": false, "id": 30950, "insee": "75116", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "name": "Paris 18e", "open": true, "originalName": "Paris 18e", "region": { "code": "11", "id": 7, "name": "Île-de-France" }, "zipcode": "75018" }, "createdAt": "2023-05-24T09:29:17+02:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "expired": true, "expiredAt": "2023-05-24T09:29:17+02:00", "floor": 6, "furnished": true, "landSurface": 300, "lastCrawledAdvert": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "lastCrawledAt": "2023-05-24T09:29:17+02:00", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "price": 950, "pricePerMeter": 31.66, "property": "/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "propertyType": 0, "publisherTypes": [ 1 ], "room": 3, "stations": [ { "id": 33, "lines": [ { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Jules Joffrin" }, { "id": 191, "lines": [ { "color": "#B94D9A", "id": 11, "name": "Ligne 4", "number": "4", "routeName": "Porte de Clignancourt ↔ Mairie de Montrouge" }, { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d’Issy" } ], "name": "Marcadet-Poissonniers" } ], "surface": 30, "title": "Appartement 2 pieces", "transactionType": 1, "updatedAt": "2023-05-24T09:29:17+02:00", "uuid": "38cb65b9-2965-4bd0-bc9b-2b8a8be7c457" } ``` # Create Search Source: https://docs.stream.estate/api-reference/endpoint/searches/create POST /searches Creates a new search ### Body Minimum number of bedrooms in the property. Maximum number of bedrooms in the property. Maximum budget for the property. Minimum budget for the property. HTTPS webhook that receives `match` payloads whenever a property satisfies the search. Requires `notificationEnabled=true`. You can test your endpoint with our [webhook simulator](/api-reference/endpoint/webhooks/send). HTTPS webhook that receives advert `event` payloads (price changes, expirations, etc.) from the searches you subscribe to. Requires `notificationEnabled=true` and at least one entry in `subscribedEvents`. You can test your endpoint with our [webhook simulator](/api-reference/endpoint/webhooks/send). Cities to be excluded. Source sites to be excluded. Site categories to be excluded. Full text matching including/excluding words & phrases in the title or the description of the property. Example: `expressions[0][0][word]=travaux&expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=false&expressions[0][1][word]=lumineux&expressions[0][1][options][includes]=true&expressions[0][1][options][strict]=false` which will search for properties that contain both the keywords `lumineux` and `travaux`. Whether the property is furnished or not. Filters properties by geocoding confidence level. Use `1` to keep only house-number level matches and `2` to include neighborhood-level approximations. Leave empty to allow both. Filters properties within specified geographic areas. Example: `geoShapes=geoShapes[0][0][0]=6.063201&geoShapes[0][0][1]=44.549092&geoShapes[0][1][0]=6.063201&geoShapes[0][1][1]=44.543009&geoShapes[0][2][0]=6.073453&geoShapes[0][2][1]=44.543293&geoShapes[0][3][0]=6.073453&geoShapes[0][3][1]=44.549092&geoShapes[0][4][0]=6.063201&geoShapes[0][4][1]=44.549092`. Whether to hide property contact information or not. Included cities. Use [locations](/api-reference/endpoint/indicators/locations) to get the desired city ids. Included departments. Use [locations](/api-reference/endpoint/indicators/locations) to get the desired city ids. Included site categories. Source sites to be included. Included zipcodes. Included INSEE codes (used to infer the cities associated with the search). Maximum land surface. Minimum land surface. Latitude of the center point used for radial filtering. Provide together with `lon`, otherwise this filter has no effect. Example: `lat=48.864716` Longitude of the center point used for radial filtering. Provide together with `lat`. Example: `lon=2.349014` Enables delivery of matches and events either by webhook (`endpointRecipient`, `eventEndpoint`) or by email (`notificationRecipient`). Email address that receives alert summaries when `notificationEnabled=true`. Use this as a fallback if you do not have a webhook yet. Maximum price per meter. Minimum price per meter. Type of property. Apartment `0`, House `1`, Building `2`, Parking `3`, Office `4`, Land `5`, Shop `6`. Example: `propertyTypes[]=0&propertyTypes[]=1` Type of publisher. Individual `0`, Professional `1`. Example: `publisherTypes[]=0&publisherTypes[]=1` Distance in kilometers around the provided `lat`/`lon`. Example: `radius=20`, `radius=0.5` Minimum number of rooms. Maximum number of rooms. Event codes (e.g. `property.ad.create`, `ad.update.price`, `ad.update.expired`) you want to receive on the `eventEndpoint`. See the [webhook simulator page](/api-reference/endpoint/webhooks/send) for the full list. Maximum property surface area. Minimum property surface area. Title of the created search. Type of transaction. Sell `0`, Rent `1`. Example: `transactionType=0` Price coherence filter. `true` returns adverts whose price passes our coherence checks; `false` returns adverts flagged as incoherent — both also include adverts whose price has not been assessed. Set to `null` (or send an empty value) to disable filtering. If omitted, defaults to `true`. Whether the property includes a virtual tour. ```bash cURL theme={null} curl --location 'https://api.stream.estate/searches' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ --data-raw '{ "bedroomMin": 0, "budgetMax": 1500000, "budgetMin": 0, "endpointRecipient": "https://hook.eu1.make.com/xyz", "eventEndpoint": "https://hook.eu1.make.com/xyz", "lat": 48.864716, "lon": 2.349014, "notificationEnabled": true, "notificationRecipient": "foo@bar.com", "propertyTypes": [0, 1], "radius": 20, "subscribedEvents": [ "property.ad.create" ], "surfaceMax": 0, "surfaceMin": 20, "transactionType": 0, "title": "mySearch" }' ``` ```python Python theme={null} import requests import json url = "https://api.stream.estate/searches" payload = json.dumps({ "bedroomMin": 0, "budgetMax": 1500000, "budgetMin": 0, "endpointRecipient": "https://hook.eu1.make.com/xyz", "eventEndpoint": "https://hook.eu1.make.com/xyz", "lat": 48.864716, "lon": 2.349014, "notificationEnabled": True, "notificationRecipient": "foo@bar.com", "propertyTypes": [ 0, 1 ], "radius": 20, "subscribedEvents": [ "property.ad.create" ], "surfaceMax": 0, "surfaceMin": 20, "transactionType": 0, "title": "mySearch" }) headers = { 'Content-Type': 'application/json', 'X-API-KEY': '' } response = requests.request("POST", url, headers=headers, data=payload) print(response.json()) ``` ```json Example Response theme={null} { "@context": "/contexts/Search", "@id": "/searches/xyz", "@type": "Search", "title": "mySearch", "user": "/users/xyz", "transactionType": 0, "budgetMax": 1500000, "budgetMin": 0, "bedroomMin": 0, "roomMin": null, "surfaceMin": 20, "surfaceMax": 0, "propertyTypes": [ 0, 1 ], "publisherTypes": [], "lastAlertAt": null, "token": "xyz", "pricePerMeterMin": null, "pricePerMeterMax": null, "createdAt": "2023-06-04T00:39:53+02:00", "updatedAt": "2023-06-04T00:39:53+02:00", "notificationEnabled": true, "includedCities": [], "includedDepartments": [], "excludedCities": [], "expressions": [], "notificationRecipient": "foo@bar.com", "furnished": null, "hidePropertyContact": false, "withVirtualTour": null, "withCoherentPrice": true, "landSurfaceMin": null, "landSurfaceMax": null, "includedSiteCategories": [], "excludedSiteCategories": [], "endpointRecipient": "https://hook.eu1.make.com/xyz", "eventEndpoint": "https://hook.eu1.make.com/xyz", "subscribedEvents": [ "property.ad.create" ], "radius": 20, "lon": 2.349014, "lat": 48.864716 } ``` # Delete Search Source: https://docs.stream.estate/api-reference/endpoint/searches/delete DELETE /searches/{id} Deletes an existing search. ### Path UUID of the selected search ```bash Example Request theme={null} curl --location --request DELETE 'https://api.stream.estate/searches/{id}' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` # Searches Source: https://docs.stream.estate/api-reference/endpoint/searches/get_collection GET /searches Returns a collection of your existing searches matching given criteria. ### Query parameters Filter searches which have notifications enabled or not. Order searches by title. Can be `asc` or `desc`. The collection page number. Title of the created search. ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/searches' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` ```json Example Response theme={null} { "hydra:member": [ { "@context": "string", "@id": "string", "@type": "string", "bedroomMin": 0, "budgetMax": 0, "budgetMin": 0, "createdAt": "2019-08-24T14:15:22Z", "endpointRecipient": "https://www.mycompany.com/webhook_melo_match", "eventEndpoint": "https://www.mycompany.com/webhook_melo_updates", "excludedCities": [ { "@context": "string", "@id": "string", "@type": "string", "article": "string", "insee": "string", "libelle": "string", "name": "string", "zipcode": "string" } ], "excludedSiteCategories": [ { "@context": "string", "@id": "string", "@type": "string", "name": "string" } ], "expressions": "expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=true&expressions[1][0][word]=viager&expressions[1][0][options][includes]=true&expressions[1][0][options][strict]=true", "furnished": true, "hidePropertyContact": true, "includedCities": [ { "@context": "string", "@id": "string", "@type": "string", "article": "string", "insee": "string", "libelle": "string", "name": "string", "zipcode": "string" } ], "includedDepartments": [ { "@context": "string", "@id": "string", "@type": "string", "chefLieu": "string", "departmentCode": "string", "name": "string", "nameClean": "string" } ], "includedSiteCategories": [ { "@context": "string", "@id": "string", "@type": "string", "name": "string" } ], "landSurfaceMax": 0, "landSurfaceMin": 0, "lastAlertAt": "2019-08-24T14:15:22Z", "lat": "48.864716", "lon": "2.349014", "notificationEnabled": false, "notificationRecipient": "foo@bar.com", "pricePerMeterMax": 0, "pricePerMeterMin": 0, "propertyTypes": 3, "publisherTypes": 3, "radius": "20", "roomMin": 0, "subscribedEvents": [ "ad.update.price" ], "surfaceMax": 0, "surfaceMin": 0, "title": "string", "token": "string", "transactionType": "0", "updatedAt": "2019-08-24T14:15:22Z", "user": "string", "withCoherentPrice": true, "withVirtualTour": true } ], "hydra:totalItems": 0, "hydra:view": { "@id": "string", "@type": "string", "hydra:first": "string", "hydra:last": "string", "hydra:next": "string" }, "hydra:search": { "@type": "string", "hydra:template": "string", "hydra:variableRepresentation": "string", "hydra:mapping": [ { "@type": "string", "variable": "string", "property": "string", "required": true } ] } } ``` # Search Source: https://docs.stream.estate/api-reference/endpoint/searches/get_single GET /searches/{id} Returns a single existing search matching the given id. ### Path parameters UUID of the selected search ```bash Example Request theme={null} curl --location -g --request GET 'https://api.stream.estate/searches/{id}' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` ```json Example Response theme={null} { "@context": "string", "@id": "string", "@type": "string", "bedroomMin": 0, "budgetMax": 0, "budgetMin": 0, "createdAt": "2019-08-24T14:15:22Z", "endpointRecipient": "https://www.mycompany.com/webhook_melo_match", "eventEndpoint": "https://www.mycompany.com/webhook_melo_updates", "excludedCities": [ { "@context": "string", "@id": "string", "@type": "string", "article": "string", "insee": "string", "libelle": "string", "name": "string", "zipcode": "string" } ], "excludedSiteCategories": [ { "@context": "string", "@id": "string", "@type": "string", "name": "string" } ], "expressions": "expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=true&expressions[1][0][word]=viager&expressions[1][0][options][includes]=true&expressions[1][0][options][strict]=true", "furnished": true, "hidePropertyContact": true, "includedCities": [ { "@context": "string", "@id": "string", "@type": "string", "article": "string", "insee": "string", "libelle": "string", "name": "string", "zipcode": "string" } ], "includedDepartments": [ { "@context": "string", "@id": "string", "@type": "string", "chefLieu": "string", "departmentCode": "string", "name": "string", "nameClean": "string" } ], "includedSiteCategories": [ { "@context": "string", "@id": "string", "@type": "string", "name": "string" } ], "landSurfaceMax": 0, "landSurfaceMin": 0, "lastAlertAt": "2019-08-24T14:15:22Z", "lat": "48.864716", "lon": "2.349014", "notificationEnabled": false, "notificationRecipient": "foo@bar.com", "pricePerMeterMax": 0, "pricePerMeterMin": 0, "propertyTypes": 3, "publisherTypes": 3, "radius": "20", "roomMin": 0, "subscribedEvents": [ "ad.update.price" ], "surfaceMax": 0, "surfaceMin": 0, "title": "string", "token": "string", "transactionType": "0", "updatedAt": "2019-08-24T14:15:22Z", "user": "string", "withCoherentPrice": true, "withVirtualTour": true } ``` # Update Search Source: https://docs.stream.estate/api-reference/endpoint/searches/update PUT /searches/{id} Updates an existing search ### Path UUID of the existing search ### Body Minimum number of bedrooms in the property. Maximum number of bedrooms in the property. Maximum budget for the property. Minimum budget for the property. HTTPS webhook that receives `match` payloads whenever a property satisfies the search. Requires `notificationEnabled=true`. You can test your endpoint with our [webhook simulator](/api-reference/endpoint/webhooks/send). HTTPS webhook that receives advert `event` payloads (price changes, expirations, etc.) from the searches you subscribe to. Requires `notificationEnabled=true` and at least one entry in `subscribedEvents`. You can test your endpoint with our [webhook simulator](/api-reference/endpoint/webhooks/send). Cities to be excluded. Source sites to be excluded. Site categories to be excluded. Full text matching including/excluding words & phrases in the title or the description of the property. Example: `expressions[0][0][word]=travaux&expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=false&expressions[0][1][word]=lumineux&expressions[0][1][options][includes]=true&expressions[0][1][options][strict]=false` which will search for properties that contain both the keywords `lumineux` and `travaux`. Whether the property is furnished or not. Filters properties by geocoding confidence level. Use `1` to keep only house-number level matches and `2` to include neighborhood-level approximations. Leave empty to allow both. Filters properties within specified geographic areas. Example: `geoShapes[0][0][0]=6.063201&geoShapes[0][0][1]=44.549092&geoShapes[0][1][0]=6.063201&geoShapes[0][1][1]=44.543009&geoShapes[0][2][0]=6.073453&geoShapes[0][2][1]=44.543293&geoShapes[0][3][0]=6.073453&geoShapes[0][3][1]=44.549092&geoShapes[0][4][0]=6.063201&geoShapes[0][4][1]=44.549092`. Whether to hide property contact information or not. Included cities. Included departments. Included site categories. Source sites to be included. Included zipcodes. Included INSEE codes (used to infer the cities associated with the search). Maximum land surface. Minimum land surface. Latitude of the center point used for radial filtering. Provide together with `lon`, otherwise this filter has no effect. Example: `lat=48.864716` Longitude of the center point used for radial filtering. Provide together with `lat`. Example: `lon=2.349014` Enables delivery of matches and events either by webhook (`endpointRecipient`, `eventEndpoint`) or by email (`notificationRecipient`). Email address that receives alert summaries when `notificationEnabled=true`. Use this as a fallback if you do not have a webhook yet. Maximum price per meter. Minimum price per meter. Type of property. Apartment `0`, House `1`, Building `2`, Parking `3`, Office `4`, Land `5`, Shop `6`. Example: `propertyTypes[]=0&propertyTypes[]=1` Type of publisher. Individual `0`, Professional `1`. Example: `publisherTypes[]=0&publisherTypes[]=1` Distance in kilometers around the provided `lat`/`lon`. Example: `radius=20` Minimum number of rooms. Maximum number of rooms. Event codes (e.g. `property.ad.create`, `ad.update.price`, `ad.update.expired`) you want to receive on the `eventEndpoint`. See the [webhook simulator page](/api-reference/endpoint/webhooks/send) for the full list. Maximum property surface area. Minimum property surface area. Title of the created search. Type of transaction. Sell `0`, Rent `1`. Example: `transactionType=0` Price coherence filter. `true` returns adverts whose price passes our coherence checks; `false` returns adverts flagged as incoherent — both also include adverts whose price has not been assessed. Set to `null` (or send an empty value) to disable filtering. If omitted, defaults to `true`. Whether the property includes a virtual tour. ```bash Example Request theme={null} curl --location --request PUT 'https://api.stream.estate/searches/{id}' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ --data-raw '{ "bedroomMin": 0, "budgetMax": 0, "budgetMin": 0, "endpointRecipient": "https://www.mycompany.com/webhook_melo_match", "eventEndpoint": "https://www.mycompany.com/webhook_melo_updates", "excludedCities": [ "string" ], "excludedSiteCategories": [ "string" ], "expressions": "expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=true&expressions[1][0][word]=viager&expressions[1][0][options][includes]=true&expressions[1][0][options][strict]=true", "furnished": true, "hidePropertyContact": true, "includedCities": [ "string" ], "includedDepartments": [ "string" ], "includedSiteCategories": [ "string" ], "landSurfaceMax": 0, "landSurfaceMin": 0, "lat": "48.864716", "lon": "2.349014", "notificationEnabled": false, "notificationRecipient": "foo@bar.com", "pricePerMeterMax": 0, "pricePerMeterMin": 0, "propertyTypes": 3, "publisherTypes": 3, "radius": "20", "roomMin": 0, "subscribedEvents": [ "ad.update.price" ], "surfaceMax": 0, "surfaceMin": 0, "title": "string", "transactionType": "0", "withCoherentPrice": true, "withVirtualTour": true }' ``` ```json Example Response theme={null} { "bedroomMin": 0, "budgetMax": 0, "budgetMin": 0, "endpointRecipient": "https://www.mycompany.com/webhook_melo_match", "eventEndpoint": "https://www.mycompany.com/webhook_melo_updates", "excludedCities": [ "string" ], "excludedSiteCategories": [ "string" ], "expressions": "expressions[0][0][options][includes]=true&expressions[0][0][options][strict]=true&expressions[1][0][word]=viager&expressions[1][0][options][includes]=true&expressions[1][0][options][strict]=true", "furnished": true, "hidePropertyContact": true, "includedCities": [ "string" ], "includedDepartments": [ "string" ], "includedSiteCategories": [ "string" ], "landSurfaceMax": 0, "landSurfaceMin": 0, "lat": "48.864716", "lon": "2.349014", "notificationEnabled": false, "notificationRecipient": "foo@bar.com", "pricePerMeterMax": 0, "pricePerMeterMin": 0, "propertyTypes": 3, "publisherTypes": 3, "radius": "20", "roomMin": 0, "subscribedEvents": [ "ad.update.price" ], "surfaceMax": 0, "surfaceMin": 0, "title": "string", "transactionType": "0", "withCoherentPrice": true, "withVirtualTour": true } ``` # Simulate Source: https://docs.stream.estate/api-reference/endpoint/webhooks/send GET /webhook-tester This endpoint will simulate a `match` or an `event` to the given endpoint. Please read our [Concepts](https://docs.stream.estate/concepts) to understand the differences between a `property`, a `match`, an `advert` and an `event`. If you want to receive new `properties` that meet your search criteria in real time, you need to provide on [POST /searches](http://docs.stream.estate/api-reference/endpoint/searches/create): * an `endpointRecipient` * set the `notificationEnabled` parameter to `true` If you want to receive new `events` in real time you need to provide on [POST /searches](http://docs.stream.estate/api-reference/endpoint/searches/create): * an `eventEndpoint` * set the `notificationEnabled` parameter to `true` * set the events you want to subscribe to using the `subscribedEvents` parameter. All types of events are listed below this section. Restricting your endpoints to our IP addresses is highly recommended for security reasons: * Sandbox: `178.238.226.136` * Production: `144.76.91.183` Your server implementation should return a `200` HTTP status code if the data was received successfully. If a webhook fails, it will be retried up to five times. Every retry will take place 1 hour after the previous one. | Events | Description | | | -------------------- | -------------------------------------------------------- | - | | `ad.update.price` | Notifies you when the price of an advert changes. | | | `ad.update.surface` | Notifies you when the surface area of an advert changes. | | | `ad.update.pictures` | Notifies you when the pictures of an advert are updated. | | | `ad.update.expired` | Notifies you when an advert has expired. | | | `property.ad.create` | Notifies you when a new advert is created. | | | `property.ad.update` | Notifies you when an existing advert is updated. | | ### Path Endpoint where the match or the event will be sent to. The type of event you want to trigger. ```bash Example Request theme={null} curl --location --request GET 'https://api.stream.estate/webhook-tester' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' \ ``` ```json Event theme={null} { "event": "ad.update.price", "adEvent": { "fieldName": "price", "fieldOldValue": "900", "fieldNewValue": "875", "percentVariation": "-2.81", "createdAt": "2019-08-24T14:15:22Z" }, "match": { "@context": "string", "@id": "string", "@type": "string", "property": "string", "search": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "propertyDocument": { "@context": "/contexts/PropertyDocument", "@id": "/documents/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "@type": "PropertyDocument", "adverts": [ { "contact": { "agency": "Agence Immo 2000", "email": "contact@agenceimmo2000.fr", "fax": "0120304050", "name": "Olivie Olivier", "phone": "0120304050", "reference": "B42042" }, "createdAt": "2024-03-26T10:39:41+01:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "events": [ { "createdAt": "2024-03-26T10:39:41+01:00", "fieldName": "price", "fieldNewValue": "950", "fieldOldValue": "995", "percentVariation": -4.52 } ], "features": [ "Grand balcon", "Bâtiment de 5 étages", "Lumineux", "Coin cuisine" ], "energy": { "category": "C", "value": 117 }, "greenHouseGas": { "category": "D", "value": 32 }, "constructionYear": 1982, "floorQuantity": 6, "renterFees": 60, "rentalPledge": 1000, "inventoryPrice": 350, "rentalCharges": 75, "feesPercentage": 10, "priceExcludingFees": 1800000, "feesResponsibility": 0, "lotCount": 12, "condominiumFees": 1200, "floor": 6, "furnished": true, "lastCrawledAt": "2024-03-26T10:39:41+01:00", "publisher": { "category": "Portails", "name": "Century21", "type": 1 }, "surface": 30, "landSurface": 300, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "picturesRemote": [ "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_45D57CD0-7D18-4FA0-B463-060789202625.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_39192DB9-A503-4FD7-AEDB-3DEFFE35E42E.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_FDDEC9E3-8A85-4BE5-83B8-12005A2D4078.jpg" ], "price": 950, "title": "Appartement 2 pieces", "updatedAt": "2024-03-26T10:39:41+01:00", "url": "https://www.century21.fr/trouver_logement/detail/2424196788/", "uuid": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "virtualTour": "https://my.matterport.com/show/?m=9GnMTmZgY44" } ], "bedroom": 2, "city": { "cityParentId": 0, "country": { "code": "250", "id": 2, "name": "France" }, "department": { "code": "75", "id": 77, "name": "Paris" }, "groupedCityNames": [ "string" ], "groupedCityZipcodes": [ "string" ], "hasGroupedByName": false, "hasGroupedByZipcode": false, "id": 30950, "insee": "75116", "location": { "lat": 48.8530933, "lon": 2.2487626 }, "name": "Paris 18e", "open": true, "originalName": "Paris 18e", "region": { "code": "11", "id": 7, "name": "Île-de-France" }, "zipcode": "75018" }, "createdAt": "2024-03-26T10:39:41+01:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "expired": true, "expiredAt": "2024-03-26T10:39:41+01:00", "floor": 6, "furnished": true, "landSurface": 300, "lastCrawledAdvert": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "lastCrawledAt": "2024-03-26T10:39:41+01:00", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "price": 950, "pricePerMeter": 31.66, "property": "/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "propertyType": 0, "publisherTypes": [ 1 ], "room": 3, "stations": [ { "id": 33, "lines": [ { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d'Issy" } ], "name": "Jules Joffrin" }, { "id": 191, "lines": [ { "color": "#B94D9A", "id": 11, "name": "Ligne 4", "number": "4", "routeName": "Porte de Clignancourt ↔ Mairie de Montrouge" }, { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d'Issy" } ], "name": "Marcadet-Poissonniers" } ], "surface": 30, "title": "Appartement 2 pieces", "transactionType": 1, "updatedAt": "2024-03-26T10:39:41+01:00", "uuid": "38cb65b9-2965-4bd0-bc9b-2b8a8be7c457" } } } ``` ```json Match theme={null} { "@context": "string", "@id": "string", "@type": "string", "property": "string", "search": "string", "createdAt": "2019-08-24T14:15:22Z", "updatedAt": "2019-08-24T14:15:22Z", "propertyDocument": { "@context": "/contexts/PropertyDocument", "@id": "/documents/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "@type": "PropertyDocument", "adverts": [ { "contact": { "agency": "Agence Immo 2000", "email": "contact@agenceimmo2000.fr", "fax": "0120304050", "name": "Olivie Olivier", "phone": "0120304050", "reference": "B42042" }, "createdAt": "2024-02-20T14:50:32+01:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d'espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d'eau avec fenêtre, idéalement situé...", "elevator": true, "events": [ { "createdAt": "2024-02-20T14:50:32+01:00", "fieldName": "price", "fieldNewValue": "950", "fieldOldValue": "995", "percentVariation": -4.52 } ], "features": [ "Grand balcon", "Bâtiment de 5 étages", "Lumineux", "Coin cuisine" ], "energy": { "category": "C", "value": 117 }, "greenHouseGas": { "category": "D", "value": 32 }, "constructionYear": 1982, "floorQuantity": 6, "renterFees": 60, "rentalPledge": 1000, "inventoryPrice": 350, "rentalCharges": 75, "feesPercentage": 10, "priceExcludingFees": 1800000, "feesResponsibility": 0, "lotCount": 12, "condominiumFees": 1200, "floor": 6, "furnished": true, "lastCrawledAt": "2024-02-20T14:50:32+01:00", "publisher": { "category": "Portails", "name": "Century21", "type": 1 }, "surface": 30, "landSurface": 300, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "picturesRemote": [ "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_45D57CD0-7D18-4FA0-B463-060789202625.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_39192DB9-A503-4FD7-AEDB-3DEFFE35E42E.jpg", "https://www.century21.fr/imagesBien/s3/202/3427/c21_202_3427_1185_1_FDDEC9E3-8A85-4BE5-83B8-12005A2D4078.jpg" ], "price": 950, "title": "Appartement 2 pieces", "updatedAt": "2024-02-20T14:50:32+01:00", "url": "https://www.century21.fr/trouver_logement/detail/2424196788/", "uuid": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "virtualTour": "https://my.matterport.com/show/?m=9GnMTmZgY44" } ], "bedroom": 2, "city": { "cityParentId": 0, "country": { "code": "250", "id": 2, "name": "France" }, "department": { "code": "75", "id": 77, "name": "Paris" }, "groupedCityNames": [ "string" ], "groupedCityZipcodes": [ "string" ], "hasGroupedByName": false, "hasGroupedByZipcode": false, "id": 30950, "insee": "75116", "location": { "lat": 48.8530933, "lon": 2.2487626 }, "name": "Paris 18e", "open": true, "originalName": "Paris 18e", "region": { "code": "11", "id": 7, "name": "Île-de-France" }, "zipcode": "75018" }, "createdAt": "2024-02-20T14:50:32+01:00", "description": "Bel appartement « coup de coeur » 2 pieces Sans perte d’espace, lumineux, poutres, parquet massif, belle hauteur sous plafonds, entièrement refait à neuf avec fenêtres double vitrage, volets roulants, porte blindée, cuisine entièrement équipée, salle d’eau avec fenêtre, idéalement situé...", "elevator": true, "expired": true, "expiredAt": "2024-02-20T14:50:32+01:00", "floor": 6, "furnished": true, "landSurface": 300, "lastCrawledAdvert": "21f2a17b-dae3-4ea4-976f-e521cebfe609", "lastCrawledAt": "2024-02-20T14:50:32+01:00", "locations": { "lat": 48.8530933, "lon": 2.2487626 }, "pictures": [ "https://pictures.notif.immo/properties/2021/05/10/10/a20cbdc44632c63f89aad2e6d9d049.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/b0935cb714d501c668b66997d7f16a.jpg", "https://pictures.notif.immo/properties/2021/05/10/10/7e1ea590d4b827e9a8a762e7f378fb.jpg" ], "price": 950, "pricePerMeter": 31.66, "property": "/properties/a2fe8869-bbd8-4d92-ad22-5ca5511a5bc7", "propertyType": 0, "publisherTypes": [ 1 ], "room": 3, "stations": [ { "id": 33, "lines": [ { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d'Issy" } ], "name": "Jules Joffrin" }, { "id": 191, "lines": [ { "color": "#B94D9A", "id": 11, "name": "Ligne 4", "number": "4", "routeName": "Porte de Clignancourt ↔ Mairie de Montrouge" }, { "color": "#128B5B", "id": 20, "name": "Ligne 12", "number": "12", "routeName": "Front Populaire ↔ Mairie d'Issy" } ], "name": "Marcadet-Poissonniers" } ], "surface": 30, "title": "Appartement 2 pieces", "transactionType": 1, "updatedAt": "2024-02-20T14:50:32+01:00", "uuid": "38cb65b9-2965-4bd0-bc9b-2b8a8be7c457" } } ``` # Error Codes Source: https://docs.stream.estate/api-reference/errors Error codes that can be returned by the API | Error Code | Description | | ---------- | -------------------------------------------------------------------------- | | 400 | Bad Request - Your request is incorrect | | 401 | Unauthorized - Your API key is wrong | | 403 | Forbidden - The action requested is not allowed | | 404 | Not Found - The requested resource could not be found | | 405 | Method Not Allowed - You tried to access a resource with an invalid method | | 429 | Too Many Requests - You're requesting too much! Slow down! | | 500 | Internal Server Error - We had a problem with our server. Try again later | # FAQ Source: https://docs.stream.estate/api-reference/faq This section of is aimed at collecting and answering common questions that developers may have when working with the API. If you want to get an access and try out the API, please [sign up](https://www.melo.io) and create an API key in your settings. The timezone is set to `Europe/Paris`. Yes, in order to do that you have to send a request with `itemsPerPage=0` as a query parameter. Please note that count is limited to 10 000 results for `/documents/properties` endpoint. Please reach out using the chat on our our [Website](https://stream.estate), we're happy to answer you all your questions and get you started. # Changelog Source: https://docs.stream.estate/changelog Product updates and announcements **Enhanced Location Features** * Added `geoAccuracy` field for GPS coordinate precision indicator * New `withLocation` filter to find properties with GPS coordinates * Polygon search for custom geographic areas and neighborhood targeting with `geoShapes` field **Enhanced Prices Filtering** * Added `advertPriceMin` and `advertPriceMax` to filter properties based on any non expired adverts prices. # What is Stream Estate? Source: https://docs.stream.estate/introduction The Stream Estate API is designed to enable builders to easily query, observe, and automate real estate data and insights The Stream Estate API lets you query, observe, and automate real estate data over HTTP. Authenticate with the `X-API-KEY` header — here's a working call that returns houses for sale: ```bash theme={null} curl -g 'https://api.stream.estate/documents/properties?propertyTypes[]=1&transactionType=0' \ --header 'X-API-KEY: ' ``` New here? The [Quickstart](/quickstart) gets you to your first response in a few minutes. Detailed technical information about our API, including its endpoints, methods, and responses. Get answers to the most common questions and concerns about the use of our API. Keep track of all modifications and updates made to the API over time. # Quickstart Source: https://docs.stream.estate/quickstart Authenticate and make your first Stream Estate API call in a few minutes. The Stream Estate API lets you query real estate properties, adverts, and market indicators over HTTP. This guide takes you from zero to your first working request. ## Prerequisites * A Stream Estate account — [sign up](https://stream.estate/signup) if you don't have one. * An API key. Create one in your account settings and keep it secret. Every request is authenticated with the `X-API-KEY` header. There is no other auth step: no OAuth flow, no tokens to refresh. ## Make your first request The call below returns houses for sale in the Seine-et-Marne department (`77`), created since 2020, within a €1.8M–1.9M budget. ```bash cURL theme={null} curl --location -g --request GET \ 'https://api.stream.estate/documents/properties?includedDepartments[]=departments/77&fromDate=2020-01-10&propertyTypes[]=1&transactionType=0&withCoherentPrice=true&budgetMin=1800000&budgetMax=1900000' \ --header 'Content-Type: application/json' \ --header 'X-API-KEY: ' ``` ```javascript Node.js theme={null} // Node.js 18+ (native fetch) const params = new URLSearchParams({ "includedDepartments[]": "departments/77", fromDate: "2020-01-10", "propertyTypes[]": "1", transactionType: "0", withCoherentPrice: "true", budgetMin: "1800000", budgetMax: "1900000", }); const res = await fetch( `https://api.stream.estate/documents/properties?${params}`, { headers: { "Content-Type": "application/json", "X-API-KEY": process.env.STREAM_ESTATE_KEY, }, } ); if (!res.ok) throw new Error(`Stream Estate API: ${res.status}`); const data = await res.json(); console.log(data["hydra:member"]); ``` A successful response is a [Hydra](https://www.hydra-cg.com/) collection: matching properties are in `hydra:member`, and `hydra:totalItems` holds the total count. See the [Properties reference](/api-reference/endpoint/properties/get_collection) for the full response shape. ## Understand the parameters The example above uses only documented enum values: | Parameter | Value | Meaning | | ------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `propertyTypes[]` | `1` | House — Apartment `0`, House `1`, Building `2`, Parking `3`, Office `4`, Land `5`, Shop `6` | | `transactionType` | `0` | Sell `0`, Rent `1` | | `includedDepartments[]` | `departments/77` | Restrict to a department — get ids from [Locations](/api-reference/endpoint/indicators/locations) | | `withCoherentPrice` | `true` | `true` keeps coherent prices, `false` keeps incoherent ones (both also include unassessed listings) — `null`/empty disables the filter, omitted defaults to `true` | | `budgetMin` / `budgetMax` | `1800000` / `1900000` | Budget range, in euros | The [Properties reference](/api-reference/endpoint/properties/get_collection) lists every available filter. ## Next steps Properties, adverts, events, searches, and webhooks explained. How to create and use your API key. Every filter available on the properties endpoint. Get notified in real time when new properties match a saved search.