{"openapi":"3.1.0","info":{"title":"Fimacode API","description":"Cyprus property data: homes for sale and rent from the main property sites, read every day and merged so one home is one property. Search offers, follow prices, read statistics by area, value a home from comparable offers, and get webhooks when something new matches.\n\nSend your key in the `X-API-Key` header. Every answer is `{\"success\": true, \"data\": …, \"meta\": {…}}`. Asking prices are shown as published; a home price that cannot be real is left out of `status=active` searches and every statistic, and comes back flagged `price_suspect` with `status=any` or by id.\n\nStart here: https://api.fimacode.com/","version":"1.0.0"},"servers":[{"url":"https://api.fimacode.com","description":"Production"}],"paths":{"/api/v1/listings":{"get":{"tags":["Listings"],"summary":"Search listings","description":"Search offers. Each row is one site's offer; `property_id` groups the same home.\n\n`meta.total` is shared by every page and sort of the same filters and may trail the\nrows by up to a minute, the same time the answer may be cached by the client.\n\nTo read on, send `meta.next_cursor` back as `cursor` with the same filters and sort.\nUnlike `page`, it continues right after the last row served, so offers added or\nchanged in between neither repeat nor go missing.","operationId":"searchListings","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":false,"schema":{"anyOf":[{"enum":["sale","rent"],"type":"string"},{"type":"null"}],"title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"area","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":10},{"type":"null"}],"description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them.","title":"Area"},"description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["buysellcyprus","bazaraki","indexcy","homecy"],"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"status","in":"query","required":false,"schema":{"enum":["active","removed","any"],"type":"string","default":"active","title":"Status"}},{"name":"updated_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Since"}},{"name":"price_change","in":"query","required":false,"schema":{"anyOf":[{"enum":["reduced","increased","any"],"type":"string"},{"type":"null"}],"title":"Price Change"}},{"name":"price_changed_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed Since"}},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Price"}},{"name":"min_sqm","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Sqm"}},{"name":"max_sqm","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Sqm"}},{"name":"price_vat","in":"query","required":false,"schema":{"anyOf":[{"enum":["included","excluded","not_applicable"],"type":"string"},{"type":"null"}],"title":"Price Vat"}},{"name":"min_construction_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1800},{"type":"null"}],"title":"Min Construction Year"}},{"name":"max_construction_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1800},{"type":"null"}],"title":"Max Construction Year"}},{"name":"min_floor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":-1},{"type":"null"}],"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match.","title":"Min Floor"},"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},{"name":"max_floor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":-1},{"type":"null"}],"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match.","title":"Max Floor"},"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},{"name":"sea_view","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422.","title":"Sea View"},"description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},{"name":"pool","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","private","communal"],"type":"string"},{"type":"null"}],"description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind.","title":"Pool"},"description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind."},{"name":"elevator","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422.","title":"Elevator"},"description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},{"name":"parking","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","covered"],"type":"string"},{"type":"null"}],"description":"yes: any parking the site states; covered: only covered parking.","title":"Parking"},"description":"yes: any parking the site states; covered: only covered parking."},{"name":"furnished","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","no"],"type":"string"},{"type":"null"}],"description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither.","title":"Furnished"},"description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither."},{"name":"title_deed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither.","title":"Title Deed"},"description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither."},{"name":"min_energy_class","in":"query","required":false,"schema":{"anyOf":[{"enum":["A+","A","B+","B","C","D","E","F","G"],"type":"string"},{"type":"null"}],"description":"Energy certificate class at least this good (A+ is best, G worst).","title":"Min Energy Class"},"description":"Energy certificate class at least this good (A+ is best, G worst)."},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":50,"exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}},{"name":"min_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Min Lat"}},{"name":"min_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Min Lon"}},{"name":"max_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Max Lat"}},{"name":"max_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Max Lon"}},{"name":"polygon","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":2000},{"type":"null"}],"title":"Polygon"}},{"name":"group","in":"query","required":false,"schema":{"enum":["offer","home"],"type":"string","description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers.","default":"offer","title":"Group"},"description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers."},{"name":"sort","in":"query","required":false,"schema":{"enum":["newest","updated_asc","updated_desc","price_asc","price_desc","price_per_sqm_asc","price_per_sqm_desc","price_changed_desc","price_change_pct_asc"],"type":"string","default":"newest","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":500},{"type":"null"}],"title":"Cursor"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_ListingSummary__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/listings/map":{"get":{"tags":["Listings"],"summary":"Search results on a map","description":"The search's offers inside the map's view, grouped into markers for the zoom.\n\nTakes every filter of `GET /listings` plus the view (`west`, `south`, `east`,\n`north`) and `zoom`. Pins closer than about 60 pixels share a marker with their count\nand lowest price; a marker of one offer carries its `listing_id`. Only offers whose\nsite shows a pin are drawn; `unpinned` counts the matches placed only by area.","operationId":"listingMap","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":false,"schema":{"anyOf":[{"enum":["sale","rent"],"type":"string"},{"type":"null"}],"title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"area","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":10},{"type":"null"}],"description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them.","title":"Area"},"description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them."},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"enum":["buysellcyprus","bazaraki","indexcy","homecy"],"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"status","in":"query","required":false,"schema":{"enum":["active","removed","any"],"type":"string","default":"active","title":"Status"}},{"name":"updated_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Since"}},{"name":"price_change","in":"query","required":false,"schema":{"anyOf":[{"enum":["reduced","increased","any"],"type":"string"},{"type":"null"}],"title":"Price Change"}},{"name":"price_changed_since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed Since"}},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"}},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Price"}},{"name":"min_sqm","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Sqm"}},{"name":"max_sqm","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Sqm"}},{"name":"price_vat","in":"query","required":false,"schema":{"anyOf":[{"enum":["included","excluded","not_applicable"],"type":"string"},{"type":"null"}],"title":"Price Vat"}},{"name":"min_construction_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1800},{"type":"null"}],"title":"Min Construction Year"}},{"name":"max_construction_year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2100,"minimum":1800},{"type":"null"}],"title":"Max Construction Year"}},{"name":"min_floor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":-1},{"type":"null"}],"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match.","title":"Min Floor"},"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},{"name":"max_floor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":-1},{"type":"null"}],"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match.","title":"Max Floor"},"description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},{"name":"sea_view","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422.","title":"Sea View"},"description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},{"name":"pool","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","private","communal"],"type":"string"},{"type":"null"}],"description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind.","title":"Pool"},"description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind."},{"name":"elevator","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422.","title":"Elevator"},"description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},{"name":"parking","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","covered"],"type":"string"},{"type":"null"}],"description":"yes: any parking the site states; covered: only covered parking.","title":"Parking"},"description":"yes: any parking the site states; covered: only covered parking."},{"name":"furnished","in":"query","required":false,"schema":{"anyOf":[{"enum":["yes","no"],"type":"string"},{"type":"null"}],"description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither.","title":"Furnished"},"description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither."},{"name":"title_deed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither.","title":"Title Deed"},"description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither."},{"name":"min_energy_class","in":"query","required":false,"schema":{"anyOf":[{"enum":["A+","A","B+","B","C","D","E","F","G"],"type":"string"},{"type":"null"}],"description":"Energy certificate class at least this good (A+ is best, G worst).","title":"Min Energy Class"},"description":"Energy certificate class at least this good (A+ is best, G worst)."},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":50,"exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}},{"name":"min_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Min Lat"}},{"name":"min_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Min Lon"}},{"name":"max_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Max Lat"}},{"name":"max_lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Max Lon"}},{"name":"polygon","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":2000},{"type":"null"}],"title":"Polygon"}},{"name":"group","in":"query","required":false,"schema":{"enum":["offer","home"],"type":"string","description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers.","default":"offer","title":"Group"},"description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers."},{"name":"sort","in":"query","required":false,"schema":{"enum":["newest","updated_asc","updated_desc","price_asc","price_desc","price_per_sqm_asc","price_per_sqm_desc","price_changed_desc","price_change_pct_asc"],"type":"string","default":"newest","title":"Sort"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":500},{"type":"null"}],"title":"Cursor"}},{"name":"zoom","in":"query","required":true,"schema":{"type":"integer","maximum":18,"minimum":7,"title":"Zoom"}},{"name":"west","in":"query","required":true,"schema":{"type":"number","maximum":35.7,"minimum":31.200000000000003,"title":"West"}},{"name":"south","in":"query","required":true,"schema":{"type":"number","maximum":36.8,"minimum":33.4,"title":"South"}},{"name":"east","in":"query","required":true,"schema":{"type":"number","maximum":35.7,"minimum":31.200000000000003,"title":"East"}},{"name":"north","in":"query","required":true,"schema":{"type":"number","maximum":36.8,"minimum":33.4,"title":"North"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ListingMap_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/listings/{listing_id}":{"get":{"tags":["Listings"],"summary":"Get one listing","description":"One offer with its description, photos, and price history.","operationId":"getListing","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"listing_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Listing Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_ListingDetail_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"No listing has this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/properties/{property_id}":{"get":{"tags":["Properties"],"summary":"Get a property with all its offers","description":"One physical home and every offer for it, so prices can be compared across sites.\n\nTakes any `property_id` from a listing. An offer not matched to others yet is its own\nhome under its listing id; once linked, that id answers with the linked home.","operationId":"getProperty","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PropertyDetail_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"No property has this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/properties/{property_id}/price-history":{"get":{"tags":["Properties"],"summary":"Price history of a property","description":"Every price a home showed across all its offers, oldest first, with the link certainty.","operationId":"getPriceHistory","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_PropertyPricePoint__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"No property has this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/properties/{property_id}/valuation":{"get":{"tags":["Valuation"],"summary":"Valuate a known property","description":"Estimate a known home's value from comparable offers, leaving out its own.","operationId":"valuateProperty","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"property_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Property Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_Valuation_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"No property has this id, or too few comparable offers exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/valuation":{"get":{"tags":["Valuation"],"summary":"Valuate a described home","description":"Estimate a value from comparable active offers for the property described.","operationId":"valuate","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":true,"schema":{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string","title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"}},{"name":"sqm","in":"query","required":true,"schema":{"anyOf":[{"type":"number","maximum":10000000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Sqm"}},{"name":"bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Bedrooms"}},{"name":"floor","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":60,"minimum":-1},{"type":"null"}],"description":"The subject's floor: 0 is the ground floor, -1 a basement. Comps within one floor of it are listed first and compared apart in `features`; the estimate still rests on every comp.","title":"Floor"},"description":"The subject's floor: 0 is the ground floor, -1 a basement. Comps within one floor of it are listed first and compared apart in `features`; the estimate still rests on every comp."},{"name":"sea_view","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Whether the subject sees the sea. Comps alike are listed first and compared apart in `features`; the estimate still rests on every comp. Sites state a sea view but never its absence, so `false` is compared with comps that do not mention one.","title":"Sea View"},"description":"Whether the subject sees the sea. Comps alike are listed first and compared apart in `features`; the estimate still rests on every comp. Sites state a sea view but never its absence, so `false` is compared with comps that do not mention one."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_Valuation_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"Too few comparable offers exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/sources":{"get":{"tags":["Sources"],"summary":"Collected sites and data coverage","description":"The collected sites: listing counts, when each was last read, and field coverage.\n\n`completeness` shows what share of a site's active listings carry a price, size,\nbedrooms, and a map point, overall and per property type, so a client knows which\nfields it can rely on from each source.","operationId":"sources","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_SourceSummary__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/stats/point":{"get":{"tags":["Statistics"],"summary":"Price levels around a point on the map","description":"Asking-price percentiles inside a circle on the map, for offers with a site pin.","operationId":"pointStats","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":35.8,"minimum":34.4,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":34.7,"minimum":32.2,"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"type":"number","maximum":10,"exclusiveMinimum":0,"default":1.0,"title":"Radius Km"}},{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"min_properties","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":5,"title":"Min Properties"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PointStats_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"Too few properties with a map pin lie in the circle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/stats/areas":{"get":{"tags":["Statistics"],"summary":"Price levels by area","description":"Asking-price percentiles per area. A home listed several times counts once.","operationId":"areaStats","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"group_by","in":"query","required":false,"schema":{"enum":["district","municipality","quarter"],"type":"string","default":"district","title":"Group By"}},{"name":"min_properties","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":5,"title":"Min Properties"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_AreaStats__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/stats/areas/trends":{"get":{"tags":["Statistics"],"summary":"Price trends by area","description":"A median asking-price line per area, one point per month or quarter.\n\nEach point counts live offers, not deduplicated homes: a home on several sites is\ncounted on each, because every agency keeps its own price line. `coverage_start` is\nwhen price collection began; periods before it return no point, and the newest point\ncovers the current period only up to now.","operationId":"areaTrends","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"group_by","in":"query","required":false,"schema":{"enum":["district","municipality","quarter"],"type":"string","default":"district","title":"Group By"}},{"name":"min_properties","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":5,"title":"Min Properties"}},{"name":"interval","in":"query","required":false,"schema":{"enum":["week","month","quarter"],"type":"string","default":"month","title":"Interval"}},{"name":"periods","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":2,"default":12,"title":"Periods"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_AreaTrend__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/stats/areas/yield":{"get":{"tags":["Statistics"],"summary":"Gross rental yield by area","description":"Gross rental yield per area: a year of rent over the sale price, per m².","operationId":"areaYield","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":false,"schema":{"anyOf":[{"enum":["sale","rent"],"type":"string"},{"type":"null"}],"title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"group_by","in":"query","required":false,"schema":{"enum":["district","municipality","quarter"],"type":"string","default":"district","title":"Group By"}},{"name":"min_properties","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":5,"title":"Min Properties"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_AreaYield__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/stats/areas/activity":{"get":{"tags":["Statistics"],"summary":"Market activity by area","description":"Live stock, fresh offers, removals, and time on market per area.","operationId":"areaActivity","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"group_by","in":"query","required":false,"schema":{"enum":["district","municipality","quarter"],"type":"string","default":"district","title":"Group By"}},{"name":"min_properties","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":5,"title":"Min Properties"}},{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_AreaActivity__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/stats/distribution":{"get":{"tags":["Statistics"],"summary":"Price histogram for an area or a circle","description":"A price histogram over the filtered properties, each counted once.","operationId":"priceDistribution","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"}},{"name":"lon","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"}},{"name":"radius_km","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":10,"exclusiveMinimum":0},{"type":"null"}],"title":"Radius Km"}},{"name":"purpose","in":"query","required":true,"schema":{"enum":["sale","rent"],"type":"string","title":"Purpose"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["Apartment","House","Land","Office","Commercial","Building","Shop"],"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"district","in":"query","required":false,"schema":{"anyOf":[{"enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"],"type":"string"},{"type":"null"}],"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English.","title":"District"},"description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},{"name":"municipality","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names.","title":"Municipality"},"description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},{"name":"quarter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":120},{"type":"null"}],"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names.","title":"Quarter"},"description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},{"name":"min_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Min Bedrooms"}},{"name":"max_bedrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":0},{"type":"null"}],"title":"Max Bedrooms"}},{"name":"build_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["new","under_construction","off_plan","resale"],"type":"string"},"minItems":1,"maxItems":4},{"type":"null"}],"title":"Build Status"}},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":2,"default":10,"title":"Buckets"}},{"name":"tail_pct","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":1,"title":"Tail Pct"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_PriceDistribution_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}}}}},"/api/v1/alerts":{"get":{"tags":["Alerts"],"summary":"List alerts","description":"List the calling key's alerts, newest first.","operationId":"listAlerts","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_list_AlertOut__"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}]},"post":{"tags":["Alerts"],"summary":"Create an alert","description":"Save a saved-search alert and return it with its one-time signing secret.\n\nThe signing secret is shown only in this response. Store it: the webhook signature\non each delivery is an HMAC-SHA256 keyed by it.","operationId":"createAlert","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AlertCreated_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"403":{"description":"The plan's alert limit is reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}]}},"/api/v1/alerts/{alert_id}":{"get":{"tags":["Alerts"],"summary":"Get an alert","description":"Read one of the calling key's alerts.","operationId":"getAlert","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AlertOut_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"The calling key has no alert with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Alerts"],"summary":"Update an alert","description":"Change an alert's name, webhook, delivery, filters, or active state.","operationId":"updateAlert","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Alert Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AlertOut_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"The calling key has no alert with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Alerts"],"summary":"Delete an alert","description":"Delete one of the calling key's alerts.","operationId":"deleteAlert","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Alert Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The per-minute rate limit or the daily quota is used up.","headers":{"Retry-After":{"description":"Seconds until the call may be retried.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Calls allowed per minute on this plan.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Calls left in the current minute.","schema":{"type":"integer"}},"X-Quota-Limit":{"description":"Calls allowed per UTC day on this plan.","schema":{"type":"integer"}},"X-Quota-Remaining":{"description":"Calls left today.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"The calling key has no alert with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/v1/alerts/{alert_id}/test":{"post":{"tags":["Alerts"],"summary":"Send a test delivery","description":"POST the alert's latest matches to its webhook now, signed like a real delivery.\n\nThe body is an ordinary delivery with `test: true` and up to three of the newest\nmatching offers, so the receiving code and its signature check can be tried without\nwaiting for a new listing. It is sent once, and the answer says whether the webhook\ntook it. The alert itself is unchanged: what it sends next, and its failure count,\nstay as they were.","operationId":"testAlert","security":[{"HTTPBearer":[]},{"APIKeyHeader":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope_AlertTestResult_"}}}},"401":{"description":"The API key is missing or not valid.","headers":{"WWW-Authenticate":{"description":"Bearer","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"A test of this alert was sent seconds ago.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"A backing service is briefly unavailable. Retry after a short wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"A path, query, or body field is not valid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationErrorResponse"}}}},"404":{"description":"The calling key has no alert with this id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AlertCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"webhook_url":{"type":"string","maxLength":2000,"minLength":1,"title":"Webhook Url"},"delivery":{"type":"string","enum":["immediate","daily"],"title":"Delivery","default":"immediate"},"filters":{"$ref":"#/components/schemas/ListingFilters-Input"}},"additionalProperties":false,"type":"object","required":["name","webhook_url"],"title":"AlertCreate","description":"Create a saved search that posts matches to a webhook."},"AlertCreated":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"webhook_url":{"type":"string","title":"Webhook Url"},"delivery":{"type":"string","enum":["immediate","daily"],"title":"Delivery"},"filters":{"$ref":"#/components/schemas/ListingFilters-Output"},"is_active":{"type":"boolean","title":"Is Active"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"last_delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"webhook_secret":{"type":"string","title":"Webhook Secret"}},"type":"object","required":["id","name","webhook_url","delivery","filters","is_active","last_checked_at","last_delivered_at","created_at","webhook_secret"],"title":"AlertCreated","description":"The create response. Carries the signing secret, shown only this once."},"AlertOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"webhook_url":{"type":"string","title":"Webhook Url"},"delivery":{"type":"string","enum":["immediate","daily"],"title":"Delivery"},"filters":{"$ref":"#/components/schemas/ListingFilters-Output"},"is_active":{"type":"boolean","title":"Is Active"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"last_delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Delivered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","webhook_url","delivery","filters","is_active","last_checked_at","last_delivered_at","created_at"],"title":"AlertOut","description":"An alert as returned to its owner. The signing secret is never included here."},"AlertTestResult":{"properties":{"delivered":{"type":"boolean","title":"Delivered","description":"The webhook answered with a 2xx status."},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"The webhook's HTTP status. Null when it never answered."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Why it was not delivered, when not."},"count":{"type":"integer","title":"Count","description":"Listings in the test payload: the latest matches, up to 3."}},"type":"object","required":["delivered","count"],"title":"AlertTestResult","description":"What happened when a test delivery was POSTed to the alert's webhook."},"AlertUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"webhook_url":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Webhook Url"},"delivery":{"anyOf":[{"type":"string","enum":["immediate","daily"]},{"type":"null"}],"title":"Delivery"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"filters":{"anyOf":[{"$ref":"#/components/schemas/ListingFilters-Input"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"AlertUpdate","description":"Change parts of an alert. Omitted fields are left as they are."},"AreaActivity":{"properties":{"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"active":{"type":"integer","title":"Active"},"new_in_window":{"type":"integer","title":"New In Window"},"removed_in_window":{"type":"integer","title":"Removed In Window"},"median_days_on_market":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Median Days On Market"},"price_cuts_in_window":{"type":"integer","title":"Price Cuts In Window","default":0},"median_price_cut_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Median Price Cut Pct"}},"type":"object","required":["district","active","new_in_window","removed_in_window","median_days_on_market"],"title":"AreaActivity","description":"How busy one area is: live stock, fresh offers, removals, and time to sell."},"AreaStats":{"properties":{"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"properties":{"type":"integer","title":"Properties"},"median_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Price"},"p25_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"P25 Price"},"p75_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"P75 Price"},"median_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Median Price Per Sqm"}},"type":"object","required":["district","properties","median_price","p25_price","p75_price","median_price_per_sqm"],"title":"AreaStats","description":"Asking prices in one area. Each property counts once, at its lowest active price."},"AreaTrend":{"properties":{"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"coverage_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Coverage Start"},"points":{"items":{"$ref":"#/components/schemas/TrendPoint"},"type":"array","title":"Points"}},"type":"object","required":["district","coverage_start","points"],"title":"AreaTrend","description":"How one area's median asking price moved, period by period."},"AreaYield":{"properties":{"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"sale_properties":{"type":"integer","title":"Sale Properties"},"rent_properties":{"type":"integer","title":"Rent Properties"},"median_sale_price_per_sqm":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Sale Price Per Sqm"},"median_rent_per_sqm":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Rent Per Sqm"},"gross_yield_pct":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Gross Yield Pct"}},"type":"object","required":["district","sale_properties","rent_properties","median_sale_price_per_sqm","median_rent_per_sqm","gross_yield_pct"],"title":"AreaYield","description":"Gross rental yield in one area: a year of rent over the sale price, per m²."},"Completeness":{"properties":{"active_listings":{"type":"integer","title":"Active Listings"},"price_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Pct"},"sqm_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sqm Pct"},"bedrooms_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Bedrooms Pct"},"location_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Location Pct"},"site_pin_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Site Pin Pct"}},"type":"object","required":["active_listings","price_pct","sqm_pct","bedrooms_pct","location_pct","site_pin_pct"],"title":"Completeness","description":"Share of active listings, in percent, that carry each field; null when none apply.\n\n`bedrooms_pct` counts apartments and houses only. `location_pct` is any map point;\n`site_pin_pct` is the part placed by the site itself, exact or blurred, while the rest\nsit at the centre of their quarter or municipality."},"Envelope_AlertCreated_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/AlertCreated"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[AlertCreated]"},"Envelope_AlertOut_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/AlertOut"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[AlertOut]"},"Envelope_AlertTestResult_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/AlertTestResult"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[AlertTestResult]"},"Envelope_ListingDetail_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/ListingDetail"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[ListingDetail]"},"Envelope_ListingMap_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/ListingMap"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[ListingMap]"},"Envelope_PointStats_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/PointStats"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[PointStats]"},"Envelope_PriceDistribution_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/PriceDistribution"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[PriceDistribution]"},"Envelope_PropertyDetail_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/PropertyDetail"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[PropertyDetail]"},"Envelope_Valuation_":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"$ref":"#/components/schemas/Valuation"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[Valuation]"},"Envelope_list_AlertOut__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/AlertOut"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[AlertOut]]"},"Envelope_list_AreaActivity__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/AreaActivity"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[AreaActivity]]"},"Envelope_list_AreaStats__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/AreaStats"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[AreaStats]]"},"Envelope_list_AreaTrend__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/AreaTrend"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[AreaTrend]]"},"Envelope_list_AreaYield__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/AreaYield"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[AreaYield]]"},"Envelope_list_ListingSummary__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/ListingSummary"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[ListingSummary]]"},"Envelope_list_PropertyPricePoint__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/PropertyPricePoint"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[PropertyPricePoint]]"},"Envelope_list_SourceSummary__":{"properties":{"success":{"type":"boolean","title":"Success"},"data":{"items":{"$ref":"#/components/schemas/SourceSummary"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"Envelope[list[SourceSummary]]"},"ErrorMessage":{"properties":{"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"ErrorMessage","description":"What went wrong, in one sentence."},"ErrorResponse":{"properties":{"success":{"type":"boolean","const":false,"title":"Success"},"data":{"$ref":"#/components/schemas/ErrorMessage"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"ErrorResponse","description":"Body of every error except 422: `success` is false and `data.message` says why."},"FeatureSplit":{"properties":{"feature":{"type":"string","enum":["sea_view","floor"],"title":"Feature"},"alike":{"type":"integer","title":"Alike"},"alike_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Alike Price Per Sqm"},"alike_estimate":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Alike Estimate"},"other":{"type":"integer","title":"Other"},"other_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Other Price Per Sqm"}},"type":"object","required":["feature","alike","alike_price_per_sqm","alike_estimate","other","other_price_per_sqm"],"title":"FeatureSplit","description":"The estimate's comps split by one feature of the subject, each side's median per m².\n\n`alike` share the subject's feature: a stated sea view (or none mentioned, for a\nsubject without one), or a stated floor within one of the subject's. `other` are the\nrest; for the floor, a comp that states no floor is on neither side. A median and an\nestimate are given only for a side with at least five comps."},"FieldError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Loc"},"msg":{"type":"string","title":"Msg"}},"type":"object","required":["loc","msg"],"title":"FieldError","description":"One refused field: where it sits in the request and why. The value is not echoed."},"FieldErrors":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/FieldError"},"type":"array","title":"Errors"}},"type":"object","required":["errors"],"title":"FieldErrors","description":"Every refused field of one request."},"ListingDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_id":{"type":"string","format":"uuid","title":"Property Id"},"match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Level"},"source":{"type":"string","title":"Source"},"source_url":{"type":"string","title":"Source Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"purpose":{"type":"string","title":"Purpose"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"previous_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Previous Price"},"price_change":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Change"},"price_change_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Change Pct"},"price_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed At"},"currency":{"type":"string","title":"Currency"},"price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Per Sqm"},"internal_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Internal Price Per Sqm"},"sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sqm"},"sqm_from_description":{"type":"boolean","title":"Sqm From Description"},"sqm_basis":{"anyOf":[{"type":"string","enum":["covered","internal","plot","unspecified","description"]},{"type":"null"}],"title":"Sqm Basis","description":"Which of the site's fields `sqm` is. `covered`: the site's covered or total covered area (INDEX, Home.cy, BuySell); whether covered verandas are in it is the agent's choice. `internal`: the site gives only the internal area. `plot`: land. `unspecified`: a size field that does not say which, Bazaraki's \"Property area\". `description`: the site's size was missing or impossible and the indoor area stated in the text is used. Null when `sqm` is null."},"internal_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Internal Sqm","description":"The site's own internal area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"covered_veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Covered Veranda Sqm","description":"The site's own covered veranda area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"uncovered_veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Uncovered Veranda Sqm","description":"The site's own uncovered veranda area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Veranda Sqm","description":"The site's own veranda area, when it does not say covered or uncovered (BuySell) field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"plot_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Plot Sqm","description":"The site's own plot area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"build_status":{"anyOf":[{"type":"string","enum":["new","under_construction","off_plan","resale"]},{"type":"null"}],"title":"Build Status"},"price_vat":{"anyOf":[{"type":"string","enum":["included","excluded","not_applicable"]},{"type":"null"}],"title":"Price Vat"},"construction_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Construction Year"},"floor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floor"},"pool":{"anyOf":[{"type":"string","enum":["private","communal","yes","no"]},{"type":"null"}],"title":"Pool"},"elevator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevator"},"parking":{"anyOf":[{"type":"string","enum":["covered","uncovered","yes","no"]},{"type":"null"}],"title":"Parking"},"sea_view":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sea View"},"furnished":{"anyOf":[{"type":"string","enum":["full","partial","appliances","optional","none"]},{"type":"null"}],"title":"Furnished"},"title_deed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Title Deed"},"energy_class":{"anyOf":[{"type":"string","enum":["A+","A","B+","B","C","D","E","F","G"]},{"type":"null"}],"title":"Energy Class"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}]},"agency_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Name"},"seller_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Type"},"status":{"type":"string","title":"Status"},"published_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published On"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"on_market_since":{"type":"string","format":"date-time","title":"On Market Since"},"on_market_since_known":{"type":"boolean","title":"On Market Since Known","default":true},"days_on_market":{"type":"integer","title":"Days On Market"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"flags":{"items":{"type":"string"},"type":"array","title":"Flags","description":"Doubts to check before leaning on this row; the data stays as the site states it. `studio_in_text`: the title calls the home a studio while the site's bedroom field says one or more. `build_status_conflict`: the site's condition field and the description disagree; `build_status` keeps the site's field. `quarter_from_point`: the site named no quarter, and `quarter` is the official one its own map pin falls in. `place_from_description`: the site gave the district alone, and the place is the one the description's opening line names. `place_from_link`: the site gave the district alone, and the place is the one every offer of the same home on another site names. `construction_year_expected`: the home is under construction or off-plan, so `construction_year` is the year it is due. `price_suspect`: a home's price no such home can have (a sale under €10,000, a rent over €50,000 a month), most often a rent posted as a sale or a typo. `price_per_sqm_suspect`: price and size give a price per m² no home has (for sale €300 to €35,000, to rent €2 to €250 a month), so one of them is wrong; `price_per_sqm` is empty. A live offer whose price cannot be real (`price_suspect`, or a rent over €250 per m² a month, a season's or a year's) is left out of searches, maps, statistics and valuations, and comes back when its site corrects it; `GET /listings/{id}` still returns it."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"amenities":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Amenities"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"},"price_history":{"items":{"$ref":"#/components/schemas/PricePoint"},"type":"array","title":"Price History"}},"type":"object","required":["id","property_id","match_level","source","source_url","title","purpose","property_type","price","previous_price","price_change","price_change_pct","price_changed_at","currency","price_per_sqm","sqm","sqm_from_description","sqm_basis","internal_sqm","covered_veranda_sqm","uncovered_veranda_sqm","veranda_sqm","plot_sqm","bedrooms","bathrooms","build_status","price_vat","construction_year","floor","pool","elevator","parking","sea_view","furnished","title_deed","energy_class","district","municipality","quarter","location","agency_name","seller_type","status","published_on","first_seen_at","last_seen_at","on_market_since","days_on_market","updated_at","image_url","description","amenities","image_urls","price_history"],"title":"ListingDetail","description":"One offer with its full text, photos, and price history."},"ListingFilters-Input":{"properties":{"purpose":{"anyOf":[{"type":"string","enum":["sale","rent"]},{"type":"null"}],"title":"Purpose"},"property_type":{"anyOf":[{"type":"string","enum":["Apartment","House","Land","Office","Commercial","Building","Shop"]},{"type":"null"}],"title":"Property Type"},"district":{"anyOf":[{"type":"string","enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"]},{"type":"null"}],"title":"District","description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},"municipality":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Municipality","description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},"quarter":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Quarter","description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},"min_bedrooms":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Min Bedrooms"},"max_bedrooms":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Max Bedrooms"},"build_status":{"anyOf":[{"items":{"type":"string","enum":["new","under_construction","off_plan","resale"]},"type":"array","maxItems":4,"minItems":1},{"type":"null"}],"title":"Build Status"},"area":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1},{"type":"null"}],"title":"Area","description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them."},"source":{"anyOf":[{"type":"string","enum":["buysellcyprus","bazaraki","indexcy","homecy"]},{"type":"null"}],"title":"Source"},"status":{"type":"string","enum":["active","removed","any"],"title":"Status","default":"active"},"updated_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Since"},"price_change":{"anyOf":[{"type":"string","enum":["reduced","increased","any"]},{"type":"null"}],"title":"Price Change"},"price_changed_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed Since"},"min_price":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"},"max_price":{"anyOf":[{"type":"number","maximum":1000000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Price"},"min_sqm":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Sqm"},"max_sqm":{"anyOf":[{"type":"number","maximum":10000000.0,"minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Sqm"},"price_vat":{"anyOf":[{"type":"string","enum":["included","excluded","not_applicable"]},{"type":"null"}],"title":"Price Vat"},"min_construction_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1800.0},{"type":"null"}],"title":"Min Construction Year"},"max_construction_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1800.0},{"type":"null"}],"title":"Max Construction Year"},"min_floor":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":-1.0},{"type":"null"}],"title":"Min Floor","description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},"max_floor":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":-1.0},{"type":"null"}],"title":"Max Floor","description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},"sea_view":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sea View","description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},"pool":{"anyOf":[{"type":"string","enum":["yes","private","communal"]},{"type":"null"}],"title":"Pool","description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind."},"elevator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevator","description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},"parking":{"anyOf":[{"type":"string","enum":["yes","covered"]},{"type":"null"}],"title":"Parking","description":"yes: any parking the site states; covered: only covered parking."},"furnished":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}],"title":"Furnished","description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither."},"title_deed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Title Deed","description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither."},"min_energy_class":{"anyOf":[{"type":"string","enum":["A+","A","B+","B","C","D","E","F","G"]},{"type":"null"}],"title":"Min Energy Class","description":"Energy certificate class at least this good (A+ is best, G worst)."},"lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"},"radius_km":{"anyOf":[{"type":"number","maximum":50.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Radius Km"},"min_lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Min Lat"},"min_lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Min Lon"},"max_lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Max Lat"},"max_lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Max Lon"},"polygon":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Polygon"},"group":{"type":"string","enum":["offer","home"],"title":"Group","description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers.","default":"offer"},"sort":{"type":"string","enum":["newest","updated_asc","updated_desc","price_asc","price_desc","price_per_sqm_asc","price_per_sqm_desc","price_changed_desc","price_change_pct_asc"],"title":"Sort","default":"newest"},"page":{"type":"integer","minimum":1.0,"title":"Page","default":1},"per_page":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Per Page","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","title":"ListingFilters","description":"Query string of `GET /listings`."},"ListingFilters-Output":{"properties":{"purpose":{"anyOf":[{"type":"string","enum":["sale","rent"]},{"type":"null"}],"title":"Purpose"},"property_type":{"anyOf":[{"type":"string","enum":["Apartment","House","Land","Office","Commercial","Building","Shop"]},{"type":"null"}],"title":"Property Type"},"district":{"anyOf":[{"type":"string","enum":["Nicosia","Limassol","Larnaca","Paphos","Famagusta"]},{"type":"null"}],"title":"District","description":"One of the five districts, in Greek or Latin letters: Limassol, Lemesos, and Λεμεσός are the same. Answers always name it in English."},"municipality":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Municipality","description":"Municipality or community, in Greek or Latin letters and any common spelling: Limassol, Lemesos, and Λεμεσός find the same offers. An unknown name answers 422 with the likely names."},"quarter":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Quarter","description":"Quarter or known area inside `municipality`, in any common spelling: Agia Triada, Agia Trias, and Αγία Τριάδα are one quarter. An unknown name answers 422 with the likely names."},"min_bedrooms":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Min Bedrooms"},"max_bedrooms":{"anyOf":[{"type":"integer","maximum":50.0,"minimum":0.0},{"type":"null"}],"title":"Max Bedrooms"},"build_status":{"anyOf":[{"items":{"type":"string","enum":["new","under_construction","off_plan","resale"]},"type":"array","maxItems":4,"minItems":1},{"type":"null"}],"title":"Build Status"},"area":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1},{"type":"null"}],"title":"Area","description":"Several places at once, any of which matches, as `district|municipality|quarter`; repeat it up to 10 times: `area=Limassol|Germasogeia&area=Limassol|Agios Athanasios`. Leave out the parts you do not need: `area=Paphos`, `area=Limassol|Limassol|Neapolis`. Each part takes Greek or Latin letters: `area=Λεμεσός|Γερμασόγεια`. Use it instead of `district`, `municipality` and `quarter`, not with them."},"source":{"anyOf":[{"type":"string","enum":["buysellcyprus","bazaraki","indexcy","homecy"]},{"type":"null"}],"title":"Source"},"status":{"type":"string","enum":["active","removed","any"],"title":"Status","default":"active"},"updated_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Since"},"price_change":{"anyOf":[{"type":"string","enum":["reduced","increased","any"]},{"type":"null"}],"title":"Price Change"},"price_changed_since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed Since"},"min_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"},"max_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Price"},"min_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Sqm"},"max_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Max Sqm"},"price_vat":{"anyOf":[{"type":"string","enum":["included","excluded","not_applicable"]},{"type":"null"}],"title":"Price Vat"},"min_construction_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1800.0},{"type":"null"}],"title":"Min Construction Year"},"max_construction_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1800.0},{"type":"null"}],"title":"Max Construction Year"},"min_floor":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":-1.0},{"type":"null"}],"title":"Min Floor","description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},"max_floor":{"anyOf":[{"type":"integer","maximum":60.0,"minimum":-1.0},{"type":"null"}],"title":"Max Floor","description":"Floor of an apartment, office or shop: 0 is the ground floor, -1 a basement. Houses, land and listings that state no floor never match."},"sea_view":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sea View","description":"true: the site says the home sees the sea. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},"pool":{"anyOf":[{"type":"string","enum":["yes","private","communal"]},{"type":"null"}],"title":"Pool","description":"yes: any pool the site states (private, communal, or of unstated kind); private or communal: only that kind."},"elevator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevator","description":"true: the site says the home has a lift. Sites state this only when it is there, never its absence, so `false` would always find nothing and is refused with 422."},"parking":{"anyOf":[{"type":"string","enum":["yes","covered"]},{"type":"null"}],"title":"Parking","description":"yes: any parking the site states; covered: only covered parking."},"furnished":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}],"title":"Furnished","description":"yes: fully or partly furnished. no: unfurnished or appliances only. Listings that say nothing match neither."},"title_deed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Title Deed","description":"true: the site says the home has its title deed. false: the site says it does not. Listings that say nothing match neither."},"min_energy_class":{"anyOf":[{"type":"string","enum":["A+","A","B+","B","C","D","E","F","G"]},{"type":"null"}],"title":"Min Energy Class","description":"Energy certificate class at least this good (A+ is best, G worst)."},"lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Lon"},"radius_km":{"anyOf":[{"type":"number","maximum":50.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Radius Km"},"min_lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Min Lat"},"min_lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Min Lon"},"max_lat":{"anyOf":[{"type":"number","maximum":35.8,"minimum":34.4},{"type":"null"}],"title":"Max Lat"},"max_lon":{"anyOf":[{"type":"number","maximum":34.7,"minimum":32.2},{"type":"null"}],"title":"Max Lon"},"polygon":{"anyOf":[{"type":"string","maxLength":2000,"minLength":1},{"type":"null"}],"title":"Polygon"},"group":{"type":"string","enum":["offer","home"],"title":"Group","description":"`offer`: one row per site's offer, so a home on three sites is three rows. `home`: one row per home, its cheapest live offer; `property_id` and `GET /properties/{id}` give the others, and `meta.total` counts homes. More than six live sale offers of homes with one place, type, bedroom count, price and size (usually a development's units) are one row too. Applies to live offers (`status=active`) without `source`; otherwise rows are offers.","default":"offer"},"sort":{"type":"string","enum":["newest","updated_asc","updated_desc","price_asc","price_desc","price_per_sqm_asc","price_per_sqm_desc","price_changed_desc","price_change_pct_asc"],"title":"Sort","default":"newest"},"page":{"type":"integer","minimum":1.0,"title":"Page","default":1},"per_page":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Per Page","default":20},"cursor":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Cursor"}},"additionalProperties":false,"type":"object","title":"ListingFilters","description":"Query string of `GET /listings`."},"ListingMap":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/MapCluster"},"type":"array","title":"Clusters"},"in_view":{"type":"integer","title":"In View"},"pinned":{"type":"integer","title":"Pinned"},"unpinned":{"type":"integer","title":"Unpinned"}},"type":"object","required":["clusters","in_view","pinned","unpinned"],"title":"ListingMap","description":"The search's offers on the map. Only offers whose site shows a map pin are drawn;\na quarter or municipality centre is the middle of an area, not the house, so\n`unpinned` counts the matches that are in the list but not on the map."},"ListingSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_id":{"type":"string","format":"uuid","title":"Property Id"},"match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Level"},"source":{"type":"string","title":"Source"},"source_url":{"type":"string","title":"Source Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"purpose":{"type":"string","title":"Purpose"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"previous_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Previous Price"},"price_change":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Change"},"price_change_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Change Pct"},"price_changed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Price Changed At"},"currency":{"type":"string","title":"Currency"},"price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Per Sqm"},"internal_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Internal Price Per Sqm"},"sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sqm"},"sqm_from_description":{"type":"boolean","title":"Sqm From Description"},"sqm_basis":{"anyOf":[{"type":"string","enum":["covered","internal","plot","unspecified","description"]},{"type":"null"}],"title":"Sqm Basis","description":"Which of the site's fields `sqm` is. `covered`: the site's covered or total covered area (INDEX, Home.cy, BuySell); whether covered verandas are in it is the agent's choice. `internal`: the site gives only the internal area. `plot`: land. `unspecified`: a size field that does not say which, Bazaraki's \"Property area\". `description`: the site's size was missing or impossible and the indoor area stated in the text is used. Null when `sqm` is null."},"internal_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Internal Sqm","description":"The site's own internal area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"covered_veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Covered Veranda Sqm","description":"The site's own covered veranda area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"uncovered_veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Uncovered Veranda Sqm","description":"The site's own uncovered veranda area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"veranda_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Veranda Sqm","description":"The site's own veranda area, when it does not say covered or uncovered (BuySell) field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"plot_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Plot Sqm","description":"The site's own plot area field, in m². Null when the site has no such field; a size written only in the description is not copied here, so a number in this field is always one the site published as that field."},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"build_status":{"anyOf":[{"type":"string","enum":["new","under_construction","off_plan","resale"]},{"type":"null"}],"title":"Build Status"},"price_vat":{"anyOf":[{"type":"string","enum":["included","excluded","not_applicable"]},{"type":"null"}],"title":"Price Vat"},"construction_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Construction Year"},"floor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floor"},"pool":{"anyOf":[{"type":"string","enum":["private","communal","yes","no"]},{"type":"null"}],"title":"Pool"},"elevator":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Elevator"},"parking":{"anyOf":[{"type":"string","enum":["covered","uncovered","yes","no"]},{"type":"null"}],"title":"Parking"},"sea_view":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sea View"},"furnished":{"anyOf":[{"type":"string","enum":["full","partial","appliances","optional","none"]},{"type":"null"}],"title":"Furnished"},"title_deed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Title Deed"},"energy_class":{"anyOf":[{"type":"string","enum":["A+","A","B+","B","C","D","E","F","G"]},{"type":"null"}],"title":"Energy Class"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}]},"agency_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agency Name"},"seller_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seller Type"},"status":{"type":"string","title":"Status"},"published_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Published On"},"first_seen_at":{"type":"string","format":"date-time","title":"First Seen At"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"on_market_since":{"type":"string","format":"date-time","title":"On Market Since"},"on_market_since_known":{"type":"boolean","title":"On Market Since Known","default":true},"days_on_market":{"type":"integer","title":"Days On Market"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"flags":{"items":{"type":"string"},"type":"array","title":"Flags","description":"Doubts to check before leaning on this row; the data stays as the site states it. `studio_in_text`: the title calls the home a studio while the site's bedroom field says one or more. `build_status_conflict`: the site's condition field and the description disagree; `build_status` keeps the site's field. `quarter_from_point`: the site named no quarter, and `quarter` is the official one its own map pin falls in. `place_from_description`: the site gave the district alone, and the place is the one the description's opening line names. `place_from_link`: the site gave the district alone, and the place is the one every offer of the same home on another site names. `construction_year_expected`: the home is under construction or off-plan, so `construction_year` is the year it is due. `price_suspect`: a home's price no such home can have (a sale under €10,000, a rent over €50,000 a month), most often a rent posted as a sale or a typo. `price_per_sqm_suspect`: price and size give a price per m² no home has (for sale €300 to €35,000, to rent €2 to €250 a month), so one of them is wrong; `price_per_sqm` is empty. A live offer whose price cannot be real (`price_suspect`, or a rent over €250 per m² a month, a season's or a year's) is left out of searches, maps, statistics and valuations, and comes back when its site corrects it; `GET /listings/{id}` still returns it."}},"type":"object","required":["id","property_id","match_level","source","source_url","title","purpose","property_type","price","previous_price","price_change","price_change_pct","price_changed_at","currency","price_per_sqm","sqm","sqm_from_description","sqm_basis","internal_sqm","covered_veranda_sqm","uncovered_veranda_sqm","veranda_sqm","plot_sqm","bedrooms","bathrooms","build_status","price_vat","construction_year","floor","pool","elevator","parking","sea_view","furnished","title_deed","energy_class","district","municipality","quarter","location","agency_name","seller_type","status","published_on","first_seen_at","last_seen_at","on_market_since","days_on_market","updated_at","image_url"],"title":"ListingSummary","description":"One offer in a search result."},"Location":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"precision":{"type":"string","enum":["exact","approximate","quarter","municipality"],"title":"Precision"}},"type":"object","required":["lat","lon","precision"],"title":"Location","description":"Where the listing is on the map, and how closely.\n\n`exact` is the pin the site shows on the property. `approximate` is a pin the site\nblurred on purpose; how far it moves the point depends on the site. `quarter` and\n`municipality` are the centre of that area, used when the site publishes the name only."},"MapCluster":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"count":{"type":"integer","title":"Count"},"west":{"type":"number","title":"West"},"south":{"type":"number","title":"South"},"east":{"type":"number","title":"East"},"north":{"type":"number","title":"North"},"min_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Min Price"},"listing_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Listing Id"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"precision":{"anyOf":[{"type":"string","enum":["exact","approximate"]},{"type":"null"}],"title":"Precision"},"exact":{"type":"integer","title":"Exact","default":0},"reduced":{"type":"integer","title":"Reduced","default":0},"private":{"type":"integer","title":"Private","default":0}},"type":"object","required":["lat","lon","count","west","south","east","north","min_price"],"title":"MapCluster","description":"Offers whose site pins lie close together at this zoom, drawn as one marker.\n\nA marker of one offer carries its `listing_id`, `price`, and `precision`; a group\ncarries its size and lowest price, and opens when the map zooms in. `west`...`north`\nis the grid cell the marker gathers: send it as `min_lon`... to list its offers.\n`exact` counts the offers whose site pins the property itself; the rest are blurred.\n`reduced` counts the offers whose latest price is below the one before it, and\n`private` the offers a private seller posted, as the site marks them."},"Meta":{"additionalProperties":true,"type":"object"},"PinCounts":{"properties":{"exact":{"type":"integer","title":"Exact"},"approximate":{"type":"integer","title":"Approximate"}},"type":"object","required":["exact","approximate"],"title":"PinCounts","description":"How many offers behind a circle statistic sat on an exact pin or a blurred one."},"PointStats":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"},"radius_km":{"type":"number","title":"Radius Km"},"purpose":{"type":"string","title":"Purpose"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"properties":{"type":"integer","title":"Properties"},"median_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Price"},"p25_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"P25 Price"},"p75_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"P75 Price"},"median_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Median Price Per Sqm"},"pins":{"$ref":"#/components/schemas/PinCounts"}},"type":"object","required":["lat","lon","radius_km","purpose","property_type","properties","median_price","p25_price","p75_price","median_price_per_sqm","pins"],"title":"PointStats","description":"Asking prices inside a circle on the map. Each property counts once, at its lowest\nactive price, and only offers whose site shows a map pin are inside: a quarter or\nmunicipality centre is the middle of an area, not a house. `pins` says how many of\nthe counted offers had an exact pin and how many a pin the site blurred on purpose,\nso a small circle over mostly blurred pins is read with care."},"PriceBucket":{"properties":{"lower":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Lower"},"upper":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Upper"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["lower","upper","count"],"title":"PriceBucket","description":"A price band and how many properties fall inside it."},"PriceDistribution":{"properties":{"properties":{"type":"integer","title":"Properties"},"min_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Min Price"},"max_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Max Price"},"buckets":{"items":{"$ref":"#/components/schemas/PriceBucket"},"type":"array","title":"Buckets"}},"type":"object","required":["properties","min_price","max_price","buckets"],"title":"PriceDistribution","description":"A price histogram over the filtered properties, each counted once."},"PricePoint":{"properties":{"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price"},"currency":{"type":"string","title":"Currency"}},"type":"object","required":["recorded_at","price","currency"],"title":"PricePoint","description":"A price the listing showed from `recorded_at` on."},"PropertyDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sqm"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"location":{"anyOf":[{"$ref":"#/components/schemas/Location"},{"type":"null"}]},"active_listings":{"type":"integer","title":"Active Listings"},"lowest_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Lowest Price"},"highest_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Highest Price"},"lowest_price_ever":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Lowest Price Ever"},"lowest_price_ever_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lowest Price Ever At"},"highest_price_ever":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Highest Price Ever"},"highest_price_ever_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Highest Price Ever At"},"listings":{"items":{"$ref":"#/components/schemas/ListingSummary"},"type":"array","title":"Listings"}},"type":"object","required":["id","property_type","sqm","bedrooms","bathrooms","district","municipality","quarter","location","active_listings","lowest_price","highest_price","lowest_price_ever","lowest_price_ever_at","highest_price_ever","highest_price_ever_at","listings"],"title":"PropertyDetail","description":"One physical property and every offer for it across sites."},"PropertyPricePoint":{"properties":{"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price"},"currency":{"type":"string","title":"Currency"},"listing_id":{"type":"string","format":"uuid","title":"Listing Id"},"source":{"type":"string","title":"Source"},"match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Level"}},"type":"object","required":["recorded_at","price","currency","listing_id","source","match_level"],"title":"PropertyPricePoint","description":"One price on a home's merged timeline, with the offer and link it came from."},"QuarterEstimate":{"properties":{"quarter":{"type":"string","title":"Quarter"},"comps":{"type":"integer","title":"Comps"},"price_per_sqm":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price Per Sqm"},"estimate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Estimate"}},"type":"object","required":["quarter","comps","price_per_sqm","estimate"],"title":"QuarterEstimate","description":"The same estimate made from one quarter's comps only."},"SourceSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"base_url":{"type":"string","title":"Base Url"},"active_listings":{"type":"integer","title":"Active Listings"},"removed_listings":{"type":"integer","title":"Removed Listings"},"last_new_listing_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last New Listing At"},"last_collected_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Collected At"},"completeness":{"$ref":"#/components/schemas/Completeness"},"completeness_by_type":{"items":{"$ref":"#/components/schemas/TypeCompleteness"},"type":"array","title":"Completeness By Type"}},"type":"object","required":["slug","name","base_url","active_listings","removed_listings","last_new_listing_at","last_collected_at","completeness","completeness_by_type"],"title":"SourceSummary","description":"One collected site, how fresh its data is, and how complete its listings are."},"TrendPoint":{"properties":{"period":{"type":"string","format":"date-time","title":"Period"},"offers":{"type":"integer","title":"Offers"},"median_price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Median Price"},"median_price_per_sqm":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Median Price Per Sqm"}},"type":"object","required":["period","offers","median_price","median_price_per_sqm"],"title":"TrendPoint","description":"One period on an area's price line."},"TypeCompleteness":{"properties":{"active_listings":{"type":"integer","title":"Active Listings"},"price_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price Pct"},"sqm_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Sqm Pct"},"bedrooms_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Bedrooms Pct"},"location_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Location Pct"},"site_pin_pct":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Site Pin Pct"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"}},"type":"object","required":["active_listings","price_pct","sqm_pct","bedrooms_pct","location_pct","site_pin_pct","property_type"],"title":"TypeCompleteness","description":"Completeness for one property type; `property_type` is null for untyped listings."},"ValidationErrorResponse":{"properties":{"success":{"type":"boolean","const":false,"title":"Success"},"data":{"$ref":"#/components/schemas/FieldErrors"},"meta":{"$ref":"#/components/schemas/Meta"}},"type":"object","required":["success","data"],"title":"ValidationErrorResponse","description":"Body of a 422: `success` is false and `data.errors` lists each refused field."},"Valuation":{"properties":{"purpose":{"type":"string","title":"Purpose"},"property_type":{"type":"string","title":"Property Type"},"district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"District"},"municipality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Municipality"},"quarter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quarter"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon"},"sqm":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Sqm"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"estimate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Estimate"},"low":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Low"},"high":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"High"},"price_per_sqm":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price Per Sqm"},"currency":{"type":"string","title":"Currency"},"price_basis":{"type":"string","const":"asking","title":"Price Basis"},"comps_count":{"type":"integer","title":"Comps Count"},"comps_returned":{"type":"integer","title":"Comps Returned"},"comps_by_level":{"$ref":"#/components/schemas/ValuationLevels"},"basis":{"type":"string","enum":["radius_500m","radius_1km","radius_2km","quarter","municipality","district"],"title":"Basis"},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence"},"criteria":{"$ref":"#/components/schemas/ValuationCriteria"},"comps":{"items":{"$ref":"#/components/schemas/ListingSummary"},"type":"array","title":"Comps"},"floor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Floor"},"sea_view":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sea View"},"features":{"items":{"$ref":"#/components/schemas/FeatureSplit"},"type":"array","title":"Features"},"by_quarter":{"items":{"$ref":"#/components/schemas/QuarterEstimate"},"type":"array","title":"By Quarter"}},"type":"object","required":["purpose","property_type","district","municipality","quarter","sqm","bedrooms","estimate","low","high","price_per_sqm","currency","price_basis","comps_count","comps_returned","comps_by_level","basis","confidence","criteria","comps"],"title":"Valuation","description":"An estimated value from comparable active offers, with the comps it rests on.\n\nComps are active offers with the same purpose and type, a size within 20% of the\nsubject, and, when bedrooms are given, the same count where a level holds ten such\nhomes, else within one bedroom (`criteria` says which). A home listed on several\nsites counts once, at its lowest price. With a subject point the search starts 500 m\naround it and widens to 1 km and 2 km, counting only offers with a site pin; then, or\nwithout a point, it goes by name from the quarter to the municipality and the district.\nIt stops at the first level with at least five comps.\n\n`estimate` is the median comp price per m² times the subject size; `low` and `high`\nuse the 25th and 75th percentiles. Prices are asking prices, not sale prices.\n\n`confidence` weighs where the comps came from, not only how many there are: `high`\nneeds ten or more comps within 1 km or in the quarter, a 2 km or municipality estimate\nis at most `medium`, and a district estimate is always `low` because it mixes towns\nwith different prices. A spread from `low` to `high` wider than half the estimate\nlowers it one step."},"ValuationCriteria":{"properties":{"purpose":{"type":"string","title":"Purpose"},"property_type":{"type":"string","title":"Property Type"},"sqm_min":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Sqm Min"},"sqm_max":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Sqm Max"},"bedrooms_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms Min"},"bedrooms_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms Max"}},"type":"object","required":["purpose","property_type","sqm_min","sqm_max","bedrooms_min","bedrooms_max"],"title":"ValuationCriteria","description":"The filters every comp had to pass, so a client can reproduce the comp set."},"ValuationLevels":{"properties":{"radius_500m":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Radius 500M"},"radius_1km":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Radius 1Km"},"radius_2km":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Radius 2Km"},"quarter":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quarter"},"municipality":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Municipality"},"district":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"District"}},"type":"object","title":"ValuationLevels","description":"Comps found at each level tried, narrowest first; null when a level was not tried.\n\nThe rings need a subject point and count only offers with a site pin; the area levels\nneed the subject's district."}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"Authorization: Bearer <API key>","scheme":"bearer"},"APIKeyHeader":{"type":"apiKey","description":"X-API-Key: <API key>","in":"header","name":"X-API-Key"}}},"tags":[{"name":"Listings","description":"Search offers and read one in full."},{"name":"Statistics","description":"Price levels, trends, yield, activity, and histograms, by area or around a point on the map."},{"name":"Valuation","description":"Estimates from comparable active offers."},{"name":"Properties","description":"The same home across sites, with its price history."},{"name":"Sources","description":"Collected sites and data coverage."},{"name":"Alerts","description":"Webhook alerts for direct API keys."}]}