akawami.com API 1.2

Gunakan API akawami.com untuk mengirimkan pesan WhatsApp secara otomatis dari aplikasi pihak ketiga seperti Kasir, Website e-commerce, CRM, atau sistem internal Anda.

Endpoint ini berjalan secara lokal di server/PC Anda sendiri, sehingga menjamin keamanan data dan respon yang sangat cepat.

Parameters Reference

Berikut adalah daftar parameter utama yang digunakan di berbagai endpoint API akawami.com, lengkap dengan tipe data, status wajib (required/optional), dan penjelasan fungsinya.

Parameter Tipe Data Status Penjelasan & Contoh
no String Required Nomor tujuan WhatsApp. Mendukung format:
  • Nomor HP: 62812345678
  • Group ID: [email protected]
  • LID / JID: 1234567890@lid atau @s.whatsapp.net
text String Conditional Wajib untuk pesan teks biasa. Pada pesan media, berfungsi sebagai caption. Pada tipe pesan terstruktur, diisi string khusus dengan awalan seperti LOCATION!, CONTACT!, POLLVOTE!, atau BUTTONS!.
media String Optional URL publik file media yang dikirim (Gambar, Video, Audio, Stiker). Mendukung pengiriman beberapa media sekaligus menggunakan pemisah karakter pipa (url1|url2) atau format JSON Array (["url1","url2"]). Contoh: https://site.com/image.jpg
file String Optional URL publik file dokumen (PDF, XLSX, DOCX, dll). Mendukung beberapa dokumen sekaligus menggunakan pemisah pipa (url1|url2) atau format JSON Array. Contoh: https://site.com/doc.pdf
immediate Boolean Optional Gunakan true untuk bypass antrean (dikirim instan), dan false untuk memasukkan pesan ke outbox (mengikuti delay antrean). Default: false.
key String Optional API Key akawami.com. Bisa diletakkan di request body JSON ini sebagai alternatif jika Anda tidak meletakkannya di HTTP header.
category String Optional Kategori atau nama kampanye pesan untuk pengelompokan di Outbox. Contoh: direct atau nama kampanye kustom. Default: direct.
schedule String Optional Waktu pengiriman pesan yang dijadwalkan (format: YYYY-MM-DD HH:mm:ss). Hanya aktif jika immediate bernilai false. Default: waktu sekarang.
name String Required (Group Create) Nama grup baru yang ingin Anda buat di WhatsApp.
participants Array [String] Required (Group) Daftar nomor WhatsApp anggota grup yang ingin dikelola. Contoh: ["62812345678", "62899999999"].
action String Required (Group) Aksi yang dilakukan terhadap anggota grup. Pilihan: add, remove, promote, atau demote.
Full JSON Payload Example
{
    "key": "__api_key_anda__",
    "no": "62812345678",
    "text": "Halo akawami.com",
    "media": "",
    "file": "",
    "immediate": true
}

Authentication

Setiap request ke endpoint API akawami.com diproteksi menggunakan API Key yang dapat Anda atur pada halaman Configuration di Dashboard akawami.com.

AUTHORIZATION API Key Header / Body

Anda dapat mengirimkan API Key melalui dua cara:

  • Melalui HTTP Header: x-api-key: API_KEY_ANDA
  • Melalui Request Body (JSON): "key": "API_KEY_ANDA"
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json'

text

POST Send text
http://localhost:3000/api/send

Body raw (json)

Field Description
no Required. Nomor WhatsApp tujuan. Bisa berupa nomor biasa (628...), Group ID (@g.us), LID (@lid), ataupun JID (@s.whatsapp.net).
text Required. Isi pesan teks Anda. Mendukung markdown standar WhatsApp (*tebal*, _miring_).
immediate Optional. true untuk bypass antrean (instan), false untuk masuk outbox (delay). Default: false.
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "Halo, ini pesan dari akawami.com API.",
    "immediate": true
}'
Example Response
Body Headers (3)
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

