Dokumentasi Public API WhatsApp Gateway

Bearer auth dan request JSON sekarang jadi format resmi.

Dokumentasi ini mengacu pada endpoint aktif di api.ovn.my.id per 19 Maret 2026. Field token di body request sudah tidak didukung lagi. Gunakan header Authorization: Bearer <token>.

Base URL https://api.ovn.my.id
Autentikasi Authorization: Bearer <token>
Format POST JSON
Endpoint Aktif POST only
  • /kirimPesan personal untuk akun FREE dan PREMIUM.
  • /kirim-grupsPesan grup khusus akun PREMIUM.
  • /list-grupsDaftar grup dari device premium yang online.
  • /cek-nomerCek apakah nomor terdaftar di WhatsApp.
FREE PREMIUM

Akun FREE untuk kebutuhan personal ringan. Akun PREMIUM dapat kirim ke grup dan membaca daftar grup aktif.

Bearer Auth

Setiap request wajib memakai header Authorization.

JSON Request

Gunakan application/json sebagai format integrasi resmi.

Maks. 500 Karakter

Field pesan dibatasi 500 karakter.

Rate Limit

Default personal 120, grup 90, dan list grup 60 request per 60 detik per IP.

Pola Respons

HTTP status dan body response

Mulai versi ini, API tidak lagi mengembalikan semua kegagalan sebagai HTTP 200. Cek HTTP status lebih dulu, lalu baca isi body JSON.

Prinsip integrasi: gunakan kombinasi HTTP status, code, status, dan pesan. Beberapa endpoint menambahkan field lain seperti msgid, limit, data, atau waktu.

Format body umum

FieldTipeKeterangan
codeintegerKode internal aplikasi. Untuk beberapa error bisa berupa kode bisnis seperti 1003, 1004, atau 1005.
statusbooleantrue jika request berhasil, false jika gagal.
pesanstringPesan utama yang perlu ditampilkan atau dicatat di log integrasi Anda.
data, msgid, limit, waktumixedField tambahan, hanya muncul pada endpoint atau kondisi tertentu.

Status HTTP yang dipakai

HTTPKapan munculContoh code
200 OKRequest berhasil diproses.200
401Header Bearer tidak dikirim, format salah, atau token tidak terdaftar.401, 1003
403Akun tidak punya akses, bukan PREMIUM, kuota habis, atau token internal tidak valid.403, 1004, 1005
404Endpoint tidak ditemukan.404
422Validasi request gagal, misalnya field wajib kosong, nomor tidak valid, atau pesan terlalu panjang.105, 422
429Terlalu banyak request dari IP yang sama dalam window rate limit.429
502Gateway WhatsApp memberi response tidak valid atau tidak bisa diparse.502
504Gateway WhatsApp timeout atau tidak merespon.504, 1002
Response example

401 Token tidak terdaftar

401
1{2  "code": 1003,3  "status": false,4  "pesan": "Token tidak terdaftar."5}
Response example

403 Fitur grup premium

403
1{2  "code": 1004,3  "status": false,4  "pesan": "Fitur grup hanya untuk akun premium."5}
Response example

422 Validasi request

422
1{2  "code": 422,3  "status": false,4  "pesan": "Field nomer wajib diisi."5}
Response example

429 Rate limit

429
1{2  "code": 429,3  "status": false,4  "pesan": "Terlalu banyak request dari IP ini. Coba lagi dalam 32 detik."5}
Endpoint

Referensi endpoint aktif

Semua contoh di bawah memakai format resmi terbaru: Bearer auth dan request JSON.

POST

/kirim

Kirim pesan ke nomor personal.

Request body (JSON)

FieldTipeWajibKeterangan
nomerstringYaNomor tujuan 8 sampai 15 digit. Contoh: 62811294440.
pesanstringYaIsi pesan maksimal 500 karakter.
Request Example
POST https://api.ovn.my.id/kirim
Auth: Bearer token Content-Type: application/json atau application/x-www-form-urlencoded
Contoh integrasi
kirim.curlcURL example
1curl --request POST "https://api.ovn.my.id/kirim" \2  --header "Authorization: Bearer APIKEY_ANDA" \3  --header "Content-Type: application/json" \4  --data '{"nomer":"62811294440","pesan":"Halo dari aplikasi saya"}'
kirim.phpPHP cURL
1<?php2$payload = json_encode([3    'nomer' => '62811294440',4    'pesan' => 'Halo dari aplikasi saya',5]);67$ch = curl_init('https://api.ovn.my.id/kirim');8curl_setopt($ch, CURLOPT_POST, true);9curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);10curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);11curl_setopt($ch, CURLOPT_HTTPHEADER, [12    'Authorization: Bearer APIKEY_ANDA',13    'Content-Type: application/json',14    'Accept: application/json',15]);1617$result = curl_exec($ch);18curl_close($ch);19echo $result;
kirim.rscMikroTik RouterOS 6
1:local api "APIKEY";2:local nomer "0811xxx";34:local res [/tool fetch url="https://api.ovn.my.id/kirim" \5    http-method=post \6    http-header-field="Authorization:Bearer $api,Content-Type:application/x-www-form-urlencoded" \7    http-data="nomer=$nomer&pesan=hallo ini pesan dari gateway dengan mikrotik." \8    as-value output=user]910:local data ($res->"data")11:local key "\"pesan\":\""12:local start [:find $data $key]1314:if ($start != nil) do={15    :set start ($start + [:len $key])16    :local end [:find $data "\",\"msgid\"" $start]17    :local pesan [:pick $data $start $end]1819    :log warning ("LOGS: " . $pesan)20}
Catatan MikroTik: contoh RouterOS 6 ini memakai application/x-www-form-urlencoded agar lebih stabil saat request dikirim lewat /tool fetch.
Response example

