{
  "openapi": "3.1.0",
  "info": {
    "title": "Terra Vivet Agent API",
    "version": "2026-04-20",
    "description": "API pública de solo lectura para inventario, proyectos y cotizaciones de Terra Vivet."
  },
  "servers": [
    {
      "url": "https://www.terravivet.com"
    }
  ],
  "paths": {
    "/api/v1/status": {
      "get": {
        "summary": "Estado y capacidades del servicio",
        "responses": {
          "200": {
            "description": "Estado general del servicio"
          }
        }
      }
    },
    "/api/v1/projects": {
      "get": {
        "summary": "Lista todos los proyectos",
        "responses": {
          "200": {
            "description": "Listado de proyectos y totales"
          }
        }
      }
    },
    "/api/v1/project": {
      "get": {
        "summary": "Obtiene un proyecto por slug",
        "parameters": [
          {
            "in": "query",
            "name": "slug",
            "required": true,
            "schema": {
              "enum": [
                "montesito",
                "santa-barbara",
                "valle-del-toachi",
                "torres-zermatt"
              ],
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalle del proyecto"
          },
          "400": {
            "description": "Slug inválido o faltante"
          },
          "404": {
            "description": "Proyecto no encontrado"
          }
        }
      }
    },
    "/api/v1/properties": {
      "get": {
        "summary": "Lista propiedades filtrables",
        "parameters": [
          {
            "in": "query",
            "name": "project",
            "schema": {
              "enum": [
                "montesito",
                "santa-barbara",
                "valle-del-toachi",
                "torres-zermatt"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "enum": [
                "Disponible",
                "Reservado",
                "Vendido"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "propertyType",
            "schema": {
              "enum": [
                "Lote",
                "Quinta",
                "Departamento",
                "Local"
              ],
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "availableOnly",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "schema": {
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Listado de propiedades"
          },
          "400": {
            "description": "Filtros inválidos"
          }
        }
      }
    },
    "/api/v1/property": {
      "get": {
        "summary": "Obtiene una propiedad por canonicalId",
        "parameters": [
          {
            "in": "query",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Detalle de propiedad y defaults de cotización"
          },
          "400": {
            "description": "Id faltante"
          },
          "404": {
            "description": "Propiedad no encontrada"
          }
        }
      }
    },
    "/api/v1/quote/calculate": {
      "post": {
        "summary": "Calcula una cotización manual o sobre una propiedad",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "oneOf": [
                  {
                    "required": [
                      "propertyId",
                      "purchaseType"
                    ]
                  },
                  {
                    "required": [
                      "project",
                      "propertyLabel",
                      "propertyType",
                      "price",
                      "purchaseType"
                    ]
                  }
                ],
                "properties": {
                  "annualRate": {
                    "type": "number"
                  },
                  "contractDate": {
                    "type": "string",
                    "format": "date"
                  },
                  "discountRate": {
                    "type": "number"
                  },
                  "entryAmount": {
                    "type": "number"
                  },
                  "paymentDay": {
                    "type": "integer"
                  },
                  "project": {
                    "type": "string"
                  },
                  "propertyId": {
                    "type": "string"
                  },
                  "propertyLabel": {
                    "type": "string"
                  },
                  "propertyType": {
                    "enum": [
                      "Lote",
                      "Quinta",
                      "Departamento",
                      "Local"
                    ],
                    "type": "string"
                  },
                  "purchaseType": {
                    "enum": [
                      "Financiado",
                      "Contado"
                    ],
                    "type": "string"
                  },
                  "price": {
                    "type": "number"
                  },
                  "termMonths": {
                    "type": "integer"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Cotización calculada"
          },
          "400": {
            "description": "Entrada inválida"
          }
        }
      }
    },
    "/api/v1/quote/from-property": {
      "post": {
        "summary": "Atajo para cotizar a partir de una propiedad",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "properties": {
                  "propertyId": {
                    "type": "string"
                  }
                },
                "required": [
                  "propertyId"
                ],
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Cotización calculada"
          },
          "400": {
            "description": "Id faltante o inválido"
          }
        }
      }
    }
  }
}
