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. 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 |
| DANA | dana | redirect | Planned |
| OVO | ovo | redirect | Planned |
| ShopeePay | shopeepay | redirect | Planned |
| i.saku | isaku | redirect | Planned |
| Akulaku | akulaku | redirect | Private preview |
| Kredivo | kredivo | redirect | Private preview |
| Indodana | indodana | redirect | Private preview |
| 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 |
| E-wallet | customer.phone | Some wallets bind the payment to a number |
akulaku | customer.name, customer.email, customer.phone | The lender underwrites the buyer |
kredivo, indodana | The three above, plus customer.address | See PayLater |
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 and the eight Virtual Account banks above are live, and the PayLater lenders are in private preview; e-wallets 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.