Payment requests

List requests

List payment requests, newest first, with cursor paging.

GET/v1/transactions

Query parameters

limitintegeroptional

Items per page, 1–100 (default 20). Anything else — over 100, zero, negative, or not a number at all — is quietly replaced by the default 20 rather than refused, so a limit you did not mean costs you rows per request instead of an error.

Example: 20

starting_afterstringoptional

The last payreq_* id you saw, for the next page. Do not combine paging with the filters below: has_more answers for the query, not for what survived the filter, so a filtered page can come back empty with has_more: true — and the cursor is the last id in data, which an empty page does not give you. Page unfiltered and filter on your side.

statusstringoptional

Filter by status. Every filter here applies only to the page that was fetched, so a filtered list reaches back at most limit records — it is not a search over your history. To cover everything, page unfiltered and filter on your side.

Example: succeeded

external_idstringoptional

Filter by order number. Page-only, like status.

merchant_refstringoptional

Filter by your own reference. Page-only, like status.

created_after, created_beforestringoptional

Time range (RFC3339), half-open: created_after includes a request created exactly on the bound, created_before excludes it, so consecutive windows never drop nor duplicate one. Page-only, like status. A value that is not RFC3339 is refused with 422 invalid_filter rather than ignored — send 2026-08-11T00:00:00+07:00, not 2026-08-11.

GET /v1/transactions
curl "https://pay.kasera.id/v1/transactions?limit=20&status=succeeded" \
  -H "Authorization: Bearer kp_live_..."
{
  "data": [
    {
      "id": "payreq_9b2f...",
      "livemode": true,
      "status": "pending",
      "currency": "IDR",
      "amount": 150000,
      "fee": 1300,
      "net": 148700,
      "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",
      "payment_method": "qris",
      "payment": {
        "type": "qr",
        "qr_string": "00020101021226670016COM.KASERA.WWW...6304A1B2"
      },
      "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"
    }
  ],
  "has_more": false
}