media

POST Send media (Image/Video)

Body raw (json)

Field Description
no Required. Nomor WhatsApp tujuan (Bisa nomor biasa, Group ID, LID, atau JID).
text Optional. Berfungsi sebagai caption dari gambar/video.
media Required. URL publik yang mengarah ke file media (.jpg, .png, .mp4).
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "Ini adalah caption gambar promosi kami.",
    "media": "https://www.akawami.com/assets/promo-banner.png"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

document

POST Send document

Body raw (json)

Field Description
no Required. Nomor WhatsApp tujuan (Bisa nomor biasa, Group ID, LID, atau JID).
text Optional. Digunakan sebagai nama file dokumen saat diterima (termasuk eksistensi).
file Required. URL publik yang mengarah ke file dokumen (.pdf, .xlsx, dll).
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "Invoice-Tagihan-1082.pdf",
    "file": "https://domain.com/invoices/inv-1082.pdf"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil masuk antrean (Outbox)"
}

audio / voice note

POST Send audio / voice note

Body raw (json)

Field Description
no Required. Nomor WhatsApp tujuan (Bisa nomor biasa, Group ID, LID, atau JID).
media Required. URL publik file audio (.mp3, .ogg, .wav). Otomatis dikirim sebagai Voice Note (PTT).
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "media": "https://domain.com/audio/voice-note.ogg"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

sticker

POST Send sticker (.webp)

Body raw (json)

Field Description
no Required. Nomor WhatsApp tujuan (Bisa nomor biasa, Group ID, LID, atau JID).
media Required. URL publik file stiker berekstensi (.webp).
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "media": "https://domain.com/stickers/happy.webp"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

location

POST Send location (Map)

Kirim pesan berupa peta lokasi. Gunakan format LOCATION!latitude,longitude,nama lokasi pada parameter `text`.

Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "LOCATION!-6.200000,106.816666,Kantor Pusat Kami"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

contact

POST Send contact (vCard)

Kirim pesan berupa kontak WhatsApp (vCard). Gunakan format CONTACT!nama,nomor hp pada parameter `text`.

Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "CONTACT!Customer Service,628111222333"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

poll

POST Send poll (Voting)

Kirim pesan berupa opsi Polling/Voting. Gunakan format POLLVOTE!Pertanyaan:Opsi1:Opsi2:Opsi3 pada parameter `text` (Pisahkan tiap opsi dengan karakter titik dua :).

Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "[email protected]",
    "text": "POLLVOTE!Apa makanan kesukaan Anda?:Nasi Goreng:Mie Ayam:Sate Ayam:Bakso"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

button

POST Send interactive buttons

Kirim pesan dengan tombol interaktif. Gunakan awalan BUTTONS! pada parameter `text`, lalu pisahkan struktur tombol dengan tanda pipa (|).

Tipe Tombol:
reply: Tombol quick reply biasa.
url: Tombol link website.
call: Tombol panggil telepon.
copy: Tombol salin teks ke clipboard.
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "62812345678",
    "text": "BUTTONS! Silakan klaim kupon promo diskon gajian Anda di bawah ini: | footer: Promo Terbatas | reply: Klaim Sekarang:klaim_promo | copy: Salin Kupon:DISKON50",
    "media": "https://www.akawami.com/assets/promo.jpg"
}'
Example Response
{
    "success": true,
    "message": "Pesan berhasil dikirim (Immediate)"
}

bulk

POST Bulk sending

Kirim pesan ke banyak nomor sekaligus. Pisahkan antar nomor dengan karakter baris baru (\n).

Catatan:
Untuk bulk send, disarankan mengatur parameter "immediate": false agar pesan masuk ke antrean (Outbox) dan dikirim menggunakan jeda otomatis (anti-ban).
Example Request
curl --location 'http://localhost:3000/api/send' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "no": "628123456789\n628987654321\n628555123456",
    "text": "Halo, ini adalah pesan promosi massal kami.",
    "immediate": false
}'
Example Response
{
    "success": true,
    "message": "3 pesan telah ditambahkan ke outbox"
}

