Direct API

Kartu kredit

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

Kartu menjangkau pembeli di luar Indonesia, dan satu-satunya metode yang batas pembangunannya ditentukan aturan selain aturan kami: nomor kartu adalah data yang diatur. Satu kode, card, mencakup keempat jaringannya. Bentuknya redirect: Anda mengarahkan pembeli ke payment.redirect_url, mereka mengisi kartu dan melewati 3-D Secure di sana, lalu dibawa kembali.

Data kartu tidak pernah menyentuh server Anda — atau kami

Menangani nomor kartu mentah membutuhkan sertifikasi PCI DSS. Kedua integrasi tidak menuntut itu dari Anda: pada Checkout halaman kami yang mengarahkan pembeli, dan di sini Anda sendiri. Kartu diketik di halaman pemroses dan tidak pernah dikirim ke tempat lain.

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

Langkah integrasi

  1. Buat permintaan pembayarannya.
  2. Arahkan pembeli ke payment.redirect_url.
  3. Terima konfirmasi pembayaran — webhook payment.paid.
  4. Cek status saat Anda perlu kepastian: GET /v1/transactions/:id.

1. Buat permintaan pembayaran

Kartu membutuhkan customer.email; create yang menyebut card tanpa itu 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. Arahkan pembeli ke sana

Navigasi tingkat atas, bukan iframe: langkah 3-D Secure dari bank penerbit memang keluar dari frame apa pun. Saat pembeli selesai — dibayar, ditolak, atau ditinggalkan — pemroses mengarahkan browsernya ke halaman Kasera Pay Checkout untuk pembayaran ini, yang mengonfirmasi hasilnya ke pemroses lalu meneruskan pembeli ke return_url Anda dengan ?id=payreq_…&status=succeeded. Anda tidak pernah menangani kembalinya sendiri, dan tidak perlu.

Di mode tes tidak ada halaman pemroses: redirect_url adalah halaman Checkout pembayaran itu, tempat simulator menandainya lunas. Jalur kode di sisi Anda sama saja.

3. Terima konfirmasi pembayaran

payment.paid menyala saat otorisasi, jadi biasanya datang ketika pembeli masih dalam perjalanan kembali. Penuhi pesanan berdasarkan webhook itu, bukan karena pembeli mendarat di return_url — URL yang bisa diketik siapa saja.

4. Cek status

GET /v1/transactions/:id — dan simpan catatannya setelah itu. Lihat catatan sanggahan di bawah.

Refund

Kartu adalah metode pertama yang bisa direfund lewat API. POST /v1/refunds mengembalikan uang pada pembayaran kartu yang succeeded; kosongkan amount untuk seluruhnya, atau kirim nominal untuk refund sebagian. Refund sebagian boleh diulang sampai nominal yang dibayar habis; satu rupiah lebih ditolak 422 refund_exceeds_amount. Sertakan header Idempotency-Key: pengulangan dengan kunci yang sama mengembalikan refund 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 direfund. Baca kembali 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_refusedPemroses menolak. Tidak ada uang yang bergerak; nominalnya bisa dicoba lagi.
502 refund_unresolvedPemroses tidak bisa dihubungi. Nominalnya ditahan pending — jangan coba lagi; hubungi dukungan.

Refund mengembalikan uang pembeli; tidak mengembalikan biayanya. Biaya pada pembayaran aslinya tetap berlaku apa pun yang direfund, seluruhnya atau sebagian. Nominal yang direfund dipotong dari payout Anda berikutnya — pada refund penuh, biayanya menjadi tanggungan Anda, tercantum di payout sebagai refund_withheld.

Perlu diketahui

Kartu
KonfirmasiLangsung, saat otorisasi
Bisa direfundYa, termasuk refund sebagian berulang
ChargebackMungkin terjadi — pembeli bisa menyanggah berbulan-bulan kemudian
BiayaLebih tinggi dari QRIS dan VA — baca dari GET /v1/payment_methods

Kartu satu-satunya metode yang bisa menarik kembali uang setelah Anda mengirim barang. Pembayaran yang berhasil tidak sefinal pembayaran QRIS — simpan catatan pesanan dan data pembeli yang Anda kirim di customer, itulah yang menjawab sanggahan.