v1 REST API

Documentación de Wapi

Wapi es una API REST que te permite enviar y recibir mensajes de WhatsApp desde cualquier sistema o lenguaje de programación. La conexión se realiza vinculando un número de WhatsApp vía código QR, sin necesidad de la API oficial de Meta.

Nota: Wapi es una herramienta privada (no oficial). Úsala para notificaciones y comunicación con clientes conocidos. El uso masivo de spam puede resultar en bloqueos del número.

URL base

https://api.wapi.kore.pe/api/v1

Autenticación

Todas las peticiones a la API requieren un header Authorization con tu API Key. Puedes generar una o varias API Keys desde el panel en API Keys.

Header requerido

Authorization: Bearer TU_API_KEY

Ejemplo

curl https://api.wapi.kore.pe/api/v1/instances \ -H "Authorization: Bearer wapi_xxxxxxxxxxxxxxxx"
Las API Keys son específicas por usuario. Nunca las compartas ni las incluyas en código frontend público.

Quick Start

Sigue estos pasos para enviar tu primer mensaje:

  1. 1

    Crea una instancia

    Desde el panel, crea una instancia con el nombre que identifique tu número (ej: ventas, soporte).

  2. 2

    Escanea el QR

    Ve a la instancia creada, espera el código QR y escanéalo con WhatsApp → Dispositivos vinculados.

  3. 3

    Genera tu API Key

    Ve a API Keys en el panel y crea una nueva key. Guárdala en un lugar seguro.

  4. 4

    Envía tu primer mensaje

    curl -X POST https://api.wapi.kore.pe/api/v1/ventas/send/text \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"to":"51999888777","message":"¡Hola!"}'

Listar instancias

GET /api/v1/instances

Devuelve todas las instancias asociadas a tu cuenta con su estado actual.

Respuesta

{ "ok": true, "instances": [ { "id": "ventas", "status": "conectado", "webhookUrl": "https://tu-sistema.com/webhook" } ] }

Estado de instancia

GET /api/v1/{instance_id}/status

Devuelve el estado actual de una instancia específica.

Estados posibles

Estado Descripción
conectadoWhatsApp vinculado y listo para enviar
escaneandoEsperando escaneo del QR
iniciandoInstancia iniciando sesión
desconectadoSesión cerrada o expirada

Enviar mensaje de texto

POST /api/v1/{instance_id}/send/text

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

Body (JSON)

Campo Tipo Descripción
to * string Número destino con código de país (ej: 51999888777)
message * string Texto del mensaje. Soporta emojis 🎉

Ejemplo

curl -X POST https://api.wapi.kore.pe/api/v1/ventas/send/text \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"to":"51999888777","message":"Tu pedido #1234 fue confirmado ✅"}'

Respuesta exitosa

{ "ok": true, "messageId": "3EB0C4F9A1B2D3E4F5A6", "queued": false }

Enviar multimedia

POST /api/v1/{instance_id}/send/media

Envía una imagen, PDF u otro archivo junto con un caption opcional.

Body (JSON)

Campo Tipo Descripción
to * string Número destino con código de país
url * string URL pública del archivo a enviar
caption string Texto que acompaña al archivo (opcional)
filename string Nombre del archivo para documentos (opcional)

Ejemplo — enviar PDF

curl -X POST https://api.wapi.kore.pe/api/v1/ventas/send/media \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "51999888777", "url": "https://tu-sistema.com/facturas/F001-123.pdf", "caption": "Tu factura del mes de marzo", "filename": "Factura-F001-123.pdf" }'

Webhooks — Configuración

Los webhooks permiten que Wapi notifique a tu sistema en tiempo real cuando ocurre un evento (mensaje recibido, instancia desconectada, etc.).

Configura la URL de webhook desde el panel en la vista de detalle de cada instancia, o vía la siguiente petición:

POST /api/v1/{instance_id}/webhook
curl -X POST https://api.wapi.kore.pe/api/v1/ventas/webhook \ -H "Authorization: Bearer TU_API_KEY" \ -H "Content-Type: application/json" \ -d '{"url":"https://tu-sistema.com/wapi-webhook"}'

Webhooks — Eventos

Wapi enviará un POST a tu URL con el siguiente formato:

message.received

{ "event": "message.received", "instanceId": "ventas", "data": { "from": "51999888777", "fromName": "Juan Pérez", "message": "Hola, quiero información", "type": "text", "timestamp": 1711234567 } }

instance.disconnected

{ "event": "instance.disconnected", "instanceId": "ventas", "data": { "reason": "loggedOut" } }
Tu endpoint de webhook debe responder con HTTP 200 en menos de 10 segundos. Si falla, Wapi reintentará hasta 3 veces con backoff exponencial.

Ejemplo — PHP

<?php $apiKey = 'wapi_xxxxxxxxxxxxxxxx'; $instance = 'ventas'; $baseUrl = 'https://api.wapi.kore.pe/api/v1'; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => "$baseUrl/$instance/send/text", CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer $apiKey", 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'to' => '51999888777', 'message' => 'Tu pedido fue confirmado ✅', ]), ]); $response = json_decode(curl_exec($ch), true); curl_close($ch); // $response['ok'] === true

Ejemplo — JavaScript (Node.js)

const apiKey = 'wapi_xxxxxxxxxxxxxxxx'; const instance = 'ventas'; const baseUrl = 'https://api.wapi.kore.pe/api/v1'; const response = await fetch(`${baseUrl}/${instance}/send/text`, { method: 'POST', headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ to: '51999888777', message: 'Tu pedido fue confirmado ✅', }), }); const data = await response.json(); console.log(data); // { ok: true, messageId: '3EB0...' }

Ejemplo — Python

import requests api_key = 'wapi_xxxxxxxxxxxxxxxx' instance = 'ventas' base_url = 'https://api.wapi.kore.pe/api/v1' response = requests.post( f'{base_url}/{instance}/send/text', headers={ 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json', }, json={ 'to': '51999888777', 'message': 'Tu pedido fue confirmado ✅', } ) data = response.json() print(data) # {'ok': True, 'messageId': '3EB0...'}

Códigos de error

Código HTTP Descripción
200Operación exitosa
400Datos inválidos o faltantes en el body
401API Key inválida o faltante
404Instancia no encontrada
409Instancia no conectada (escanea el QR)
429Límite de mensajes del plan superado
500Error interno del servidor

Límites por plan

Plan Instancias Mensajes/día Precio
Starter 1 300 S/. 49/mes
Pro 5 2,000 S/. 129/mes
Business 20 Ilimitado S/. 299/mes

¿Necesitas más capacidad? Contáctanos para un plan a medida.