fetch groups

GET Get all groups

Mengambil daftar semua grup WhatsApp di mana nomor pengirim (sender) tergabung di dalamnya.

http://localhost:3000/api/groups
Example Request
curl --location 'http://localhost:3000/api/groups' \
--header 'x-api-key: __api_key_anda__'
Example Response
{
    "success": true,
    "groups": [
        {
            "id": "[email protected]",
            "name": "Grup Internal Sales",
            "owner": "[email protected]"
        }
    ]
}

fetch members

GET Get group members

Mengambil daftar seluruh peserta/member di dalam suatu grup spesifik.

http://localhost:3000/api/group-members/:id
Path Variable Description
id Required. Group ID tujuan (berakhiran @g.us).
Example Request
curl --location 'http://localhost:3000/api/group-members/[email protected]' \
--header 'x-api-key: __api_key_anda__'
Example Response
{
    "success": true,
    "groupId": "[email protected]",
    "name": "Grup Internal Sales",
    "participants": [
        {
            "id": "[email protected]",
            "admin": "superadmin"
        },
        {
            "id": "[email protected]",
            "admin": null
        }
    ]
}

create group

POST Create new group

Body raw (json)

Field Description
name Required. Nama grup yang akan dibuat.
participants Required. Array berisi nomor HP anggota awal grup (contoh: ["628..."]).
Example Request
curl --location 'http://localhost:3000/api/groups/create' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "name": "Grup Pelanggan VIP",
    "participants": [
        "62812345678",
        "62887654321"
    ]
}'
Example Response
{
    "success": true,
    "message": "Group successfully created",
    "group": {
        "id": "[email protected]",
        "subject": "Grup Pelanggan VIP",
        "owner": "[email protected]"
    }
}

manage members

POST Add/Remove/Promote

Mengelola anggota grup seperti menambah, mengeluarkan, menjadikan admin, atau mencabut hak admin.

http://localhost:3000/api/groups/participants

Body raw (json)

Field Description
groupId Required. ID grup tujuan (harus berakhiran @g.us).
participants Required. Array daftar nomor yang akan dikelola.
action Required. Tindakan yang dilakukan. Nilai yang diterima:
add, remove, promote (jadikan admin), demote (cabut admin).
Example Request
curl --location 'http://localhost:3000/api/groups/participants' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "groupId": "[email protected]",
    "action": "add",
    "participants": [
        "628999123456"
    ]
}'
Example Response
{
    "success": true,
    "message": "Participants action 'add' processed",
    "response": [
        {
            "status": "200",
            "jid": "[email protected]"
        }
    ]
}

Incoming Webhook

POST Incoming Message Forward

Setiap kali ada pesan WhatsApp masuk ke nomor WhatsApp Anda, akawami.com akan meneruskan data pesan tersebut secara otomatis ke Webhook URL yang telah Anda konfigurasi di Dashboard akawami.com.

Webhook ini dikirimkan menggunakan metode HTTP POST dengan payload data berformat JSON yang berisi 16 field informasi lengkap mengenai pesan tersebut.

Payload JSON Structure (16 Fields)

