API de Nexora CRM
Integra tu agencia con cualquier sistema. Todas las respuestas son JSON.
Autenticación
Crea una clave en Panel → API, elige sus permisos (por ejemplo contactos:read) y envíala en cada solicitud:
Authorization: Bearer nx_live_xxxxxxxxxxxxxxxx
Recursos
| Recurso | Ruta | Métodos |
|---|---|---|
| contactos | /v1/contactos | GET · POST · PATCH ?id= |
| oportunidades | /v1/oportunidades | GET · POST · PATCH ?id= |
| objetos | /v1/objetos | GET · POST · PATCH ?id= |
| tickets | /v1/tickets | GET · POST · PATCH ?id= |
| citas | /v1/citas | GET · POST · PATCH ?id= |
| cursos | /v1/cursos | GET · POST · PATCH ?id= |
| resenas | /v1/resenas | GET · POST · PATCH ?id= |
| afiliados | /v1/afiliados | GET · POST · PATCH ?id= |
| referidos | /v1/referidos | GET · POST · PATCH ?id= |
| llamadas | /v1/llamadas | GET · POST · PATCH ?id= |
/v1/whatsapp | GET · POST · PATCH ?id= | |
| mensajes | /v1/mensajes | GET · POST · PATCH ?id= |
| planes_reventa | /v1/planes_reventa | GET · POST · PATCH ?id= |
| notificaciones | /v1/notificaciones | GET · PATCH ?id= (read) |
| auditoria | /v1/auditoria | GET (solo lectura) |
Filtros en GET: subaccount_id, id, limit (máx. 200). POST requiere subaccount_id.
Ejemplos
# Exportar contactos en CSV (hasta 5000 filas)
curl "https://TU-DOMINIO/api/public/v1/contactos?format=csv&limit=5000" -H "Authorization: Bearer nx_live_..." -o contactos.csv
# Registro de auditoría (permiso auditoria:read)
curl https://TU-DOMINIO/api/public/v1/auditoria?limit=100 -H "Authorization: Bearer nx_live_..."
# Listar contactos
curl https://TU-DOMINIO/api/public/v1/contactos?limit=20 \
-H "Authorization: Bearer nx_live_..."
# Crear contacto
curl -X POST https://TU-DOMINIO/api/public/v1/contactos \
-H "Authorization: Bearer nx_live_..." -H "Content-Type: application/json" \
-d '{"subaccount_id":"UUID","name":"Ana Torres","email":"ana@correo.com","tags":["web"]}'
# Mover una oportunidad de etapa
curl -X PATCH "https://TU-DOMINIO/api/public/v1/oportunidades?id=UUID" \
-H "Authorization: Bearer nx_live_..." -H "Content-Type: application/json" \
-d '{"stage":"Ganado"}'// JavaScript
const res = await fetch("https://TU-DOMINIO/api/public/v1/tickets", {
method: "POST",
headers: { Authorization: "Bearer nx_live_...", "Content-Type": "application/json" },
body: JSON.stringify({ subaccount_id: "UUID", subject: "Necesito ayuda", priority: "alta" }),
});
const { data } = await res.json();Webhooks de Salida
Eventos: contacto_nuevo, oportunidad_movida, pago, ticket_creado, curso_terminado, documento_firmado, resena_nueva, llamada_completada, referido_nuevo, reserva_nueva, chat_mensaje. Cada envío incluye X-Nexora-Event y X-Nexora-Signature: sha256=… (HMAC-SHA256 del cuerpo con tu secreto). Para webhooks de entrada puedes añadir X-Nexora-Timestamp (segundos Unix) y firmar timestamp.cuerpo; se rechaza si tiene más de 5 minutos. Se reintenta hasta 3 veces y queda en el registro de envíos.
// Verificar firma (Node.js)
import crypto from "crypto";
const expected = crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
const ok = req.headers["x-nexora-signature"] === "sha256=" + expected;Webhooks de Entrada
Cada subcuenta tiene su dirección /api/public/hooks/SUBCUENTA_ID y su secreto. Firma el cuerpo igual que arriba. El campo opcional tipo decide qué se crea: contacto (por defecto: name, email, phone, tags, source), resena (author, rating 1-5, body, platform) o llamada (contact_name, phone, outcome, transcript, summary, duration_sec).
BODY='{"name":"Luis","email":"luis@correo.com","source":"Formulario"}'
SIG=$(printf %s "$BODY" | openssl dgst -sha256 -hmac "$SECRETO" | cut -d' ' -f2)
curl -X POST https://TU-DOMINIO/api/public/hooks/SUBCUENTA_ID \
-H "X-Nexora-Signature: sha256=$SIG" -H "Content-Type: application/json" -d "$BODY"
# Registrar una reseña
BODY='{"tipo":"resena","author":"Marta","rating":5,"body":"¡Excelente!","platform":"google"}'Reservas, Chat Embebible y Formularios
Cada subcuenta tiene un calendario público en /reservar/SUBCUENTA_ID (días, horario, duración y zona horaria se configuran en Panel → Reservas y chat web). Cada reserva crea el contacto, la cita y dispara reserva_nueva. Las citas también se leen y crean con el recurso citas.
El chat en vivo se instala con una línea; los mensajes llegan al buzón (recurso mensajes, platform: "web"), disparan chat_mensaje y el asistente IA responde solo con la base de conocimientos.
<script src="https://TU-DOMINIO/api/public/widget/SUBCUENTA_ID" async></script>
# Responder a un visitante del chat desde tu sistema
curl -X POST https://TU-DOMINIO/api/public/v1/mensajes -H "Authorization: Bearer nx_live_..." -H "Content-Type: application/json" \
-d '{"subaccount_id":"UUID","platform":"web","contact_name":"Ana (#1a2b3c4d)","body":"¡Hola Ana!","direction":"saliente"}'Los formularios (/f/FORM_ID) admiten lógica condicional: cada pregunta puede tener showIf: { field, equals } y solo se valida si está visible. Tipos: text, textarea, email, phone, select (options), checkbox, rating.
Servidor MCP
Cada agencia tiene su URL MCP (JSON-RPC sobre HTTP). Herramientas: buscar_contactos, crear_oportunidad, mover_oportunidad, responder_ticket, consultar_reporte, listar_resenas, responder_resena, registrar_llamada, consultar_afiliados, consultar_disponibilidad, listar_chats. Cada clave solo ve las herramientas que le permitas y todo uso queda registrado.
curl -X POST https://TU-DOMINIO/api/public/mcp/AGENCIA_ID \
-H "Authorization: Bearer nxmcp_..." -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"buscar_contactos","arguments":{"q":"ana"}}}'Errores y Límites
- 401: clave ausente o inválida
- 403: la clave no tiene el permiso
- 404: recurso no encontrado
- 429: límite por hora superado (cabecera
Retry-After)