DavyCorp APIs WhatsApp

WhatsApp API

Envía mensajes y PDFs por WhatsApp, gestiona sesiones QR y verifica estados en tiempo real.

BASE URL https://apis.davycorp.ec/v2/api/
Cada endpoint existe en dos modos: demo (sin descuento de límite, ideal para integrar) y comercial (modo producción). Ambos comparten el mismo Bearer token y devuelven respuestas idénticas.
Flujo de conexión
1
GET /qr → obtener QR
2
Usuario escanea QR
3
GET /state → verificar connected
4
POST /send o /send-pdf
5
POST /logout cuando termines
Endpoints disponibles
GET /whatsapp/qr/{demo|comercial} Genera el QR para escanear con WhatsApp AMBOS
GET /whatsapp/state/{demo|comercial} Consulta estado actual de la sesión AMBOS
POST /whatsapp/send/{demo|comercial} Envía un mensaje de texto AMBOS
POST /whatsapp/send-pdf/{demo|comercial} Envía un PDF adjunto (multipart/form-data) AMBOS
POST /whatsapp/logout/{demo|comercial} Cierra la sesión y elimina credenciales AMBOS
GET /whatsapp/qr/cancel/{demo|comercial} Cancela el proceso de escaneo de QR AMBOS
Autenticación

Headers requeridos en todos los endpoints

Authorization Bearer TU_API_KEY REQUERIDO
Content-Type application/json (o multipart/form-data para send-pdf) REQUERIDO
Estados posibles de la sesión
"not_initialized"  → Nunca se ha iniciado sesión
"qr"               → Esperando que el usuario escanee el QR
"connected"        → Sesión activa y lista para enviar
"logged_out"       → Sesión cerrada (logout manual o desde el teléfono)
"stopped"          → Proceso detenido (cancelado)
GET /whatsapp/qr/demo   ·   /whatsapp/qr/comercial AMBOS MODOS
Inicia la sesión de WhatsApp y devuelve el QR en base64 (PNG) listo para mostrar en tu app. Si la sesión ya estaba conectada, devuelve directamente el estado connected.

Headers

AuthorizationBearer TU_API_KEYREQUERIDO
Parámetros
// No requiere body — solo el header Authorization
Ejemplos de consumo
cURL
JS Fetch
Node axios
Python
PHP
Java
C#
curl 'https://apis.davycorp.ec/v2/api/whatsapp/qr/demo' \
  -H 'Authorization: Bearer TU_API_KEY'
const res = await fetch('https://apis.davycorp.ec/v2/api/whatsapp/qr/demo', {
  headers: { 'Authorization': 'Bearer TU_API_KEY' }
});
const { status, qrImage } = await res.json();

if (status === 'qr') {
  // qrImage es un data:image/png;base64,... listo para un 
  document.getElementById('qr').src = qrImage;
} else if (status === 'connected') {
  console.log('Ya conectado ✅');
}
import axios from 'axios';

const { data } = await axios.get(
  'https://apis.davycorp.ec/v2/api/whatsapp/qr/demo',
  { headers: { 'Authorization': 'Bearer TU_API_KEY' } }
);

if (data.status === 'qr') {
  // mostrar data.qrImage en un 
  console.log('QR listo', data.qr);
}
import requests, base64

r = requests.get(
    'https://apis.davycorp.ec/v2/api/whatsapp/qr/demo',
    headers={'Authorization': 'Bearer TU_API_KEY'}
)
data = r.json()

if data['status'] == 'qr':
    # Guardar QR como imagen PNG
    img_data = data['qrImage'].split(',')[1]
    with open('qr.png', 'wb') as f:
        f.write(base64.b64decode(img_data))
    print('QR guardado en qr.png')
elif data['status'] == 'connected':
    print(f"Conectado: {data['phone']}")
$ch = curl_init('https://apis.davycorp.ec/v2/api/whatsapp/qr/demo');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer TU_API_KEY']
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);

if ($data['status'] === 'qr') {
    // Mostrar en HTML: <img src="">
    echo '<img src="' . $data['qrImage'] . '">';
}
import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://apis.davycorp.ec/v2/api/whatsapp/qr/demo"))
    .header("Authorization", "Bearer TU_API_KEY")
    .GET()
    .build();

