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 undocument.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 unconsole.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="= $data['qrImage'] ?>"> 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" }