Direct API

E-wallet

Send the buyer to the provider, and take them back when it is done.

Not live yet. This is the shape e-wallet will ship with, published now so you can build against it. A create naming one of these codes today is refused 422 payment_method_unavailable.

The buyer leaves your page, approves in the provider's app or web flow, and returns to your return_url. Paylater uses the same redirect shape and the same integration, but is deferred behind the wallets — it needs the most buyer data of any method, and the least is settled about it.

Integration steps

  1. Create the payment request.
  2. Send the buyer to payment.redirect_url.
  3. Acknowledge the payment — the payment.paid webhook.
  4. Check status when you need certainty: GET /v1/transactions/:id.

Codes

CodeProviderFamily
danaDANAE-wallet
ovoOVOE-wallet
shopeepayShopeePayE-wallet
isakui.sakuE-wallet
akulakuAkulakuPaylater — later
kredivoKredivoPaylater — later
indodanaIndodanaPaylater — later

1. Create the payment request

return_url matters more here than anywhere else: it is where the provider drops the buyer when they are finished.

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": ["dana"],
    "return_url": "https://toko.example/selesai"
  }'
{
  "id": "payreq_9b2f...",
  "status": "pending",
  "payment_method": "dana",
  "payment": {
    "type": "redirect",
    "redirect_url": "https://link.dana.id/pay/...",
    "display_name": "DANA"
  },
  "expires_at": "2026-08-27T13:00:00+07:00"
}

2. Send the buyer there

Navigate the browser to payment.redirect_url. Do not open it in an iframe or a popup — the providers block framing, and a popup is the first thing a mobile browser eats. Save your order state before you navigate; you are handing the page away.

3. Acknowledge the payment

The buyer coming back to return_url is navigation, not proof — they can land there by closing the provider's page. Fulfil on the payment.paid webhook. This is the shape where getting that wrong is easiest, because the return looks so much like success.

4. Check status

On return, retrieve the request server-side before you show the buyer anything final. A buyer who abandoned the provider's page returns to the same URL as one who paid.