Key Tipe Data Deskripsi
message_date String Tanggal saat pesan diterima (format: YYYY-MM-DD). Contoh: 2026-06-18.
message_time String Waktu saat pesan diterima (format: HH:MM:SS). Contoh: 20:30:15.
chat String WhatsApp Chat JID atau Group JID asal pesan. Contoh: [email protected] atau [email protected].
sender String WhatsApp JID individu pengirim pesan (untuk grup, ini adalah pengirim pesan di grup). Contoh: [email protected].
sender_push_name String Nama profil WhatsApp pengirim pesan. Contoh: John Doe.
sender_phone String Nomor telepon bersih pengirim pesan (tanpa domain JID). Contoh: 62812345678.
is_group Boolean Bernilai true jika pesan dikirim di grup, dan false jika chat pribadi.
is_from_me Boolean Bernilai true jika pesan dikirim dari nomor kita sendiri (outbox), dan false jika pesan masuk.
message_id String ID unik pesan WhatsApp. Contoh: 3EB0ABC12345.
message_type String Tipe pesan WhatsApp. Contoh: conversation (teks biasa), imageMessage (gambar), videoMessage (video), dll.
message_text String Isi pesan teks yang diterima.
file_name String Nama file media jika ada file yang dikirimkan bersama pesan. Contoh: invoice.pdf.
wa_no String Alias dari parameter chat (disediakan untuk kompatibilitas versi sebelumnya).
pushName String Alias dari parameter sender_push_name (disediakan untuk kompatibilitas versi sebelumnya).
text String Alias dari parameter message_text (disediakan untuk kompatibilitas versi sebelumnya).
timestamp Number Unix timestamp pesan diterima dalam detik. Contoh: 1781778000.
Webhook Payload Example
{
    "message_date": "2026-06-18",
    "message_time": "20:30:15",
    "chat": "[email protected]",
    "sender": "[email protected]",
    "sender_push_name": "John Doe",
    "sender_phone": "62812345678",
    "is_group": false,
    "is_from_me": false,
    "message_id": "3EB0ABC12345",
    "message_type": "conversation",
    "message_text": "Halo akawami.com",
    "file_name": "",
    "wa_no": "[email protected]",
    "pushName": "John Doe",
    "text": "Halo akawami.com",
    "timestamp": 1781778000
}
Example Receiver Code
<?php
// Menerima payload webhook
$jsonStr = file_get_contents('php://input');
$data = json_decode($jsonStr, true);

if ($data) {
    // Pastikan ini bukan event grup
    if (!isset($data['event'])) {
        $chatId = $data['chat'];
        $pengirim = $data['sender_phone'];
        $pesan = $data['message_text'];
        
        // Log aktivitas pesan masuk
        file_put_contents('pesan_masuk.txt', "Pesan dari {$pengirim} di {$chatId}: {$pesan}\n", FILE_APPEND);
    }
    
    http_response_code(200);
    echo json_encode(["status" => "success"]);
}
?>

Group Events

POST Group Participants Update

akawami.com juga mengirimkan notifikasi webhook ketika terjadi perubahan pada anggota grup WhatsApp (seperti peserta baru ditambahkan, peserta keluar, promosi admin, atau demosi admin).

Webhook ini dikirimkan dengan menyertakan parameter event bernilai "group_participants_update" dan memiliki 10 field data terstruktur.

Payload JSON Structure (10 Fields)

Key Tipe Data Deskripsi
event String Nama event webhook. Selalu bernilai group_participants_update.
chat String WhatsApp Group JID tempat event berlangsung. Contoh: [email protected].
action String Jenis aksi perubahan anggota grup. Pilihan nilainya:
  • add: Anggota baru ditambahkan
  • remove: Anggota keluar atau dikeluarkan
  • promote: Anggota dijadikan admin grup
  • demote: Anggota diberhentikan dari admin grup
participants Array [String] Daftar WhatsApp JID anggota grup yang terlibat dalam aksi ini. Contoh: ["[email protected]"].
group_name String Nama terbaru grup WhatsApp tersebut. Contoh: Grup Alumni akawami.com.
member_count Number Jumlah total anggota grup saat ini. Contoh: 45.
variables Object Objek custom variables yang dievaluasi dari database. Contoh: {"count":45, "total_bill":500000, "share_amount":11111}.
timestamp Number Unix timestamp event terjadi dalam satuan detik. Contoh: 1781778000.
Group Webhook Payload Example
{
    "event": "group_participants_update",
    "chat": "[email protected]",
    "action": "add",
    "participants": [
        "[email protected]"
    ],
    "group_name": "Grup Alumni akawami.com",
    "member_count": 45,
    "variables": {
        "nama_var_kustom": "nilai_var"
    },
    "timestamp": 1781778000
}
Example Group Receiver Code
<?php
// Menerima payload webhook
$jsonStr = file_get_contents('php://input');
$data = json_decode($jsonStr, true);

