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:
|
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. |
{
"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"
curl --location 'http://localhost:3000/api/send' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json'
text
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. |
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 }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
media
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). |
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
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). |
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" }'
{
"success": true,
"message": "Pesan berhasil masuk antrean (Outbox)"
}
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). |
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
sticker
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). |
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
location
Kirim pesan berupa peta lokasi. Gunakan format LOCATION!latitude,longitude,nama lokasi pada parameter `text`.
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
contact
Kirim pesan berupa kontak WhatsApp (vCard). Gunakan format CONTACT!nama,nomor hp pada parameter `text`.
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
poll
Kirim pesan berupa opsi Polling/Voting. Gunakan format POLLVOTE!Pertanyaan:Opsi1:Opsi2:Opsi3 pada parameter `text` (Pisahkan tiap opsi dengan karakter titik dua :).
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" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
carousel
Kirim pesan kartu geser interaktif (Carousel) WhatsApp. Gunakan awalan CAROUSEL! pada parameter text diikuti dengan string JSON terformat yang berisi teks pengantar, footer utama, dan array kartu (cards).
header / mediaUrl: URL gambar/video kartu.
title: Judul kartu.
body: Deskripsi kartu.
footer: Footer kartu.
buttons: Array tombol kartu (
reply, url, call, copy).
curl --location 'http://localhost:3000/api/send' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json' \ --data '{ "no": "62812345678", "text": "CAROUSEL! {\"text\":\"Daftar Paket Produk Unggulan Kami:\",\"footer\":\"akawami.com WhatsApp System\",\"cards\":[{\"header\":\"https://www.akawami.com/assets/paket_a.jpg\",\"title\":\"Paket Bisnis A\",\"body\":\"Paket lengkap automasi WhatsApp dengan unlimited kontak.\",\"footer\":\"Diskon 20%\",\"buttons\":[{\"type\":\"url\",\"label\":\"Beli Sekarang\",\"value\":\"https://www.akawami.com/order\"},{\"type\":\"reply\",\"label\":\"Tanya CS\",\"value\":\"tanya_paket_a\"}]},{\"header\":\"https://www.akawami.com/assets/paket_b.jpg\",\"title\":\"Paket Bisnis B\",\"body\":\"Paket enterprise WhatsApp multi-user dan AI support.\",\"footer\":\"Best Seller\",\"buttons\":[{\"type\":\"call\",\"label\":\"Hubungi Sales\",\"value\":\"6289687579540\"},{\"type\":\"copy\",\"label\":\"Kode Kupon\",\"value\":\"WAFYPROMO\"}]}]}" }'
{
"success": true,
"message": "Pesan berhasil dikirim (Immediate)"
}
bulk
Kirim pesan ke banyak nomor sekaligus. Pisahkan antar nomor dengan karakter baris baru (\n).
Untuk bulk send, disarankan mengatur parameter
"immediate": false agar pesan masuk ke antrean (Outbox) dan dikirim menggunakan jeda otomatis (anti-ban).
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 }'
{
"success": true,
"message": "3 pesan telah ditambahkan ke outbox"
}
fetch groups
Mengambil daftar semua grup WhatsApp di mana nomor pengirim (sender) tergabung di dalamnya.
curl --location 'http://localhost:3000/api/groups' \
--header 'x-api-key: __api_key_anda__'
{
"success": true,
"groups": [
{
"id": "[email protected]",
"name": "Grup Internal Sales",
"owner": "[email protected]"
}
]
}
fetch members
Mengambil daftar seluruh peserta/member di dalam suatu grup spesifik.
| Path Variable | Description |
|---|---|
id |
Required. Group ID tujuan (berakhiran @g.us). |
curl --location 'http://localhost:3000/api/group-members/[email protected]' \ --header 'x-api-key: __api_key_anda__'
{
"success": true,
"groupId": "[email protected]",
"name": "Grup Internal Sales",
"participants": [
{
"id": "[email protected]",
"admin": "superadmin"
},
{
"id": "[email protected]",
"admin": null
}
]
}
create group
Body raw (json)
| Field | Description |
|---|---|
name |
Required. Nama grup yang akan dibuat. |
participants |
Required. Array berisi nomor HP anggota awal grup (contoh: ["628..."]). |
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" ] }'
{
"success": true,
"message": "Group successfully created",
"group": {
"id": "[email protected]",
"subject": "Grup Pelanggan VIP",
"owner": "[email protected]"
}
}
manage members
Mengelola anggota grup seperti menambah, mengeluarkan, menjadikan admin, atau mencabut hak admin.
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). |
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" ] }'
{
"success": true,
"message": "Participants action 'add' processed",
"response": [
{
"status": "200",
"jid": "[email protected]"
}
]
}
Incoming Webhook
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. |
{
"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
}
<?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
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:
|
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. |
{
"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
}
<?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
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.
curl --location 'http://localhost:3000/api/session/status' \
--header 'x-api-key: __api_key_anda__'
{
"success": true,
"connected": true,
"qr": null,
"user": {
"id": "6289513258338:[email protected]",
"name": "Ghazio"
},
"restriction": {
"isRestricted": false
}
}
request pairing code
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). |
curl --location 'http://localhost:3000/api/session/pair' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json' \ --data '{ "phone": "628123456789" }'
{
"success": true,
"phone": "628123456789",
"code": "ABCD-1234"
}
logout session
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).
curl --location 'http://localhost:3000/api/session/logout' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json'
{
"success": true,
"message": "Logout berhasil. Menyiapkan sesi baru..."
}
restart connection
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).
curl --location 'http://localhost:3000/api/session/restart' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json'
{
"success": true,
"message": "Sesi sedang direstart..."
}
WhatsApp 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.
curl --location 'http://localhost:3000/api/session/contacts-stats' \
--header 'x-api-key: __api_key_anda__'
{
"success": true,
"stats": {
"contacts": 11015,
"groups": 74,
"chats": 537,
"channels": 1,
"labels": 0,
"calls": 0,
"catalog": 0,
"deletedMessages": 115
}
}
Sync WhatsApp 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". |
curl --location 'http://localhost:3000/api/session/sync-contacts' \ --header 'x-api-key: __api_key_anda__' \ --header 'Content-Type: application/json' \ --data '{ "option": "all" }'
{
"success": true,
"syncedCount": 11015,
"message": "Berhasil sinkronisasi 11015 kontak dari WhatsApp."
}
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.
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.
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.
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'
{
"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
}
]
}
}
create transaction / invoice
https://<DOMAIN>/<subfolder>/api/qris/v1/invoices (contoh: https://www.akawami.com/dhoni/api/qris/v1/invoices)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. |
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
}'
{
"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"
}
]
}
}
check payment status
https://<DOMAIN>/<subfolder>/api/qris/v1/check-status?order_id=...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.
curl --location 'http://localhost:3000/api/qris/v1/check-status?order_id=ORD-20261015-001' \ --header 'x-api-key: YOUR_WACS_API_KEY'
{
"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 callback
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 |
Endpoint webhook Anda WAJIB mengembalikan respon HTTP status 200 OK dengan format JSON: {"success": true} agar gateway menandai pengiriman webhook telah berhasil.
{
"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"
}
<?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']);
}