DOCUMENTOS/API REST~ 9 MIN DE LECTURA

REST · v1 · BEARER

Controla tu espacio
desde tu propio código.

La API REST permite a tu CRM, backend de e-commerce, herramienta de automatización o script de migración enviar mensajes, listar conversaciones y leer contactos en tu workspace de EasyLiveChat — usando una clave con alcance por tenant, no la contraseña de un agente.

§ 00Qué es la API REST

EasyLiveChat expone una API REST en /api/v1/* para que código externo — tu propio backend, una integración con CRM, un flujo de Zapier o n8n, un script de migración — pueda leer y escribir en tu workspace sin que un agente humano esté conectado. Cada llamada se autentica con una clave API creada en el panel y con alcance por tenant.

Si alguna vez has llamado a la API de Stripe, Slack o GitHub, funciona igual: token secreto de larga duración en una cabecera Authorization, cuerpos de petición y respuesta JSON, códigos de estado HTTP predecibles.

Una clave API nunca lleva 2FA ni contraseña — ese es justamente el punto. Es una credencial que incrustas en otro software para que actúe en nombre de tu tenant, sólo con los ámbitos que le das.

§ 01Disponibilidad por plan

La API REST está disponible en todos los planes de pago y se desbloquea durante la prueba de 14 días. No hay facturación por llamada.

Cuando expira la prueba, la API pasa a sólo lectura — las escrituras devuelven 402 hasta que se actualice el workspace. Las lecturas siguen funcionando para que tus exportaciones históricas nunca se rompan.

§ 02Autenticación

Crea una clave en https://app.livechattools.com/settings/api-keys. Elige el conjunto más pequeño de ámbitos que la integración realmente necesita. Puedes revocar una clave desde la misma página en cualquier momento — deja de funcionar al instante, sin afectar al dashboard ni a los inicios de sesión móviles de tus agentes.

Pasa la clave en cada solicitud, como Bearer o vía x-api-key:

Authorization: Bearer plk_<your-key>
# — or, equivalently —
x-api-key: plk_<your-key>

Verifica que la clave funciona antes de cablearla a nada — /me devuelve tus ámbitos y tu tenant:

curl https://api.livechattools.com/api/v1/me \
  -H "Authorization: Bearer plk_<your-key>"

La clave en bruto sólo se muestra una vez al crearla. ¿La perdiste? Revócala y crea una nueva — no hay forma de recuperar el valor original.

§ 03Ámbitos (scopes)

Los ámbitos se comprueban en cada solicitud. Una clave con sólo ámbitos :read nunca puede mutar datos por accidente — útil para dashboards de sólo lectura, exports BI o pipelines de analítica.

ÁmbitoPermite
conversations:readListar y leer conversaciones y sus mensajes.
conversations:writeCerrar, reabrir o reasignar conversaciones.
messages:readLeer el historial de mensajes de una conversación.
messages:writeEnviar un nuevo mensaje como agente.
contacts:readListar y buscar contactos.

Principio del menor privilegio — claves separadas por integración. Una clave de sólo lectura filtrada en tu pipeline de reportes hace mucho menos daño que una única clave "todopoderosa" compartida en todo tu stack.

§ 04Endpoints

Cada ruta arranca en /api/v1. Las respuestas son JSON. Las horas son ISO 8601 UTC.

GET /api/v1/me

Devuelve la identidad de la clave y el tenant. No requiere ámbito — útil para probar la conexión.

curl https://api.livechattools.com/api/v1/me \
  -H "Authorization: Bearer plk_<key>"

{
  "apiKeyId": "ck...",
  "scopes": ["conversations:read","messages:write"],
  "tenant": { "id": "...", "name": "Acme", "slug": "acme", "planTier": "GROWTH" }
}

GET /api/v1/conversations

Lista las conversaciones más nuevas primero. Todos los filtros son opcionales.

  • ?status= OPEN · SNOOZED · CLOSED
  • ?channel= WIDGET · WHATSAPP · TELEGRAM · MESSENGER · INSTAGRAM
  • ?limit= 1–200, por defecto 50
  • ?cursor= id de la última fila de la página anterior
curl "https://api.livechattools.com/api/v1/conversations?status=OPEN&limit=50" \
  -H "Authorization: Bearer plk_<key>"

{
  "data": [
    { "id":"...", "sourceChannel":"WHATSAPP", "status":"OPEN",
      "lastMessagePreview":"hi there", "lastMessageAt":"..." }
  ],
  "nextCursor": "..."
}

GET /api/v1/conversations/:id

Obtiene una conversación con su contacto adjunto.

GET /api/v1/conversations/:id/messages

Historial de mensajes paginado para una conversación, los más nuevos primero.

curl "https://api.livechattools.com/api/v1/conversations/<id>/messages?limit=50" \
  -H "Authorization: Bearer plk_<key>"

POST /api/v1/conversations/:id/messages

Envía un mensaje saliente en una conversación. Se distribuye al canal correspondiente (widget, WhatsApp, Telegram, Messenger, Instagram) exactamente igual que la respuesta de un agente humano.

curl -X POST "https://api.livechattools.com/api/v1/conversations/<id>/messages" \
  -H "Authorization: Bearer plk_<key>" \
  -H "Content-Type: application/json" \
  -d '{ "body": "Your order has shipped." }'

# → 201 Created
{ "message": { "id":"...", "senderType":"AGENT", "body":"Your order has shipped.", "createdAt":"..." } }

senderAgentId es opcional — si se omite, el mensaje se atribuye al primer OWNER o ADMIN activo del workspace. Pasa un id explícito cuando quieras que una cuenta de bot concreta aparezca en la conversación.

PATCH /api/v1/conversations/:id

Actualiza el estado de una conversación (OPEN · SNOOZED · CLOSED) o su agente asignado. Pasa assignedAgentId: null para des-asignar.

curl -X PATCH "https://api.livechattools.com/api/v1/conversations/<id>" \
  -H "Authorization: Bearer plk_<key>" \
  -H "Content-Type: application/json" \
  -d '{ "status": "CLOSED" }'

GET /api/v1/contacts

Lista los contactos del workspace. ?q= busca por nombre, email o teléfono.

curl "https://api.livechattools.com/api/v1/contacts?q=acme" \
  -H "Authorization: Bearer plk_<key>"

§ 05Paginación

Todos los endpoints de lista usan paginación por cursor. La forma de la respuesta es:

{
  "data": [ /* up to ?limit= rows */ ],
  "nextCursor": "<id of last row>"   // or null when there are no more
}