if ($data) {
    // Cek event apakah benar group_participants_update
    if (isset($data['event']) && $data['event'] === 'group_participants_update') {
        $grupJid = $data['chat'];
        $namaGrup = $data['group_name'];
        $aksi = $data['action'];
        $peserta = $data['participants']; // Array
        
        // Log aktivitas perubahan grup
        file_put_contents('log_grup.txt', "Grup '{$namaGrup}' ({$grupJid}): Aksi '{$aksi}' pada anggota " . implode(", ", $peserta) . "\n", FILE_APPEND);
    }
    
    http_response_code(200);
    echo json_encode(["status" => "success"]);
}
?>

session status

GET Get Session Connection Status
http://localhost:3000/api/session/status

Endpoint ini mengembalikan status koneksi WhatsApp Anda. Jika status belum terhubung (`connected: false`), parameter `qr` akan menyertakan kode QR WhatsApp mentah untuk ditampilkan di sisi klien.

Example Request
curl --location 'http://localhost:3000/api/session/status' \
--header 'x-api-key: __api_key_anda__'
Example Response
{
    "success": true,
    "connected": true,
    "qr": null,
    "user": {
        "id": "6289513258338:[email protected]",
        "name": "Ghazio"
    },
    "restriction": {
        "isRestricted": false
    }
}

request pairing code

POST Request numeric pairing code
http://localhost:3000/api/session/pair

Menghasilkan kode pemasangan (pairing code) numerik 8 karakter untuk menautkan nomor HP WhatsApp Anda ke akawami.com tanpa perlu memindai QR Code.

Body raw (json)

Field Description
phone Required. Nomor WhatsApp yang ingin ditautkan (format internasional, misal 628123456789).
Example Request
curl --location 'http://localhost:3000/api/session/pair' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "phone": "628123456789"
}'
Example Response
{
    "success": true,
    "phone": "628123456789",
    "code": "ABCD-1234"
}

logout session

GET POST Disconnect WhatsApp session
http://localhost:3000/api/session/logout

Memutus sesi koneksi WhatsApp secara bersih dan menghapus folder kredensial/session lokal di server agar siap untuk tautan perangkat baru. (Mendukung request GET dan POST).

Example Request
curl --location 'http://localhost:3000/api/session/logout' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json'
Example Response
{
    "success": true,
    "message": "Logout berhasil. Menyiapkan sesi baru..."
}

restart connection

GET POST Force refresh WhatsApp connection
http://localhost:3000/api/session/restart

Memutus dan menyambungkan kembali koneksi socket WhatsApp secara instan tanpa perlu membuang session/kredensial yang sudah terdaftar. Berguna jika terjadi delay/koneksi tersendat. (Mendukung request GET dan POST).

Example Request
curl --location 'http://localhost:3000/api/session/restart' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json'
Example Response
{
    "success": true,
    "message": "Sesi sedang direstart..."
}
GET

WhatsApp Contacts Stats

http://localhost:3000/api/session/contacts-stats

Mengambil statistik jumlah kontak, grup, chat thread, call history, channel, dan pesan terhapus (revoked) yang terdapat dalam session WhatsApp yang aktif saat ini.

Example Request
curl --location 'http://localhost:3000/api/session/contacts-stats' \
--header 'x-api-key: __api_key_anda__'
Example Response
{
    "success": true,
    "stats": {
        "contacts": 11015,
        "groups": 74,
        "chats": 537,
        "channels": 1,
        "labels": 0,
        "calls": 0,
        "catalog": 0,
        "deletedMessages": 115
    }
}
POST

Sync WhatsApp Contacts

