{"openapi":"3.1.0","security":[],"info":{"title":"Keyilo Public API","version":"1.0.0","description":"Read only access to the property market data behind Keyilo. Georgia is the first live market.","contact":{"email":"api@keyilo.com"},"termsOfService":"https://keyilo.com/disclaimer"},"externalDocs":{"description":"API documentation and fair use guidance","url":"https://keyilo.com/developers"},"servers":[{"url":"https://api.keyilo.com/v1"}],"paths":{"/properties":{"get":{"operationId":"listProperties","summary":"List current properties","description":"Search current public listings. Results retain the original source URL for verification and attribution. Use next_cursor unchanged for stable pagination.","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000},"description":"Page number."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100},"description":"Page size. Maximum 100 for list mode."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Cursor returned by a previous request."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"updated_desc, best_deal, price_asc, price_desc, or area_desc."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Text or normalized location search."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"City filter. Repeat for multiple cities."},{"name":"district","in":"query","required":false,"schema":{"type":"string"},"description":"District filter."},{"name":"neighborhood","in":"query","required":false,"schema":{"type":"string"},"description":"Neighborhood filter."},{"name":"deal","in":"query","required":false,"schema":{"type":"string"},"description":"buy, rent, daily_rent, or lease."},{"name":"property_kind","in":"query","required":false,"schema":{"type":"string"},"description":"apartment, house, country_house, land, commercial, hotel, or residential."},{"name":"furnished","in":"query","required":false,"schema":{"type":"string"},"description":"furnished or unfurnished."},{"name":"source","in":"query","required":false,"schema":{"type":"string"},"description":"Source name."},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL price."},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL price."},{"name":"min_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum square metres."},{"name":"max_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum square metres."},{"name":"min_ppm","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL per square metre."},{"name":"max_ppm","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL per square metre."},{"name":"has_coordinates","in":"query","required":false,"schema":{"type":"string"},"description":"Set to 1 to return only geocoded properties."},{"name":"indexable","in":"query","required":false,"schema":{"type":"string"},"description":"Set to 1 for properties that pass the Keyilo quality gate."},{"name":"include_flagged","in":"query","required":false,"schema":{"type":"string"},"description":"Set to 1 to include flagged listings."}],"responses":{"200":{"description":"Property list response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/area":{"get":{"operationId":"listAreaProperties","summary":"List properties in a map area","description":"Return map and card results for one viewport. Results are bounded by bbox when supplied and ordered around the supplied map center.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500},"description":"Maximum results. Maximum 500."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"updated_desc, best_deal, price_asc, price_desc, or area_desc."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Text or normalized location search."},{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"City filter."},{"name":"district","in":"query","required":false,"schema":{"type":"string"},"description":"District filter."},{"name":"neighborhood","in":"query","required":false,"schema":{"type":"string"},"description":"Neighborhood filter."},{"name":"deal","in":"query","required":false,"schema":{"type":"string"},"description":"buy, rent, daily_rent, or lease."},{"name":"property_kind","in":"query","required":false,"schema":{"type":"string"},"description":"Property kind filter."},{"name":"furnished","in":"query","required":false,"schema":{"type":"string"},"description":"furnished or unfurnished."},{"name":"source","in":"query","required":false,"schema":{"type":"string"},"description":"Source name."},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL price."},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL price."},{"name":"min_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum square metres."},{"name":"max_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum square metres."},{"name":"min_ppm","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL per square metre."},{"name":"max_ppm","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL per square metre."},{"name":"include_flagged","in":"query","required":false,"schema":{"type":"string"},"description":"Set to 1 to include flagged listings."},{"name":"bbox","in":"query","required":false,"schema":{"type":"string"},"description":"Bounds as west,south,east,north."},{"name":"map_lat","in":"query","required":false,"schema":{"type":"number","minimum":-90,"maximum":90},"description":"Viewport center latitude."},{"name":"map_lng","in":"query","required":false,"schema":{"type":"number","minimum":-180,"maximum":180},"description":"Viewport center longitude."}],"responses":{"200":{"description":"Area property list response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/list/area":{"get":{"operationId":"listSearchPropertiesInArea","summary":"Page search cards in one viewport","description":"Return only card fields for the current map bounds. Use next_cursor for infinite scrolling without reloading map markers.","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string"},"description":"Bounds as west,south,east,north."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Text or normalized location search."},{"name":"deal","in":"query","required":false,"schema":{"type":"string"},"description":"buy, rent, daily_rent, or lease."},{"name":"property_kind","in":"query","required":false,"schema":{"type":"string"},"description":"Property kind filter."},{"name":"furnished","in":"query","required":false,"schema":{"type":"string"},"description":"furnished or unfurnished."},{"name":"min_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum square metres."},{"name":"max_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum square metres."},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL price."},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL price."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100},"description":"Page size. Maximum 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"},"description":"Cursor from the previous page."},{"name":"sort","in":"query","required":false,"schema":{"type":"string"},"description":"Search result sort order."}],"responses":{"200":{"description":"Bounded property-card page.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/map":{"get":{"operationId":"listSearchMapMarkers","summary":"Get non-overlapping markers for one viewport","description":"Return compact, server-thinned marker tuples. Full card and property fields are deliberately excluded.","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string"},"description":"Bounds as west,south,east,north."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Text or normalized location search."},{"name":"deal","in":"query","required":false,"schema":{"type":"string"},"description":"buy, rent, daily_rent, or lease."},{"name":"property_kind","in":"query","required":false,"schema":{"type":"string"},"description":"Property kind filter."},{"name":"furnished","in":"query","required":false,"schema":{"type":"string"},"description":"furnished or unfurnished."},{"name":"min_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum square metres."},{"name":"max_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum square metres."},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum GEL price."},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum GEL price."},{"name":"width","in":"query","required":false,"schema":{"type":"integer","minimum":240,"maximum":4096},"description":"Viewport width in CSS pixels."},{"name":"height","in":"query","required":false,"schema":{"type":"integer","minimum":240,"maximum":4096},"description":"Viewport height in CSS pixels."}],"responses":{"200":{"description":"Compact marker response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapMarkers"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/price-distribution":{"get":{"operationId":"getSearchPriceDistribution","summary":"Get prices for the current selection","description":"Return a fixed-bin price histogram for the current bounds and non-price filters. Active minimum and maximum price filters do not truncate the graph.","parameters":[{"name":"bbox","in":"query","required":true,"schema":{"type":"string"},"description":"Bounds as west,south,east,north."},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Text or normalized location search."},{"name":"deal","in":"query","required":false,"schema":{"type":"string"},"description":"buy, rent, daily_rent, or lease."},{"name":"property_kind","in":"query","required":false,"schema":{"type":"string"},"description":"Property kind filter."},{"name":"furnished","in":"query","required":false,"schema":{"type":"string"},"description":"furnished or unfurnished."},{"name":"min_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Minimum square metres."},{"name":"max_area","in":"query","required":false,"schema":{"type":"number","minimum":0},"description":"Maximum square metres."}],"responses":{"200":{"description":"Selection-specific price distribution.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDistribution"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/{id}/preview":{"get":{"operationId":"getSearchPropertyPreview","summary":"Get one lightweight map preview","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Lightweight property preview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyPreview"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."},"503":{"description":"Service unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/properties/{id}":{"get":{"operationId":"getProperty","summary":"Get one property by Keyilo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Property detail response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyDetail"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}},"/options":{"get":{"operationId":"listLocationOptions","summary":"Get location filter options","parameters":[{"name":"city","in":"query","required":false,"schema":{"type":"string"},"description":"City filter."},{"name":"district","in":"query","required":false,"schema":{"type":"string"},"description":"District filter."}],"responses":{"200":{"description":"Location options response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptionsResponse"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}},"/suggestions":{"get":{"operationId":"listLocationSuggestions","summary":"Get location suggestions","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Search query."}],"responses":{"200":{"description":"Suggestion response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionsResponse"}}}},"400":{"description":"Invalid query parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}},"/rates":{"get":{"operationId":"getExchangeRates","summary":"Get GEL-based exchange rates","responses":{"200":{"description":"Exchange-rate response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatesResponse"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}},"/markets":{"get":{"operationId":"listMarkets","summary":"Get the versioned international market catalog","parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string"},"description":"Display locale: en, ka, or ru."}],"responses":{"200":{"description":"Market catalog response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketCatalogResponse"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}},"/prices/{city}":{"get":{"operationId":"getCityDistrictPrices","summary":"Get district price intelligence for a city","parameters":[{"name":"city","in":"path","required":true,"example":"Tbilisi","schema":{"type":"string"}}],"responses":{"200":{"description":"District price response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDistrictsResponse"}}}},"429":{"description":"Rate limit exceeded. Back off before retrying and follow Retry-After when present.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error."}}}}},"components":{"schemas":{"PropertyList":{"type":"object","description":"A page of current properties. Pass next_cursor unchanged on the next request. Do not combine a cursor with a different sort order.","required":["page","limit","total","has_more","items"],"properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":["integer","null"]},"has_more":{"type":"boolean"},"next_cursor":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Property"}}},"example":{"page":1,"limit":1,"total":null,"has_more":true,"next_cursor":"{\"sort\":\"updated_desc\",\"id\":42}","items":[{"id":42,"source":"example","source_id":"abc123","source_listing_url":"https://source.example/listing/abc123","city":"Tbilisi","price_gel":260000,"area":86,"updated_at":"2026-07-12T09:30:00Z"}]}},"MapMarkers":{"type":"object","required":["m"],"properties":{"m":{"type":"array","items":{"type":"object","required":["i","v","x","y"],"properties":{"i":{"type":"integer","description":"Property ID."},"p":{"type":"number","description":"Price in GEL."},"v":{"type":"string","enum":["g","n","b","u"]},"x":{"type":"number","description":"Longitude."},"y":{"type":"number","description":"Latitude."},"a":{"type":"integer","enum":[1]},"r":{"type":"number","description":"Accuracy radius."},"c":{"type":"integer","description":"Nearby listing count."}}}}}},"PriceDistribution":{"type":"object","required":["bins","max","total"],"properties":{"bins":{"type":"array","items":{"type":"integer"}},"max":{"type":"number"},"total":{"type":"integer"}}},"PropertyPreview":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"},"title":{"type":"string"},"title_en":{"type":"string"},"street_en":{"type":"string"},"neighborhood_en":{"type":"string"},"city_en":{"type":"string"},"area":{"type":"number"},"rooms":{"type":"number"},"bedrooms":{"type":"number"},"bathrooms":{"type":"number"},"price_gel":{"type":"number"},"image":{"type":"string","format":"uri"}}},"PropertyDetail":{"allOf":[{"$ref":"#/components/schemas/Property"},{"type":"object","properties":{"context":{"type":"object","additionalProperties":true,"properties":{"score_label":{"type":"string"},"deal":{"type":"string"},"comps":{"type":"array","items":{"$ref":"#/components/schemas/Property"}}}},"core_property":{"type":"object"},"area_center":{"type":"object"},"area_bounds":{"type":"object"}}}]},"Property":{"type":"object","description":"Public allowlisted property fields. Raw source payloads, owner names, contact phone numbers, cadastral codes, and internal fields are not exposed.","required":["id","source","source_id","source_listing_url"],"properties":{"id":{"type":"integer"},"source":{"type":"string"},"source_id":{"type":"string"},"source_listing_url":{"type":"string","format":"uri"},"title":{"type":"string"},"title_en":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"city_en":{"type":"string"},"district":{"type":"string"},"district_en":{"type":"string"},"neighborhood":{"type":"string"},"neighborhood_en":{"type":"string"},"street":{"type":"string"},"street_en":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"},"location_latitude":{"type":"number"},"location_longitude":{"type":"number"},"location_accuracy":{"type":"string"},"location_radius_meters":{"type":"number"},"location_evidence_count":{"type":"number"},"area":{"type":"number"},"rooms":{"type":"number"},"bedrooms":{"type":"number"},"floor":{"type":"number"},"total_floors":{"type":"number"},"bathrooms":{"type":"number"},"balconies":{"type":"number"},"construction_year":{"type":"number"},"ceiling_height":{"type":"number"},"land_area":{"type":"number"},"yard_area":{"type":"number"},"condition":{"type":"string"},"renovation":{"type":"string"},"building_type":{"type":"string"},"building_status":{"type":"string"},"heating":{"type":"string"},"hot_water":{"type":"string"},"parking":{"type":"string"},"project_name":{"type":"string"},"agency_name":{"type":"string"},"view_count":{"type":"number"},"is_vip":{"type":"boolean"},"is_vip_plus":{"type":"boolean"},"is_super_vip":{"type":"boolean"},"is_promoted":{"type":"boolean"},"is_urgent":{"type":"boolean"},"has_3d":{"type":"boolean"},"has_remote_viewing":{"type":"boolean"},"is_new_build":{"type":"boolean"},"price_negotiable":{"type":"boolean"},"amenities":{"type":"object"},"price_gel":{"type":"number"},"price_usd":{"type":"number"},"price_per_m2":{"type":"number"},"local_median_price_per_m2":{"type":"number"},"local_comparable_count":{"type":"number"},"local_value_ratio":{"type":"number"},"local_value_tone":{"type":"string"},"investor_verdict":{"type":"string"},"investor_value_tone":{"type":"string"},"investor_reason_codes":{"type":"array","items":{"type":"string"}},"investor_all_in_high_ratio":{"type":"number"},"investor_all_in_high_price_per_m2":{"type":"number"},"investor_capex_high_per_m2":{"type":"number"},"investor_stabilized_median_price_per_m2":{"type":"number"},"investor_stabilized_comparable_count":{"type":"number"},"investor_confidence":{"type":"number"},"image_analysis_condition":{"type":"string"},"image_analysis_confidence":{"type":"number"},"image_analysis_risk_codes":{"type":"array","items":{"type":"string"}},"deal":{"type":"string"},"property_type":{"type":"string"},"property_kind":{"type":"string"},"property_type_label":{"type":"string"},"furnished":{"type":"string"},"updated_at":{"type":"string","format":"date-time"},"image":{"type":"string","format":"uri"},"images":{"type":"array","items":{"type":"string","format":"uri"}}}},"OptionsResponse":{"type":"object","properties":{"cities":{"type":"array","items":{"$ref":"#/components/schemas/OptionRow"}},"districts":{"type":"array","items":{"$ref":"#/components/schemas/OptionRow"}},"neighborhoods":{"type":"array","items":{"$ref":"#/components/schemas/OptionRow"}}},"example":{"cities":[{"value":"Tbilisi","label":"Tbilisi","count":12000}],"districts":[],"neighborhoods":[]}},"OptionRow":{"type":"object","required":["value","label","count"],"properties":{"value":{"type":"string"},"label":{"type":"string"},"count":{"type":"integer"}}},"SuggestionsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","required":["value","label"],"properties":{"value":{"type":"string"},"label":{"type":"string"},"field":{"type":"string","enum":["country","city","district","neighborhood"]},"country_code":{"type":"string"},"location_id":{"type":"string"},"market_slug":{"type":"string"},"market_status":{"type":"string","enum":["active","coming_soon","disabled"]}}}}},"example":{"items":[{"value":"Tbilisi","label":"Tbilisi","field":"city"}]}},"MarketCatalogResponse":{"type":"object","required":["version","locale","markets"],"properties":{"version":{"type":"string"},"locale":{"type":"string","enum":["en","ka","ru"]},"markets":{"type":"array","items":{"type":"object","required":["country_code","display_name","slug","recommended_locales","local_currency","default_area_unit","status","country","priority_locations"],"properties":{"country_code":{"type":"string"},"display_name":{"type":"string"},"slug":{"type":"string"},"recommended_locales":{"type":"array","items":{"type":"string"}},"local_currency":{"type":"string"},"default_area_unit":{"type":"string","enum":["m2","ft2"]},"status":{"type":"string","enum":["active","coming_soon","disabled"]},"country":{"$ref":"#/components/schemas/MarketLocation"},"priority_locations":{"type":"array","items":{"$ref":"#/components/schemas/MarketLocation"}}}}}}},"MarketLocation":{"type":"object","required":["id","kind","country_code","name"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["country","city"]},"country_code":{"type":"string"},"parent_id":{"type":"string"},"name":{"type":"string"},"latitude":{"type":"number"},"longitude":{"type":"number"}}},"RatesResponse":{"type":"object","required":["base","rates"],"properties":{"base":{"type":"string","enum":["GEL"]},"rates":{"type":"object","additionalProperties":{"type":"number"}},"time_last_update_utc":{"type":"string"},"provider":{"type":"string"},"warning":{"type":"string"}},"example":{"base":"GEL","rates":{"GEL":1,"USD":0.37},"time_last_update_utc":"2026-07-12T00:00:00Z","provider":"Exchange rate provider"}},"PriceDistrictsResponse":{"type":"object","required":["city","currency","rows"],"properties":{"city":{"type":"string"},"currency":{"type":"string","enum":["GEL"]},"updated_at":{"type":"string","format":"date-time"},"median_price_per_m2_gel":{"type":"number"},"rows":{"type":"array","items":{"type":"object","required":["area","listing_count"],"properties":{"area":{"type":"string"},"listing_count":{"type":"integer"},"median_price_per_m2_gel":{"type":"number"},"updated_at":{"type":"string","format":"date-time"}}}}},"example":{"city":"Tbilisi","currency":"GEL","updated_at":"2026-07-12T09:30:00Z","median_price_per_m2_gel":3700,"rows":[{"area":"Vake","listing_count":30,"median_price_per_m2_gel":4200,"updated_at":"2026-07-12T09:30:00Z"}]}},"Error":{"type":"object","properties":{"error":{"type":"string"}},"example":{"error":"Rate limit exceeded"}}}}}