{"openapi":"3.1.0","info":{"title":"InmoData Public API","version":"2.0.0","description":"Contrato público y versionado para integrar cobertura, ubicaciones, mercado inmobiliario y estimaciones en productos externos."},"servers":[{"url":"https://api.inmodata.io","description":"Producción"}],"paths":{"/public/v2/coverage/cities":{"get":{"tags":["Público"],"summary":"Países y ciudades con cobertura","description":"Devuelve únicamente cobertura agregada por país, ciudad y mercado. No requiere autenticación y no expone registros inmobiliarios individuales.","operationId":"public_get_cities_coverage","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"País opcional en nombre normalizado, por ejemplo `colombia` o `qatar`.","title":"Country"},"description":"País opcional en nombre normalizado, por ejemplo `colombia` o `qatar`."},{"name":"min_total_count","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Cantidad mínima de registros publicados para incluir una ciudad.","default":1,"title":"Min Total Count"},"description":"Cantidad mínima de registros publicados para incluir una ciudad."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Get Cities Coverage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/v2/geocoding/places":{"get":{"tags":["Público"],"summary":"Buscar lugares","description":"Búsqueda de lugares para autocompletar direcciones, barrios, ciudades o puntos de interés.\n\n- Devuelve hasta **5** candidatos de ubicación (Google Maps Geocoding API).\n- Requiere ``GOOGLE_MAPS_API_KEY`` en el servidor; el cliente no envía clave.\n- Uso típico: autocompletado de direcciones o ciudades en el cliente.","operationId":"search_places_public_v2_geocoding_places_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Consulta de texto (dirección, barrio, ciudad, punto de interés).","examples":["Medellín El Poblado","Calle 10 Bogotá"],"title":"Q"},"description":"Consulta de texto (dirección, barrio, ciudad, punto de interés)."}],"responses":{"200":{"description":"Lista de candidatos de ubicación.","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/v2/location/enrich":{"get":{"tags":["Público"],"summary":"Enriquecer una ubicación","description":"Recibe una dirección o coordenadas. Las direcciones se geocodifican con Google Maps; después se resuelven país, ciudad, localidad y barrio, junto con capas urbanas cercanas.","operationId":"enrich_location_endpoint_public_v2_location_enrich_get","security":[{"ApiKeyHeader":[]},{"ApiKeyBearer":[]}],"parameters":[{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3},{"type":"null"}],"description":"Dirección libre. No se combina con latitude/longitude.","examples":["Carrera 15 # 93-47, Bogotá"],"title":"Address"},"description":"Dirección libre. No se combina con latitude/longitude."},{"name":"latitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":90,"minimum":-90},{"type":"null"}],"title":"Latitude"}},{"name":"longitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":180,"minimum":-180},{"type":"null"}],"title":"Longitude"}},{"name":"radius_m","in":"query","required":false,"schema":{"type":"number","maximum":5000,"exclusiveMinimum":0,"description":"Distancia máxima para devolver elementos cercanos.","default":2000,"title":"Radius M"},"description":"Distancia máxima para devolver elementos cercanos."},{"name":"limit_per_layer","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Máximo de elementos devueltos por categoría y sistema.","default":3,"title":"Limit Per Layer"},"description":"Máximo de elementos devueltos por categoría y sistema."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationEnrichmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/v2/traditional":{"get":{"tags":["Público"],"summary":"Listar avisos del mercado tradicional","description":"Listado paginado de avisos deduplicados del mercado tradicional (venta, arriendo y variantes).\n\n### Autenticación (obligatoria)\n- `X-Api-Key: <tu_api_key>` **o**\n- `Authorization: Bearer <tu_api_key>`\n\n### Parámetros principales\n| Parámetro | Uso |\n|-----------|-----|\n| `q` | Búsqueda por texto en **título** o **dirección** (coincidencia parcial). |\n| `limit` / `offset` | Paginación. Si omites `limit`, el servidor usa un límite alto por defecto (ver documentación del query). |\n| `sw_lat`, `sw_lng`, `ne_lat`, `ne_lng` | **Las cuatro** acotan un área rectangular en el mapa. Si envías una esquina, deben ir las cuatro; si no envías ninguna, no hay filtro por mapa. |\n| *Otros query params* | Filtros opcionales por campos del aviso (`city`, `business_type`, `normalized_type`, etc.). Ver esquema *TraditionalMarketListFilters* debajo. |\n\n### Respuesta\nArray de objetos `TraditionalMarketRow`. Orden típico: avisos más recientes primero.","operationId":"public_list_traditional_market","security":[{"ApiKeyHeader":[]},{"ApiKeyBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"description":"Máximo de filas a devolver. Si se omite, el servidor aplica un límite alto por defecto (actualmente 5000).","examples":[50,500],"title":"Limit"},"description":"Máximo de filas a devolver. Si se omite, el servidor aplica un límite alto por defecto (actualmente 5000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Desplazamiento para paginación (filas a saltar).","examples":[0,100],"default":0,"title":"Offset"},"description":"Desplazamiento para paginación (filas a saltar)."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Texto libre: busca coincidencia parcial en el **título** del aviso o en la **dirección**. No es un filtro de igualdad exacta sobre una columna concreta.","examples":["poblado","carrera 70"],"title":"Q"},"description":"Texto libre: busca coincidencia parcial en el **título** del aviso o en la **dirección**. No es un filtro de igualdad exacta sobre una columna concreta."},{"name":"sw_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Esquina suroeste del área de mapa: latitud (debe ir con `sw_lng`, `ne_lat`, `ne_lng`).","examples":[6.15],"title":"Sw Lat"},"description":"Esquina suroeste del área de mapa: latitud (debe ir con `sw_lng`, `ne_lat`, `ne_lng`)."},{"name":"sw_lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Esquina suroeste del área de mapa: longitud.","examples":[-75.65],"title":"Sw Lng"},"description":"Esquina suroeste del área de mapa: longitud."},{"name":"ne_lat","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Esquina noreste del área de mapa: latitud.","examples":[6.25],"title":"Ne Lat"},"description":"Esquina noreste del área de mapa: latitud."},{"name":"ne_lng","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"Esquina noreste del área de mapa: longitud.","examples":[-75.55],"title":"Ne Lng"},"description":"Esquina noreste del área de mapa: longitud."},{"name":"listing_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Listing Id"}},{"name":"property_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Id"}},{"name":"source_system","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source System"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"}},{"name":"normalized_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"}},{"name":"business_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"}},{"name":"area_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"}},{"name":"rooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Rooms"}},{"name":"bathrooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"}},{"name":"garages","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages"}},{"name":"antiquity","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity"}},{"name":"estrato","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato"}},{"name":"sale_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"}},{"name":"rent_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"}},{"name":"admin_price","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Admin Price"}},{"name":"sale_price_per_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"}},{"name":"rent_price_per_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"}},{"name":"neighborhood","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"}},{"name":"address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"}},{"name":"latitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"}},{"name":"longitude","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"}},{"name":"h3_res7","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"}},{"name":"h3_res8","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"}},{"name":"h3_res9","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"}},{"name":"geo_hash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},{"name":"country_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},{"name":"scraped_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"}},{"name":"first_scraped_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Scraped At"}},{"name":"days_on_market","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days On Market"}},{"name":"total_scrape_days","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Scrape Days"}},{"name":"days_since_last_scrape","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"}},{"name":"is_stale","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"}},{"name":"has_price_reduction","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price Reduction"}},{"name":"price_change_total_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Change Total Pct"}},{"name":"quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"}},{"name":"publisher_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Name"}},{"name":"publisher_phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Phone"}},{"name":"url","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},{"name":"fingerprint_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint Id"}},{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"}},{"name":"day","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day"}},{"name":"est_airbnb_income","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Income"}},{"name":"est_traditional_rent","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Rent"}},{"name":"airbnb_vs_traditional_multiplier","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Vs Traditional Multiplier"}},{"name":"investment_recommendation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Recommendation"}},{"name":"airbnb_comparables_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Comparables Count"}},{"name":"traditional_rent_comparables_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Rent Comparables Count"}},{"name":"est_airbnb_yield_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Yield Pct"}},{"name":"est_traditional_yield_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Yield Pct"}},{"name":"est_airbnb_payback_years","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Payback Years"}},{"name":"est_traditional_payback_years","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Payback Years"}},{"name":"zone_avg_sale_price_per_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Sale Price Per M2"}},{"name":"zone_sale_comparables_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Sale Comparables Count"}},{"name":"sale_price_vs_zone_avg_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs Zone Avg Pct"}},{"name":"sale_price_valuation_label","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Price Valuation Label"}},{"name":"zone_avg_rent_price_per_m2","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Rent Price Per M2"}},{"name":"zone_rent_comparables_count","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Rent Comparables Count"}},{"name":"rent_price_vs_zone_avg_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs Zone Avg Pct"}},{"name":"rent_price_valuation_label","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Price Valuation Label"}},{"name":"sale_price_vs_30d_ago_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs 30D Ago Pct"}},{"name":"rent_price_vs_30d_ago_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs 30D Ago Pct"}},{"name":"sale_trend_30d","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Trend 30D"}},{"name":"gross_cap_rate_annual_pct","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Cap Rate Annual Pct"}},{"name":"refreshed_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"}},{"name":"synced_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"}},{"name":"transport_system","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transport System"}},{"name":"max_transport_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Transport Distance M"}},{"name":"min_transport_within_500m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Transport Within 500M"}},{"name":"min_transport_within_1km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Transport Within 1Km"}},{"name":"min_transport_within_2km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Transport Within 2Km"}},{"name":"max_metro_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Metro Distance M"}},{"name":"max_mio_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Mio Distance M"}},{"name":"max_transmilenio_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Transmilenio Distance M"}},{"name":"retail_system","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retail System"}},{"name":"max_retail_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Retail Distance M"}},{"name":"min_retail_within_500m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Retail Within 500M"}},{"name":"min_retail_within_1km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Retail Within 1Km"}},{"name":"min_retail_within_2km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Retail Within 2Km"}},{"name":"max_shopping_center_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Shopping Center Distance M"}},{"name":"max_water_body_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Water Body Distance M"}},{"name":"min_water_bodies_within_500m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Water Bodies Within 500M"}},{"name":"min_water_bodies_within_1km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Water Bodies Within 1Km"}},{"name":"max_park_distance_m","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"title":"Max Park Distance M"}},{"name":"min_parks_within_500m","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Parks Within 500M"}},{"name":"min_parks_within_1km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Parks Within 1Km"}},{"name":"min_parks_within_2km","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Min Parks Within 2Km"}},{"name":"block_stratum","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Block Stratum"}},{"name":"all_publishers_contains_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"All Publishers Contains Json"}},{"name":"all_urls_contains_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"All Urls Contains Json"}},{"name":"all_sources_contains_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"All Sources Contains Json"}},{"name":"property_images_contains_json","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Images Contains Json"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TraditionalMarketRow"},"title":"Response Public List Traditional Market"}}}},"401":{"description":"Falta cabecera de API key o la clave no existe / está revocada."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"502":{"description":"No se pudo consultar la fuente de datos en este momento."}}}},"/public/v2/valuation/estimate":{"post":{"tags":["Público"],"summary":"Estimación por comparables (público)","description":"Calcula una valoración orientativa de mercado a partir de ubicación, características del inmueble y comparables cercanos.\n\nLa respuesta incluye:\n- bandas de venta, arriendo tradicional y renta corta;\n- métricas por m² cuando hay datos suficientes;\n- avisos comparables ordenados por parecido (`similarity_score`);\n- desglose de parecido (`match_breakdown`) para entender por qué un comparable es relevante;\n- análisis estratégico en español con lectura de oportunidad, riesgos de datos y siguiente paso.\n\nCampos recomendados para mejorar precisión: `normalized_type`, `area_m2`, `rooms`, `bathrooms`, `garages`,\n`antiquity`, `estrato`, `country` y coordenadas (`latitude`/`longitude`) o `address_query`.\n\nNotas:\n- `max_distance_km` controla el radio de búsqueda de comparables.\n- `distance_weight` controla cuánto pesan los comparables más cercanos frente a los más lejanos.\n- `min_comparables` define la muestra mínima deseada antes de relajar algunos criterios.\n- `garages` y `antiquity` ayudan a seleccionar comparables más parecidos cuando esos datos están disponibles.\n- Es una orientación de mercado, no una tasación ni avalúo formal.\n\n### Autenticación (obligatoria)\n- `X-Api-Key: <tu_api_key>` **o**\n- `Authorization: Bearer <tu_api_key>`\n\nPrefijo base: `/public/v2/valuation`.","operationId":"public_post_property_estimate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyEstimateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyEstimateResponse"}}}},"401":{"description":"Falta cabecera de API key o la clave no es válida."},"422":{"description":"La solicitud no cumple el contrato esperado."},"502":{"description":"No se pudo completar el análisis en este momento."},"503":{"description":"El análisis estratégico no está disponible temporalmente."}},"security":[{"ApiKeyHeader":[]},{"ApiKeyBearer":[]}]}}},"components":{"schemas":{"AdministrativeContext":{"properties":{"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Id"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality Id"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood Id"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"}},"type":"object","title":"AdministrativeContext"},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes","description":"Ámbitos opcionales; máximo 64 caracteres por elemento."}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key","description":"Secreto completo; guárdelo ahora; no se repetirá."},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","name","key","key_prefix","scopes","created_at"],"title":"ApiKeyCreatedResponse","description":"La clave en texto plano solo se devuelve en la creación."},"ApiKeySummaryResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","user_id","name","key_prefix","scopes","is_active","created_at","last_used_at","revoked_at"],"title":"ApiKeySummaryResponse"},"ApiKeyUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"ApiKeyUpdateRequest"},"ApiUsageEndpointBreakdown":{"properties":{"service":{"type":"string","title":"Service"},"method":{"type":"string","title":"Method"},"endpoint":{"type":"string","title":"Endpoint"},"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors"},"avg_latency_ms":{"type":"number","title":"Avg Latency Ms"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["service","method","endpoint","requests","errors","avg_latency_ms","last_used_at"],"title":"ApiUsageEndpointBreakdown"},"ApiUsageKeyBreakdown":{"properties":{"api_key_id":{"type":"string","format":"uuid","title":"Api Key Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"is_active":{"type":"boolean","title":"Is Active"},"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors"},"success_rate":{"type":"number","title":"Success Rate"},"avg_latency_ms":{"type":"number","title":"Avg Latency Ms"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["api_key_id","name","key_prefix","is_active","requests","errors","success_rate","avg_latency_ms","last_used_at"],"title":"ApiUsageKeyBreakdown"},"ApiUsageOverviewResponse":{"properties":{"period":{"$ref":"#/components/schemas/ApiUsagePeriod"},"totals":{"$ref":"#/components/schemas/ApiUsageTotals"},"timeseries":{"items":{"$ref":"#/components/schemas/ApiUsageTimeseriesPoint"},"type":"array","title":"Timeseries"},"services":{"items":{"$ref":"#/components/schemas/ApiUsageServiceBreakdown"},"type":"array","title":"Services"},"keys":{"items":{"$ref":"#/components/schemas/ApiUsageKeyBreakdown"},"type":"array","title":"Keys"},"endpoints":{"items":{"$ref":"#/components/schemas/ApiUsageEndpointBreakdown"},"type":"array","title":"Endpoints"}},"type":"object","required":["period","totals","timeseries","services","keys","endpoints"],"title":"ApiUsageOverviewResponse"},"ApiUsagePeriod":{"properties":{"start":{"type":"string","format":"date","title":"Start"},"end":{"type":"string","format":"date","title":"End"}},"type":"object","required":["start","end"],"title":"ApiUsagePeriod"},"ApiUsageServiceBreakdown":{"properties":{"service":{"type":"string","title":"Service"},"label":{"type":"string","title":"Label"},"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors"},"success_rate":{"type":"number","title":"Success Rate"},"avg_latency_ms":{"type":"number","title":"Avg Latency Ms"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["service","label","requests","errors","success_rate","avg_latency_ms","last_used_at"],"title":"ApiUsageServiceBreakdown"},"ApiUsageTimeseriesPoint":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors"}},"type":"object","required":["date","requests","errors"],"title":"ApiUsageTimeseriesPoint"},"ApiUsageTotals":{"properties":{"requests":{"type":"integer","title":"Requests"},"errors":{"type":"integer","title":"Errors"},"success_rate":{"type":"number","title":"Success Rate"},"avg_latency_ms":{"type":"number","title":"Avg Latency Ms"},"active_keys":{"type":"integer","title":"Active Keys"}},"type":"object","required":["requests","errors","success_rate","avg_latency_ms","active_keys"],"title":"ApiUsageTotals"},"AppRole":{"type":"string","enum":["user","internal","admin"],"title":"AppRole"},"AutocompleteResponse":{"properties":{"suggestions":{"items":{"$ref":"#/components/schemas/AutocompleteSuggestion"},"type":"array","title":"Suggestions"}},"type":"object","title":"AutocompleteResponse","description":"Lista de sugerencias para un prefijo de búsqueda."},"AutocompleteSuggestion":{"properties":{"label":{"type":"string","title":"Label","description":"Texto mostrado al usuario (nombre completo del lugar)."},"query_for_classify":{"type":"string","title":"Query For Classify","description":"Valor recomendado del parámetro ``q`` en GET .../search-classify."},"kind_hint":{"anyOf":[{"type":"string","enum":["address","city","neighborhood","locality","unknown"]},{"type":"null"}],"title":"Kind Hint","description":"Heurística Google Places; ``search-classify`` puede afinar con geocodificación completa."},"coordinates":{"anyOf":[{"$ref":"#/components/schemas/Coordinates"},{"type":"null"}],"description":"Centro del candidato (vista previa en mapa, opcional)."}},"type":"object","required":["label","query_for_classify"],"title":"AutocompleteSuggestion","description":"Una fila de autocompletado pensada para reenviar a ``search-classify``."},"Coordinates":{"properties":{"lat":{"type":"number","title":"Lat"},"lon":{"type":"number","title":"Lon"}},"type":"object","required":["lat","lon"],"title":"Coordinates"},"CurrentUserAccess":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"role":{"$ref":"#/components/schemas/AppRole"},"is_internal":{"type":"boolean","title":"Is Internal","readOnly":true},"is_admin":{"type":"boolean","title":"Is Admin","readOnly":true}},"type":"object","required":["user_id","email","name","role","is_internal","is_admin"],"title":"CurrentUserAccess"},"DistanceCounts":{"properties":{"within_500m":{"type":"integer","title":"Within 500M","default":0},"within_1km":{"type":"integer","title":"Within 1Km","default":0},"within_2km":{"type":"integer","title":"Within 2Km","default":0}},"type":"object","title":"DistanceCounts"},"EstimateBand":{"properties":{"median":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median"},"p25":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P25"},"p75":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P75"},"n":{"type":"integer","minimum":0,"title":"N","description":"Número de comparables con valor válido en ese canal.","default":0},"unit":{"type":"string","title":"Unit","description":"Unidad de la banda: COP, COP_mes, COP_noche o pct."}},"type":"object","required":["unit"],"title":"EstimateBand"},"EstimateMethodology":{"properties":{"pipeline_contract":{"type":"string","title":"Pipeline Contract","default":"v2"},"confidence":{"type":"string","enum":["alta","media","baja"],"title":"Confidence"},"data_sources":{"items":{"type":"string"},"type":"array","title":"Data Sources"},"search_radius_km":{"type":"number","title":"Search Radius Km"},"distance_weight":{"type":"string","enum":["inverse","gaussian"],"title":"Distance Weight"},"candidate_rows":{"additionalProperties":{"type":"integer"},"type":"object","title":"Candidate Rows"},"effective_samples":{"additionalProperties":{"type":"integer"},"type":"object","title":"Effective Samples"},"outliers_removed":{"additionalProperties":{"type":"integer"},"type":"object","title":"Outliers Removed"},"relaxation_applied":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object","title":"Relaxation Applied"}},"type":"object","required":["confidence","data_sources","search_radius_km","distance_weight","candidate_rows","effective_samples","outliers_removed","relaxation_applied"],"title":"EstimateMethodology","description":"Trazabilidad estructurada del cálculo para explicar calidad y muestra."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InternalPropertySearchItem":{"properties":{"market":{"type":"string","enum":["traditional","short_term","presale"],"title":"Market"},"entity_id":{"type":"string","title":"Entity Id"},"secondary_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Observed At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"}},"type":"object","required":["market","entity_id"],"title":"InternalPropertySearchItem"},"InternalPropertySearchResponse":{"properties":{"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"},"counts":{"additionalProperties":{"type":"integer"},"propertyNames":{"enum":["traditional","short_term","presale"]},"type":"object","title":"Counts"},"items":{"items":{"$ref":"#/components/schemas/InternalPropertySearchItem"},"type":"array","title":"Items"}},"type":"object","required":["total","offset","limit","counts","items"],"title":"InternalPropertySearchResponse"},"LocationEnrichmentResponse":{"properties":{"location":{"$ref":"#/components/schemas/app__schemas__location_enrichment__ResolvedLocation"},"administrative":{"$ref":"#/components/schemas/AdministrativeContext"},"search_radius_m":{"type":"number","title":"Search Radius M"},"layers":{"items":{"$ref":"#/components/schemas/NearbyLayer"},"type":"array","title":"Layers"},"enriched_at":{"type":"string","format":"date-time","title":"Enriched At"}},"type":"object","required":["location","administrative","search_radius_m","layers","enriched_at"],"title":"LocationEnrichmentResponse"},"NearbyFeature":{"properties":{"feature_id":{"type":"string","title":"Feature Id"},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"feature_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Type"},"subtype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtype"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"distance_m":{"type":"number","title":"Distance M"},"nearest_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nearest Latitude"},"nearest_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Nearest Longitude"},"centroid_latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Centroid Latitude"},"centroid_longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Centroid Longitude"},"geometry":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geometry","description":"Geometría GeoJSON simplificada de la entidad urbana."},"properties":{"additionalProperties":true,"type":"object","title":"Properties"}},"type":"object","required":["feature_id","distance_m"],"title":"NearbyFeature"},"NearbyLayer":{"properties":{"category":{"type":"string","title":"Category"},"system":{"type":"string","title":"System"},"label":{"type":"string","title":"Label"},"counts":{"$ref":"#/components/schemas/DistanceCounts"},"nearest":{"$ref":"#/components/schemas/NearbyFeature"},"nearby":{"items":{"$ref":"#/components/schemas/NearbyFeature"},"type":"array","title":"Nearby"}},"type":"object","required":["category","system","label","counts","nearest","nearby"],"title":"NearbyLayer"},"OccupancyCalendarDay":{"properties":{"calendar_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Calendar Date"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"},"min_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Nights"}},"type":"object","title":"OccupancyCalendarDay","description":"Disponibilidad observada para un día del último snapshot."},"PolygonSearchRequest":{"properties":{"polygon":{"$ref":"#/components/schemas/app__api__internal__v2__properties__GeoJSONPolygon"},"limit":{"type":"integer","minimum":1,"title":"Limit","default":500},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","required":["polygon"],"title":"PolygonSearchRequest","description":"Body para búsqueda por polígono."},"PresaleProjectDetail":{"properties":{"project_id":{"type":"string","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"housing_condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Housing Condition"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"min_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price Per M2"},"monthly_payment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Payment"},"months_to_pay":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Pay"},"downpayment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Downpayment"},"est_monthly_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Return"},"portal_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Portal Rank Score"},"subsidies":{"anyOf":[{},{"type":"null"}],"title":"Subsidies"},"project_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Tag"},"min_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Unit Price"},"max_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Unit Price"},"min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Area"},"max_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bedrooms"},"min_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Bedrooms"},"max_bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bathrooms"},"different_unit_types":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Different Unit Types"},"typology_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typology Count"},"typology_min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Price"},"typology_max_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Price"},"typology_min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Area"},"typology_max_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Area"},"market_airbnb_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Monthly Income"},"market_airbnb_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Occupancy Pct"},"airbnb_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Match Level"},"airbnb_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Sample Size"},"min_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Airbnb Yield Pct"},"max_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Airbnb Yield Pct"},"avg_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Airbnb Yield Pct"},"best_airbnb_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Airbnb Typology"},"best_airbnb_typology_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Typology Price"},"best_airbnb_typology_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Airbnb Typology Bedrooms"},"best_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Yield Pct"},"market_traditional_monthly_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Traditional Monthly Rent"},"market_rent_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Rent Per M2"},"traditional_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traditional Match Level"},"traditional_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Sample Size"},"min_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Traditional Yield Pct"},"max_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Traditional Yield Pct"},"avg_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Traditional Yield Pct"},"best_traditional_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Traditional Typology"},"best_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Traditional Yield Pct"},"avg_downpayment_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Downpayment Pct"},"avg_buy_vs_rent_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Buy Vs Rent Ratio"},"avg_payback_years_airbnb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Airbnb"},"avg_payback_years_traditional":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Traditional"},"delivery_horizon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Horizon"},"investment_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Investment Score"},"final_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Recommendation"},"investment_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Tier"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"months_to_delivery":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Delivery"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"typologies":{"items":{"$ref":"#/components/schemas/PresaleTypology"},"type":"array","title":"Typologies"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"},"property_images":{"items":{"$ref":"#/components/schemas/PropertyImageSet"},"type":"array","title":"Property Images"}},"type":"object","required":["project_id","project_name","synced_at"],"title":"PresaleProjectDetail","description":"Detalle de preventa con imágenes agregadas por fuente."},"PresaleProjectMapRow":{"properties":{"project_id":{"type":"string","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"housing_condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Housing Condition"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"min_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price Per M2"},"monthly_payment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Payment"},"months_to_pay":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Pay"},"downpayment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Downpayment"},"est_monthly_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Return"},"portal_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Portal Rank Score"},"project_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Tag"},"min_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Unit Price"},"max_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Unit Price"},"min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Area"},"max_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bedrooms"},"min_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Bedrooms"},"max_bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bathrooms"},"different_unit_types":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Different Unit Types"},"typology_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typology Count"},"typology_min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Price"},"typology_max_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Price"},"typology_min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Area"},"typology_max_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Area"},"market_airbnb_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Monthly Income"},"market_airbnb_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Occupancy Pct"},"airbnb_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Match Level"},"airbnb_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Sample Size"},"min_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Airbnb Yield Pct"},"max_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Airbnb Yield Pct"},"avg_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Airbnb Yield Pct"},"best_airbnb_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Airbnb Typology"},"best_airbnb_typology_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Typology Price"},"best_airbnb_typology_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Airbnb Typology Bedrooms"},"best_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Yield Pct"},"market_traditional_monthly_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Traditional Monthly Rent"},"market_rent_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Rent Per M2"},"traditional_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traditional Match Level"},"traditional_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Sample Size"},"min_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Traditional Yield Pct"},"max_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Traditional Yield Pct"},"avg_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Traditional Yield Pct"},"best_traditional_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Traditional Typology"},"best_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Traditional Yield Pct"},"avg_downpayment_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Downpayment Pct"},"avg_buy_vs_rent_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Buy Vs Rent Ratio"},"avg_payback_years_airbnb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Airbnb"},"avg_payback_years_traditional":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Traditional"},"delivery_horizon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Horizon"},"investment_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Investment Score"},"final_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Recommendation"},"investment_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Tier"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"months_to_delivery":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Delivery"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["project_id","project_name","synced_at"],"title":"PresaleProjectMapRow","description":"Fila liviana para pintar el mapa de preventa."},"PresaleProjectRow":{"properties":{"project_id":{"type":"string","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"housing_condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Housing Condition"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"min_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price Per M2"},"monthly_payment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Payment"},"months_to_pay":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Pay"},"downpayment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Downpayment"},"est_monthly_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Return"},"portal_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Portal Rank Score"},"subsidies":{"anyOf":[{},{"type":"null"}],"title":"Subsidies"},"project_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Tag"},"min_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Unit Price"},"max_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Unit Price"},"min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Area"},"max_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bedrooms"},"min_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Bedrooms"},"max_bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bathrooms"},"different_unit_types":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Different Unit Types"},"typology_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typology Count"},"typology_min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Price"},"typology_max_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Price"},"typology_min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Area"},"typology_max_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Area"},"market_airbnb_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Monthly Income"},"market_airbnb_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Occupancy Pct"},"airbnb_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Match Level"},"airbnb_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Sample Size"},"min_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Airbnb Yield Pct"},"max_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Airbnb Yield Pct"},"avg_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Airbnb Yield Pct"},"best_airbnb_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Airbnb Typology"},"best_airbnb_typology_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Typology Price"},"best_airbnb_typology_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Airbnb Typology Bedrooms"},"best_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Yield Pct"},"market_traditional_monthly_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Traditional Monthly Rent"},"market_rent_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Rent Per M2"},"traditional_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traditional Match Level"},"traditional_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Sample Size"},"min_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Traditional Yield Pct"},"max_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Traditional Yield Pct"},"avg_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Traditional Yield Pct"},"best_traditional_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Traditional Typology"},"best_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Traditional Yield Pct"},"avg_downpayment_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Downpayment Pct"},"avg_buy_vs_rent_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Buy Vs Rent Ratio"},"avg_payback_years_airbnb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Airbnb"},"avg_payback_years_traditional":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Traditional"},"delivery_horizon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Horizon"},"investment_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Investment Score"},"final_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Recommendation"},"investment_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Tier"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"months_to_delivery":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Delivery"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"typologies":{"items":{"$ref":"#/components/schemas/PresaleTypology"},"type":"array","title":"Typologies"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["project_id","project_name","synced_at"],"title":"PresaleProjectRow","description":"Refleja columnas expuestas por PostgREST sobre la tabla del pipeline."},"PresaleSimilarRow":{"properties":{"project_id":{"type":"string","title":"Project Id"},"project_name":{"type":"string","title":"Project Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"housing_condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Housing Condition"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"zone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zone"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"min_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Price Per M2"},"monthly_payment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Payment"},"months_to_pay":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Pay"},"downpayment":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Downpayment"},"est_monthly_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Return"},"portal_rank_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Portal Rank Score"},"subsidies":{"anyOf":[{},{"type":"null"}],"title":"Subsidies"},"project_tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Tag"},"min_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Unit Price"},"max_unit_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Unit Price"},"min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Area"},"max_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bedrooms"},"min_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Bedrooms"},"max_bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Bathrooms"},"different_unit_types":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Different Unit Types"},"typology_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Typology Count"},"typology_min_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Price"},"typology_max_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Price"},"typology_min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Min Area"},"typology_max_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Typology Max Area"},"market_airbnb_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Monthly Income"},"market_airbnb_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Airbnb Occupancy Pct"},"airbnb_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Match Level"},"airbnb_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Sample Size"},"min_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Airbnb Yield Pct"},"max_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Airbnb Yield Pct"},"avg_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Airbnb Yield Pct"},"best_airbnb_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Airbnb Typology"},"best_airbnb_typology_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Typology Price"},"best_airbnb_typology_bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Best Airbnb Typology Bedrooms"},"best_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Airbnb Yield Pct"},"market_traditional_monthly_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Traditional Monthly Rent"},"market_rent_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Rent Per M2"},"traditional_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traditional Match Level"},"traditional_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Sample Size"},"min_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Traditional Yield Pct"},"max_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Traditional Yield Pct"},"avg_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Traditional Yield Pct"},"best_traditional_typology":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Best Traditional Typology"},"best_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Best Traditional Yield Pct"},"avg_downpayment_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Downpayment Pct"},"avg_buy_vs_rent_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Buy Vs Rent Ratio"},"avg_payback_years_airbnb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Airbnb"},"avg_payback_years_traditional":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Payback Years Traditional"},"delivery_horizon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Horizon"},"investment_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Investment Score"},"final_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Recommendation"},"investment_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Tier"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"months_to_delivery":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months To Delivery"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"typologies":{"items":{"$ref":"#/components/schemas/PresaleTypology"},"type":"array","title":"Typologies"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"},"similarity_score":{"type":"number","title":"Similarity Score","description":"Puntaje V2 de similitud (0-100): mayor = más comparable en ubicación, rango de precio, área, tipología y timing."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distancia Haversine al proyecto de referencia; null si falta lat/lng en alguno."},"match_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Quality","description":"Lectura corta del pareo: alta, media o baja."},"match_breakdown":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Match Breakdown","description":"Desglose estructurado del match: señales de ubicación, precio, área, dormitorios y entrega."},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","description":"Razones legibles para UI que resumen por qué el proyecto salió como similar."}},"type":"object","required":["project_id","project_name","synced_at","similarity_score"],"title":"PresaleSimilarRow","description":"Proyecto de preventa parecido a otro de referencia (misma vertical)."},"PresaleTypology":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"bedroom":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedroom"},"bathroom":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bathroom"},"min_area":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Area"},"pictures":{"items":{"type":"string"},"type":"array","title":"Pictures"},"parking_numbers":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Parking Numbers"},"airbnb_est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Est Monthly Income"},"airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Yield Pct"},"airbnb_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Sample Size"},"airbnb_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Airbnb Match Level"},"traditional_est_monthly_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Traditional Est Monthly Rent"},"traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Traditional Yield Pct"},"traditional_sample_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Sample Size"},"traditional_match_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Traditional Match Level"}},"additionalProperties":true,"type":"object","title":"PresaleTypology","description":"Tipologia de un proyecto con métricas de mercado calculadas por unidad."},"PropertyEstimateRequest":{"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude","description":"Latitud WGS84; obligatoria salvo `address_query`."},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude","description":"Longitud WGS84; obligatoria salvo `address_query`."},"address_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Query","description":"Si no hay lat/lon, se geocodifica con Google Maps (Geocoding API) y se usa el primer resultado."},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type","description":"Ej. apartamento, casa. Recomendado; si la muestra es escasa se puede relajar (ver `warnings`)."},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages","description":"Parqueaderos del inmueble a valorar; filtra comparables tradicionales (±1 vs el dato del aviso)."},"antiquity":{"anyOf":[{"type":"integer","maximum":120,"minimum":0},{"type":"null"}],"title":"Antiquity","description":"Antigüedad del inmueble a valorar en años; filtra comparables tradicionales dentro de ±5 años (avisos sin dato no se excluyen)."},"estrato":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Estrato","description":"Estrato manual (1–6). Si se omite, la API intenta resolverlo automáticamente desde la capa urbana de estratificación que contiene el punto o la manzana válida más cercana cuando el geocodificador ubica el punto sobre una vía."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Si se envía, filtra avisos con el mismo `country`."},"amenities":{"items":{"type":"string"},"type":"array","title":"Amenities","description":"Reservado para versiones futuras; no afecta el cálculo en v1."},"max_distance_km":{"type":"number","maximum":5,"minimum":0.5,"title":"Max Distance Km","description":"Radio máximo de búsqueda de comparables, en kilómetros.","default":2},"distance_weight":{"type":"string","enum":["inverse","gaussian"],"title":"Distance Weight","description":"Método para dar más peso a comparables cercanos: `inverse` o `gaussian`.","default":"inverse"},"min_comparables":{"type":"integer","maximum":100,"minimum":1,"title":"Min Comparables","description":"Muestra mínima deseada antes de ampliar algunos criterios de búsqueda.","default":10},"bbox_half_km":{"type":"number","maximum":80,"minimum":5,"title":"Bbox Half Km","description":"Parámetro avanzado de respaldo para acotar la búsqueda geográfica cuando sea necesario.","default":18},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale","description":"`False` excluye datos obsoletos; `None` no filtra.","default":false},"comparables_limit":{"type":"integer","maximum":50,"minimum":1,"title":"Comparables Limit","description":"Máximo de avisos comparables a incluir en la respuesta.","default":20},"include_strategic_analysis":{"type":"boolean","title":"Include Strategic Analysis","description":"Si es `true`, añade análisis estratégico generado por IA. Use `false` cuando priorice una respuesta numérica de baja latencia.","default":true}},"type":"object","title":"PropertyEstimateRequest","description":"Datos del inmueble a valorar y parámetros de búsqueda."},"PropertyEstimateResponse":{"properties":{"location_resolved":{"$ref":"#/components/schemas/app__schemas__property_estimate__ResolvedLocation"},"sale":{"$ref":"#/components/schemas/EstimateBand"},"rent":{"$ref":"#/components/schemas/EstimateBand"},"sale_per_m2":{"$ref":"#/components/schemas/EstimateBand","description":"Mediana y percentiles de precio de venta por m² (COP/m²); ponderado por proximidad y filtrado de outliers."},"rent_per_m2":{"$ref":"#/components/schemas/EstimateBand","description":"Mediana y percentiles de canon de arriendo por m² y mes (COP/m²/mes); ponderado por proximidad y filtrado de outliers."},"airbnb_monthly":{"$ref":"#/components/schemas/EstimateBand","description":"Ingreso mensual estimado de renta corta. Permanece sin valores hasta disponer de ocupación calibrada."},"airbnb_nightly":{"$ref":"#/components/schemas/EstimateBand","description":"Tarifa nocturna observada en el histórico de scrapeos de comparables STR."},"airbnb_gross_potential_30n":{"$ref":"#/components/schemas/EstimateBand","description":"Potencial bruto a 30 noches calculado como tarifa nocturna observada por 30. Supone disponibilidad completa y no es ingreso esperado ni realizado."},"airbnb_occupancy_pct":{"$ref":"#/components/schemas/EstimateBand","description":"Banda orientativa de ocupación de renta corta entre comparables; no es una medición del inmueble consultado."},"traditional_comparables":{"items":{"$ref":"#/components/schemas/TraditionalComparableItem"},"type":"array","title":"Traditional Comparables","description":"Avisos tradicionales usados como referencia para la estimación; ordenados por parecido y distancia."},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings"},"methodology":{"anyOf":[{"$ref":"#/components/schemas/EstimateMethodology"},{"type":"null"}],"description":"Muestra, filtros, outliers y nivel de confianza del cálculo."},"short_term_comparables":{"items":{"$ref":"#/components/schemas/ShortTermComparableItem"},"type":"array","title":"Short Term Comparables","description":"Alojamientos de renta corta cercanos usados como evidencia de tarifa nocturna; ordenados por parecido y distancia."},"ml_estimate_sale_cop":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ml Estimate Sale Cop","description":"Estimación opcional de venta generada por modelos adicionales cuando esté disponible."},"ml_model_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ml Model Version","description":"Versión del modelo adicional usado para la estimación opcional, si aplica."},"disclaimer":{"type":"string","title":"Disclaimer","description":"Aviso legal: orientación de mercado, no tasación ni avalúo."},"strategic_analysis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategic Analysis","description":"Texto breve (inversión, arriendo tradicional o renta corta tipo Airbnb): qué importa, riesgos de datos y siguiente paso; sin jerga de implementación ni abrir describiendo el inmueble. En UI conviene mostrar la cadena completa o un “ver más” explícito: un truncado por altura/`line-clamp` puede ocultar el final (p. ej. renta corta) aunque la API devuelva el texto entero."}},"type":"object","required":["location_resolved","sale","rent","sale_per_m2","rent_per_m2","airbnb_monthly","airbnb_nightly","airbnb_gross_potential_30n","airbnb_occupancy_pct","disclaimer"],"title":"PropertyEstimateResponse"},"PropertyIdsRequest":{"properties":{"property_ids":{"items":{"type":"string"},"type":"array","title":"Property Ids","description":"Lista de property_ids a consultar"},"market_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Type","description":"Si se indica, solo filas con este market_type (traditional | presale | airbnb)"}},"type":"object","required":["property_ids"],"title":"PropertyIdsRequest"},"PropertyImageSet":{"properties":{"property_id":{"type":"string","title":"Property Id"},"market_type":{"type":"string","title":"Market Type"},"source":{"type":"string","title":"Source"},"images":{"items":{},"type":"array","title":"Images"},"image_count":{"type":"integer","title":"Image Count"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["property_id","market_type","source","image_count","synced_at"],"title":"PropertyImageSet","description":"Grupo HTTP de imágenes por fuente; en V2 se arma desde filas relacionales."},"SearchClassifyResponse":{"properties":{"kind":{"type":"string","enum":["address","city","neighborhood","locality","unknown"],"title":"Kind","description":"address=dirección concreta; city=ciudad; neighborhood=barrio/zona; localidad=localidad o núcleo menor; unknown=no clasificado."},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Nombre legible del resultado principal."},"coordinates":{"anyOf":[{"$ref":"#/components/schemas/Coordinates"},{"type":"null"}],"description":"Centro o punto de la dirección (principalmente para kind=address)."},"polygon":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Polygon","description":"GeoJSON Geometry (Polygon/MultiPolygon) cuando el proveedor lo expone."},"bbox":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Bbox","description":"Bounding box [min_lon, min_lat, max_lon, max_lat] si está disponible."},"provider_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Hint","description":"Proveedor(es): ``google_maps``, ``google_maps+nominatim`` si el polígono es OSM."}},"type":"object","required":["kind"],"title":"SearchClassifyResponse","description":"Clasifica el texto de búsqueda y devuelve punto o polígono según corresponda."},"ShortTermCalendarHistoryRow":{"properties":{"property_id":{"type":"string","title":"Property Id"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"calendar_date":{"type":"string","format":"date","title":"Calendar Date"},"is_available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available"},"min_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Nights"},"source_scraped_at":{"type":"string","format":"date-time","title":"Source Scraped At"},"scrape_date":{"type":"string","format":"date","title":"Scrape Date"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["property_id","calendar_date","source_scraped_at","scrape_date","synced_at"],"title":"ShortTermCalendarHistoryRow","description":"Observación relacional del calendario para una fecha de scrape."},"ShortTermCalendarSnapshot":{"properties":{"property_id":{"type":"string","title":"Property Id"},"days":{"items":{"$ref":"#/components/schemas/OccupancyCalendarDay"},"type":"array","title":"Days"},"available_days":{"type":"integer","title":"Available Days"},"unavailable_days":{"type":"integer","title":"Unavailable Days"},"observed_days":{"type":"integer","title":"Observed Days"},"total_days":{"type":"integer","title":"Total Days"},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights","description":"Promedio de noches mínimas del calendario futuro del último snapshot."},"median_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Min Nights"},"mode_min_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mode Min Nights"},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct"},"estimated_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Occupancy Pct"},"occupancy_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Method"},"occupancy_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Confidence"},"est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Income"},"monthly_income_upper_bound":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Income Upper Bound"},"income_estimate_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Income Estimate Method"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"}},"type":"object","required":["property_id","days","available_days","unavailable_days","observed_days","total_days"],"title":"ShortTermCalendarSnapshot","description":"Último snapshot de calendario con métricas calculadas en API."},"ShortTermComparableItem":{"properties":{"property_id":{"type":"string","title":"Property Id"},"distance_km":{"type":"number","title":"Distance Km","description":"Distancia Haversine al punto consultado (km)."},"similarity_score":{"type":"number","maximum":100,"minimum":0,"title":"Similarity Score","description":"Parecido global por distancia, tipo de inmueble y dormitorios (0-100)."},"match_quality":{"type":"string","enum":["alta","media","baja"],"title":"Match Quality"},"match_breakdown":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Match Breakdown","description":"Desglose del pareo STR; no usa precio, disponibilidad ni ocupación para calcular similitud."},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beds"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"is_superhost":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superhost"},"avg_night_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Night Price","description":"Tarifa nocturna observada en el histórico de scrapeos."},"monthly_gross_potential_30n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Gross Potential 30N","description":"Tarifa nocturna observada multiplicada por 30; supone disponibilidad completa y no representa ingreso mensual estimado."},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct","description":"Porcentaje de noches no disponibles observado; no equivale a ocupación ni reservas confirmadas."},"observed_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observed Days"},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights"},"data_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Confidence"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL de la imagen principal del alojamiento."}},"type":"object","required":["property_id","distance_km","similarity_score","match_quality"],"title":"ShortTermComparableItem","description":"Alojamiento STR cercano usado como evidencia de tarifa nocturna."},"ShortTermPolygonRequest":{"properties":{"polygon":{"$ref":"#/components/schemas/app__api__internal__v2__short_term__GeoJSONPolygon"},"limit":{"type":"integer","minimum":1,"title":"Limit","default":500},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"}},"type":"object","required":["polygon"],"title":"ShortTermPolygonRequest"},"ShortTermPriceHistoryPoint":{"properties":{"scrape_date":{"type":"string","format":"date","title":"Scrape Date"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"avg_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Price"},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Per Night"},"total_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Price"},"num_nights":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Num Nights"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"price_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Source"}},"type":"object","required":["scrape_date"],"title":"ShortTermPriceHistoryPoint","description":"Precio observado del listing en un scrape; no promedia calendario futuro."},"ShortTermRentalListRow":{"properties":{"property_id":{"type":"string","title":"Property Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beds"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"is_superhost":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superhost"},"host_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Name"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"avg_night_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Night Price"},"monthly_gross_potential_30n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Gross Potential 30N","description":"Tarifa nocturna observada multiplicada por 30; supone disponibilidad completa y no representa ingreso mensual estimado."},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights","description":"Promedio de noches mínimas del calendario futuro del último snapshot."},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct"},"unavailable_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unavailable Days"},"observed_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observed Days"},"estimated_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Occupancy Pct"},"occupancy_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Method"},"occupancy_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Confidence"},"est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Income"},"monthly_income_upper_bound":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Income Upper Bound"},"income_estimate_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Income Estimate Method"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"data_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Confidence"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Primera imagen relacional de la propiedad (si existe)."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["property_id","synced_at"],"title":"ShortTermRentalListRow","description":"Fila para listados y mapa, sin el calendario completo para mantener el payload acotado."},"ShortTermRentalMapRow":{"properties":{"property_id":{"type":"string","title":"Property Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beds"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"is_superhost":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superhost"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"avg_night_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Night Price"},"monthly_gross_potential_30n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Gross Potential 30N","description":"Potencial bruto a 30 noches; no es ingreso esperado."},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights"},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct"},"unavailable_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unavailable Days"},"observed_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observed Days"},"estimated_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Occupancy Pct"},"occupancy_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Method"},"occupancy_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Confidence"},"est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Income"},"monthly_income_upper_bound":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Income Upper Bound"},"income_estimate_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Income Estimate Method"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"data_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Confidence"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"}},"type":"object","required":["property_id","synced_at"],"title":"ShortTermRentalMapRow","description":"Fila liviana para pintar el mapa de rentas cortas."},"ShortTermRentalRow":{"properties":{"property_id":{"type":"string","title":"Property Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beds"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"is_superhost":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superhost"},"host_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Name"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"avg_night_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Night Price"},"monthly_gross_potential_30n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Gross Potential 30N","description":"Tarifa nocturna observada multiplicada por 30; supone disponibilidad completa y no representa ingreso mensual estimado."},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights","description":"Promedio de noches mínimas del calendario futuro del último snapshot."},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct"},"unavailable_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unavailable Days"},"observed_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observed Days"},"estimated_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Occupancy Pct"},"occupancy_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Method"},"occupancy_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Confidence"},"est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Income"},"monthly_income_upper_bound":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Income Upper Bound"},"income_estimate_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Income Estimate Method"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"data_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Confidence"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Primera imagen relacional de la propiedad (si existe)."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"},"occupancy_calendar":{"anyOf":[{"items":{"$ref":"#/components/schemas/OccupancyCalendarDay"},"type":"array"},{"type":"null"}],"title":"Occupancy Calendar"}},"type":"object","required":["property_id","synced_at"],"title":"ShortTermRentalRow","description":"Detalle por `property_id`: incluye `occupancy_calendar` del último snapshot."},"ShortTermSimilarRow":{"properties":{"property_id":{"type":"string","title":"Property Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"room_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Room Type"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"capacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Capacity"},"bedrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bedrooms"},"beds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Beds"},"rating_overall":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating Overall"},"review_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Review Count"},"is_superhost":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superhost"},"host_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host Name"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"avg_night_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Night Price"},"monthly_gross_potential_30n":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Gross Potential 30N","description":"Tarifa nocturna observada multiplicada por 30; supone disponibilidad completa y no representa ingreso mensual estimado."},"avg_min_nights":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Min Nights","description":"Promedio de noches mínimas del calendario futuro del último snapshot."},"calendar_unavailable_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calendar Unavailable Pct"},"unavailable_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unavailable Days"},"observed_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Observed Days"},"estimated_occupancy_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Occupancy Pct"},"occupancy_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Method"},"occupancy_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Occupancy Confidence"},"est_monthly_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Monthly Income"},"monthly_income_upper_bound":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Income Upper Bound"},"income_estimate_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Income Estimate Method"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"data_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Confidence"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Primera imagen relacional de la propiedad (si existe)."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"source_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Scraped At"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"search_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Text"},"synced_at":{"type":"string","format":"date-time","title":"Synced At"},"similarity_score":{"type":"number","title":"Similarity Score","description":"Puntaje V2 de similitud (0-100): mayor = más comparable en tipo, layout, capacidad, precio y cercanía."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distancia Haversine al aviso tradicional de referencia; null si falta lat/lng en alguno."},"match_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Quality","description":"Lectura corta del pareo: alta, media o baja."},"match_breakdown":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Match Breakdown","description":"Desglose estructurado del match: factores de tipo, capacidad, dormitorios, precio y geografía."},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","description":"Razones legibles para UI que resumen por qué la renta corta salió como similar."}},"type":"object","required":["property_id","synced_at","similarity_score"],"title":"ShortTermSimilarRow","description":"Renta corta parecida a otra renta corta de referencia; métricas de similitud."},"TraditionalComparableItem":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"property_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Id","description":"Identificador interno de la propiedad cuando está disponible."},"distance_km":{"type":"number","title":"Distance Km","description":"Distancia Haversine al punto consultado (km)."},"similarity_score":{"anyOf":[{"type":"number","maximum":100,"minimum":0},{"type":"null"}],"title":"Similarity Score","description":"Parecido global frente al inmueble consultado (0-100): distancia, área, layout, tipo, estrato y antigüedad."},"match_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Quality","description":"Lectura corta del score: alta, media o baja."},"match_breakdown":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Match Breakdown","description":"Datos útiles del pareo: diferencias de área, habitaciones, baños, garajes, antigüedad, estrato, tipo y aporte por distancia."},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms","description":"Número de baños; puede ser null si el aviso no trae dato."},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages","description":"Número de garajes / parqueaderos; puede ser null si el aviso no trae dato."},"antiquity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity","description":"Antigüedad en años; puede ser null si no hay dato."},"estrato":{"anyOf":[{"type":"integer","maximum":6,"minimum":1},{"type":"null"}],"title":"Estrato","description":"Estrato socioeconómico del inmueble; puede ser null fuera de Colombia o si no hay dato."},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL de la imagen principal del inmueble."}},"type":"object","required":["listing_id","distance_km"],"title":"TraditionalComparableItem","description":"Un aviso del mercado tradicional usado como comparable en la estimación (referencia visual)."},"TraditionalMarketDetail":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"property_id":{"type":"string","title":"Property Id"},"source_system":{"type":"string","title":"Source System"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages"},"antiquity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity"},"estrato":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"admin_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Admin Price"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"geo_relocation":{"anyOf":[{},{"type":"null"}],"title":"Geo Relocation"},"location_quality":{"anyOf":[{},{"type":"null"}],"title":"Location Quality"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"first_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Scraped At"},"days_on_market":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days On Market"},"total_scrape_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Scrape Days"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"has_price_reduction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price Reduction"},"price_change_total_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Change Total Pct"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"publisher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Name"},"publisher_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Phone"},"all_publishers":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Publishers"},"all_urls":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Urls"},"all_sources":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Sources"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"fingerprint_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint Id"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day"},"est_airbnb_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Income"},"est_traditional_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Rent"},"airbnb_vs_traditional_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Vs Traditional Multiplier"},"investment_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Recommendation"},"airbnb_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Comparables Count"},"traditional_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Rent Comparables Count"},"est_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Yield Pct"},"est_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Yield Pct"},"est_airbnb_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Payback Years"},"est_traditional_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Payback Years"},"zone_avg_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Sale Price Per M2"},"zone_median_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Sale Price Per M2"},"zone_p25_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Sale Price Per M2"},"zone_p75_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Sale Price Per M2"},"zone_sale_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Sale Comparables Count"},"sale_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs Zone Avg Pct"},"sale_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Price Valuation Label"},"zone_avg_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Rent Price Per M2"},"zone_median_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Rent Price Per M2"},"zone_p25_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Rent Price Per M2"},"zone_p75_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Rent Price Per M2"},"zone_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Rent Comparables Count"},"rent_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs Zone Avg Pct"},"rent_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Price Valuation Label"},"sale_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs 30D Ago Pct"},"rent_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs 30D Ago Pct"},"sale_trend_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Trend 30D"},"gross_cap_rate_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Cap Rate Annual Pct"},"net_admin_yield_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Admin Yield Annual Pct"},"recommendation_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation Confidence"},"property_images":{"items":{},"type":"array","title":"Property Images"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"},"price_history":{"items":{"$ref":"#/components/schemas/TraditionalMarketPriceHistory"},"type":"array","title":"Price History"}},"type":"object","required":["listing_id","property_id","source_system"],"title":"TraditionalMarketDetail","description":"Detalle de un aviso con historial de precios."},"TraditionalMarketMapRow":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"property_id":{"type":"string","title":"Property Id"},"source_system":{"type":"string","title":"Source System"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages"},"antiquity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity"},"estrato":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"admin_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Admin Price"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"days_on_market":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days On Market"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"has_price_reduction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price Reduction"},"price_change_total_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Change Total Pct"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"publisher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Name"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"investment_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Recommendation"},"sale_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Price Valuation Label"},"rent_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Price Valuation Label"},"geo_relocation":{"anyOf":[{},{"type":"null"}],"title":"Geo Relocation"},"location_quality":{"anyOf":[{},{"type":"null"}],"title":"Location Quality"},"sale_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs 30D Ago Pct"},"rent_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs 30D Ago Pct"},"sale_trend_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Trend 30D"},"rent_trend_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Trend 30D"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"}},"type":"object","required":["listing_id","property_id","source_system"],"title":"TraditionalMarketMapRow","description":"Fila liviana para pintar el mapa tradicional."},"TraditionalMarketPriceHistory":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"scraped_at":{"type":"string","format":"date-time","title":"Scraped At"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"sale_price_prev":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Prev"},"rent_price_prev":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Prev"},"sale_price_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Change"},"rent_price_change":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Change"},"sale_price_change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Change Pct"},"rent_price_change_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Change Pct"},"price_event":{"type":"string","title":"Price Event"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"}},"type":"object","required":["listing_id","scraped_at","price_event"],"title":"TraditionalMarketPriceHistory","description":"Evento histórico de precio para un aviso."},"TraditionalMarketRow":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"property_id":{"type":"string","title":"Property Id"},"source_system":{"type":"string","title":"Source System"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages"},"antiquity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity"},"estrato":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"admin_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Admin Price"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"geo_relocation":{"anyOf":[{},{"type":"null"}],"title":"Geo Relocation"},"location_quality":{"anyOf":[{},{"type":"null"}],"title":"Location Quality"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"first_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Scraped At"},"days_on_market":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days On Market"},"total_scrape_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Scrape Days"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"has_price_reduction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price Reduction"},"price_change_total_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Change Total Pct"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"publisher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Name"},"publisher_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Phone"},"all_publishers":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Publishers"},"all_urls":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Urls"},"all_sources":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Sources"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"fingerprint_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint Id"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day"},"est_airbnb_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Income"},"est_traditional_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Rent"},"airbnb_vs_traditional_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Vs Traditional Multiplier"},"investment_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Recommendation"},"airbnb_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Comparables Count"},"traditional_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Rent Comparables Count"},"est_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Yield Pct"},"est_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Yield Pct"},"est_airbnb_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Payback Years"},"est_traditional_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Payback Years"},"zone_avg_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Sale Price Per M2"},"zone_median_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Sale Price Per M2"},"zone_p25_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Sale Price Per M2"},"zone_p75_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Sale Price Per M2"},"zone_sale_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Sale Comparables Count"},"sale_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs Zone Avg Pct"},"sale_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Price Valuation Label"},"zone_avg_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Rent Price Per M2"},"zone_median_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Rent Price Per M2"},"zone_p25_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Rent Price Per M2"},"zone_p75_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Rent Price Per M2"},"zone_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Rent Comparables Count"},"rent_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs Zone Avg Pct"},"rent_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Price Valuation Label"},"sale_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs 30D Ago Pct"},"rent_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs 30D Ago Pct"},"sale_trend_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Trend 30D"},"gross_cap_rate_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Cap Rate Annual Pct"},"net_admin_yield_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Admin Yield Annual Pct"},"recommendation_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation Confidence"},"property_images":{"items":{},"type":"array","title":"Property Images"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"}},"type":"object","required":["listing_id","property_id","source_system"],"title":"TraditionalMarketRow","description":"Aviso inmobiliario deduplicado del mercado tradicional."},"TraditionalPolygonRequest":{"properties":{"polygon":{"$ref":"#/components/schemas/app__api__internal__v2__traditional__GeoJSONPolygon"},"limit":{"type":"integer","minimum":1,"title":"Limit","default":5000},"offset":{"type":"integer","minimum":0,"title":"Offset","default":0},"source_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source System"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"}},"type":"object","required":["polygon"],"title":"TraditionalPolygonRequest"},"TraditionalSimilarRow":{"properties":{"listing_id":{"type":"string","title":"Listing Id"},"property_id":{"type":"string","title":"Property Id"},"source_system":{"type":"string","title":"Source System"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"property_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Property Type"},"normalized_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Normalized Type"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"area_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Area M2"},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms"},"bathrooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bathrooms"},"garages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Garages"},"antiquity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Antiquity"},"estrato":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato"},"sale_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price"},"rent_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price"},"admin_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Admin Price"},"sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Per M2"},"rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Per M2"},"neighborhood":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Neighborhood"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"h3_res7":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res7"},"h3_res8":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res8"},"h3_res9":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"H3 Res9"},"geo_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geo Hash"},"urban_transport":{"anyOf":[{},{"type":"null"}],"title":"Urban Transport"},"urban_retail":{"anyOf":[{},{"type":"null"}],"title":"Urban Retail"},"urban_stratification":{"anyOf":[{},{"type":"null"}],"title":"Urban Stratification"},"urban_environment":{"anyOf":[{},{"type":"null"}],"title":"Urban Environment"},"urban_education":{"anyOf":[{},{"type":"null"}],"title":"Urban Education"},"market_liquidity":{"anyOf":[{},{"type":"null"}],"title":"Market Liquidity"},"geo_relocation":{"anyOf":[{},{"type":"null"}],"title":"Geo Relocation"},"location_quality":{"anyOf":[{},{"type":"null"}],"title":"Location Quality"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"locality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locality"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"first_scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Scraped At"},"days_on_market":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days On Market"},"total_scrape_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Scrape Days"},"days_since_last_scrape":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Since Last Scrape"},"is_stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Stale"},"has_price_reduction":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Price Reduction"},"price_change_total_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Change Total Pct"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"publisher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Name"},"publisher_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publisher Phone"},"all_publishers":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Publishers"},"all_urls":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Urls"},"all_sources":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"All Sources"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"fingerprint_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint Id"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Month"},"day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day"},"est_airbnb_income":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Income"},"est_traditional_rent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Rent"},"airbnb_vs_traditional_multiplier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Airbnb Vs Traditional Multiplier"},"investment_recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Investment Recommendation"},"airbnb_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Airbnb Comparables Count"},"traditional_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Traditional Rent Comparables Count"},"est_airbnb_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Yield Pct"},"est_traditional_yield_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Yield Pct"},"est_airbnb_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Airbnb Payback Years"},"est_traditional_payback_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Est Traditional Payback Years"},"zone_avg_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Sale Price Per M2"},"zone_median_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Sale Price Per M2"},"zone_p25_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Sale Price Per M2"},"zone_p75_sale_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Sale Price Per M2"},"zone_sale_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Sale Comparables Count"},"sale_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs Zone Avg Pct"},"sale_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Price Valuation Label"},"zone_avg_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Avg Rent Price Per M2"},"zone_median_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone Median Rent Price Per M2"},"zone_p25_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P25 Rent Price Per M2"},"zone_p75_rent_price_per_m2":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Zone P75 Rent Price Per M2"},"zone_rent_comparables_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Zone Rent Comparables Count"},"rent_price_vs_zone_avg_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs Zone Avg Pct"},"rent_price_valuation_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rent Price Valuation Label"},"sale_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sale Price Vs 30D Ago Pct"},"rent_price_vs_30d_ago_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rent Price Vs 30D Ago Pct"},"sale_trend_30d":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sale Trend 30D"},"gross_cap_rate_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gross Cap Rate Annual Pct"},"net_admin_yield_annual_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Net Admin Yield Annual Pct"},"recommendation_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation Confidence"},"property_images":{"items":{},"type":"array","title":"Property Images"},"refreshed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Refreshed At"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"},"similarity_score":{"type":"number","title":"Similarity Score","description":"Puntaje V2 de similitud (0-100): mayor = más comparable en tipo, negocio, layout, área y cercanía."},"distance_km":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Distance Km","description":"Distancia Haversine al aviso de referencia; null si falta lat/lng en alguno."},"match_quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Match Quality","description":"Lectura corta del pareo: alta, media o baja."},"match_breakdown":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"string"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Match Breakdown","description":"Desglose estructurado del match: factores de score, deltas y compatibilidades principales."},"match_reasons":{"items":{"type":"string"},"type":"array","title":"Match Reasons","description":"Razones legibles para UI que resumen por qué el aviso salió como similar."}},"type":"object","required":["listing_id","property_id","source_system","similarity_score"],"title":"TraditionalSimilarRow","description":"Aviso tradicional parecido a otro del mismo mercado."},"UserRoleUpdate":{"properties":{"role":{"$ref":"#/components/schemas/AppRole"}},"type":"object","required":["role"],"title":"UserRoleUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"app__api__internal__v2__properties__GeoJSONPolygon":{"properties":{"type":{"type":"string","pattern":"^Polygon$","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates","description":"Array de anillos. Cada anillo es un array de [lng, lat]."}},"type":"object","required":["coordinates"],"title":"GeoJSONPolygon","description":"GeoJSON Polygon geometry."},"app__api__internal__v2__short_term__GeoJSONPolygon":{"properties":{"type":{"type":"string","pattern":"^Polygon$","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates","description":"Array de anillos. Cada anillo es un array de [lng, lat]."}},"type":"object","required":["coordinates"],"title":"GeoJSONPolygon"},"app__api__internal__v2__traditional__GeoJSONPolygon":{"properties":{"type":{"type":"string","pattern":"^Polygon$","title":"Type","default":"Polygon"},"coordinates":{"items":{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},"type":"array","title":"Coordinates","description":"Anillos GeoJSON. Cada punto es [lng, lat]."}},"type":"object","required":["coordinates"],"title":"GeoJSONPolygon"},"app__schemas__location_enrichment__ResolvedLocation":{"properties":{"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"input_type":{"type":"string","title":"Input Type","description":"address o coordinates"},"input_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Address"},"formatted_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Formatted Address"},"geocoding_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geocoding Provider"}},"type":"object","required":["latitude","longitude","input_type"],"title":"ResolvedLocation"},"app__schemas__property_estimate__ResolvedLocation":{"properties":{"latitude":{"type":"number","title":"Latitude"},"longitude":{"type":"number","title":"Longitude"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Dirección formateada por Google Maps: geocodificación normal cuando se recibió texto o geocodificación inversa cuando se recibieron coordenadas."},"geocoded_from_address":{"type":"boolean","title":"Geocoded From Address","default":false},"estrato":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Estrato","description":"Estrato efectivo usado en la valoración, ya sea manual o detectado por capa."},"estrato_source":{"type":"string","enum":["user","urban_layer","unavailable"],"title":"Estrato Source","description":"Origen del estrato efectivo: usuario, capa urbana o no disponible.","default":"unavailable"}},"type":"object","required":["latitude","longitude"],"title":"ResolvedLocation"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"},"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Clave de API de InmoData (prefijo típico `imd_`). Alternativa equivalente: cabecera `Authorization: Bearer <misma_clave>`."},"ApiKeyBearer":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"Mismo valor que enviarías en `X-Api-Key`. Para endpoints públicos, el Bearer transporta la **API key**."}}}}