HttpResponse<String> response = client.send(
    request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
// Parsear JSON y extraer qrImage para mostrar en JLabel
using System.Net.Http;
using System.Text.Json;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer TU_API_KEY");

var json = await client.GetStringAsync(
    "https://apis.davycorp.ec/v2/api/whatsapp/qr/demo"
);
var doc = JsonDocument.Parse(json);
var status = doc.RootElement.GetProperty("status").GetString();

if (status == "qr") {
    var qrImage = doc.RootElement.GetProperty("qrImage").GetString();
    // qrImage es base64, cargar en PictureBox
}
Respuestas
200 — QR
200 — Ya conectado
200 — Inicializando
{
  "success": true,
  "status": "qr",
  "qr": "2@xxx...",                      // string raw del QR
  "qrImage": "data:image/png;base64,..."   // imagen lista para <img src="...">
}
{
  "success": true,
  "status": "connected",
  "phone": "593987654321"
}
{
  "success": true,
  "status": "initializing"   // reintenta en 2-3 segundos
}
GET /whatsapp/state/demo   ·   /whatsapp/state/comercial AMBOS MODOS
Consulta el estado actual de la sesión sin generar un nuevo QR. Útil para polling periódico hasta confirmar la conexión.
Ejemplos de consumo
cURL
JS Fetch
Python
PHP
curl 'https://apis.davycorp.ec/v2/api/whatsapp/state/demo' \
  -H 'Authorization: Bearer TU_API_KEY'
// Polling hasta que la sesión esté conectada
async function waitConnected() {
  while (true) {
    const res = await fetch('https://apis.davycorp.ec/v2/api/whatsapp/state/demo', {
      headers: { 'Authorization': 'Bearer TU_API_KEY' }
    });
    const { status, phone } = await res.json();
    if (status === 'connected') {
      console.log(`✅ Conectado: ${phone}`);
      break;
    }
    await new Promise(r => setTimeout(r, 2000));
  }
}
import requests, time

while True:
    r = requests.get(
        'https://apis.davycorp.ec/v2/api/whatsapp/state/demo',
        headers={'Authorization': 'Bearer TU_API_KEY'}
    )
    data = r.json()
    if data['status'] == 'connected':
        print(f"Conectado: {data['phone']}")
        break
    time.sleep(2)
do {
    $ch = curl_init('https://apis.davycorp.ec/v2/api/whatsapp/state/demo');
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => ['Authorization: Bearer TU_API_KEY']
    ]);
    $data = json_decode(curl_exec($ch), true);
    curl_close($ch);
    if ($data['status'] !== 'connected') sleep(2);
} while ($data['status'] !== 'connected');
Respuesta
{
  "success": true,
  "status": "connected",      // o "qr" / "not_initialized" / "logged_out"
  "phone": "593987654321",    // solo cuando status === "connected"
  "isReady": true,
  "updatedAt": "2026-06-30T14:32:00.000Z"
}
POST /whatsapp/send/demo   ·   /whatsapp/send/comercial AMBOS MODOS
Envía un mensaje de texto a un número de WhatsApp. La sesión debe estar en estado connected antes de llamar a este endpoint.

Body (application/json)

numberNúmero con código de país, sin + ni espaciosREQUERIDO
messageTexto del mensajeREQUERIDO
Ejemplos de consumo
cURL
JS Fetch
Node axios
Python
PHP
Java
C#
Kotlin
curl -X POST 'https://apis.davycorp.ec/v2/api/whatsapp/send/demo' \
  -H 'Authorization: Bearer TU_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"number":"593987654321","message":"Hola desde DavyCorp API 👋"}'
const res = await fetch('https://apis.davycorp.ec/v2/api/whatsapp/send/demo', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer TU_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    number: '593987654321',
    message: 'Hola desde DavyCorp API 👋'
  })
});
const data = await res.json();
console.log(data.success ? 'Enviado ✅' : data.error);
import axios from 'axios';

const { data } = await axios.post(
  'https://apis.davycorp.ec/v2/api/whatsapp/send/demo',
  { number: '593987654321', message: 'Hola 👋' },
  { headers: { 'Authorization': 'Bearer TU_API_KEY' } }
);
console.log(data);
import requests

r = requests.post(
    'https://apis.davycorp.ec/v2/api/whatsapp/send/demo',
    json={'number': '593987654321', 'message': 'Hola 👋'},
    headers={'Authorization': 'Bearer TU_API_KEY'}
)
print(r.json())
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => 'https://apis.davycorp.ec/v2/api/whatsapp/send/demo',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode([
        'number'  => '593987654321',
        'message' => 'Hola 👋'
    ]),
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer TU_API_KEY',
        'Content-Type: application/json'
    ]
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import java.net.http.*;
import java.net.URI;

String body = "{\"number\":\"593987654321\",\"message\":\"Hola 👋\"}";
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://apis.davycorp.ec/v2/api/whatsapp/send/demo"))
    .header("Authorization", "Bearer TU_API_KEY")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
System.out.println(client.send(req, HttpResponse.BodyHandlers.ofString()).body());
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody

val body = """{"number":"593987654321","message":"Hola 👋"}"""
    .toRequestBody("application/json".toMediaType())
val request = Request.Builder()
    .url("https://apis.davycorp.ec/v2/api/whatsapp/send/demo")
    .post(body)
    .addHeader("Authorization", "Bearer TU_API_KEY")
    .build()
println(OkHttpClient().newCall(request).execute().body?.string())
Respuestas
200 — Enviado
Errores
{ "success": true }
// 500 — No conectado
{ "success": false, "error": "WhatsApp no conectado" }

// 500 — Sesión no iniciada
{ "success": false, "error": "WhatsApp no iniciado" }
POST /whatsapp/send-pdf/demo   ·   /whatsapp/send-pdf/comercial AMBOS MODOS
Envía un archivo PDF como documento adjunto. Usa multipart/form-data — no JSON. El campo del archivo debe llamarse pdf. Máximo 10 MB.

