WA EFO Blast Pro API

REST API ini dirancang untuk integrasi dengan sistem ERP, CRM, atau aplikasi eksternal lainnya. Anda dapat mengirim pesan WhatsApp, mengelola kontak, membuat campaign, dan memantau status pengiriman secara real-time.

Base URL
https://waefo.my.id/api/v1
Format
JSON
Auth
Bearer Token
Quick Start
  1. Login ke dashboard dan buka menu API Keys
  2. Klik Generate Key Baru, beri nama, lalu salin key-nya
  3. Kirim request dengan header Authorization: Bearer <api-key>
  4. Mulai integrasi — cek saldo dulu dengan endpoint GET /balance

# Autentikasi

Semua endpoint API memerlukan API Key yang dikirim melalui HTTP Header.

Header
Authorization: Bearer wsofa_a1b2c3d4e5f6...

Cara Mendapatkan API Key

  1. Login ke dashboard waefo.my.id
  2. Buka menu API Keys di sidebar
  3. Klik Generate Key Baru
  4. Beri nama label (contoh: ERP Toko Online)
  5. Salin API Key yang muncul — key hanya ditampilkan sekali

API Key yang tidak aktif atau tidak valid akan mengembalikan error 401 Unauthorized. Anda dapat mengaktifkan/nonaktifkan key kapan saja dari dashboard.

# Base URL

Semua request harus menggunakan HTTPS. Base URL untuk semua endpoint:

Base URL
https://waefo.my.id/api/v1
HeaderWajibNilai
AuthorizationRequiredBearer <api-key>
Content-TypeRequiredapplication/json
AcceptOptionalapplication/json

# Billing & Pricing

Sistem menggunakan model prepaid credits (wa_balance). Setiap pesan WhatsApp yang dikirim melalui API akan dikenakan biaya 1 credit.

1
Credit = 1 Pesan
~Rp900
Biaya per Pesan
Tidak Ada
Masa Berlaku

Biaya per pesan bersifat dinamis mengikuti kurs USD dan biaya Twilio/Meta. Cek biaya terkini via endpoint GET /balance.

Jika saldo tidak mencukupi, API mengembalikan 402 Payment Required. Top up saldo di halaman Billing dashboard.

# Error Codes

API menggunakan HTTP status codes standar. Setiap error response memiliki struktur JSON yang konsisten.

Error Response Format
{
    "success": false,
    "error":  "Deskripsi error",
    "code":   "ERROR_CODE"
}
HTTP StatusCodeKeterangan
400VALIDATION_ERRORInput tidak valid
401AUTH_MISSING_HEADERHeader Authorization tidak ditemukan
401AUTH_INVALID_KEYAPI Key tidak valid atau tidak aktif
402INSUFFICIENT_BALANCESaldo wa_balance tidak mencukupi
404NOT_FOUNDResource tidak ditemukan
409CONFLICTDuplikat data
422VALIDATION_ERRORValidasi input gagal
500INTERNAL_ERRORError internal server
502BAD_GATEWAYGagal mengirim ke Twilio

# Cek Saldo

GET /api/v1/balance Mengembalikan saldo & biaya per pesan
200 OK 401 Unauthorized

Response (200)

{ "success": true, "data": { "wa_balance": 500000, "cost_per_message": 900, "estimated_sends": 555, "currency": "IDR" } }
cURL
curl -H "Authorization: Bearer wsofa_your_api_key" \
     -H "Content-Type: application/json" \
     https://waefo.my.id/api/v1/balance

# Kirim Pesan Tunggal

POST /api/v1/messages/send Mengirim 1 pesan WhatsApp
Mengirim satu pesan WhatsApp ke nomor tujuan. Biaya akan dipotong dari wa_balance.
200 OK 400 Validasi 402 Insufficient Balance

Request Body

FieldTypeRequiredDeskripsi
tostringYaNomor tujuan (08xx / 62xx / +62xx)
bodystringYaIsi pesan
media_urlstringTidakURL gambar/file (opsional)

