Documentacion completa de Waprime API
Waprime permite conectar una cuenta de WhatsApp mediante QR, enviar mensajes transaccionales por API, recibir eventos por webhook y operar tus instancias desde una interfaz propia.
Mensajes transaccionales, soporte, notificaciones operativas y automatizaciones solicitadas por usuarios. No usar para scraping, spam ni campanas masivas.
Quickstart
1. Crear cuenta
Entrar en waprime.click, registrar email y contrasena. Se crea automaticamente un tenant, una instancia y un token.
2. Conectar WhatsApp
Desde el panel, iniciar la instancia y escanear el QR con WhatsApp desde Dispositivos vinculados.
3. Enviar por API
Usar instance_id y token en los endpoints compatibles.
curl -X POST "https://api.waprime.click/{instance_id}/messages/chat" \
-H "content-type: application/json" \
-d '{
"token": "wap_inst_xxxxxxxxx",
"to": "59899123456",
"body": "Hola desde Waprime",
"priority": 10
}'
Respuesta esperada:
{
"sent": "true",
"message": "ok",
"id": 123
}
Esta respuesta significa que el mensaje fue aceptado en cola. El envio real sucede en background y se confirma por estados/webhooks.
El codigo de emparejamiento, cuando se habilite en una interfaz, tambien vincula Waprime como dispositivo secundario de una cuenta existente. No convierte la instancia en telefono principal ni crea una cuenta de WhatsApp sin telefono.
Instancia y token
Cada cuenta creada en el panel tiene al menos una instancia. La instancia publica tiene formato
instancexxxxxx y el token tiene formato wap_inst_....
| Campo | Descripcion | Donde verlo |
|---|---|---|
instance_id | Identificador publico usado en el path de la API compatible. | Panel de Waprime, tarjeta Instancia y Token. |
token | Secreto de autenticacion de la instancia. Se muestra una sola vez al crearlo o rotarlo. | Panel de Waprime, tarjeta Credenciales API. |
phone | Telefono conectado cuando la instancia esta en READY. | Panel o endpoint /instance/me. |
El panel no vuelve a solicitar ni mostrar el token almacenado. Para reemplazarlo, use Rotar token en Credenciales API, confirme la invalidacion inmediata del token anterior y copie el nuevo antes de recargar.
En webhooks, instance_id es el UUID interno de WAPRIME. En la API compatible /{instance_id}/... se usa el publicId, por ejemplo instanceff9104.
WhatsApp puede entregar entrantes como JID privado @lid. Waprime lo resuelve al telefono real cuando Baileys tiene el mapping, para que message.received.data.from contenga el contacto remoto.
Formatos de destinatarios
El campo to acepta contactos y grupos. El formato recomendado depende del tipo de destino.
Contactos / numeros
Formato recomendado: numero internacional con codigo de pais, sin +, espacios, guiones ni parentesis.
59899123456
Tambien se aceptan separadores comunes; Waprime limpia simbolos antes de validar.
+598 99 123 456 (+598) 99-123-456 598-99-123-456 598 99 123 456 598097609597
Los ejemplos con 99 123 456 se normalizan internamente a 59899123456. La validacion requiere entre 8 y 15 digitos despues de limpiar simbolos, incluyendo el codigo de pais.
El ejemplo 598097609597 conserva el 0 local despues del prefijo pais. Waprime lo acepta y lo normaliza a 59897609597.
Los moviles uruguayos locales sin prefijo internacional no se aceptan. Por ejemplo, 099123456 y 99123456 son invalidos. Deben enviarse con 598 adelante.
Chat IDs de contacto
Si tu sistema ya guarda identificadores de chat, tambien puedes enviarlos directamente.
59899123456@c.us 59899123456@s.whatsapp.net
Estos formatos representan chats individuales/contactos, no grupos.
Grupos
Para grupos no se usa numero internacional. Se usa el ID del grupo con sufijo @g.us.
120363000000000000@g.us
Se pueden obtener IDs de grupo con:
GET https://api.waprime.click/{instance_id}/groups/ids?token=wap_inst_xxxxxxxxx
Ejemplo de envio a grupo:
{
"token": "wap_inst_xxxxxxxxx",
"to": "120363000000000000@g.us",
"body": "Hola grupo"
}
Contactos: 59899123456, +598 99 123 456, 598097609597, 59899123456@c.us o 59899123456@s.whatsapp.net. Grupos: 120363...@g.us. No se aceptan locales sueltos como 099123456 o 99123456.
Los endpoints /v1/messages/* con API key y el test message del panel aceptan numeros y chat IDs de contacto, pero no grupos. Para grupos usa los endpoints de instancia /{instance_id}/messages/... con to en formato @g.us.
Panel
Funciones principales
Registro y login, visualizacion de token, QR, estado de instancia, cambio de nombre, eliminacion de instancias, prueba de envio de texto, settings de webhook y listado de mensajes recientes.
Acciones de instancia
Iniciar QR, reiniciar socket, cerrar sesion, rotar token, editar nombre, eliminar instancia, ver telefono conectado y consultar errores recientes.
Autenticacion
Los endpoints compatibles aceptan token por query string, JSON, form-urlencoded o multipart.
GET https://api.waprime.click/{instance_id}/instance/status?token=wap_inst_xxxxxxxxx
POST https://api.waprime.click/{instance_id}/messages/chat
Content-Type: application/json
{
"token": "wap_inst_xxxxxxxxx",
"to": "59899123456",
"body": "Mensaje",
"priority": 10
}
Mensajes
Los envios se encolan, se procesan por Waprime y se actualizan con estados de entrega cuando WhatsApp los informa.
priority es opcional en los envios. Si no se envia, Waprime usa messagePriority de la instancia. Valores permitidos: 1 a 100; 1 se procesa antes.
Los endpoints de envio responden cuando el mensaje queda en cola, no cuando WhatsApp lo envio. El worker aplica un lock por instancia y espera sendDelay o sendDelayMax antes de cada envio, incluido el primer mensaje. Con 10 o mas mensajes en cola/proceso usa sendDelayMax; si no, usa sendDelay. Distintas instancias pueden enviar en paralelo.
to y body.to, image, caption opcional.to, document, filename, caption opcional.audio.to, address, lat, lng.name o displayName definen el nombre visible; si faltan se usa FN, ORG o numero.msgId el external_message_id raw del webhook. Soporta mensajes entrantes, manuales y API; IDs desconocidos devuelven 404.msgId, body.unsent o expired.page, limit, status y sort.En /messages/vcard, name o displayName se usa como nombre visible del contacto. Si faltan, Waprime parsea FN, luego ORG y finalmente el numero de la vCard. Soporta saltos CRLF, LF, CR y \n literal escapado.
Instancia
sendDelay, sendDelayMax, messagePriority, webhook_url y toggles.Para enviar con rotacion de instancias, usa solo instancias cuyo status sea authenticated y substatus connected.
{
"status": {
"accountStatus": {
"status": "authenticated",
"substatus": "connected"
}
}
}
Gestion de perfil
Estos endpoints usan capacidades de la instancia conectada. Algunas acciones pueden tardar en reflejarse en todos los clientes.
name.about.picture.chatId.Chats
Algunos datos dependen de lo sincronizado por la instancia. Waprime cachea actividad entrante y consulta la conexion cuando esta activa.
chatId, limit.duration en segundos.Contactos
chatId.chatId.Grupos
Los endpoints de grupos consultan metadata de la instancia cuando esta activa y cachean resultados utiles.
groupId.Etiquetas
Waprime agrega soporte propio para etiquetas de WhatsApp Business. Se cachean localmente para poder listarlas aunque WhatsApp no reenvie todo el estado.
include_deleted=true.name, color de 0 a 19, id opcional.deleted=true.chatId.chatId.chatId, messageId.curl -X POST "https://api.waprime.click/{instance_id}/labels" \
-H "content-type: application/json" \
-d '{
"token": "wap_inst_xxxxxxxxx",
"name": "Cliente VIP",
"color": "4"
}'
Media
Waprime acepta archivos por URL HTTP, base64 o multipart. La media se guarda temporalmente y puede exponerse como URL no adivinable.
curl -X POST "https://api.waprime.click/{instance_id}/media/upload" \
-H "content-type: application/json" \
-d '{
"token": "wap_inst_xxxxxxxxx",
"file": "https://example.com/factura.pdf"
}'
MM-YYYY.message_id, msgId o media_id.Waprime soporta stickers, audio, notas de voz PTT, video y descarga de media entrante almacenada. Los thumbnails/previews dependen de lo que WhatsApp entregue para cada tipo de mensaje.
Webhooks
Los webhooks se configuran por instancia desde el panel o desde /instance/settings.
Primero guarde la URL. Luego, en Seguridad del webhook, pulse Generar secreto y copielo inmediatamente: no volvera a mostrarse. En esa misma seccion puede rotarlo con confirmacion o enviar un webhook de prueba firmado. La prueba muestra estado y codigo HTTP sin exponer el secreto.
webhookRetries acepta valores de 0 a 10. El valor recomendado 3 significa tres reintentos despues del intento inicial, hasta cuatro intentos totales.
| Setting | Evento | Descripcion |
|---|---|---|
webhook_message_received | message.received | Mensajes entrantes observados. |
webhook_message_create | message.created, message.queued, message.processing, message.sent, message.failed | Salientes observados (incluidos manuales) y ciclo outbound. |
webhook_message_ack | message.delivered, message.read | Confirmaciones de entrega/lectura. |
webhook_message_download_media | Media entrante | Incluye media_url cuando existe archivo descargable. |
webhook_message_reaction | Reacciones | Eventos de reaccion cuando WhatsApp los entrega. |
webhook_message_edited | message.edited | Mensaje editado, con cuerpo actualizado cuando WhatsApp lo informa. |
webhook_message_deleted | message.deleted | Mensaje eliminado o revocado. |
webhook_call_received | call.received, call.rejected | Llamadas entrantes y llamadas auto-rechazadas. |
webhook_labels | label.created, chat.label.added, etc. | Cambios de etiquetas y asociaciones a chats/mensajes. |
auto_reject_calls | call.rejected | Si esta activo, Waprime intenta rechazar automaticamente la llamada entrante. |
{
"event": "message.received",
"timestamp": "2026-06-10T10:17:01.396Z",
"tenant_id": "tenant_uuid",
"instance_id": "internal_instance_uuid",
"instance_public_id": "instanceff9104",
"data": {
"direction": "INBOUND",
"fromMe": false,
"from_me": false,
"source": "unknown",
"message_id": "message_uuid",
"internal_message_id": "message_uuid",
"public_message_id": null,
"external_message_id": "3EB012345678",
"legacy_external_message_id": "59899123456@s.whatsapp.net:3EB012345678",
"id": "3EB012345678",
"msgId": "3EB012345678",
"sid": "3EB012345678",
"chat_id": "59899123456@s.whatsapp.net",
"from": "59899123456",
"from_jid": "59899123456@s.whatsapp.net",
"fromPhone": "59899123456",
"to": "59898765432",
"to_jid": "59898765432:1@s.whatsapp.net",
"toPhone": "59898765432",
"body": "Hola",
"type": "TEXT",
"type_normalized": "chat",
"internal_type": "TEXT",
"timestamp": 1780000000,
"timestamp_iso": "2026-05-27T10:13:20.000Z",
"group_id": null,
"participant": null,
"participant_jid": null,
"media_id": null,
"media_url": null,
"quoted_message": null,
"quotedMsg": null
}
}
instance_id es el UUID interno y instance_public_id es el identificador compatible con UltraMsg. En message.received, type y participant conservan valores historicos; use type_normalized y participant_jid para el contrato nuevo.
Payload de message.created:
{
"event": "message.created",
"timestamp": "2026-05-27T10:13:20.500Z",
"tenant_id": "tenant_uuid",
"instance_id": "internal_instance_uuid",
"instance_public_id": "instanceff9104",
"data": {
"direction": "OUTBOUND",
"fromMe": true,
"from_me": true,
"source": "manual",
"message_id": "message_uuid",
"internal_message_id": "message_uuid",
"public_message_id": null,
"external_message_id": "3EB0ABCDEF",
"legacy_external_message_id": "59899123456@s.whatsapp.net:3EB0ABCDEF",
"id": "3EB0ABCDEF",
"msgId": "3EB0ABCDEF",
"sid": "3EB0ABCDEF",
"chat_id": "59899123456@s.whatsapp.net",
"from": "59898765432",
"from_jid": "59898765432:1@s.whatsapp.net",
"fromPhone": "59898765432",
"to": "59899123456",
"to_jid": "59899123456@s.whatsapp.net",
"toPhone": "59899123456",
"body": "Respuesta manual",
"type": "chat",
"type_normalized": "chat",
"internal_type": "TEXT",
"timestamp": 1780000000,
"timestamp_iso": "2026-05-27T10:13:20.000Z",
"group_id": null,
"participant": null,
"participant_jid": null,
"media_id": null,
"media_url": null,
"quoted_message": {
"external_message_id": "QUOTED123",
"chat_id": "59899123456@s.whatsapp.net",
"participant": "59898765432@s.whatsapp.net",
"fromMe": true,
"body": "Mensaje anterior",
"type": "chat"
},
"quotedMsg": { "id": "QUOTED123", "sid": "QUOTED123" }
}
}
internal_message_id es el UUID Waprime, public_message_id es el entero UltraMsg y external_message_id es el ID raw de WhatsApp. Use este ultimo como msgId en /{instance_id}/messages/reaction. Tambien se acepta el compuesto legacy si esta persistido; IDs desconocidos devuelven 404.
Las citas se extraen de contextInfo y se exponen como quoted_message y quotedMsg, incluso dentro de wrappers ephemeral, view-once y document-with-caption cuando Baileys entrega el contenido.
Payload de fallo outbound:
{
"event": "message.failed",
"timestamp": "2026-06-10T10:17:31.396Z",
"tenant_id": "tenant_uuid",
"instance_id": "internal_instance_uuid",
"data": {
"message_id": "message_uuid",
"status": "FAILED",
"error": "La instancia no está READY"
}
}
message.processing, message.sent, message.delivered y message.read usan el mismo shape basico con message_id y status. En compatibilidad UltraMsg, FAILED se consulta como unsent y EXPIRED como expired.
Payload de llamada:
{
"event": "call.received",
"timestamp": "2026-06-10T18:45:00.000Z",
"tenant_id": "tenant_uuid",
"instance_id": "instance_uuid",
"data": {
"call_id": "call_id",
"from": "59899123456",
"from_jid": "59899123456@c.us",
"status": "offer",
"is_video": false,
"is_group": false
}
}
Los envios incluyen X-Waprime-Signature: sha256=<hex>, calculada con HMAC-SHA256 sobre el body HTTP crudo, X-Waprime-Event y X-Waprime-Delivery-Id. Compare la firma con una funcion timing-safe y no vuelva a serializar el JSON. El delivery ID permanece estable durante todos los reintentos.
webhook_retries indica reintentos posteriores al primero. El secreto es diferente del token de instancia, se devuelve una sola vez al crearlo o rotarlo y puede rotarse con POST /v1/webhooks/{webhook_id}/rotate-secret o desde el panel de instancia.
La resolucion de @lid es best-effort y conserva siempre el JID original. Algunos mensajes antiguos pueden omitir autor o cuerpo citado. No se hace backfill completo de historial: message.created cubre mensajes observados en vivo por el socket.
Respuestas y estados
| Tipo | Ejemplo | Notas |
|---|---|---|
| Envio exitoso | { "sent": "true", "message": "ok", "id": 123 } | El mensaje queda en cola y se procesa en background. |
| Accion async | { "status": "pending", "message": "ok" } | Usado en acciones de chat/contacto/socket. |
| Operacion admin | { "success": "done" } | Usado en clear/delete/resend. |
Mensajes: QUEUED, PROCESSING, SENT, DELIVERED, READ, FAILED, EXPIRED. Instancias: CREATED, STARTING, QR_READY, AUTHENTICATED, READY, DISCONNECTED, RECONNECTING, LOGGED_OUT, ERROR.
/messages/chat puede responder OK porque encolo el mensaje. Si luego el worker no puede enviarlo porque la instancia no esta READY, el mensaje pasa a FAILED y se emite message.failed. Para rotar automaticamente, reintenta desde otra instancia activa al recibir ese evento o verifica /instance/status antes de enviar.
Limites y seguridad
Rate limits
Los endpoints de envio no tienen limite por minuto y no responden 429 por volumen: las solicitudes validas quedan en cola y sendDelay/sendDelayMax regulan el envio real. API_RATE_LIMIT_PER_MINUTE se conserva para otras rutas. Si la cola supera OUTBOUND_QUEUE_MAX_PENDING (default 100000), la API responde 503.
Buenas practicas
No exponer tokens en frontend publico, rotar token ante sospecha, validar webhooks por firma y usar HTTPS siempre.
Media temporal
Los archivos se guardan temporalmente y se limpian por worker. No usar como almacenamiento permanente.
Uso permitido
Mensajeria transaccional y conversacional solicitada. No scraping, spam, stealth ni campanas masivas.
Errores
| HTTP | Causa comun | Solucion |
|---|---|---|
| 400 | Campos faltantes o formato invalido. | Revisar payload, telefono internacional, URL/base64 de media y parametros requeridos. |
| 401 | Token ausente o invalido. | Copiar el token desde el panel y verificar el instance_id. |
| 403 | Acceso no permitido al tenant. | Verificar que el usuario o la API key pertenezcan al tenant del recurso. |
| 404 | Recurso inexistente. | Verificar IDs de instancia, mensaje, etiqueta o media. |
| 429 | Rate limit excedido. | Reducir frecuencia de requests/envios. |
| 500 | Error interno o socket no disponible. | Revisar estado de instancia y logs si sos administrador. |
Soporte
Panel: https://waprime.click
API base: https://api.waprime.click
Swagger tecnico: https://api.waprime.click/docs
Health check: GET https://api.waprime.click/health (sin autenticacion)
Docs publicas: https://docs.waprime.click