Dark mode
API Waprime · Multi-tenant · Webhooks

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.

Resumen de plataforma
72endpoints compatibles
QRconexion por Linked Devices
HMACwebhooks firmados
RESTJSON, form-data y multipart
Uso recomendado:

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.

QR vs codigo de emparejamiento:

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_....

CampoDescripcionDonde verlo
instance_idIdentificador publico usado en el path de la API compatible.Panel de Waprime, tarjeta Instancia y Token.
tokenSecreto de autenticacion de la instancia. Se muestra una sola vez al crearlo o rotarlo.Panel de Waprime, tarjeta Credenciales API.
phoneTelefono 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"
}
Resumen:

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.

Cola y delay real:

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.

POST
/{instance_id}/messages/chat
Enviar texto. Requiere to y body.
POST
/{instance_id}/messages/image
Enviar imagen por URL, base64 o multipart. Campos: to, image, caption opcional.
POST
/{instance_id}/messages/sticker
Enviar sticker WebP o imagen convertible segun soporte de WhatsApp.
POST
/{instance_id}/messages/document
Enviar documento. Campos: to, document, filename, caption opcional.
POST
/{instance_id}/messages/audio
Enviar audio MP3, AAC u OGG.
POST
/{instance_id}/messages/voice
Enviar nota de voz PTT usando campo audio.
POST
/{instance_id}/messages/video
Enviar video con caption opcional.
POST
/{instance_id}/messages/contact
Enviar contacto o lista de contactos.
POST
/{instance_id}/messages/location
Enviar ubicacion. Campos: to, address, lat, lng.
POST
/{instance_id}/messages/vcard
Enviar vCard 3.0. Campos opcionales name o displayName definen el nombre visible; si faltan se usa FN, ORG o numero.
POST
/{instance_id}/messages/reaction
Reaccionar usando como msgId el external_message_id raw del webhook. Soporta mensajes entrantes, manuales y API; IDs desconocidos devuelven 404.
POST
/{instance_id}/messages/edit
Editar un mensaje enviado cuando WhatsApp lo permite. Campos: msgId, body.
POST
/{instance_id}/messages/delete
Eliminar mensaje de WhatsApp cuando el socket y WhatsApp lo permiten.
GET
/{instance_id}/messages/edited
Listar mensajes marcados como editados por eventos de WhatsApp o por endpoint.
GET
/{instance_id}/messages/deleted
Listar mensajes marcados como borrados por eventos de WhatsApp o por endpoint.
POST
/{instance_id}/messages/resendByStatus
Reencolar mensajes con estado unsent o expired.
POST
/{instance_id}/messages/resendById
Reencolar un mensaje por ID.
POST
/{instance_id}/messages/clear
Borrar registros por estado: queue, sent, unsent, invalid o expired.
GET
/{instance_id}/messages
Listar mensajes con page, limit, status y sort.
GET
/{instance_id}/messages/statistics
Contadores de sent, queue, unsent, invalid y expired.

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

GET
/{instance_id}/instance/status
Estado de cuenta: initialize, qr, authenticated, disconnected, retrying.
GET
/{instance_id}/instance/qr
Devuelve imagen SVG del QR disponible.
GET
/{instance_id}/instance/qrCode
Devuelve el texto QR para render propio.
GET
/{instance_id}/instance/me
Informacion del telefono conectado.
GET
/{instance_id}/instance/settings
Settings de delay, prioridad y webhooks.
POST
/{instance_id}/instance/settings
Actualizar sendDelay, sendDelayMax, messagePriority, webhook_url y toggles.
POST
/{instance_id}/instance/logout
Cerrar sesion de WhatsApp Web y pedir QR nuevo.
POST
/{instance_id}/instance/restart
Reiniciar la conexion de la instancia.
POST
/{instance_id}/instance/clear
Borrar mensajes/settings y cerrar sesion para volver a QR.

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.

GET
/{instance_id}/profile/me
Obtener perfil propio: ID, nombre, about/estado y foto si esta disponible.
POST
/{instance_id}/profile/name
Cambiar nombre visible. Campo: name.
POST
/{instance_id}/profile/about
Cambiar estado/about. Campo: about.
POST
/{instance_id}/profile/picture
Cambiar foto de perfil usando URL, base64 o multipart. Campo: picture.
POST
/{instance_id}/profile/picture/delete
Eliminar foto de perfil propia.
GET
/{instance_id}/contacts/image
Obtener foto de perfil de un contacto por chatId.

Chats

Algunos datos dependen de lo sincronizado por la instancia. Waprime cachea actividad entrante y consulta la conexion cuando esta activa.

GET
/{instance_id}/chats
Lista de chats cacheados o consultados al socket.
GET
/{instance_id}/chats/ids
IDs de chats.
GET
/{instance_id}/chats/messages
Mensajes de un chat. Query: chatId, limit.
POST
/{instance_id}/chats/archive
Archivar chat.
POST
/{instance_id}/chats/unarchive
Desarchivar chat.
POST
/{instance_id}/chats/clearMessages
Limpiar mensajes del chat cuando WhatsApp lo permite.
POST
/{instance_id}/chats/delete
Eliminar chat.
POST
/{instance_id}/chats/read
Marcar chat como leido.
POST
/{instance_id}/chats/unread
Marcar chat como no leido.
POST
/{instance_id}/chats/mute
Mutear chat. Campo opcional: duration en segundos.
POST
/{instance_id}/chats/unmute
Quitar mute del chat.
POST
/{instance_id}/chats/pin
Fijar chat.
POST
/{instance_id}/chats/unpin
Desfijar chat.