Contoh Request

{ "to": "6281234567890", "body": "Halo, ini pesan dari ERP kami." }

Response (200)

{ "success": true, "data": { "message_id": "SMxxxxxxxxxxxxxxxx", "to": "+6281234567890", "status": "sent", "cost": 900, "balance_after": 499100 } }
cURL
curl -X POST \
  -H "Authorization: Bearer wsofa_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"to":"6281234567890","body":"Halo dari ERP!"}' \
  https://waefo.my.id/api/v1/messages/send

# Kirim Massal

POST /api/v1/messages/bulk Mengirim banyak pesan (max 1000)
Mengirim banyak pesan sekaligus. Hanya pesan berhasil yang dikenakan biaya — pesan gagal diretur otomatis.

Request Body

FieldTypeRequiredDeskripsi
messagesarrayYaArray objek pesan (max 1000)
messages[].tostringYaNomor tujuan
messages[].bodystringYaIsi pesan
messages[].media_urlstringTidakURL media

Contoh Request

{ "messages": [ { "to": "6281234567890", "body": "Halo Andi, promo spesial!" }, { "to": "6281234567891", "body": "Halo Budi, diskon 50%!" } ] }

Response (200)

{ "success": true, "data": { "total": 2, "sent": 2, "failed": 0, "total_cost": 1800, "balance_after": 497300, "results": [ { "to": "+6281234567890", "status": "sent" }, { "to": "+6281234567891", "status": "sent" } ] } }

# Daftar Pesan

GET /api/v1/messages Mengambil daftar pesan dengan filter
Mendukung filter status, tanggal, dan paginasi.

Query Parameters

ParameterTypeDeskripsi
limitintJumlah per halaman (default: 50, max: 200)
offsetintHalaman (default: 0)
statusstringFilter: sent, delivered, read, failed
date_fromstringFilter awal (YYYY-MM-DD HH:MM:SS)
date_tostringFilter akhir (YYYY-MM-DD HH:MM:SS)

# Detail Pesan

GET /api/v1/messages/{message_sid} Detail & status terkini pesan
Mengambil detail satu pesan berdasarkan Message SID.

Response (200)

{ "success": true, "data": { "id": 1, "message_sid": "SMxxxxxxxxxxxx1", "phone": "+6281234567890", "status": "delivered", "sent_at": "2026-06-15 10:00:00", "delivered_at": "2026-06-15 10:00:05" } }

# Daftar Kontak

GET /api/v1/contacts Mengambil daftar kontak
Mendukung pencarian berdasarkan nama, telepon, atau email.

Query Parameters

ParameterTypeDeskripsi
limitintJumlah per halaman (default: 50)
offsetintHalaman
searchstringCari nama, telepon, atau email

# Tambah Kontak

POST /api/v1/contacts Menambahkan kontak baru

Request Body

FieldTypeRequiredDeskripsi
namestringYaNama kontak
phonestringYaNomor telepon
emailstringTidakEmail
citystringTidakKota
tagsstringTidakTags (pisahkan koma)

Contoh Request

{ "name": "Andi Pratama", "phone": "6281234567890", "email": "andi@example.com", "city": "Jakarta", "tags": "customer,vip" }

Response (201 Created)

{ "success": true, "data": { "id": 51, "name": "Andi Pratama", "phone": "+6281234567890" } }

# Daftar Campaign

GET /api/v1/campaigns Mengambil daftar campaign
ParameterTypeDeskripsi
limitintJumlah per halaman (default: 50)
offsetintHalaman

# Detail Campaign

GET /api/v1/campaigns/{id} Detail & statistik campaign
Mengambil detail campaign beserta statistik pengiriman (total, sent, delivered, read, failed).

Response (200)

{ "success": true, "data": { "campaign": { "id": 1, "name": "Promo Akhir Tahun", "status": "sent" }, "stats": { "total": 1000, "delivered": 950, "read": 800, "failed": 0 } } }