Body (multipart/form-data)

numberNúmero con código de paísREQUERIDO
pdfArchivo PDF (campo file, max 10MB)REQUERIDO
messageCaption / descripción del archivoOPCIONAL
Ejemplos de consumo
cURL
JS Fetch
Node axios
Python
PHP
Java
curl -X POST 'https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo' \
  -H 'Authorization: Bearer TU_API_KEY' \
  -F 'number=593987654321' \
  -F 'message=Tu factura adjunta' \
  -F 'pdf=@/ruta/factura.pdf'
const form = new FormData();
form.append('number', '593987654321');
form.append('message', 'Tu factura adjunta');
form.append('pdf', pdfFile);  // File / Blob

const res = await fetch('https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer TU_API_KEY' },
  // NO fijar Content-Type — el navegador lo pone solo con el boundary
  body: form
});
console.log(await res.json());
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';

const form = new FormData();
form.append('number', '593987654321');
form.append('message', 'Tu factura adjunta');
form.append('pdf', fs.createReadStream('/ruta/factura.pdf'));

const { data } = await axios.post(
  'https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo',
  form,
  { headers: { 'Authorization': 'Bearer TU_API_KEY', ...form.getHeaders() } }
);
import requests

with open('factura.pdf', 'rb') as f:
    r = requests.post(
        'https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo',
        headers={'Authorization': 'Bearer TU_API_KEY'},
        data={
            'number': '593987654321',
            'message': 'Tu factura adjunta'
        },
        files={'pdf': ('factura.pdf', f, 'application/pdf')}
    )
print(r.json())
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL            => 'https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => [
        'number'  => '593987654321',
        'message' => 'Tu factura',
        'pdf'     => new CURLFile('/ruta/factura.pdf', 'application/pdf')
    ],
    CURLOPT_HTTPHEADER => ['Authorization: Bearer TU_API_KEY']
]);
$data = json_decode(curl_exec($ch), true);
// Java 11+ con HttpClient multipart manual
import java.net.http.*;
import java.nio.file.*;

String boundary = "----DavyCorpBoundary";
byte[] fileBytes = Files.readAllBytes(Path.of("factura.pdf"));

String bodyStr = "--" + boundary + "\r\n" +
    "Content-Disposition: form-data; name=\"number\"\r\n\r\n593987654321\r\n" +
    "--" + boundary + "\r\n" +
    "Content-Disposition: form-data; name=\"message\"\r\n\r\nTu factura\r\n" +
    "--" + boundary + "\r\n" +
    "Content-Disposition: form-data; name=\"pdf\"; filename=\"factura.pdf\"\r\n" +
    "Content-Type: application/pdf\r\n\r\n";

HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://apis.davycorp.ec/v2/api/whatsapp/send-pdf/demo"))
    .header("Authorization", "Bearer TU_API_KEY")
    .header("Content-Type", "multipart/form-data; boundary=" + boundary)
    .POST(HttpRequest.BodyPublishers.ofByteArray(
        /* combinar bodyStr.getBytes() + fileBytes + cierre boundary */
        bodyStr.getBytes()
    )).build();
Respuesta
{ "success": true }
POST /whatsapp/logout/demo   ·   /whatsapp/logout/comercial AMBOS MODOS
Cierra la sesión de WhatsApp y elimina las credenciales del servidor. Después de esto se requerirá escanear un nuevo QR para reconectar.
Ejemplos de consumo
cURL
JS Fetch
Python
PHP
curl -X POST 'https://apis.davycorp.ec/v2/api/whatsapp/logout/demo' \
  -H 'Authorization: Bearer TU_API_KEY'
await fetch('https://apis.davycorp.ec/v2/api/whatsapp/logout/demo', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer TU_API_KEY' }
});
requests.post(
    'https://apis.davycorp.ec/v2/api/whatsapp/logout/demo',
    headers={'Authorization': 'Bearer TU_API_KEY'}
)
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL        => 'https://apis.davycorp.ec/v2/api/whatsapp/logout/demo',
    CURLOPT_POST       => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer TU_API_KEY']
]);
curl_exec($ch);
Respuesta
{ "success": true, "message": "logout ok" }
GET /whatsapp/qr/cancel/demo   ·   /whatsapp/qr/cancel/comercial AMBOS MODOS
Detiene el proceso de generación de QR sin cerrar sesión. Útil cuando el usuario cierra el modal de escaneo antes de completar la conexión.
Ejemplo
cURL
JS Fetch
curl 'https://apis.davycorp.ec/v2/api/whatsapp/qr/cancel/demo' \
  -H 'Authorization: Bearer TU_API_KEY'
await fetch('https://apis.davycorp.ec/v2/api/whatsapp/qr/cancel/demo', {
  headers: { 'Authorization': 'Bearer TU_API_KEY' }
});
Respuesta
{ "success": true, "status": "stopped" }