Contactos

POST
/{instance_id}/contacts/block
Bloquear contacto.
POST
/{instance_id}/contacts/unblock
Desbloquear contacto.
GET
/{instance_id}/contacts
Listar contactos cacheados o disponibles por socket.
GET
/{instance_id}/contacts/ids
IDs de contactos.
GET
/{instance_id}/contacts/contact
Detalle de contacto. Query: chatId.
GET
/{instance_id}/contacts/blocked
Contactos bloqueados.
GET
/{instance_id}/contacts/invalid
Numeros invalidos detectados.
GET
/{instance_id}/contacts/check
Validar si un numero existe en WhatsApp. Query: chatId.
GET
/{instance_id}/contacts/image
URL de foto de perfil si esta disponible.

Grupos

Los endpoints de grupos consultan metadata de la instancia cuando esta activa y cachean resultados utiles.

GET
/{instance_id}/groups
Lista de grupos con participantes.
GET
/{instance_id}/groups/ids
IDs de grupos.
GET
/{instance_id}/groups/group
Detalle de grupo. Query: groupId.

Etiquetas

Waprime agrega soporte propio para etiquetas de WhatsApp Business. Se cachean localmente para poder listarlas aunque WhatsApp no reenvie todo el estado.

GET
/{instance_id}/labels
Listar etiquetas cacheadas. Query opcional: include_deleted=true.
POST
/{instance_id}/labels
Crear etiqueta. Campos: name, color de 0 a 19, id opcional.
PATCH
/{instance_id}/labels/{label_id}
Renombrar, cambiar color o marcar como borrada con deleted=true.
DELETE
/{instance_id}/labels/{label_id}
Marcar etiqueta como eliminada en WhatsApp y cache local.
POST
/{instance_id}/labels/{label_id}/chats
Asignar etiqueta a chat. Campo: chatId.
DELETE
/{instance_id}/labels/{label_id}/chats
Quitar etiqueta de chat. Campo: chatId.
POST
/{instance_id}/labels/{label_id}/messages
Asignar etiqueta a mensaje. Campos: chatId, messageId.
DELETE
/{instance_id}/labels/{label_id}/messages
Quitar etiqueta de mensaje.
GET
/{instance_id}/labels/{label_id}/associations
Listar chats y mensajes asociados a una etiqueta.
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"
  }'
POST
/{instance_id}/media/upload
Subir media y obtener URL publica temporal.
POST
/{instance_id}/media/delete
Eliminar media por URL.
POST
/{instance_id}/media/deleteByDate
Eliminar media por mes y ano, formato MM-YYYY.
GET
/{instance_id}/media/download
Obtener URL de media entrante ya almacenada por message_id, msgId o media_id.
GET
/media/{media_id}
Descargar media publica temporal.
Media avanzada:

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.

Seguridad desde el panel:

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.

SettingEventoDescripcion
webhook_message_receivedmessage.receivedMensajes entrantes observados.
webhook_message_createmessage.created, message.queued, message.processing, message.sent, message.failedSalientes observados (incluidos manuales) y ciclo outbound.
webhook_message_ackmessage.delivered, message.readConfirmaciones de entrega/lectura.
webhook_message_download_mediaMedia entranteIncluye media_url cuando existe archivo descargable.
webhook_message_reactionReaccionesEventos de reaccion cuando WhatsApp los entrega.
webhook_message_editedmessage.editedMensaje editado, con cuerpo actualizado cuando WhatsApp lo informa.
webhook_message_deletedmessage.deletedMensaje eliminado o revocado.
webhook_call_receivedcall.received, call.rejectedLlamadas entrantes y llamadas auto-rechazadas.
webhook_labelslabel.created, chat.label.added, etc.Cambios de etiquetas y asociaciones a chats/mensajes.
auto_reject_callscall.rejectedSi 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" }
  }
}
IDs y reacciones:

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.

Limitaciones de Baileys:

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

TipoEjemploNotas
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.
Estados internos:

Mensajes: QUEUED, PROCESSING, SENT, DELIVERED, READ, FAILED, EXPIRED. Instancias: CREATED, STARTING, QR_READY, AUTHENTICATED, READY, DISCONNECTED, RECONNECTING, LOGGED_OUT, ERROR.

Instancia no lista:

/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

HTTPCausa comunSolucion
400Campos faltantes o formato invalido.Revisar payload, telefono internacional, URL/base64 de media y parametros requeridos.
401Token ausente o invalido.Copiar el token desde el panel y verificar el instance_id.
403Acceso no permitido al tenant.Verificar que el usuario o la API key pertenezcan al tenant del recurso.
404Recurso inexistente.Verificar IDs de instancia, mensaje, etiqueta o media.
429Rate limit excedido.Reducir frecuencia de requests/envios.
500Error 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