Contoh sukses

200 OK
1{2  "code": 200,3  "status": true,4  "pesan": "Pesan berhasil dikirim",5  "msgid": "MSG123456789",6  "limit": 499,7  "waktu": "2026-03-19 09:30:00"8}
POST

/kirim-grups

Kirim pesan ke grup WhatsApp. Khusus akun PREMIUM.

Tips: ambil ID grup valid terlebih dahulu dari endpoint /list-grups.

Request body (JSON)

FieldTipeWajibKeterangan
nomerstringYaID grup, misalnya 120363000000000000.
pesanstringYaIsi pesan grup maksimal 500 karakter.
Request Example
POST https://api.ovn.my.id/kirim-grups
Auth: Bearer token premium Content-Type: application/json atau application/x-www-form-urlencoded
Contoh integrasi
send-group.curlPremium only
1curl --request POST "https://api.ovn.my.id/kirim-grups" \2  --header "Authorization: Bearer APIKEY_PREMIUM" \3  --header "Content-Type: application/json" \4  --data '{"nomer":"120363000000000000","pesan":"Halo grup premium"}'
send-group.phpPHP cURL
1<?php2$payload = json_encode([3    'nomer' => '120363000000000000',4    'pesan' => 'Halo grup premium',5]);67$ch = curl_init('https://api.ovn.my.id/kirim-grups');8curl_setopt($ch, CURLOPT_POST, true);9curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);10curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);11curl_setopt($ch, CURLOPT_HTTPHEADER, [12    'Authorization: Bearer APIKEY_PREMIUM',13    'Content-Type: application/json',14    'Accept: application/json',15]);1617$result = curl_exec($ch);18curl_close($ch);19echo $result;
send-group.rscMikroTik RouterOS 6
1:local api "APIKEY";2:local nomer "ID_GRUPS";34:local res [/tool fetch url="https://api.ovn.my.id/kirim-grups" \5    http-method=post \6    http-header-field="Authorization:Bearer $api,Content-Type:application/x-www-form-urlencoded" \7    http-data="nomer=$nomer&pesan=hallo ini pesan dari gateway dengan mikrotik." \8    as-value output=user]910:local data ($res->"data")11:local key "\"pesan\":\""12:local start [:find $data $key]1314:if ($start != nil) do={15    :set start ($start + [:len $key])16    :local end [:find $data "\",\"msgid\"" $start]17    :local pesan [:pick $data $start $end]1819    :log warning ("LOGS: " . $pesan)20}
Catatan MikroTik: contoh RouterOS 6 ini memakai application/x-www-form-urlencoded karena format tersebut paling aman untuk /tool fetch saat mengirim request ke endpoint /kirim-grups.
POST

/list-grups

Ambil daftar grup dari device premium yang sedang online.

Request: endpoint ini tidak membutuhkan body wajib. Cukup kirim POST dengan header Bearer.
Request Example
POST https://api.ovn.my.id/list-grups
Auth: Bearer token premium Body: optional
Contoh integrasi
list-groups.curlPremium only
1curl --request POST "https://api.ovn.my.id/list-grups" \2  --header "Authorization: Bearer APIKEY_PREMIUM" \3  --header "Accept: application/json"
list-groups.phpPHP cURL
1<?php2$ch = curl_init('https://api.ovn.my.id/list-grups');3curl_setopt($ch, CURLOPT_POST, true);4curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);5curl_setopt($ch, CURLOPT_HTTPHEADER, [6    'Authorization: Bearer APIKEY_PREMIUM',7    'Accept: application/json',8]);910$result = curl_exec($ch);11curl_close($ch);12echo $result;
Response example

Contoh sukses

200 OK
1{2  "code": 200,3  "status": true,4  "pesan": "OK",5  "total": 2,6  "data": [7    { "id": "120363000000000000", "subject": "Tim Operasional" },8    { "id": "120363000000000001", "subject": "Pelanggan VIP" }9  ],10  "waktu": "2026-03-19 09:45:00"11}
POST

/cek-nomer

Cek apakah nomor terdaftar di WhatsApp.

Request body (JSON)

FieldTipeWajibKeterangan
nomerstringYaNomor tujuan yang ingin dicek.
Request Example
POST https://api.ovn.my.id/cek-nomer
Auth: Bearer token Content-Type: application/json
Contoh integrasi
check-number.curlAvailability check
1curl --request POST "https://api.ovn.my.id/cek-nomer" \2  --header "Authorization: Bearer APIKEY_ANDA" \3  --header "Content-Type: application/json" \4  --data '{"nomer":"62811294440"}'
check-number.phpPHP cURL
1<?php2$payload = json_encode([3    'nomer' => '62811294440',4]);56$ch = curl_init('https://api.ovn.my.id/cek-nomer');7curl_setopt($ch, CURLOPT_POST, true);8curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);9curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);10curl_setopt($ch, CURLOPT_HTTPHEADER, [11    'Authorization: Bearer APIKEY_ANDA',12    'Content-Type: application/json',13    'Accept: application/json',14]);1516$result = curl_exec($ch);17curl_close($ch);18echo $result;
Catatan Integrasi

Hal penting sebelum masuk production

Header Bearer wajib

Jika header Authorization tidak dikirim atau formatnya salah, server akan membalas 401 Unauthorized.

Error sekarang ikut HTTP status

Auth error memakai 401, akses/quota memakai 403, validasi memakai 422, rate limit memakai 429, dan error gateway memakai 502/504. Tetap log field code, status, dan pesan.

JSON adalah format resmi

Contoh dokumentasi ini memakai application/json agar integrasi backend dan mobile lebih konsisten.

Simpan token di backend

Bearer token tetap lebih aman dipanggil dari backend Anda, bukan langsung dari frontend production.