Getting Started

Authentication

Setiap request ke API perlu 2 header: X-Api-Key (public key) dan Authorization: Bearer (secret key). Dapatkan sepasang key ini dari menu API Keys di dashboard merchant kamu.

X-Api-Key: pk_sandbox_1a2b3c4d5e6f
Authorization: Bearer sk_sandbox_9f8e7d6c5b4a3f2e1d0c...

Secret key hanya ditampilkan sekali saat dibuat. Simpan di environment variable server kamu, jangan hardcode di source code.

POST/api/v1/transactions.php

Membuat transaksi baru. Pelanggan akan diarahkan ke payment_url yang dikembalikan untuk menyelesaikan pembayaran.

Request Body

FieldTipeWajibKeterangan
order_idstringYaID unik dari sisi kamu
amountnumberYaNominal, minimal 1000
methodstringYaqris, gopay, ovo, dana, shopeepay, va_bca, va_mandiri, va_bni
customer_namestringTidakNama pelanggan
customer_emailstringTidakEmail pelanggan
callback_urlstringTidakURL webhook saat status berubah
success_redirect_urlstringTidakRedirect setelah bayar sukses
failed_redirect_urlstringTidakRedirect kalau gagal

Contoh (cURL)

curl -X POST https://nzpay.site/api/v1/transactions.php \
  -H "X-Api-Key: pk_sandbox_xxxxx" \
  -H "Authorization: Bearer sk_sandbox_xxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": "INV-2026-0091",
    "amount": 150000,
    "method": "qris",
    "customer_name": "Budi Santoso",
    "callback_url": "https://tokoanda.com/webhook"
  }'

Contoh (PHP)

$ch = curl_init("https://nzpay.site/api/v1/transactions.php");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "X-Api-Key: pk_sandbox_xxxxx",
    "Authorization: Bearer sk_sandbox_xxxxx",
    "Content-Type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "order_id" => "INV-2026-0091",
    "amount" => 150000,
    "method" => "qris",
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = json_decode(curl_exec($ch), true);
echo $response['data']['payment_url'];

Contoh (Node.js)

const res = await fetch("https://nzpay.site/api/v1/transactions.php", {
  method: "POST",
  headers: {
    "X-Api-Key": "pk_sandbox_xxxxx",
    "Authorization": "Bearer sk_sandbox_xxxxx",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ order_id: "INV-2026-0091", amount: 150000, method: "qris" }),
});
const data = await res.json();
console.log(data.data.payment_url);

Response 201

{
  "success": true,
  "data": {
    "transaction_ref": "TRX-2026-000123",
    "order_id": "INV-2026-0091",
    "status": "pending",
    "payment_url": "https://nzpay.site/checkout.php?ref=TRX-2026-000123",
    "expired_at": "2026-08-28 15:30:00"
  }
}

GET/api/v1/transactions.php?order_id=xxx

Cek status transaksi berdasarkan order_id milikmu, atau transaction_ref dari PayGate.

curl https://nzpay.site/api/v1/transactions.php?order_id=INV-2026-0091 \
  -H "X-Api-Key: pk_sandbox_xxxxx" \
  -H "Authorization: Bearer sk_sandbox_xxxxx"

Response 200

{
  "success": true,
  "data": {
    "transaction_ref": "TRX-2026-000123",
    "order_id": "INV-2026-0091",
    "status": "success",
    "method": "qris",
    "gross_amount": 150000,
    "fee_amount": 1050,
    "net_amount": 148950,
    "paid_at": "2026-08-28 14:05:11",
    "expired_at": "2026-08-28 15:05:11",
    "created_at": "2026-08-28 13:50:00"
  }
}

Payment Methods

Kode method yang bisa dipakai saat membuat transaksi (bisa berubah sesuai yang diaktifkan admin):

KodeNamaKategori
qrisQRISQRIS
va_bcaVirtual Account BCAVirtual Account
va_mandiriVirtual Account MandiriVirtual Account
va_bniVirtual Account BNIVirtual Account
gopayGoPayE-Wallet
ovoOVOE-Wallet
danaDANAE-Wallet
shopeepayShopeePayE-Wallet

Error Codes

HTTPCodeKeterangan
401unauthorizedAPI key tidak ada / salah / sudah direvoke
403merchant_not_verifiedAkun merchant belum diverifikasi admin
403blocked_by_risk_engineTransaksi ditolak sistem deteksi fraud otomatis
400missing_parameterParameter wajib untuk GET (order_id/transaction_ref) tidak ada
400invalid_jsonBody request bukan JSON valid
400validation_errorField wajib tidak lengkap / tidak valid
400invalid_methodKode metode pembayaran salah / nonaktif
409duplicate_order_idorder_id sudah pernah dipakai merchant ini
404not_foundTransaksi tidak ditemukan saat dicek
405method_not_allowedHTTP method selain GET/POST

Bagaimana Pembayaran Diproses

Sistem otomatis memilih cara pemrosesan berdasarkan konfigurasi platform, dengan urutan prioritas berikut untuk tiap metode:

PrioritasKondisiYang Terjadi
1Metode QRIS dengan otomatisasi aktifQR dinamis di-generate otomatis, status berubah otomatis lewat webhook begitu terverifikasi
2Channel Platform aktif untuk metode ituTampilkan QR statis/nomor rekening admin, customer klik "Saya Sudah Transfer", verifikasi manual oleh admin
3Provider pembayaran otomatis dikonfigurasiRedirect ke halaman pembayaran ter-hosting provider
4Tidak ada satupun di atasMode sandbox: tombol "Simulasi: Saya Sudah Bayar" untuk uji alur callback

Sebagai developer, kamu tidak perlu tahu jalur mana yang aktif — cukup redirect customer ke payment_url yang dikembalikan API, dan tunggu notifikasi ke callback_url kamu (atau polling lewat endpoint Check Transaction) untuk tahu kapan status berubah.

Catatan: selama sistem berjalan di jalur 2 (Channel Platform manual), ada jeda waktu verifikasi karena dilakukan manual oleh admin — jangan asumsikan status langsung berubah dalam hitungan detik seperti jalur 1 dan 3.