YNA PAY
API Reference · v1

Dokumentasi API YNA PAY

Base URL: api.ynapay.my.id · Semua endpoint /api/v1/* di bawah butuh 1 API Key (didapat otomatis saat daftar, lihat & kelola di dashboard tab API & Webhook) yang dikirim lewat header X-Api-Key. Semua request/response berformat JSON.

Base URL
api.ynapay.my.id
Autentikasi
1 Header · X-Api-Key
Format
JSON Request & Response

Autentikasi

Setiap request ke endpoint /api/v1/* wajib menyertakan 1 API Key lewat header X-Api-Key. API Key otomatis dibuat saat Anda daftar (1 API Key per akun) dan bisa dilihat kapan saja lewat Dashboard → tab API & Webhook. Kalau bocor atau hilang, klik "Generate Ulang" di dashboard - key lama langsung berhenti berfungsi dan digantikan yang baru saat itu juga.

Header
X-Api-Key: yna-••••••••••••••••••nj

Contoh di atas cuma ilustrasi format (bukan API Key akun manapun) - tapi tetap ditampilkan tersamar & pakai tombol mata, konsisten dengan tampilan API Key asli Anda di Dashboard.

Setiap API Key juga dibatasi kuota request (rate limit) per jendela waktu tertentu untuk menjaga kestabilan layanan - kalau terlampaui, Anda akan menerima response 429 sampai jendela waktunya reset.

POST /api/v1/qris/create

Membuat invoice/QRIS baru. Nominal amount adalah nominal ASLI yang ingin Anda terima utuh - margin/fee YNA PAY dihitung otomatis DI ATAS nominal ini, jadi jumlah yang benar-benar ditagihkan ke pembayar (total_charged) bisa lebih besar dari amount. Fee yang berlaku mengikuti tier akun Anda (fee reseller otomatis lebih murah kalau akun Anda berstatus reseller).

FieldWajibKeterangan
amountYaNominal asli (Rupiah), sesuai batas min/max payment yang berlaku
product_nameTidakDefault: "Pembayaran"
customer_nameTidakDefault: "Pelanggan"
expiryTidakMenit, default sesuai pengaturan sistem
redirect_urlTidakURL redirect setelah pembayaran sukses
Contoh Request
curl -X POST https://api.ynapay.my.id/api/v1/qris/create \
  -H "X-Api-Key: yna-kut64e32wsd5t76yhbnj" \
  -H "Content-Type: application/json" \
  -d '{"amount": 10000, "product_name": "Contoh Produk"}'
Contoh Response
{
  "status": "success",
  "data": {
    "ref_no": "QR1776670534209",
    "status": "pending",
    "product_name": "Pembayaran",
    "customer_name": "Pelanggan",
    "original_amount": 10000,
    "fee_total": 500,
    "total_charged": 10500,
    "qr_url": "https://api.ynapay.my.id/qr/QR1776670534209",
    "payment_link": "https://api.ynapay.my.id/pay/QR1776670534209",
    "receipt_url": null,
    "payor_name": null,
    "issuer": null,
    "created_at": "2026-07-24T08:00:00.000Z",
    "expired_at": "2026-07-24T08:30:00.000Z",
    "paid_at": null
  }
}

GET /api/v1/qris/status/:refNo

Cek status transaksi. Endpoint ini selalu re-check status resmi ke sistem pembayaran dulu (bukan sekadar baca cache lokal), jadi bisa dipakai untuk polling.

Contoh Response
{ "status": "success", "data": { "ref_no": "QR1776670534209", "status": "success", "...": "..." } }

GET /api/v1/transactions

List riwayat transaksi milik Anda, terbaru lebih dulu.

QueryKeterangan
statuspending / success / failed / expired
date_from, date_toFormat ISO date, filter berdasarkan created_at
page, limitPagination (default page=1, limit=20, maksimal limit=100)
Contoh Response
{
  "status": "success",
  "data": [ { "ref_no": "QR...", "status": "success", "...": "..." } ],
  "meta": { "page": 1, "limit": 20, "total": 42, "total_pages": 3 }
}

GET /api/v1/balance

Cek breakdown saldo akun Anda saat ini.

Contoh Response
{
  "status": "success",
  "data": {
    "available_balance": 250000,
    "pending_balance": 50000,
    "blocked_balance": 0,
    "total_withdrawn": 1200000
  }
}

POST /api/v1/deposit

Membuat QRIS untuk top-up/deposit saldo akun Anda sendiri. Nominal deposit TIDAK PERNAH kena potongan fee/margin apapun (100% masuk ke saldo Anda begitu dibayar).

FieldWajibKeterangan
amountYaNominal deposit (Rupiah), sesuai batas min/max deposit yang berlaku
noteTidakCatatan bebas untuk Anda sendiri
Contoh Response
{
  "status": "success",
  "data": {
    "ref_no": "QR1776670600123",
    "amount": 50000,
    "note": "Top up saldo",
    "qr_url": "https://api.ynapay.my.id/qr/QR1776670600123",
    "status": "pending",
    "created_at": "2026-07-24T08:10:00.000Z",
    "expired_at": "2026-07-24T08:40:00.000Z",
    "paid_at": null
  }
}

GET /api/v1/deposits

List riwayat deposit milik Anda, terbaru lebih dulu.

QueryKeterangan
statuspending / success / failed / expired
page, limitPagination (default page=1, limit=20, maksimal limit=100)

GET /api/v1/payment-channels

Daftar bank & e-wallet yang sedang AKTIF untuk withdraw (sama dengan daftar yang muncul di form withdraw Dashboard User), berguna kalau Anda ingin menampilkan pilihan channel withdraw ini juga di sistem Anda sendiri.

Contoh Response
{
  "status": "success",
  "data": {
    "banks": [ { "code": "bca", "name": "BCA" }, { "code": "seabank", "name": "SeaBank" } ],
    "ewallets": [ { "code": "dana", "name": "DANA" }, { "code": "gopay", "name": "GoPay" } ]
  }
}

PUT /api/v1/settings/callback-url

Atur URL server Anda sendiri yang akan menerima notifikasi otomatis setiap transaksi mencapai status final (success/failed/expired). Kirim callback_url: null atau string kosong untuk menonaktifkan.

Contoh Request
{ "callback_url": "https://toko-anda.com/webhook/yna-pay" }

GET /api/v1/webhook-logs

Lihat histori pengiriman webhook ke callback URL Anda, termasuk status (pending/success/failed), jumlah percobaan, dan pesan error terakhir.

POST /api/v1/webhook-logs/:id/retry

Kirim ulang 1 notifikasi webhook secara manual, berapa pun status/jumlah percobaan sebelumnya. Berguna kalau server Anda sempat down saat notifikasi asli dikirim.

Format Webhook yang Anda Terima

Kalau callback_url sudah diatur, server Anda akan menerima POST dengan body berikut setiap transaksi final. Verifikasi keasliannya lewat header X-YNA-Signature (HMAC-SHA256 dari body JSON, secret diberikan terpisah oleh admin YNA PAY).

Contoh Body
{
  "ref_no": "QR1776670534209",
  "status": "success",
  "original_amount": 10000,
  "total_charged": 10500,
  "product_name": "Pembayaran",
  "customer_name": "Pelanggan",
  "payor_name": "Budi Santoso",
  "issuer": "GOPAY",
  "paid_at": "2026-07-24T08:05:00.000Z",
  "timestamp": "2026-07-24T08:05:01.000Z"
}

Server Anda harus membalas dengan status HTTP 2xx. Kalau tidak, YNA PAY akan mencoba kirim ulang beberapa kali secara otomatis dengan jeda yang makin lama.

Endpoint Khusus Dashboard (Bukan Bagian API Publik)

Fitur QRIS Manual & Deposit di Dashboard User/Admin (tombol Batal QRIS dan Download QR) punya endpoint tersendiri yang TIDAK termasuk API publik /api/v1/* di atas. Endpoint di bawah ini pakai autentikasi sesi login (cookie), bukan X-Api-Key - jadi tidak bisa dan tidak dimaksudkan untuk dipanggil dari sistem/aplikasi luar. Endpoint ini hanya berfungsi saat dipanggil dari halaman Dashboard yang sedang login, dan dicantumkan di sini murni sebagai referensi/transparansi.

EndpointBoleh Dipakai OlehKeterangan
POST /api/dashboard/manual-qris/:id/cancel User (pemilik akun, hanya QRIS Manual miliknya sendiri) Batalkan QRIS Manual yang statusnya masih pending
GET /api/dashboard/manual-qris/:id/download User (pemilik akun, hanya QRIS Manual miliknya sendiri) Download gambar QR (file, bukan link)
POST /api/dashboard/deposit/:refNo/cancel User (pemilik akun, hanya deposit miliknya sendiri) Batalkan QRIS Deposit yang statusnya masih pending
GET /api/dashboard/deposit/:refNo/download User (pemilik akun, hanya deposit miliknya sendiri) Download gambar QR Deposit (file, bukan link)
GET /api/admin/manual-qris/:id/status Admin saja Sync status QRIS Manual lintas SEMUA user
POST /api/admin/manual-qris/:id/cancel Admin saja Batalkan QRIS Manual milik user manapun (bukan cuma milik admin)
GET /api/admin/manual-qris/:id/download Admin saja Download gambar QR Manual milik user manapun

Tidak boleh/tidak bisa dipakai:

  • Lewat header X-Api-Key - endpoint ini tidak mengenali kredensial API sama sekali, hanya sesi login dashboard.
  • Dari server/aplikasi pihak ketiga di luar dashboard YNA PAY - kalau butuh integrasi otomatis untuk cek status/riwayat, pakai endpoint publik /api/v1/* di atas.
  • Endpoint /api/admin/* oleh akun user biasa - otomatis ditolak (403), khusus akun dengan role admin.
  • Membatalkan QRIS yang statusnya sudah final (success/failed/ expired/cancelled) - hanya QRIS yang masih pending yang bisa dibatalkan.

Format Error

Semua error mengikuti format yang sama:

Contoh
{ "status": "error", "message": "Penjelasan error di sini." }
HTTP StatusArti
400Input tidak valid (field wajib kosong, format salah, dsb)
401API Key tidak disertakan atau tidak valid
403Akun pemilik API Key sedang dinonaktifkan
404Data/transaksi yang diminta tidak ditemukan
429Terlalu banyak request, kuota rate limit habis untuk jendela waktu ini
502Gagal terhubung ke sistem pembayaran saat sync status