Para obtener la siguiente página, pasa nextCursor como ?cursor= en la siguiente petición. Cuando nextCursor es null has llegado al final.

§ 06Errores

Los errores siempre devuelven un cuerpo JSON con un código de error y (cuando ayuda) un mensaje legible. El estado HTTP refleja el significado:

EstadoCódigoSignificado
401UNAUTHENTICATEDClave faltante, mal formada o revocada.
402TRIAL_EXPIREDPrueba expirada — las escrituras están bloqueadas, las lecturas siguen funcionando.
403FORBIDDENLa clave es válida pero le falta el ámbito que necesita este endpoint.
404NOT_FOUNDLa conversación, contacto u otro recurso no existe en tu tenant.
400INVALID_BODYAl cuerpo de la solicitud le faltan campos requeridos o tiene tipos incorrectos.
429RATE_LIMITEDDemasiadas peticiones — espera y reintenta tras unos segundos.

§ 07Webhooks (complemento)

La API REST es genial para tirar y empujar a tu ritmo. Para notificaciones push cuando ocurre algo del lado de EasyLiveChat — un nuevo mensaje de cliente, una conversación cerrándose, un agente uniéndose — configura webhooks salientes en Ajustes → Webhooks.

Los mensajes que envías vía POST /api/v1/conversations/:id/messages también disparan el webhook message.created, así que si tienes una integración enviando y otra escuchando, verás tus propios envíos rebotados por el canal del webhook.

§ 08Límites de tasa

Cada tenant tiene hasta 240 peticiones por minuto y por ruta, compartidas por todas las claves de ese tenant. Al alcanzar el límite se devuelve 429 con cabecera Retry-After.

Si tu integración necesita legítimamente un tope más alto (importación masiva, envío masivo), escribe a soporte — lo subimos para tu tenant.