Permintaan pembayaran
Buat permintaan
Buat permintaan pembayaran dan dapatkan link checkout.
/v1/transactionsHeader
Opsional, maksimal 255 byte, dan satu-satunya hal yang mencegah pembayaran ganda. Kalau tidak dikirim, setiap request jadi permintaan pembayaran baru. Kirim key yang sama lagi dan Anda dapat yang asli dengan status 200, bukan 201. Batasnya byte, bukan karakter, jadi key non-ASCII habis lebih cepat. Lihat Idempotency.
Contoh: order-1234
Parameter body
Rupiah utuh. Lihat batas.
Contoh: 150000
Tampil di halaman pembayaran. Maks 255 karakter.
Contoh: Kaos komunitas
Nomor pesanan Anda sendiri. Disimpan, dikembalikan, dan bisa difilter di endpoint list — tapi tidak mencegah duplikat: dua create dengan external_id sama tetap jadi dua permintaan pembayaran. Hanya Idempotency-Key yang mencegah duplikat.
Contoh: ORD-1234
Array berisi kode metode yang boleh dipakai untuk pembayaran ini: satu kode langsung menuju metode itu, beberapa kode menampilkan pilihan metode ke pembeli sesuai urutan yang Anda kirim, dan kalau tidak dikirim, semua metode yang aktif di akun Anda ditawarkan. Kode yang tidak ada, atau tidak aktif di akun Anda, ditolak 422 payment_method_unavailable, bukan diabaikan. Saat ini yang tersedia `qris`, kode-kode Virtual Account, dan `card`; e-wallet dan paylater belum. Lihat Metode pembayaran. Field ini yang menentukan apakah response membawa `payment`: kirim SATU kode dan instrumennya — string QRIS, nomor Virtual Account — langsung dibuat saat create dan ikut di response. Kirim beberapa kode, atau tidak sama sekali, berarti pembeli belum memilih metode, jadi belum ada yang dibuat dan Anda hanya dapat `checkout_url` sampai pembeli memilih. Perhatikan bedanya: Anda MENGIRIM `payment_methods`, tapi MEMBACA `payment_method`.
Contoh: ["va_bca", "qris"]
Semua yang membentuk halaman Kasera Pay Checkout: `steps` plus `is_name_required`, `is_email_required`, dan `is_phone_required`. Kalau object ini dikirim, create-nya jadi create Checkout — pembeli membuka `checkout_url` dan halamannya mengumpulkan data yang kurang. Kalau tidak dikirim, create-nya Direct API: tidak ada halaman yang dibuka pembeli, jadi metode yang butuh field yang tidak Anda kirim ditolak 422 customer_required. Kalau tidak dikirim, ketiga setelan `is_*_required` juga ikut setelan metode pembayaran merchant; kalau object-nya dikirim, ketiganya diganti sekaligus, jadi object yang hanya berisi `steps` mematikan default akun itu untuk pembayaran ini.
Alur checkout-nya, berupa array nama langkah, dilewati sesuai urutan yang Anda kirim: `customer` (formulir data), `payment_method` (pilihan metode), `payment` (QR, kode, atau redirect). Default-nya ketiganya. Buang `customer` kalau Anda sudah punya data pembelinya, buang `payment_method` kalau `payment_methods` hanya berisi satu kode, dan urutannya bebas — `payment_method` di depan juga valid. `payment` selalu terakhir dan otomatis ditambahkan kalau tidak Anda sertakan. Pakai nama, bukan angka: urutan array-nya sudah menunjukkan langkah mana jalan duluan, jadi angka hanya bisa bertentangan dengannya.
Contoh: ["customer", "payment_method", "payment"]
Minta nama pembeli di langkah `customer`. Metode yang butuh nama tetap mewajibkannya, jadi field ini untuk kalau Anda butuh nama padahal tidak ada metode yang mewajibkannya. Default-nya ikut setelan metode pembayaran merchant — tapi hanya kalau seluruh object `checkout` tidak dikirim, karena mengirimnya mengganti ketiganya.
Contoh: true
Minta email pembeli di langkah `customer`. Berguna kalau Anda kirim struk sendiri; kartu tetap memintanya apa pun setelan ini. Default-nya ikut setelan metode pembayaran merchant kalau seluruh object `checkout` tidak dikirim.
Contoh: true
Minta nomor telepon pembeli di langkah `customer`, dalam format E.164 (+628...). Default-nya ikut setelan metode pembayaran merchant kalau seluruh object `checkout` tidak dikirim.
Contoh: true
Opsional name, email, dan phone (E.164). Lebih lama dari customer dan dipertahankan karena tetap disimpan dan dikembalikan — di API ini, pakai customer saja. Hanya customer yang memenuhi syarat metode pembayaran; nama yang dikirim di sini tidak akan mengisi Virtual Account.
Referensi Anda sendiri, maks 64 karakter, dikembalikan dan bisa difilter di endpoint list. Tidak mencegah duplikat — retry dengan merchant_ref yang sama membuat permintaan pembayaran kedua. Kirim Idempotency-Key kalau Anda butuh proteksi retry.
Contoh: INV-2026-001
Opsional name (maks 120), email, dan phone pelanggan yang membayar. Dikembalikan di response dan webhook payment.paid; nama tampil di halaman pembayaran. Field ini juga yang memenuhi syarat metode pembayaran — Virtual Account butuh customer.name, kartu butuh customer.email. Kalau tidak dikirim di Checkout, halamannya yang menanyakan ke pembeli; kalau tidak dikirim di Direct API, metode yang membutuhkannya ditolak 422. Lihat Metode pembayaran.
Maks 50 baris {name, price, quantity}, tampil di halaman pembayaran. Total price×quantity harus sama dengan amount, kalau tidak request ditolak 422 — amount tetap jadi acuan.
URL https, maks 2048 karakter. Setelah pembayaran berhasil, halaman checkout menampilkan tombol kembali ke toko dan redirect ke sana dengan tambahan ?id=payreq_...&status=succeeded.
Contoh: https://toko.example/selesai
Default 60, maksimum mengikuti konfigurasi akun.
Contoh: 60
curl https://pay.kasera.id/v1/transactions \
-H "Authorization: Bearer kp_live_..." \
-H "Idempotency-Key: order-1234" \
-H "Content-Type: application/json" \
-d '{
"amount": 150000,
"description": "Kaos komunitas",
"external_id": "ORD-1234",
"merchant_ref": "INV-2026-001",
"customer": { "name": "Budi", "email": "budi@toko.dev" },
"order_items": [
{ "name": "Kaos komunitas", "price": 75000, "quantity": 2 }
],
"return_url": "https://toko.example/selesai",
"payment_methods": ["qris"]
}'{
"id": "payreq_9b2f...",
"livemode": true,
"status": "pending",
"currency": "IDR",
"amount": 150000,
"fee": 1300,
"net": 148700,
"description": "Kaos komunitas",
"external_id": "ORD-1234",
"merchant_ref": "INV-2026-001",
"customer": { "name": "Budi", "email": "budi@toko.dev" },
"order_items": [
{ "name": "Kaos komunitas", "price": 75000, "quantity": 2 }
],
"return_url": "https://toko.example/selesai",
"checkout_url": "https://pay.kasera.id/p/xK3f...",
"source": "api",
"payment_method": "qris",
"payment": {
"type": "qr",
"qr_string": "00020101021226670016COM.KASERA.WWW...6304A1B2"
},
"instructions": {
"title": "Cara membayar dengan QRIS",
"steps": [
"Buka aplikasi e-wallet atau mobile banking Anda.",
"Pilih menu bayar dengan QRIS, lalu scan kode QR di halaman pembayaran.",
"Periksa nama merchant dan nominal, lalu konfirmasi pembayaran.",
"Pembayaran terkonfirmasi otomatis dalam beberapa detik."
]
},
"expires_at": "2026-08-11T13:00:00+07:00",
"paid_at": null,
"created_at": "2026-08-11T12:00:00+07:00"
}