Dokumentasi API
Dokumentasi teknis integrasi API untuk partner bisnis Navarana. Sambungkan sistem Anda dengan layanan transaksi produk digital secara otomatis.
OtomaX API Bridge
Dokumentasi integrasi API untuk transaksi, deposit, reseller, dan produk digital. Autentikasi via header API client — simpan credential di server backend Anda.
Setup Credential
Dokumentasi ini untuk partner Navarana yang sudah terdaftar.
Kredensial API (client_id + client_secret)
diterbitkan oleh tim Navarana setelah proses aktivasi.
client_secret hanya disimpan di server backend Anda (variabel lingkungan, secret manager, atau konfigurasi server — sesuai stack yang Anda pakai).
Jangan ditulis di frontend, dokumentasi publik, atau repository yang terbuka.
Setelah onboarding, tim Navarana mengirimkan credential secara private. Simpan dengan aman di server backend:
Client ID : web_yusuf_xxxxxxxx
Client Secret : (diberikan Navarana — jangan dibagikan)
Nilai di atas hanya ilustrasi format. Hubungi kami untuk request akses API.
Header Wajib
Setiap request protected memerlukan header berikut. Untuk POST / PUT tambahkan Content-Type: application/json.
Accept: application/json
X-Api-Client-Id: web_yusuf_xxxxxxxx
X-Api-Client-Secret: {client_secret_dari_navarana}
Catatan Autentikasi
| Aspek | Keterangan |
|---|---|
| Login | Tidak perlu — credential statis via header |
| Token expire | Tidak ada — credential tidak kedaluwarsa |
| kode_reseller | Otomatis dari credential — jangan kirim di body/query |
| Rate limit transaksi | Per client (default 30 req/menit) |
| IP whitelist | Opsional — dikonfigurasi Navarana saat aktivasi |
Format Respons
Semua endpoint mengembalikan JSON dengan format konsisten.
| Field | Tipe | Keterangan |
|---|---|---|
| success | boolean | true jika operasi berhasil diproses |
| message | string | Pesan human-readable |
| data | object / array | Payload utama ({} atau []) |
Response Error Autentikasi
401 — Header auth tidak dikirim
Contoh: GET /products tanpa header autentikasi.
{
"success": false,
"message": "Autentikasi diperlukan. Sertakan header X-Api-Client-Id dan X-Api-Client-Secret.",
"data": []
}
401 — Client ID atau secret salah
{
"success": false,
"message": "Kredensial API tidak valid",
"data": []
}
403 — IP tidak di whitelist
{
"success": false,
"message": "IP tidak diizinkan untuk client API ini",
"data": []
}
403 — Akses saldo reseller lain
Credential terikat ke kode_reseller saat aktivasi. Contoh: GET /resellers/reseller_lain/saldo
{
"success": false,
"message": "Akses ditolak untuk reseller ini",
"data": []
}
422 — Validasi gagal
{
"success": false,
"message": "The tanggal field is required.",
"data": {
"errors": {
"tanggal": ["The tanggal field is required."]
}
}
}
429 — Rate limit transaksi
{
"success": false,
"message": "Terlalu banyak permintaan transaksi. Coba lagi nanti.",
"data": []
}
Produk & Harga
{base_url}/operators?kode=PPOB
| Query | Contoh | Keterangan |
|---|---|---|
| kode | PPOB | Kode operator induk (wajib) |
{
"success": true,
"message": "OK",
"data": [
{
"kode": "TSEL",
"nama": "Telkomsel",
"kode_operator_induk": "PPOB"
},
{
"kode": "XL",
"nama": "XL Axiata",
"kode_operator_induk": "PPOB"
}
]
}
{base_url}/products?kode=BYROMNI
| Query | Contoh | Keterangan |
|---|---|---|
| kode | BYROMNI | Kode operator / filter produk |
{
"success": true,
"message": "OK",
"data": [
{
"kode": "TS5",
"nama": "Telkomsel 5.000",
"kode_operator": "TSEL",
"harga": 5500,
"status": "Aktif"
},
{
"kode": "TS10",
"nama": "Telkomsel 10.000",
"kode_operator": "TSEL",
"harga": 10500,
"status": "Aktif"
}
]
}
{base_url}/price-list?kode_produk=TS5&kode_operator=TSEL
Query opsional. kode_reseller otomatis dari credential Anda.
| Query | Contoh | Keterangan |
|---|---|---|
| kode_produk | TS5 | Filter produk (opsional) |
| kode_operator | TSEL | Filter operator (opsional) |
{
"success": true,
"message": "OK",
"data": [
{
"kode_produk": "TS5",
"nama_produk": "Telkomsel 5.000",
"harga": 5400,
"harga_jual": 5500
}
]
}
Saldo Reseller
{base_url}/resellers/yusuf/saldo
{kode} di URL harus sama dengan kode_reseller credential Anda.
{
"success": true,
"message": "OK",
"data": {
"kode": "yusuf",
"saldo": 1500000
}
}
{
"success": false,
"message": "Reseller tidak ditemukan",
"data": {
"kode": "yusuf",
"saldo": null
}
}
Transaksi
{base_url}/transactions
| Field | Wajib | Keterangan |
|---|---|---|
| kode_produk | Ya | |
| qty | Ya | |
| tujuan | Ya | |
| pin | Ya | PIN reseller OtomaX |
| pengirim | Ya | |
| refid | Dilarang | Auto: APP20260529143052A2B3C |
| kode_reseller | Jangan kirim | Otomatis dari credential |
{
"kode_produk": "TS5",
"qty": "1",
"tujuan": "081234567890",
"pin": "1234",
"pengirim": "081234567890",
"tipe_pengirim": "W"
}
{
"success": false,
"message": "Sukses masuk transaksi",
"data": {
"status": "pending",
"rc": 22,
"refid": "APP20260529143052A2B3C",
"trxid": 4522967,
"sn": null
}
}
{
"success": true,
"message": "Sukses",
"data": {
"status": "success",
"rc": 20,
"pesan": "Transaksi berhasil. SN: 1234567890",
"refid": "APP20260529143052A2B3C",
"trxid": 4522967,
"sn": "1234567890"
}
}
{
"success": false,
"message": "Stok kosong",
"data": {
"status": "failed",
"rc": 45,
"keterangan": "Stok kosong",
"refid": "APP20260529143052A2B3C",
"trxid": null,
"sn": null
}
}
{
"success": false,
"message": "Transaksi dobel (cek transaksi sebelumnya)",
"data": {
"status": "pending",
"rc": 46,
"pesan": "Transaksi sebelumnya masih pending. Mohon tunggu hasilnya dan jangan kirim ulang dengan refid, produk, dan tujuan yang sama. Cek status menggunakan trxid yang dikembalikan.",
"refid": "APP20260529143052A2B3C",
"trxid": 4522960,
"sn": null
}
}
Nilai data.status |
|
|---|---|
| pending | Masih diproses / menunggu jawaban |
| success | Transaksi sukses |
| failed | Transaksi gagal |
| rc | Keterangan |
|---|---|
| 1 | Sedang proses |
| 2 | Menunggu jawaban |
| 3 | Gagal kirim |
| 20 | Sukses |
| 40 | Gagal |
| 45 | Stok kosong |
| 46 | Transaksi dobel |
| 47 | Produk gangguan |
| 50 | Dibatalkan |
| 52 | Tujuan salah |
| 53 | Tujuan diluar wilayah |
| 54 | Kode area tidak cocok |
| 55 | Timeout |
| 56 | Nomor blacklist |
| 58 | Nomor tidak aktif |
| 59 | Harga tidak sesuai |
| 61 | Qty tidak sesuai |
| 64 | Diabaikan |
| 69 | Cutoff |
| 200 | Proses ulang |
{base_url}/transactions/4522967
Cek status transaksi by trxid.
{
"success": true,
"message": "Sukses",
"data": {
"status": "success",
"rc": 20,
"pesan": "Transaksi berhasil. SN: 1234567890",
"trxid": 4522967,
"refid": "APP20260529143052A2B3C",
"sn": "1234567890",
"kode_produk": "TS5",
"tujuan": "081234567890",
"qty": 1,
"harga": 5400,
"tgl_entri": "2026-05-29T14:30:52",
"saldo_awal": 1500000,
"saldo_akhir": 1494600
}
}
{
"success": false,
"message": "Sedang proses",
"data": {
"status": "pending",
"rc": 1,
"trxid": 4522967,
"refid": "APP20260529143052A2B3C",
"sn": null,
"kode_produk": "TS5",
"tujuan": "081234567890",
"qty": 1,
"harga": 5400,
"tgl_entri": "2026-05-29T14:30:52",
"saldo_awal": 1500000,
"saldo_akhir": 1494600
}
}
{base_url}/history?tanggal=2026-05-29
Transaksi gagal
| Query | Contoh | Keterangan |
|---|---|---|
| tanggal | 2026-05-29 | Format YYYY-MM-DD (wajib) |
{
"success": true,
"message": "OK",
"data": {
"kode_reseller": "yusuf",
"tanggal": "2026-05-29",
"total": 2,
"items": [
{
"status": "success",
"rc": 20,
"pesan": "Transaksi berhasil. SN: 1234567890",
"trxid": 4522967,
"refid": "APP20260529143052A2B3C",
"sn": "1234567890",
"kode_produk": "TS5",
"tujuan": "081234567890",
"qty": 1,
"harga": 5400,
"tgl_entri": "2026-05-29T14:30:52"
},
{
"status": "failed",
"rc": 45,
"keterangan": "Stok kosong",
"trxid": 4522968,
"refid": "APP20260529150510X9Y8Z7",
"sn": null,
"kode_produk": "TS10",
"tujuan": "081987654321",
"qty": 1,
"harga": 10500,
"tgl_entri": "2026-05-29T15:05:10"
}
]
}
}
{
"success": true,
"message": "OK",
"data": {
"kode_reseller": "yusuf",
"tanggal": "2026-05-29",
"total": 0,
"items": []
}
}
{
"success": false,
"message": "Gagal mengambil riwayat transaksi",
"data": {
"kode_reseller": "yusuf",
"tanggal": "2026-05-29",
"total": 0,
"items": []
}
}
Deposit
{base_url}/deposit-tickets
Transaksi gagal
{
"jumlah": "100000",
"pin": "1234",
"pengirim": "081234567890",
"tipe_pengirim": "W"
}
{
"success": true,
"message": "Sukses masuk outbox",
"data": {
"status": "success",
"rc": 21,
"pesan": "Tiket deposit berhasil dibuat. Silakan transfer sesuai instruksi.",
"jumlah": "100000",
"kode_inbox": 12345,
"kode_outbox": 67890
}
}
{
"success": false,
"message": "Sukses masuk transaksi",
"data": {
"status": "pending",
"rc": 22,
"jumlah": "100000",
"kode_inbox": 12345,
"kode_outbox": 67890
}
}
Endpoint Public
Endpoint berikut tidak memerlukan autentikasi.
{base_url}/health
Transaksi gagal
{
"success": true,
"message": "OK",
"data": {
"kode": "APP001",
"versi": "1.0.0"
}
}
{base_url}/resellers/yusuf
Transaksi gagal
{
"success": true,
"message": "OK",
"data": {
"kode": "yusuf",
"nama": "Yusuf Reseller",
"saldo": 1500000,
"status": "Aktif"
}
}
{base_url}/resellers/yusuf/verify-pin
Transaksi gagal
{ "pin": "1234" }
{
"success": true,
"message": "OK",
"data": {
"kode": "yusuf"
}
}
{
"success": false,
"message": "PIN salah",
"data": {
"kode": "yusuf"
}
}
Contoh Integrasi
cURL
curl -s "https://api.navarana.id/api/products?kode=BYROMNI" \
-H "Accept: application/json" \
-H "X-Api-Client-Id: YOUR_CLIENT_ID" \
-H "X-Api-Client-Secret: YOUR_CLIENT_SECRET"
PHP
$response = $httpClient->get('https://api.navarana.id/api/products', [
'query' => ['kode' => 'BYROMNI'],
'headers' => [
'Accept' => 'application/json',
'X-Api-Client-Id' => $clientId, // dari konfigurasi server
'X-Api-Client-Secret' => $clientSecret,
],
]);
Alur Transaksi (recommended)
1. POST /transactions → simpan trxid + refid dari response
2. Jika data.status = "pending":
loop GET /transactions/{trxid} tiap 3–5 detik
3. Stop saat status = "success" atau "failed"
Ringkasan Endpoint
| Method | Path | Autentikasi |
|---|---|---|
| GET | /operators | ✅ Wajib |
| GET | /products | ✅ Wajib |
| GET | /price-list | ✅ Wajib |
| GET | /resellers/{kode}/saldo | ✅ Wajib |
| POST | /transactions | ✅ Wajib |
| GET | /transactions/{trxid} | ✅ Wajib |
| GET | /history | ✅ Wajib |
| POST | /deposit-tickets | ✅ Wajib |
| GET | /health | — Public |
| GET | /resellers/{kode} | — Public |
| POST | /resellers/{kode}/verify-pin | — Public |
success vs data.status — success: false dengan data.status: "pending" artinya request diterima tapi transaksi belum selesai. Cek ulang via GET /transactions/{trxid}.
refid — Format APP + YmdHis + 6 karakter random.
Client secret — Simpan di server backend, jangan di frontend browser.