HelpStackDocs

Integraciones

Referencia de la API

API REST para el panel de control, widget y webhooks de HelpStack.

Datos rápidos#

Ruta baseLos 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-Typeapplication/json (las subidas de archivos usan multipart/form-data)
Multi-tenantCada solicitud al panel está limitada a la organización del usuario de sesión

Espere un 404 en /api y un 401 en los endpoints autenticados. No existe ninguna ruta en https://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/conversations en 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:

HTTPCuándocode de ejemplo
400Entrada inválida / fallo de validaciónVALIDATION_ERROR
401Autenticación ausente o caducada
402Tokens insuficientes para realizar la acciónINSUFFICIENT_TOKENS
403Rol/permiso insuficiente
404Recurso no encontrado
409Duplicado/conflicto
429Límite de tasa alcanzado
502Fallo de API de terceros
500Error 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étodoRutaPropósitoAutenticación
GET/api/channelsListar canalesSession
POST/api/channelsCrear canalADMIN
GET/api/channels/[id]Obtener un canalSession
PATCH/api/channels/[id]Actualizar canalADMIN
DELETE/api/channels/[id]Eliminar canalADMIN
GET/api/channels/[id]/widget-scriptObtener script de inserción para un canal WEBSITE_CHATSession
GET/api/channels/[id]/widget-configObtener configuración de apariencia del widgetSession
GET/POST/api/channels/[id]/agent-toolsListar/adjuntar herramientas de agente con ámbito de canalSession

Crear canalPOST /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
}
CampoTipoRequeridoNotas
typeenumEMAIL | FACEBOOK | INSTAGRAM | WHATSAPP | TELEGRAM | WEBSITE_CHAT
namestringLongitud mínima 1
regionstringno
defaultLanguagestringnoPor defecto en (idioma del agente)
autoTranslatebooleannoPor defecto true
translateToLanguagestringnoIdioma del agente al que traducir
fallbackLanguagestringnoSuposición del idioma del cliente para mensajes cortos/ambiguos
aiProviderIdstringnoRecurre al proveedor predeterminado de la organización
credentialsobjectCredenciales específicas del canal (p. ej. IMAP/SMTP, tokens de página)
responseTemplateobjectno
autoReplybooleannoPor defecto false
autoApprovebooleannoPor defecto false
autoEnhancebooleannoPor 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étodoRutaPropósitoAutenticaciónParámetros clave
GET/api/conversationsListar conversacionesSessionpage, pageSize, status, channelId, unread, assignedToId, language, search
POST/api/conversationsCrear conversaciónAGENT
GET/api/conversations/[id]Obtener unaSession
PATCH/api/conversations/[id]Actualizar (estado, prioridad, asignación, idioma, notas)Session
DELETE/api/conversations/[id]EliminarSession
GET/api/conversations/[id]/messagesListar mensajesSession
POST/api/conversations/[id]/messagesEnviar respuesta del agenteAGENT
POST/api/conversations/[id]/readMarcar como leídaSession
POST/api/conversations/[id]/unreadMarcar como no leídaSession
POST/api/conversations/bulk-readMarcar muchas como leídasSession

Valores del filtro status: OPEN | PENDING | CLOSED | ARCHIVED. pageSize está limitado a 100 (por defecto 20).

Enviar mensajePOST /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"]
}
CampoTipoRequeridoNotas
conversationIdstringDebe coincidir con el parámetro de ruta [id], si no 400 VALIDATION_ERROR
contentstringLongitud mínima 1
attachmentsstring[]noRutas 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étodoRutaPropósitoAutenticación
POST/api/messages/[id]/approveAprobar una respuesta en cola/traducida para envíoSession
POST/api/messages/[id]/generate-replyGenerar una sugerencia de respuesta de IASession
POST/api/messages/[id]/retranslateVolver a ejecutar la traducción del mensajeSession

FAQs

MétodoRutaPropósitoAutenticaciónParámetros clave
GET/api/faqsListar FAQsSessionchannelId
POST/api/faqsCrear FAQADMIN
PATCH/api/faqs/[id]Actualizar FAQSession
DELETE/api/faqs/[id]Eliminar FAQSession
POST/api/faqs/reorderReordenar FAQsSession
POST/api/faqs/generateGenerar sugerencias de FAQ con IASession

Medios

MétodoRutaPropósitoAutenticación
POST/api/media/uploadSubir un archivo (multipart/form-data)Session
GET/api/media/[id]Obtener metadatos/archivo de medioSession
DELETE/api/media/[id]Eliminar medioSession

Notificaciones

MétodoRutaPropósitoAutenticación
GET/PUT/api/notifications/preferencesObtener/actualizar preferencias de notificaciónSession
GET/POST/api/notifications/integrationsListar/configurar integraciones de notificaciónSession
POST/api/notifications/push-subscriptionRegistrar una suscripción Web PushSession

Proveedores de IA

MétodoRutaPropósitoAutenticación
GET/api/ai-providersListar proveedores configuradosSession
POST/api/ai-providersAñadir un proveedorSession
PATCH/api/ai-providers/[id]Actualizar un proveedorSession
DELETE/api/ai-providers/[id]Eliminar un proveedorSession

Herramientas de agente

MétodoRutaPropósitoAutenticación
GET/api/agent-toolsListar herramientas de agente a nivel de organizaciónSession
POST/api/agent-toolsCrear una herramienta de agenteSession
PATCH/api/agent-tools/[id]Actualizar una herramienta de agenteSession
DELETE/api/agent-tools/[id]Eliminar una herramienta de agenteSession
GET/api/agent-tools/[id]/logsVer registros de llamadas a la herramientaSession

Consulte Herramientas de agente personalizadas para la anatomía completa de la herramienta.

Widget (público)

MétodoRutaPropósitoAutenticación
GET/api/widget/[channelId]/configConfiguración del widgetPúblico, ~30/min/IP
GET/api/widget/[channelId]/faqsHasta 5 chips de FAQPúblico, ~30/min/IP
GET/api/widget/[channelId]/statusEstado en líneaPúblico
POST/api/widget/[channelId]/uploadSubida de archivoPúblico
POST/api/widget/messageEnviar mensaje (fallback WebSocket)Público, ~20/min/visitante

Consulte Inserción del widget para los payloads.

Webhooks (público)

MétodoRutaPropósitoAutenticación
GET/api/webhooks/facebookHandshake de verificaciónToken de verificación
POST/api/webhooks/facebookRecibir eventos de MessengerFirma HMAC
GET/POST/api/webhooks/instagramVerificar / recibir eventos de InstagramToken de verificación / HMAC
GET/POST/api/webhooks/whatsappVerificar / recibir eventos de WhatsAppToken de verificación / HMAC

Consulte Webhooks para los detalles del handshake y la firma.

Relacionado#