{"message":"API Backend CRM ChatBot","version":"1.0.0","endpoints":{"health":"GET /health - Verifica estado del servidor y BD","api":"GET /api - Información de la API","empresas":{"verificar":"GET /api/empresas/verificar/:nit - Verificar si empresa existe","crear":"POST /api/empresas - Crear nueva empresa"},"contactos":{"verificar":"GET /api/contactos/verificar/:empresa_id/:documento - Verificar si contacto existe por cédula","crear":"POST /api/contactos - Crear nuevo contacto","listar":"GET /api/contactos/empresa/:empresa_id - Listar contactos de una empresa"},"faqAcceso":{"emitirToken":"POST /api/faq-acceso - Body: { empresaId, contactoId }. Emite token para acceso a FAQ","handoffPost":"POST /api/faq-acceso/handoff - Body: { token }. Devuelve handoffId para abrir FAQ/asistente sin JWT en la URL (?otk=)","handoffGet":"GET /api/faq-acceso/handoff/:id - Canje de un solo uso por el JWT","renovar":"POST /api/faq-acceso/renovar - Body: { token }. Renueva JWT (firma + empresa/contacto válidos; token puede estar caducado)","validar":"GET /api/faq-acceso/validar?token=xxx - Valida token de acceso FAQ"},"ia360Doc":{"contexto":"GET /api/ia360-doc/contexto?token=xxx — Empresa, NIT y directo (contacto) para el asistente IA360 (Streamlit)","historial":"GET /api/ia360-doc/historial?token=xxx&limite=500 — Todas las interacciones IA360 de ese contacto (cliente)","mensaje":"POST /api/ia360-doc/mensaje — Body: { token, rol: usuario|asistente, contenido, servicio? }. Solo tabla mensajes (CONTACTO / IA360), canal IA360_DOC","chat":"POST /api/ia360-doc/chat — Body: { token, message, history?, servicio? }. OpenAI + Notion; reply con ![ ](IMG:0001) + ia360Images { data: o URL }; BD sin ![ ](url|IMG:)","chatQuery":"POST /api/ia360-doc/chat-query — Solo si IA360_PUBLIC_QUERY_CHAT=true: { message, history? }. Sin JWT ni CRM (pruebas de latencia)","proxyImage":"GET/POST /api/ia360-doc/proxy-image — Reenvía imagen Notion/S3 (GET ?url= o POST JSON {url}; POST evita 502 por URL larga en Nginx)"}}}