Permintaan pembayaran

Buat permintaan

Buat permintaan pembayaran QRIS dan dapatkan tautan checkout.

POST/v1/transactions

Header

Idempotency-Keyheaderopsional

Opsional, maksimal 255 byte, dan satu-satunya hal yang mencegah pembayaran ganda. Kalau tidak dikirim, setiap percobaan menjadi permintaan pembayaran tersendiri. Mengirim key yang sama lagi mengembalikan 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

amountintegerwajib

Rupiah utuh. Lihat batas.

Contoh: 150000

descriptionstringopsional

Tampil di halaman pembayaran. Maks 255 karakter.

Contoh: Kaos komunitas

external_idstringopsional

Nomor pesanan Anda sendiri. Disimpan, dikembalikan, dan bisa difilter di endpoint daftar — tidak mencegah duplikat: dua create dengan external_id sama adalah dua permintaan pembayaran. Hanya Idempotency-Key yang mencegah duplikat.

Contoh: ORD-1234

payerobjectopsional

Opsional name, email, dan phone (E.164).

merchant_refstringopsional

Referensi Anda sendiri, maks 64 karakter, dikembalikan dan bisa difilter di endpoint daftar. Tidak mencegah duplikat — mengulang dengan merchant_ref yang sama membuat permintaan pembayaran kedua. Kirim Idempotency-Key kalau Anda mau perlindungan retry.

Contoh: INV-2026-001

customerobjectopsional

Opsional name (maks 120), email, dan phone pelanggan yang membayar. Dikembalikan di respons dan webhook payment.paid; nama tampil di halaman pembayaran.

order_itemsarrayopsional

Maks 50 baris {name, price, quantity}, tampil di halaman pembayaran. Jumlah price×quantity harus sama dengan amount, jika tidak ditolak 422 — amount tetap menjadi acuan.

return_urlstringopsional

URL https, maks 2048 karakter. Setelah pembayaran berhasil, halaman checkout menampilkan tombol kembali ke toko dan mengarahkan ke sana dengan tambahan ?id=payreq_...&status=succeeded.

Contoh: https://toko.example/selesai

expires_in_minutesintegeropsional

Default 60, maksimum mengikuti konfigurasi akun.

Contoh: 60

POST /v1/transactions
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"
  }'
{
  "id": "payreq_9b2f...",
  "status": "pending",
  "currency": "IDR",
  "amount": 150000,
  "fee": 3000,
  "net": 147000,
  "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",
  "qris_string": "00020101021226670016COM.KASERA.WWW...6304A1B2",
  "payment_method": "QRIS",
  "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"
}