EasyWha Logo

Documentación de la API

Guía para integrar tus aplicaciones con la API de EasyWha.

Introducción

La API de EasyWha te permite enviar y recibir mensajes de WhatsApp, consultar chats y más, de forma programática. Está diseñada bajo principios REST, utiliza JSON para la comunicación y requiere autenticación segura.

URL Base: https://api.easywha.com

1. Autenticación

La API utiliza tokens JWT (JSON Web Tokens) para garantizar la seguridad. Antes de realizar cualquier petición, debes intercambiar tus credenciales (clientId y clientSecret) por un token de acceso temporal.

1.1 Obtener Token de Acceso

Intercambia tus credenciales por un token válido por 1 hora.

POST
/api/auth/apikey-login

Cuerpo de la Solicitud (JSON)

{
  "clientId": "TU_CLIENT_ID",
  "clientSecret": "TU_CLIENT_SECRET"
}

Ejemplo de Solicitud (cURL)

curl -X POST https://api.easywha.com/api/auth/apikey-login \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "mi_client_id",
    "clientSecret": "mi_client_secret"
  }'

Respuesta Exitosa (200 OK)

{
  "success": true,
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expiresIn": 3600
}

1.2 Usar el Token en las Peticiones

Una vez tengas el token, debes incluirlo en el encabezado Authorization de todas tus solicitudes siguientes. Note que el token expira después del tiempo indicado.

Header Requerido
Authorization: Bearer <TU_ACCESS_TOKEN>

2. Envío de Mensajes

2.1 Enviar Texto

Envía un mensaje de texto simple a cualquier número de WhatsApp.

POST
/api/whatsapp/send

Cuerpo de la Solicitud (JSON)

ParámetroTipoDescripción
accountIdintegerID de la cuenta emisora.
numberstringNúmero del destinatario en formato internacional (ej: `521999...`) o JID.
messagestringContenido del mensaje de texto.

Ejemplo de Solicitud (cURL)

curl -X POST https://api.easywha.com/api/whatsapp/send \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer tu_access_token" \
  -d '{
    "accountId": 123,
    "number": "5219991234567",
    "message": "Hola, esto es una prueba desde la API."
  }'

Respuesta Exitosa (200 OK)

{
  "success": true,
  "msgId": "true_521...@c.us_3EB0...",
  "remainingQuota": 99
}

2.2 Enviar Archivos Multimedia

Envía imágenes, videos, audios o documentos.

POST
/api/whatsapp/sendMedia

Cuerpo de la Solicitud (multipart/form-data)

ParámetroTipoDescripción
filefileEl archivo binario a enviar.
accountIdintegerID de la cuenta emisora.
numberstringNúmero de destino (ej. `5219991234567`).
captionstring (opcional)Texto que acompaña al archivo.

Ejemplo de Solicitud (cURL)

curl -X POST https://api.easywha.com/api/whatsapp/sendMedia \
  -H "Authorization: Bearer tu_access_token" \
  -F "file=@/ruta/imagen.jpg" \
  -F "accountId=123" \
  -F "number=5219991234567" \
  -F "caption=Mira esta imagen"

3. Consulta de Chats y Mensajes

3.1 Listar Chats

GET
/api/chats/:accountId
Obtiene la lista de conversaciones activas.

:accountId - El ID numérico de tu cuenta o tu número de teléfono (ej. 5219990000000).

Ejemplo de Solicitud (cURL)

curl -X GET https://api.easywha.com/api/chats/5219990000000 \
  -H "Authorization: Bearer tu_access_token"

Respuesta Exitosa (200 OK)

{
  "success": true,
  "chats": [
    {
      "id": 123,
      "contact_number": "5219991234567",
      "contact_name": "Juan Pérez",
      "profile_pic_url": "https://...",
      "last_message": "¿Cuál es el precio?",
      "updated_at": "2025-10-11T02:58:00Z",
      "unread_count": 2
    }
  ]
}

3.2 Listar Historial de Mensajes

GET
/api/chats/:chatId/messages

Parámetros (Query)

ParámetroTipoDescripción
limitinteger (opcional)Cantidad de mensajes (default: 50).
beforestring (opcional)ID de mensaje o timestamp para paginación.

Ejemplo de Solicitud (cURL)

curl -X GET "https://api.easywha.com/api/chats/123/messages?limit=20" \
  -H "Authorization: Bearer tu_access_token"

Respuesta Exitosa (200 OK)

{
  "success": true,
  "messages": [
    {
      "id": 7771,
      "message_id": "true_521...@c.us_3EB0...",
      "direction": "inbound",
      "message": "Hola, quiero información",
      "timestamp": "2025-10-11T02:50:00Z",
      "status": "read"
    },
    {
      "id": 7772,
      "direction": "outbound",
      "message": "Claro, en qué te ayudo?",
      "timestamp": "2025-10-11T02:51:00Z",
      "status": "sent"
    }
  ]
}

3.3 Marcar Mensajes como Leídos

POST
/api/chats/:chatId/mark-read
curl -X POST https://api.easywha.com/api/chats/123/mark-read \
  -H "Authorization: Bearer tu_access_token"

4. Webhooks (Recepción en Tiempo Real)

Configura una URL en tu panel para recibir notificaciones POST por cada mensaje entrante.

4.1 Seguridad (Encriptación)

Por seguridad, el contenido se envía encriptado con AES-256-CBC usando tu Client Secret (¡no tu token!) como llave.

Payload Recibido
{
  "iv": "a1b2c3d4...",  // Vector de inicialización (Hex)
  "data": "f9e8d7..."   // Mensaje encriptado (Hex)
}

4.2 Ejemplo de Desencriptación (Node.js)

const crypto = require('crypto');
const API_KEY = 'tu_client_secret';

app.post('/webhook', (req, res) => {
  const { iv, data } = req.body;
  try {
    const key = Buffer.from(API_KEY, 'hex');
    const ivBuffer = Buffer.from(iv, 'hex');
    const decipher = crypto.createDecipheriv('aes-256-cbc', key, ivBuffer);
    let decrypted = decipher.update(data, 'hex', 'utf8');
    decrypted += decipher.final('utf8');
    
    const message = JSON.parse(decrypted);
    console.log("Mensaje:", message);
    res.sendStatus(200);
  } catch (e) {
    res.sendStatus(400);
  }
});

4.3 Validación (Ping)

Al registrar tu URL, nuestro sistema enviará un POST de prueba (no encriptado) para validar la conectividad:

{ "type": "ping" }

Tu servidor debe responder obligatoriamente con status 200 OK. De lo contrario, no se guardará el webhook.

5. Códigos de Error Comunes

  • 401 Unauthorized: Token inválido o expirado.
  • 403 Forbidden: Acceso denegado (IP no permitida o cuenta ajena).
  • 404 Not Found: Recurso no encontrado.
  • 500 Internal Server Error: Error del servidor o de WhatsApp Web.