http://localhost:3000/api/session/sync-contacts

Menyinkronkan kontak dari WhatsApp ke database SQLite lokal akawami.com. Fitur ini akan memperbarui nama jika terdapat kecocokan nomor telepon yang sama (overwrite/update nama).

Request Body (JSON)

Field Type Description
option String Pilihan sinkronisasi: "all", "chatted", atau "unsaved_chatted".
Example Request
curl --location 'http://localhost:3000/api/session/sync-contacts' \
--header 'x-api-key: __api_key_anda__' \
--header 'Content-Type: application/json' \
--data '{
    "option": "all"
}'
Example Response
{
    "success": true,
    "syncedCount": 11015,
    "message": "Berhasil sinkronisasi 11015 kontak dari WhatsApp."
}
Akawami Gateway Wajib Akun Merchant Mandiri

overview & merchant registration

Fitur pembayaran di akawami.com terintegrasi dengan Akawami Payment Gateway, mendukung metode pembayaran multi-channel otomatis: QRIS Dinamis Real-Time (Semua Bank & E-Wallet), Transfer Rekening Bank (SeaBank Indonesia & Bank Lainnya), serta halaman checkout multi-metode.

SETIAP USER / SUB-INSTANCE WAJIB MEMILIKI AKUN MERCHANT SENDIRI:

Untuk menjaga keamanan dana dan privasi transaksi, setiap sub-instance / user wajib memiliki akun merchant Akawami Gateway mandiri. Seluruh uang hasil penjualan masuk 100% langsung ke rekening atau saldo merchant Anda sendiri tanpa potongan pihak ketiga.

⚠️ Pemberitahuan Sistem: Jika sub-instance Anda belum memasukkan API Key dan Secret Key merchant mandiri pada menu Pengaturan Akawami Gateway, sistem akan memblokir pembuatan tagihan baru (Invoice Locked) demi keamanan akun Anda.

Kredensial yang Diperlukan

Kredensial Status Deskripsi & Lokasi Pengambilan
X-Api-Key Wajib API Key unik merchant dari dashboard Akawami Gateway → Menu API Keys.
X-Secret-Key Wajib Secret Key unik yang dirahasiakan untuk otorisasi transaksi.
Webhook Secret Opsional Kunci rahasia untuk validasi signature HMAC-SHA256 pada webhook callback pelunasan otomatis.

Metode Pembayaran yang Didukung

  • QRIS Dinamis Real-Time: Mendukung semua m-banking (BCA, Mandiri, BRI, BNI, BSI, CIMB) & e-wallet (GoPay, OVO, DANA, ShopeePay, LinkAja) dengan nominal terkunci otomatis.
  • Transfer Rekening Bank (SeaBank / Bank Lain): Nominal otomatis ditambahkan 3 digit kode unik acak untuk verifikasi instan.
  • Multi-Channel Checkout: Pelanggan mendapatkan link tagihan interaktif dan dapat memilih metode bayar yang diinginkan.
Tes Koneksi Merchant (cURL)
curl --location 'https://gateway.ezapedia.my.id/api/v1/ping' \
--header 'X-Api-Key: YOUR_EZAPEDIA_API_KEY' \
--header 'X-Secret-Key: YOUR_EZAPEDIA_SECRET_KEY' \
--header 'Accept: application/json'
Contoh Respon Sukses (200 OK)
{
    "success": true,
    "message": "Koneksi berhasil dan metode pembayaran aktif berhasil diambil.",
    "data": {
        "merchant": {
            "id": 4,
            "name": "Toko Sukses Mandiri",
            "subscription_status": "active"
        },
        "payment_methods": [
            {
                "code": "QRIS",
                "name": "QRIS Dinamis",
                "type": "qris",
                "account_number": "ID1026492947555",
                "is_active": true
            },
            {
                "code": "SEABANK",
                "name": "SeaBank Indonesia",
                "type": "bank",
                "account_number": "901871517925",
                "is_active": true
            }
        ]
    }
}
Transaction API WhatsApp Notification

