{"openapi":"3.1.0","info":{"title":"TodoProps API pública","version":"1.0.0","summary":"Datos inmobiliarios y económicos públicos de Argentina, sin clave de acceso.","description":"Endpoints de sólo lectura sobre propiedades, geografía argentina, índices del BCRA/INDEC e inmobiliarias verificadas. No requieren autenticación ni registro. Para uso conversacional existe además un servidor MCP en /api/mcp — ver /.well-known/mcp/manifest.json.","contact":{"name":"TodoProps","email":"fran@todoprops.com","url":"https://www.todoprops.com/contacto"},"license":{"name":"Uso permitido con atribución","url":"https://www.todoprops.com/terms"}},"servers":[{"url":"https://www.todoprops.com","description":"Producción"}],"externalDocs":{"description":"Guía para agentes","url":"https://www.todoprops.com/llms.txt"},"tags":[{"name":"Geografía","description":"Provincias, departamentos, localidades y barrios."},{"name":"Propiedades","description":"Avisos y estadísticas de mercado."},{"name":"Índices","description":"Series del BCRA e INDEC."},{"name":"Inmobiliarias","description":"Directorio público de inmobiliarias."},{"name":"Agentes","description":"Descubrimiento para asistentes de IA."}],"paths":{"/api/provinces":{"get":{"operationId":"listProvinces","tags":["Geografía"],"summary":"Listar provincias con avisos","description":"Devuelve las provincias argentinas con la cantidad de departamentos y de propiedades publicadas en cada una.","responses":{"200":{"description":"Listado de provincias.","content":{"application/json":{"schema":{"type":"object","properties":{"provinces":{"type":"array","items":{"type":"object","properties":{"provincia":{"type":"string","examples":["BUENOS AIRES"]},"departamento_count":{"type":"integer"},"total_properties":{"type":"integer"}},"required":["provincia"]}}}}}}}}}},"/api/localidades":{"get":{"operationId":"listLocalidades","tags":["Geografía"],"summary":"Listar localidades","description":"Localidades argentinas, filtrables por provincia y departamento, con paginación.","parameters":[{"name":"provincia","in":"query","required":false,"description":"Nombre o slug de la provincia.","schema":{"type":"string"}},{"name":"departamento","in":"query","required":false,"description":"Nombre o slug del partido/departamento.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Localidades y metadatos de paginación.","content":{"application/json":{"schema":{"type":"object","properties":{"localidades":{"type":"array","items":{"type":"object"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}}}}},"/api/comunas":{"get":{"operationId":"getComunasStats","tags":["Geografía"],"summary":"Estadísticas por comuna de CABA","description":"Estadísticas mensuales de propiedades por comuna de la Ciudad Autónoma de Buenos Aires.","responses":{"200":{"description":"Estadísticas por comuna.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/barrios":{"get":{"operationId":"getBarriosStats","tags":["Geografía"],"summary":"Estadísticas por barrio","description":"Estadísticas mensuales de propiedades agregadas por barrio.","responses":{"200":{"description":"Estadísticas por barrio.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/market-stats":{"get":{"operationId":"getMarketStats","tags":["Propiedades"],"summary":"Estadísticas de mercado por provincia","description":"Precio promedio, precio por m² y volumen de avisos para una provincia.","parameters":[{"name":"provincia","in":"query","required":true,"description":"Provincia a consultar. Obligatorio.","schema":{"type":"string"}}],"responses":{"200":{"description":"Estadísticas de la provincia.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Falta el parámetro obligatorio.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/propiedades":{"get":{"operationId":"describePropiedades","tags":["Propiedades"],"summary":"Documentación del endpoint de propiedades","description":"Devuelve la descripción de uso. La consulta real se hace con POST.","responses":{"200":{"description":"Descripción del endpoint.","content":{"application/json":{"schema":{"type":"object"}}}}}},"post":{"operationId":"searchPropiedades","tags":["Propiedades"],"summary":"Buscar propiedades publicadas","description":"Busca avisos dentro de un área geográfica, con filtros opcionales de precio, tipo y operación.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"bounds":{"type":"object","description":"Recuadro geográfico a consultar.","properties":{"north":{"type":"number"},"south":{"type":"number"},"east":{"type":"number"},"west":{"type":"number"}},"required":["north","south","east","west"]},"operacion":{"type":"string","enum":["venta","alquiler"]},"tipo":{"type":"string","examples":["Casa","Departamento"]},"precioMin":{"type":"number"},"precioMax":{"type":"number"},"limit":{"type":"integer","maximum":500}},"required":["bounds"]}}}},"responses":{"200":{"description":"Propiedades encontradas.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Cuerpo inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/indices":{"get":{"operationId":"listIndices","tags":["Índices"],"summary":"Índices disponibles","description":"Índices oficiales publicados: ICL, IPC, CER, IS y Casa Propia, con su fuente.","responses":{"200":{"description":"Índices disponibles.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/inflation-data":{"get":{"operationId":"getInflationData","tags":["Índices"],"summary":"Serie de inflación del INDEC","description":"Serie histórica del IPC del INDEC, usada para ajustar montos entre dos fechas.","responses":{"200":{"description":"Serie de IPC.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/publishers/{id}/public":{"get":{"operationId":"getPublisherPublic","tags":["Inmobiliarias"],"summary":"Ficha pública de una inmobiliaria","description":"Nombre y coordenadas de una inmobiliaria del directorio. Sólo campos públicos.","parameters":[{"name":"id","in":"path","required":true,"description":"Id numérico de la inmobiliaria.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Ficha pública.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"latitude":{"type":["number","null"]},"longitude":{"type":["number","null"]}}}}}}}},"400":{"description":"Id inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No existe.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/agents/codigos/{slug}":{"get":{"operationId":"getCodigosMarkdown","tags":["Agentes"],"summary":"Códigos de CABA en markdown","description":"El texto de los códigos de edificación y urbanísticos de CABA, transcripto del Boletín Oficial, en text/markdown. Sin `slug` devuelve el índice. Formas: `{codigo}`, `{codigo}/{seccion}`, `{codigo}/full`, `glosario`, `glosario/{termino}`. El sufijo `.md` es opcional. La versión canónica en HTML se declara con un encabezado `Link: rel=\"canonical\"`.","parameters":[{"name":"slug","in":"path","required":false,"schema":{"type":"string"},"example":"codigo-urbanistico/generalidades"}],"responses":{"200":{"description":"El documento en markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No hay un código, sección o término con ese identificador.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/agents/markdown":{"get":{"operationId":"getPageMarkdown","tags":["Agentes"],"summary":"Una página del sitio en markdown","description":"La versión markdown de una página. También se obtiene pidiendo la página HTML con `Accept: text/markdown`, que es la forma preferida: la portada y `/articulos/{slug}` negocian por encabezado.","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"/"},"example":"/articulos/como-tasar-un-terreno"}],"responses":{"200":{"description":"La página en markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No hay versión markdown de esa ruta.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/mcp/manifest":{"get":{"operationId":"getMcpManifest","tags":["Agentes"],"summary":"Manifiesto del servidor MCP","description":"Los tools que expone el servidor MCP, generados desde la misma lista que atiende `tools/list`, así que no pueden divergir. También servido en /.well-known/mcp/manifest.json.","responses":{"200":{"description":"El manifiesto.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/mcp":{"post":{"operationId":"callMcpServer","tags":["Agentes"],"summary":"Servidor MCP (Streamable HTTP)","description":"Endpoint JSON-RPC 2.0 del servidor MCP de TodoProps. Métodos: initialize, tools/list, tools/call, ping. El manifiesto está en /.well-known/mcp/manifest.json.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer","null"]},"method":{"type":"string","enum":["initialize","tools/list","tools/call","ping"]},"params":{"type":"object"}},"required":["jsonrpc","method"]}}}},"responses":{"200":{"description":"Respuesta JSON-RPC.","content":{"application/json":{"schema":{"type":"object"}}}},"202":{"description":"Notificación aceptada, sin cuerpo."}}}}},"components":{"schemas":{"Error":{"type":"object","description":"Forma de error uniforme de la API.","properties":{"error":{"type":"string","description":"Código estable, apto para lógica de reintento.","examples":["invalid_publisher_id"]},"message":{"type":"string","description":"Explicación legible, en español."}},"required":["error"]},"Pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}