Integraciones
Referencia de la API
API REST para el panel de control, widget y webhooks de HelpStack.
Datos rápidos#
| Ruta base | Los endpoints viven bajo https://helpstack.eu/api/… — es un prefijo de ruta, no una URL accesible |
| Autenticación (API del panel) | Cookie de sesión NextAuth (usuario autenticado) |
| Autenticación (API del widget) | Ninguna (pública, con límite de tasa) |
| Autenticación (webhooks) | Handshake de token de verificación + firma HMAC-SHA256 |
| Content-Type | application/json (las subidas de archivos usan multipart/form-data) |
| Multi-tenant | Cada solicitud al panel está limitada a la organización del usuario de sesión |
Espere un 404 en
/apiy un 401 en los endpoints autenticados. No existe ninguna ruta enhttps://helpstack.eu/api— devuelve 404 por diseño, porque la API es un conjunto de sub-rutas (/api/conversations,/api/channels, …), no una raíz navegable. Abrir un endpoint real como/api/conversationsen un navegador devuelve 401 (sin cookie de sesión), lo que confirma que existe y está protegido por autenticación. Ninguna de las dos respuestas es un error.
Modelo de autenticación — léa esto primero#
Actualmente no existe un sistema público de clave de API o token bearer para llamantes externos. No busque una "clave de API" — no existe. La API del panel/interna se autentica con la cookie de sesión NextAuth de un usuario autenticado, y cada solicitud queda automáticamente limitada a la organización de ese usuario mediante middleware (
withOrganization/withAdmin/withAgent). Estos endpoints son consumidos por la interfaz del panel de HelpStack.
Para llamar a endpoints del panel desde fuera del navegador debe reproducir una cookie de sesión autenticada. Si necesita acceso de máquina a máquina, las superficies públicas admitidas son:
- Endpoints del widget — públicos, con límite de tasa por IP/visitante (consulte Inserción del widget).
- Endpoints de webhooks — públicos, verificados por token + firma HMAC (consulte Webhooks).
Trate cualquier cosa que requiera una cookie de sesión como "verifique contra su despliegue" para uso programático.
Envoltorio de respuesta#
Todas las rutas de la API devuelven un envoltorio estándar.
Éxito
{ "success": true, "data": { } }
Error
{
"success": false,
"error": {
"message": "Human-readable message",
"code": "OPTIONAL_CODE",
"fields": { "fieldName": ["error 1"] }
}
}
code y fields son opcionales. fields se rellena para errores de validación (Zod) con mensajes por campo.
Códigos de error y estado HTTP#
Los errores son producidos por clases de error tipadas y un manejador central. Mapa de alto nivel:
| HTTP | Cuándo | code de ejemplo |
|---|---|---|
| 400 | Entrada inválida / fallo de validación | VALIDATION_ERROR |
| 401 | Autenticación ausente o caducada | — |
| 402 | Tokens insuficientes para realizar la acción | INSUFFICIENT_TOKENS |
| 403 | Rol/permiso insuficiente | — |
| 404 | Recurso no encontrado | — |
| 409 | Duplicado/conflicto | — |
| 429 | Límite de tasa alcanzado | — |
| 502 | Fallo de API de terceros | — |
| 500 | Error inesperado/interno (el mensaje está enmascarado) | — |
Los fallos de validación Zod devuelven 400 con code: "VALIDATION_ERROR" y un objeto fields. Los errores inesperados devuelven 500 con un mensaje genérico ("An unexpected error occurred"); el detalle real solo se registra en el servidor.
Qué puedes llamar realmente desde fuera del navegador#
Dos superficies, y solo dos:
| Superficie | Autenticación | Documentado en |
|---|---|---|
| Endpoints del widget | ninguna, públicos y con límite de tasa | Inserción del widget |
| Endpoints de webhook | verify token + HMAC-SHA256 | Webhooks |
Si estás construyendo una integración, esas dos páginas son lo que buscas. Todo lo del catálogo de abajo necesita una sesión de navegador.
Catálogo de endpoints (autenticados por sesión, no son una superficie de integración)#
Estos endpoints los consume el panel de HelpStack. Se autentican con una cookie de sesión de NextAuth, así que llamarlos programáticamente significa reproducir una sesión de navegador iniciada. Están documentados como referencia y para quienes trabajan en HelpStack, no como una vía de integración compatible, y sus formas pueden cambiar cuando cambie el panel.
Una API con alcance y autenticada por token está diseñada pero no construida. Hasta que exista, trata este catálogo como interno.
Roles: un endpoint marcado como ADMIN requiere administrador (withAdmin), AGENT requiere agente o superior (withAgent), Session requiere cualquier miembro autenticado de la organización (withOrganization).
Canales
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET | /api/channels | Listar canales | Session |
POST | /api/channels | Crear canal | ADMIN |
GET | /api/channels/[id] | Obtener un canal | Session |
PATCH | /api/channels/[id] | Actualizar canal | ADMIN |
DELETE | /api/channels/[id] | Eliminar canal | ADMIN |
GET | /api/channels/[id]/widget-script | Obtener script de inserción para un canal WEBSITE_CHAT | Session |
GET | /api/channels/[id]/widget-config | Obtener configuración de apariencia del widget | Session |
GET/POST | /api/channels/[id]/agent-tools | Listar/adjuntar herramientas de agente con ámbito de canal | Session |
Crear canal — POST /api/channels (cuerpo verificado, createChannelSchema):
{
"type": "WEBSITE_CHAT",
"name": "Website Chat",
"region": "eu",
"defaultLanguage": "en",
"autoTranslate": true,
"translateToLanguage": "en",
"fallbackLanguage": "sl",
"aiProviderId": "PROVIDER_ID",
"credentials": {},
"responseTemplate": {},
"autoReply": false,
"autoApprove": false,
"autoEnhance": false
}
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
type | enum | sí | EMAIL | FACEBOOK | INSTAGRAM | WHATSAPP | TELEGRAM | WEBSITE_CHAT | LINKEDIN | VOICE |
name | string | sí | Longitud mínima 1 |
region | string | no | |
defaultLanguage | string | no | Por defecto en (idioma del agente) |
autoTranslate | boolean | no | Por defecto true |
translateToLanguage | string | no | Idioma del agente al que traducir |
fallbackLanguage | string | no | Suposición del idioma del cliente para mensajes cortos/ambiguos |
aiProviderId | string | no | Recurre al proveedor predeterminado de la organización |
credentials | object | sí | Credenciales específicas del canal (p. ej. IMAP/SMTP, tokens de página) |
responseTemplate | object | no | |
autoReply | boolean | no | Por defecto false |
autoApprove | boolean | no | Por defecto false |
autoEnhance | boolean | no | Por defecto false |
Las formas de credencial por tipo de canal (credentials) se validan por separado — p. ej. Email requiere { host, port, username, password, from, secure?, imapHost?, imapPort?, imapSecure?, imapAllowSelfSigned? }; Facebook requiere { pageId, accessToken, appSecret? }; Instagram requiere { accountId, accessToken }. Las credenciales se almacenan cifradas (AES-256-GCM).
Conversaciones
| Método | Ruta | Propósito | Autenticación | Parámetros clave |
|---|---|---|---|---|
GET | /api/conversations | Listar conversaciones | Session | page, pageSize, status, channelId, unread, assignedToId, language, search |
POST | /api/conversations | Crear conversación | AGENT | |
GET | /api/conversations/[id] | Obtener una | Session | |
PATCH | /api/conversations/[id] | Actualizar (estado, prioridad, asignación, idioma, notas) | Session | |
DELETE | /api/conversations/[id] | Eliminar | Session | |
GET | /api/conversations/[id]/messages | Listar mensajes | Session | |
POST | /api/conversations/[id]/messages | Enviar respuesta del agente | AGENT | |
POST | /api/conversations/[id]/read | Marcar como leída | Session | |
POST | /api/conversations/[id]/unread | Marcar como no leída | Session | |
POST | /api/conversations/bulk-read | Marcar muchas como leídas | Session |
Valores del filtro status: OPEN | PENDING | CLOSED | ARCHIVED. pageSize está limitado a 100 (por defecto 20).
Enviar mensaje — POST /api/conversations/[id]/messages (cuerpo verificado, sendMessageSchema):
{
"conversationId": "CONVERSATION_ID",
"content": "Thanks for reaching out — here's how to fix that.",
"attachments": ["storage/path/file.png"]
}
| Campo | Tipo | Requerido | Notas |
|---|---|---|---|
conversationId | string | sí | Debe coincidir con el parámetro de ruta [id], si no 400 VALIDATION_ERROR |
content | string | sí | Longitud mínima 1 |
attachments | string[] | no | Rutas de almacenamiento |
Comportamiento: el mensaje se crea como OUTBOUND. Si el canal tiene autoTranslate activado y se conoce el idioma del cliente, el mensaje se crea sin aprobar y se traduce en segundo plano (el agente aprueba antes de enviarlo). Enviar consume tokens del plan; si la organización se queda sin tokens, la ruta devuelve 402 con code: "INSUFFICIENT_TOKENS". En caso de éxito devuelve el mensaje creado con HTTP 201.
Mensajes
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
POST | /api/messages/[id]/approve | Aprobar una respuesta en cola/traducida para envío | Session |
POST | /api/messages/[id]/generate-reply | Generar una sugerencia de respuesta de IA | Session |
POST | /api/messages/[id]/retranslate | Volver a ejecutar la traducción del mensaje | Session |
FAQs
| Método | Ruta | Propósito | Autenticación | Parámetros clave |
|---|---|---|---|---|
GET | /api/faqs | Listar FAQs | Session | channelId |
POST | /api/faqs | Crear FAQ | ADMIN | |
PATCH | /api/faqs/[id] | Actualizar FAQ | Session | |
DELETE | /api/faqs/[id] | Eliminar FAQ | Session | |
POST | /api/faqs/reorder | Reordenar FAQs | Session | |
POST | /api/faqs/generate | Generar sugerencias de FAQ con IA | Session |
Medios
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
POST | /api/media/upload | Subir un archivo (multipart/form-data) | Session |
GET | /api/media/[id] | Obtener metadatos/archivo de medio | Session |
DELETE | /api/media/[id] | Eliminar medio | Session |
Notificaciones
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET/PUT | /api/notifications/preferences | Obtener/actualizar preferencias de notificación | Session |
GET/POST | /api/notifications/integrations | Listar/configurar integraciones de notificación | Session |
POST | /api/notifications/push-subscription | Registrar una suscripción Web Push | Session |
Proveedores de IA
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET | /api/ai-providers | Listar proveedores configurados | Session |
POST | /api/ai-providers | Añadir un proveedor | Session |
PATCH | /api/ai-providers/[id] | Actualizar un proveedor | Session |
DELETE | /api/ai-providers/[id] | Eliminar un proveedor | Session |
Herramientas de agente
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET | /api/agent-tools | Listar herramientas de agente a nivel de organización | Session |
POST | /api/agent-tools | Crear una herramienta de agente | Session |
PATCH | /api/agent-tools/[id] | Actualizar una herramienta de agente | Session |
DELETE | /api/agent-tools/[id] | Eliminar una herramienta de agente | Session |
GET | /api/agent-tools/[id]/logs | Ver registros de llamadas a la herramienta | Session |
Consulte Herramientas de agente personalizadas para la anatomía completa de la herramienta.
Widget (público)
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET | /api/widget/[channelId]/config | Configuración del widget | Público, ~30/min/IP |
GET | /api/widget/[channelId]/faqs | Hasta 5 chips de FAQ | Público, ~30/min/IP |
GET | /api/widget/[channelId]/status | Estado en línea | Público |
POST | /api/widget/[channelId]/upload | Subida de archivo | Público |
POST | /api/widget/message | Enviar mensaje (fallback WebSocket) | Público, ~20/min/visitante |
Consulte Inserción del widget para los payloads.
Webhooks (público)
| Método | Ruta | Propósito | Autenticación |
|---|---|---|---|
GET | /api/webhooks/facebook | Handshake de verificación | Token de verificación |
POST | /api/webhooks/facebook | Recibir eventos de Messenger | Firma HMAC |
GET/POST | /api/webhooks/instagram | Verificar / recibir eventos de Instagram | Token de verificación / HMAC |
GET/POST | /api/webhooks/whatsapp | Verificar / recibir eventos de WhatsApp | Token de verificación / HMAC |
Consulte Webhooks para los detalles del handshake y la firma.