create transaction / invoice

POST Buat Tagihan Akawami Gateway & Notifikasi WhatsApp
http://localhost:3000/api/qris/v1/invoices
• Sub-Instance (Subfolder): https://<DOMAIN>/<subfolder>/api/qris/v1/invoices (contoh: https://www.akawami.com/dhoni/api/qris/v1/invoices)
• Root Instance (Tanpa Subfolder): https://<DOMAIN>/api/qris/v1/invoices

Membuat transaksi pembayaran multi-metode yang otomatis terhubung ke akun Akawami Gateway sub-instance Anda. Jika parameter customer_phone disertakan, bot WhatsApp akawami.com akan langsung mengirimkan rincian tagihan beserta link pembayaran resmi ke WhatsApp pelanggan!

Header Autentikasi

Header Tipe Status Penjelasan
x-api-key String Required API Key akawami.com instance Anda (atau API Key Akawami merchant).
Content-Type String Required Gunakan application/json.

Request Body (JSON)

Parameter Tipe Status Penjelasan
amount Number Required Nominal tagihan dalam Rupiah (minimal Rp 1.000).
order_id String Rekomendasi ID invoice unik dari sistem toko/web Anda (contoh: ORD-20261015-001).
customer_name String Optional Nama pelanggan penerima invoice (contoh: "Budi Santoso").
customer_phone String Optional Nomor WhatsApp pelanggan (format: 6281234567890). Jika diisi, bot WA akan otomatis mengirim nota tagihan.
payment_method String Optional Pilihan metode: qris (QRIS Dinamis), bank (Transfer Rekening), atau all (Checkout multi-metode). Default: qris.
expiry_minutes Number Optional Batas waktu pembayaran dalam menit. Default: 60 menit.
callback_url String Optional URL webhook sistem Anda yang akan dipanggil saat pembayaran berhasil lunas.
Example Request
curl --location 'http://localhost:3000/api/qris/v1/invoices' \
--header 'x-api-key: YOUR_WACS_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
    "amount": 50000,
    "order_id": "ORD-20261015-001",
    "customer_name": "Budi Santoso",
    "customer_phone": "6281234567890",
    "payment_method": "qris",
    "expiry_minutes": 60
}'
Example Response (200 OK)
{
    "success": true,
    "message": "Tagihan berhasil dibuat.",
    "data": {
        "invoice_id": "INV-20261015-A1B2C3",
        "order_id": "ORD-20261015-001",
        "amount": 50000,
        "total_amount": 50000,
        "status": "pending",
        "payment_method": "qris",
        "payment_url": "http://localhost:3000/invoice/INV-20261015-A1B2C3",
        "checkout_url": "https://gateway.ezapedia.my.id/checkout/EZP-12345",
        "qr_image": "data:image/png;base64,iVBORw0KGgoAAA...",
        "qr_string": "00020101021226590014ID.LINKAJA.WWW...5405500005802ID5914TOKO ANDA6007JAKARTA6304A1B2",
        "expired_at": "2026-10-15T13:45:00.000Z",
        "channels": [
            {
                "code": "QRIS",
                "name": "QRIS Dinamis",
                "type": "qris",
                "account_number": "ID1026492947555",
                "account_name": "Toko Anda"
            },
            {
                "code": "SEABANK",
                "name": "SeaBank Indonesia",
                "type": "bank",
                "account_number": "901871517925",
                "account_name": "Toko Anda"
            }
        ]
    }
}
Realtime Polling Live Gateway Sync

check payment status

GET Cek Status Pelunasan Transaksi ke Akawami Gateway
http://localhost:3000/api/qris/v1/check-status?order_id=ORD-20261015-001
• Via Order ID: https://<DOMAIN>/<subfolder>/api/qris/v1/check-status?order_id=...
• Via Invoice ID Live Check: https://<DOMAIN>/<subfolder>/api/qris/invoices/:invoiceId/check-status

