{"openapi":"3.1.0","info":{"title":"CertifiCar — formularios del sitio","version":"1.0.0","description":"Documenta los dos formularios de certificar.co (solicitud de demo y boletín). No es una API de producto: la consulta de vehículos se compra y se lee en app.certificar.co, una aplicación aparte que no expone esta especificación. Cada endpoint exige el mismo origen que el sitio y, en /api/contacto, un token de reCAPTCHA v3 generado en el navegador — no está pensado para integraciones de terceros sin navegador.\n\nVersionado: la cabecera de respuesta `API-Version` (valor actual: `1`) identifica este contrato. Un cambio incompatible incrementará ese número; una baja se anunciará antes con las cabeceras `Deprecation` y `Sunset` (RFC 8594), nunca de forma silenciosa.\n\nLímite de tasa: toda respuesta incluye `RateLimit-Limit`, `RateLimit-Remaining` y `RateLimit-Reset` (draft-ietf-httpapi-ratelimit-headers); una respuesta 429 añade `Retry-After`."},"servers":[{"url":"https://certificar.co"}],"paths":{"/api/contacto":{"post":{"operationId":"createDemoRequest","summary":"Solicitar una demostración comercial","description":"Crea un lead en el CRM (Clientify) para el equipo comercial. Protegido por reCAPTCHA v3 (score mínimo), verificación de mismo origen, honeypot, tiempo mínimo de llenado y límites de tasa por IP y globales.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nombre","apellido","email","empresa","aceptaTratamiento","recaptchaToken","website","startedAt"],"properties":{"nombre":{"type":"string","maxLength":80},"apellido":{"type":"string","maxLength":80},"email":{"type":"string","format":"email","maxLength":160},"telefono":{"type":"string","maxLength":30,"description":"Número colombiano sin el prefijo +57."},"empresa":{"type":"string","maxLength":120},"mensaje":{"type":"string","maxLength":1500},"aceptaTratamiento":{"type":"boolean","description":"Autorización de tratamiento de datos. Debe ser true."},"aceptaComercial":{"type":"boolean"},"recaptchaToken":{"type":"string","description":"Token de reCAPTCHA v3 generado en el navegador."},"website":{"type":"string","maxLength":0,"description":"Honeypot: debe llegar vacío."},"startedAt":{"type":"number","description":"Epoch ms de cuándo se mostró el formulario (antibot)."}}}}}},"responses":{"200":{"description":"Lead recibido (o descartado en silencio por antibot).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Cuerpo no es JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"invalid_json"}}}},"403":{"description":"Origen no permitido o reCAPTCHA rechazado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"recaptcha_failed"}}}},"413":{"description":"Cuerpo demasiado grande (> 8 KB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"too_large"}}}},"422":{"description":"Campos inválidos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"validation","errors":{"email":"Ese correo no parece válido."}}}}},"429":{"description":"Límite de solicitudes por IP o global excedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"rate_limited"}}}},"502":{"description":"El CRM no pudo crear el contacto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"delivery_failed"}}}},"503":{"description":"El CRM no está configurado en este entorno.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"not_configured"}}}}}}},"/api/newsletter":{"post":{"operationId":"subscribeNewsletter","summary":"Suscribirse al boletín de noticias","description":"Suscribe un correo al proveedor de boletín configurado. Protegido por verificación de mismo origen, honeypot, tiempo mínimo de llenado y límite de tasa por IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","consent","website","t"],"properties":{"name":{"type":"string","maxLength":80},"email":{"type":"string","format":"email","maxLength":254},"consent":{"type":"boolean","description":"Autorización de tratamiento de datos. Debe ser true."},"website":{"type":"string","maxLength":0,"description":"Honeypot: debe llegar vacío."},"t":{"type":"number","description":"Epoch ms de cuándo se mostró el formulario (antibot)."},"pageUri":{"type":"string","description":"Página desde la que se envía (informativo)."},"pageName":{"type":"string"}}}}}},"responses":{"200":{"description":"Suscripción recibida (o descartada en silencio por antibot).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Cuerpo no es JSON válido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"Solicitud inválida."}}}},"403":{"description":"Origen no permitido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"Origen no permitido."}}}},"413":{"description":"Cuerpo demasiado grande (> 4 KB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"Solicitud demasiado grande."}}}},"422":{"description":"Campos inválidos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"errors":{"email":"Escribe un correo válido, por ejemplo nombre@correo.com."}}}}},"429":{"description":"Límite de solicitudes por IP excedido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"Demasiados intentos. Inténtalo más tarde."}}}},"502":{"description":"El proveedor del boletín no respondió.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"No pudimos registrar tu suscripción. Inténtalo de nuevo."}}}},"503":{"description":"El boletín no está habilitado en este entorno.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"ok":false,"error":"El boletín no está disponible en este momento."}}}}}}}},"components":{"schemas":{"Error":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string","description":"Machine-readable error code."},"errors":{"type":"object","additionalProperties":{"type":"string"},"description":"Field name → human-readable message (validation failures)."}}},"Ok":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","enum":[true]}}}}}}