Payment methods
Overview
Every method, its code, the shape it takes, and whether it is live.
A method is identified by its code — qris, va_bca, card. That is the string you send and the string you get back. Every live method works through Direct API and on Kasera Pay Checkout alike.
| Method | Code | payment.type | Status |
|---|---|---|---|
| QRIS | qris | qr | Live |
| BCA Virtual Account | va_bca | payment_code | Live |
| BRI Virtual Account | va_bri | payment_code | Live |
| BNI Virtual Account | va_bni | payment_code | Live |
| Mandiri Virtual Account | va_mandiri | payment_code | Live |
| Permata Virtual Account | va_permata | payment_code | Live |
| CIMB Niaga Virtual Account | va_cimb | payment_code | Live |
| Danamon Virtual Account | va_danamon | payment_code | Live |
| Maybank Virtual Account | va_maybank | payment_code | Live |
| Visa, Mastercard, JCB, Amex | card | redirect | Live |
| DANA | dana | redirect | Planned |
| OVO | ovo | redirect | Planned |
| ShopeePay | shopeepay | redirect | Planned |
| i.saku | isaku | redirect | Planned |
| Akulaku | akulaku | redirect | Later |
| Kredivo | kredivo | redirect | Later |
| Indodana | indodana | redirect | Later |
| Alfamart | alfamart | payment_code | Planned |
| Indomaret | indomaret | payment_code | Planned |
GET /v1/payment_methods returns this list scoped to your account, with the amount range, the buyer details each method requires, and each method's fee — percent in basis points plus a flat rupiah amount, e.g. {"percent_bps": 70, "flat": 250} for QRIS. Read it rather than hard-coding the codes or the rates — a method can be enabled, suspended or repriced without a release on your side.
What each method needs about the buyer
Nothing about the buyer is required on a create. What a method needs, it needs at payment time — so either you send it in customer, or the checkout page asks the buyer for it.
| Method | Requires | Why |
|---|---|---|
qris | — | A QR carries no identity |
va_* | customer.name | The name shown on the buyer's banking app |
card | customer.email | 3-D Secure and the receipt |
| E-wallet | customer.phone | Some wallets bind the payment to a number |
On Direct API there is no page to ask, so a create naming a method whose required field is missing is rejected 422 with the field named. On Checkout the customer step collects whatever is missing — so it is only an error there if you dropped that step from checkout.steps as well.
Choosing which methods to offer
A create takes payment_methods — an array of codes, the methods this one payment may be paid with. It narrows what the buyer is offered; it can never widen it beyond what your account has enabled.
{
"amount": 150000,
"external_id": "ORD-1234",
"payment_methods": ["va_bca", "va_bri", "qris"]
}- Omitted — every method enabled on your account is offered.
- One code — that method, no picker. Direct API gets its
paymentobject straight away. - Several codes — a picker with those, in the order you sent them.
The response reports the outcome in the singular: payment_method is one code, never null — stamped at create with the first code you offered, and updated to the one the buyer actually picks.
qris, the eight Virtual Account banks above and card are live; e-wallets and paylater are not. A create naming a code that does not exist, or one an admin has switched off — yours or Kasera's — is refused 422 payment_method_unavailable, so read GET /v1/payment_methods rather than hard-coding the list.