# Buat Campaign

POST /api/v1/campaigns Membuat campaign baru (draft)
Campaign akan dibuat sebagai draft. Untuk menjalankan, gunakan dashboard.

Request Body

FieldTypeRequiredDeskripsi
namestringYaNama campaign
template_idintYaID template pesan
segment_idintYaID segment kontak
schedule_atstringTidakJadwal kirim (YYYY-MM-DD HH:MM:SS)

# Daftarkan Webhook Callback

POST /api/v1/webhook Mendaftarkan URL callback ERP
Daftarkan URL endpoint ERP Anda untuk menerima callback status pengiriman pesan secara real-time. Setiap perubahan status akan dikirim ke URL ini.

Request Body

FieldTypeRequiredDeskripsi
urlstringYaURL endpoint ERP (harus HTTPS)

Contoh Request

{ "url": "https://erp-perusahaan.com/webhook/wa-status" }

Webhook Payload (POST ke URL Anda)

Setiap kali status pesan berubah, sistem akan mengirim POST request ke URL yang didaftarkan:

{ "event": "message.status", "timestamp": "2026-06-15 10:00:05", "data": { "message_sid": "SMxxxxxxxxxxxx1", "to": "+6281234567890", "status": "delivered", "previous_status": "sent", "error_code": null, "error_message": null } }

Pastikan endpoint ERP Anda mengembalikan HTTP 200 dalam 5 detik. Webhook URL berlaku per API Key.

# Contoh Integrasi

Contoh kode untuk berbagai bahasa pemrograman.

PHP

PHP
<?php

$apiKey = 'wsofa_your_api_key_here';
$baseUrl = 'https://waefo.my.id/api/v1';

function apiRequest($method, $endpoint, $data = null) {
    global $apiKey, $baseUrl;
    $ch = curl_init($baseUrl . $endpoint);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST  => $method,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . $apiKey,
            'Content-Type: application/json',
        ],
    ]);
    if ($data) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }
    $response = curl_exec($ch);
    curl_close($ch);
    return json_decode($response, true);
}

// Cek saldo
$balance = apiRequest('GET', '/balance');
echo "Saldo: " . ($balance['data']['wa_balance'] ?? 0);

// Kirim pesan
$result = apiRequest('POST', '/messages/send', [
    'to'   => '6281234567890',
    'body' => 'Halo dari ERP!',
]);

Python

Python
import requests

API_KEY = "wsofa_your_api_key_here"
BASE_URL = "https://waefo.my.id/api/v1"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

# Cek saldo
resp = requests.get(f"{BASE_URL}/balance", headers=headers)
data = resp.json()
print(f"Saldo: {data['data']['wa_balance']}")

# Kirim pesan
resp = requests.post(f"{BASE_URL}/messages/send", headers=headers, json={
    "to": "6281234567890",
    "body": "Halo dari ERP!",
})
result = resp.json()
if result["success"]:
    print(f"Pesan terkirim! ID: {result['data']['message_id']}")

Node.js / JavaScript

JavaScript
const API_KEY = 'wsofa_your_api_key_here';
const BASE_URL = 'https://waefo.my.id/api/v1';

async function apiRequest(method, endpoint, data = null) {
    const response = await fetch(`${BASE_URL}${endpoint}`, {
        method,
        headers: {
            'Authorization': `Bearer ${API_KEY}`,
            'Content-Type': 'application/json',
        },
        body: data ? JSON.stringify(data) : undefined,
    });
    return await response.json();
}

// Cek saldo
const balance = await apiRequest('GET', '/balance');
console.log('Saldo:', balance.data.wa_balance);

// Kirim pesan
const result = await apiRequest('POST', '/messages/send', {
    to: '6281234567890',
    body: 'Halo dari ERP!',
});
console.log('Hasil:', result);

WA EFO Blast Pro API v1.0

support@wablastpro.com · +6281915556499