Endpoint ini melakukan pengecekan status secara real-time langsung ke server Akawami Gateway menggunakan kredensial akun merchant milik sub-instance. Begitu mutasi rekening/QRIS terdeteksi di Akawami, status otomatis berubah menjadi completed dan pesanan langsung lunas.

Query Parameters

Parameter Tipe Status Penjelasan
order_id String Rekomendasi Nomor invoice / nota pesanan dari toko Anda (misal: ORD-20261015-001).
invoice_id String Optional ID Invoice internal akawami.com (misal: INV-20261015-A1B2C3).

Daftar Status Transaksi

  • • pending: Menunggu transfer atau pemindaian QRIS oleh pembeli.
  • • completed: Transaksi LUNAS (mutasi uang masuk telah diverifikasi oleh gateway).
  • • expired: Waktu pembayaran telah habis melewati batas toleransi invoice.
Example Request (cURL)
curl --location 'http://localhost:3000/api/qris/v1/check-status?order_id=ORD-20261015-001' \
--header 'x-api-key: YOUR_WACS_API_KEY'
Example Response (Paid / Completed)
{
    "success": true,
    "invoice_id": "INV-20261015-A1B2C3",
    "order_id": "ORD-20261015-001",
    "status": "completed",
    "is_paid": true,
    "amount": 50000,
    "payment_method": "QRIS",
    "approved_at": "2026-10-15 12:45:00",
    "client_name": "Budi Santoso",
    "client_phone": "6281234567890"
}
Webhook Engine HMAC-SHA256 Signature

webhook callback

EVENT Notifikasi Otomatis Saat Tagihan Lunas

Saat pelanggan menyelesaikan pembayaran di aplikasi m-banking atau e-wallet, server Akawami Gateway secara instan memanggil URL Webhook Anda dengan mengirimkan payload JSON beserta signature keamanan.

Header Webhook yang Dikirimkan

Header Penjelasan
X-Callback-Signature Tanda tangan hash HMAC-SHA256 yang dibuat dari body request menggunakan Webhook Secret akun merchant Anda.
X-Callback-Timestamp Timestamp UNIX saat webhook dikirimkan.
Content-Type application/json
Respon yang Wajib Dikembalikan oleh Server Anda:

Endpoint webhook Anda WAJIB mengembalikan respon HTTP status 200 OK dengan format JSON: {"success": true} agar gateway menandai pengiriman webhook telah berhasil.

Contoh Payload Webhook (POST)
{
    "event": "payment.success",
    "order_id": "ORD-20261015-001",
    "invoice_id": "INV-20261015-A1B2C3",
    "amount": 50000,
    "total_amount": 50000,
    "status": "paid",
    "payment_method": "QRIS",
    "paid_at": "2026-10-15T12:45:00.000Z",
    "customer_name": "Budi Santoso",
    "customer_phone": "6281234567890"
}
Contoh Verifikasi Signature (PHP)
<?php
$webhookSecret = 'YOUR_EZAPEDIA_WEBHOOK_SECRET';
$rawPayload    = file_get_contents('php://input');
$signature     = $_SERVER['HTTP_X_CALLBACK_SIGNATURE'] ?? '';
$timestamp     = $_SERVER['HTTP_X_CALLBACK_TIMESTAMP'] ?? '';

// Hitung hash HMAC-SHA256
$payloadToSign = $timestamp ? "{$timestamp}.{$rawPayload}" : $rawPayload;
$computedHash  = hash_hmac('sha256', $payloadToSign, $webhookSecret);

if (hash_equals($computedHash, str_replace('sha256=', '', $signature))) {
    $data = json_decode($rawPayload, true);
    // Transaksi Valid & Lunas! Update database pesanan Anda di sini
    http_response_code(200);
    echo json_encode(['success' => true]);
} else {
    http_response_code(403);
    echo json_encode(['error' => 'Invalid signature']);
}