Direct API

Kartu kredit

Visa, Mastercard, JCB, dan Amex, dengan 3-D Secure.

Kartu sedang tidak tersedia. Halaman ini tetap ada sebagai referensi saat kartu diaktifkan kembali.

Kartu menjangkau pembeli di luar Indonesia, dan jadi satu-satunya metode yang apa yang boleh Anda bangun dibatasi aturan di luar aturan kami: nomor kartu termasuk data yang diatur regulasi. Satu kode, card, mencakup keempat network. Formatnya redirect: Anda me-redirect pembeli ke payment.redirect_url, mereka mengisi data kartu dan melewati 3-D Secure di sana, lalu dikembalikan ke Anda.

Data kartu tidak pernah sampai ke server Anda — maupun server kami

Memproses nomor kartu mentah butuh sertifikasi PCI DSS. Kedua integrasi tidak menuntut itu dari Anda: di Checkout halaman kami yang me-redirect pembeli, dan di sini Anda sendiri. Nomor kartu diketik di halaman processor dan tidak pernah dikirim ke tempat lain.

Tidak ada endpoint yang menerima nomor kartu, dan tidak akan pernah ada. Kalau Anda merasa perlu POST nomor kartu ke kami, solusinya redirect_url.

Langkah integrasi

  1. Buat permintaan pembayaran.
  2. Redirect pembeli ke payment.redirect_url.
  3. Terima konfirmasi pembayaran lewat webhook payment.paid.
  4. Cek status kalau perlu kepastian: GET /v1/transactions/:id.

1. Buat permintaan pembayaran

Kartu butuh customer.email; create dengan card tanpa email ditolak 422 customer_required. Halaman kartu terbuka paling lama expires_in_minutes.

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,
    "external_id": "ORD-1234",
    "payment_methods": ["card"],
    "customer": { "email": "budi@toko.example" },
    "return_url": "https://toko.example/selesai"
  }'
{
  "id": "payreq_9b2f...",
  "status": "pending",
  "payment_method": "card",
  "payment": {
    "type": "redirect",
    "redirect_url": "https://.../credit-card/checkout?...",
    "display_name": "Credit Card"
  },
  "instructions": {
    "title": "Cara membayar dengan kartu kredit",
    "steps": ["..."]
  },
  "expires_at": "2026-08-27T13:00:00+07:00"
}

2. Redirect pembeli ke sana

Redirect halaman penuh, bukan iframe: langkah 3-D Secure dari bank penerbit tetap akan keluar dari frame apa pun. Saat pembeli selesai — dibayar, ditolak, atau ditinggalkan — processor me-redirect browser pembeli ke halaman Kasera Pay Checkout untuk pembayaran ini, yang mengonfirmasi hasilnya ke processor lalu meneruskan pembeli ke return_url Anda dengan ?id=payreq_…&status=succeeded. Anda tidak pernah menangani redirect balik itu sendiri, dan memang tidak perlu.

Di test mode tidak ada halaman processor: redirect_url adalah halaman Checkout pembayaran itu, tempat form kartu test menandainya lunas. Kode di sisi Anda tetap sama.

3. Terima konfirmasi pembayaran

payment.paid terkirim saat otorisasi, jadi biasanya sudah datang ketika pembeli masih di-redirect balik. Proses pesanan dari webhook itu, bukan karena pembeli sampai di return_url — URL yang bisa diketik siapa saja.

4. Cek status

GET /v1/transactions/:id — dan simpan datanya setelah itu. Lihat catatan soal dispute di bawah.

Refund

Kartu adalah metode pertama yang bisa di-refund lewat API. POST /v1/refunds me-refund pembayaran kartu yang succeeded; jangan kirim amount untuk refund penuh, atau kirim nominal untuk refund sebagian. Refund sebagian boleh berkali-kali sampai nominal yang dibayar habis; lebih satu rupiah saja ditolak 422 refund_exceeds_amount. Sertakan header Idempotency-Key: retry dengan key yang sama mengembalikan refund yang asli, bukan memotong dana dua kali.

curl https://pay.kasera.id/v1/refunds \
  -H "Authorization: Bearer kp_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: refund-order-1234" \
  -d '{
    "transaction_id": "payreq_9b2f...",
    "amount": 50000,
    "reason": "Satu barang dikembalikan"
  }'
{
  "id": "rfd_7c1a...",
  "transaction_id": "payreq_9b2f...",
  "status": "succeeded",
  "currency": "IDR",
  "amount": 50000,
  "reason": "Satu barang dikembalikan",
  "created_at": "2026-08-31T10:12:00+07:00",
  "livemode": true
}
JawabanArti
201 status: succeededSudah di-refund. Cek lagi dengan GET /v1/refunds/:id.
422 refund_not_supportedBukan kartu. Refund QRIS dan Virtual Account dilakukan manual.
409 not_refundablePembayaran belum succeeded.
422 refund_exceeds_amountMelebihi sisa. Setelah refund sebagian, kirim nominalnya secara eksplisit.
502 refund_refusedProcessor menolak. Tidak ada uang yang bergerak; nominalnya bisa di-retry.
502 refund_unresolvedProcessor tidak bisa dihubungi. Nominalnya ditahan pending — jangan retry; hubungi support.

Refund mengembalikan uang pembeli, tapi biayanya tidak ikut kembali. Biaya pembayaran aslinya tetap berlaku, baik refund penuh maupun sebagian. Nominal yang di-refund dipotong dari pencairan Anda berikutnya — pada refund penuh, biayanya jadi tanggungan Anda, tercantum di pencairan sebagai refund_withheld.

Perlu diketahui

Kartu
KonfirmasiLangsung, saat otorisasi
Bisa di-refundYa, termasuk refund sebagian berulang
ChargebackBisa terjadi — pembeli bisa mengajukan dispute berbulan-bulan kemudian
BiayaLebih tinggi dari QRIS dan VA — baca dari GET /v1/payment_methods

Kartu satu-satunya metode yang uangnya bisa ditarik kembali setelah Anda mengirim barang. Pembayaran kartu yang berhasil tidak sefinal pembayaran QRIS — simpan data pesanan dan data pembeli yang Anda kirim di customer, karena itulah bukti untuk menjawab dispute.