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.
Catálogo de endpoints#
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 |
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.