{
  "openapi": "3.1.0",
  "info": {
    "title": "Radar AI public API",
    "version": "2026-09-14",
    "description": "Endpoints públicos para iniciar un checkout de Radar AI o dejar interés por el seguimiento mensual. Durante el piloto, el checkout pago sólo acepta auditorías hoteleras publicadas mediante offerId; el pago crea la cuenta y habilita el dashboard automáticamente. La API no expone datos privados ni resultados de clientes."
  },
  "servers": [
    {
      "url": "https://radar-ai.bypupila.com",
      "description": "Producción"
    }
  ],
  "paths": {
    "/api/polar/checkout": {
      "post": {
        "operationId": "createPaidCheckout",
        "summary": "Crea un checkout de medición",
        "description": "En una oferta precomputada, el servidor fija hotel, dominio, precio y ruta del informe desde offerId; Polar solicita el correo de compra y no se pide contraseña. En el checkout estándar se validan correo, empresa, sitio, idioma, representación autorizada y consentimientos.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaidCheckoutRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Checkout listo.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CheckoutResponse"
                }
              }
            }
          },
          "422": {
            "description": "Datos de contacto o dominio inválidos."
          },
          "409": {
            "description": "El checkout estándar todavía no está abierto: requiere autorización escrita y provisión técnica del proveedor de medición. Durante el piloto sólo se aceptan ofertas hoteleras precomputadas publicadas."
          },
          "429": {
            "description": "Límite de solicitudes alcanzado."
          },
          "503": {
            "description": "Checkout todavía no configurado."
          }
        }
      }
    },
    "/api/events": {
      "post": {
        "operationId": "captureSiteEvent",
        "summary": "Registra un evento de navegación",
        "description": "Acepta únicamente eventos agregados de navegación y checkout; nunca recibe el contenido de una medición.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SiteEvent"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Evento aceptado."
          },
          "422": {
            "description": "Evento no permitido."
          }
        }
      }
    },
    "/api/hotel-interests": {
      "post": {
        "operationId": "captureHotelMonthlyInterest",
        "summary": "Registra interés por el seguimiento mensual",
        "description": "Guarda una solicitud de contacto con datos empresariales públicos o autorizados. No crea una suscripción ni inicia un cobro.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/HotelInterestRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Solicitud aceptada."
          },
          "422": {
            "description": "Hotel, dominio, correo o consentimiento inválido."
          },
          "429": {
            "description": "Límite de solicitudes alcanzado."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "PaidCheckoutRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/PrecomputedAuditCheckoutRequest"
          },
          {
            "$ref": "#/components/schemas/StandardCheckoutRequest"
          }
        ],
        "description": "Usá la variante precomputada para un preview hotelero ya generado; la variante estándar requiere los datos de la empresa y autorización explícita."
      },
      "PrecomputedAuditCheckoutRequest": {
        "type": "object",
        "required": ["offerId", "plan", "vertical", "privacyAccepted", "dataProcessingAccepted", "authorizedRepresentative"],
        "properties": {
          "offerId": {
            "type": "string",
            "description": "Identificador server-side de una auditoría hotelera precomputada."
          },
          "plan": {
            "type": "string",
            "const": "audit"
          },
          "vertical": {
            "type": "string",
            "const": "hotel"
          },
          "privacyAccepted": {
            "type": "boolean",
            "const": true
          },
          "dataProcessingAccepted": {
            "type": "boolean",
            "const": true
          },
          "authorizedRepresentative": {
            "type": "boolean",
            "const": true
          },
          "locale": {
            "type": "string",
            "enum": ["es", "en"]
          }
        },
        "additionalProperties": false
      },
      "StandardCheckoutRequest": {
        "type": "object",
        "required": ["email", "domain", "brand", "plan", "language", "privacyAccepted", "dataProcessingAccepted", "authorizedRepresentative"],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "domain": {
            "type": "string",
            "format": "hostname"
          },
          "brand": {
            "type": "string",
            "description": "Nombre público de la empresa o marca."
          },
          "plan": {
            "type": "string",
            "enum": ["audit", "monitoring"]
          },
          "vertical": {
            "type": "string",
            "enum": ["general", "modular", "hotel"]
          },
          "language": {
            "type": "string",
            "enum": ["es", "en"]
          },
          "locale": {
            "type": "string",
            "enum": ["es", "en"]
          },
          "privacyAccepted": {
            "type": "boolean",
            "const": true
          },
          "dataProcessingAccepted": {
            "type": "boolean",
            "const": true
          },
          "authorizedRepresentative": {
            "type": "boolean",
            "description": "Confirmación de que la persona compradora está autorizada para representar a la empresa."
          }
        },
        "additionalProperties": false
      },
      "HotelInterestRequest": {
        "type": "object",
        "required": ["brand", "domain", "email", "privacyAccepted", "contactConsent"],
        "properties": {
          "offerId": {
            "type": "string"
          },
          "brand": {
            "type": "string"
          },
          "domain": {
            "type": "string",
            "format": "hostname"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "contactName": {
            "type": "string"
          },
          "role": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "vertical": {
            "type": "string",
            "enum": ["hotel", "modular", "general"]
          },
          "privacyAccepted": {
            "type": "boolean",
            "const": true
          },
          "contactConsent": {
            "type": "boolean",
            "const": true
          }
        },
        "additionalProperties": false
      },
      "CheckoutResponse": {
        "type": "object",
        "required": ["url", "mode", "plan", "amount", "currency"],
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "mode": {
            "type": "string",
            "enum": ["link", "session"]
          },
          "metadataCaptured": {
            "type": "boolean",
            "description": "Indica si la sesión de Polar recibió los datos necesarios para el alta automática."
          },
          "plan": {
            "type": "string",
            "enum": ["audit", "monitoring"]
          },
          "amount": {
            "type": "number"
          },
          "currency": {
            "type": "string",
            "const": "USD"
          }
        }
      },
      "SiteEvent": {
        "type": "object",
        "required": ["name"],
        "properties": {
          "name": {
            "type": "string",
            "enum": ["page_view", "checkout_started", "checkout_success", "monitoring_success", "leads_exported"]
          },
          "path": {
            "type": "string"
          },
          "vertical": {
            "type": "string",
            "enum": ["general", "modular", "hotel"]
          },
          "plan": {
            "type": "string",
            "enum": ["audit", "monitoring"]
          }
        },
        "additionalProperties": false
      }
    }
  }
}
