Autentikasi
Gunakan API key milik akun Anda. API key dapat dilihat dan dirotasi di halaman Pengaturan.
Kirim melalui body apikey, query ?apikey=, header X-API-Key, atau Authorization: Bearer <key>.
https://pg.odzre.my.id/api/v1
Create order
POST/api/v1/create-order
| Field | Wajib | Keterangan |
|---|---|---|
apikey | Ya | API key akun merchant. |
region | Ya | my atau id. |
amount | Ya | MY: unit ringgit (1 = RM1.00). ID: rupiah (1000 = Rp1.000). |
qris | Tidak | Payload QRIS atau URL gambar QR. |
expired | Tidak | Menit. Default 5, maksimal 180. |
curl -X POST https://pg.odzre.my.id/api/v1/create-order \
-H "Content-Type: application/json" \
-d '{
"apikey": "np_live_xxxxxxxxx",
"region": "my",
"amount": 116,
"qris": "00020101021226...",
"expired": 5
}'
{
"success": true,
"message": "Order berhasil dibuat.",
"data": {
"order_id": "3f48e2f6-...",
"reference": "NP261029A7K2Q",
"region": "MY",
"currency": "MYR",
"amount": 11600,
"formatted_amount": "RM116.00",
"status": "pending",
"qris": null,
"qr_url": null,
"payment_url": "https://pg.odzre.my.id/pay/NP261029A7K2Q",
"check_status_url": "https://pg.odzre.my.id/api/v1/check-status",
"expires_at": "2026-10-29T02:20:00.000Z",
"expires_in": 300
}
}
Nilai amount pada respons disimpan dalam unit terkecil: sen untuk MY, rupiah untuk ID.
Check status
GET POST/api/v1/check-status · kirim apikey dan salah satu dari order_id, reference, atau trxid.
curl "https://pg.odzre.my.id/api/v1/check-status?apikey=np_live_xxxxxxxxx&reference=NP261029A7K2Q"
{
"success": true,
"data": {
"reference": "NP261029A7K2Q",
"region": "MY",
"amount": 11600,
"formatted_amount": "RM116.00",
"status": "success",
"paid_at": "2026-10-29T02:16:42.000Z",
"expires_at": "2026-10-29T02:20:00.000Z"
}
}
Order yang melewati waktu expired akan otomatis berubah menjadi expired ketika dicek atau saat cron berjalan.
Callback Android
POST/api/v1/callback · dipanggil oleh aplikasi listener. Autentikasi memakai API key merchant agar order yang dicocokkan tetap ter-scope.
{
"apikey": "np_live_xxxxxxxxx",
"package": "id.dana",
"title": "DANA",
"text": "RM116.00 diterima untuk -",
"device_id": "android-01",
"timestamp": "2026-10-29T02:16:40.000Z"
}
Respons matched: true berarti ada order pending dengan region dan nominal yang cocok. Teks notifikasi yang tidak memiliki nominal akan tersimpan sebagai unmatched dan bisa dicocokkan manual oleh admin.
{
"success": true,
"matched": true,
"status": "matched",
"order": {
"reference": "NP261029A7K2Q",
"status": "success",
"formatted_amount": "RM116.00"
}
}
Status transaksi
Order dibuat, menunggu callback dengan nominal yang cocok.
Callback cocok dan order sudah dibayar.
Melewati batas waktu sebelum ada pembayaran.
Error
Semua error menggunakan format JSON dengan field success dan message.
| HTTP | Arti |
|---|---|
| 400 | Parameter tidak valid, region salah, atau amount kosong. |
| 401 | API key / secret tidak valid. |
| 403 | Akun ditangguhkan. |
| 404 | Order tidak ditemukan atau bukan milik API key. |
| 429 | Terlalu banyak request. Coba lagi nanti. |