Skip to main content

How do I check a payment's status?

Call GET /payment/{merchant_ref_id} with your own order ref. The response holds the latest status; paid (or completed in sandbox) means paid. Use it for reconciliation and when a webhook has not arrived, not as a replacement for webhooks.

This page was checked against the API code as of October 16, 2026.

Where do I send the request?#

GET/api/v1/gateway/payment/{merchant_ref_id}
Limit per minute:
30 requests per minute per API key
Signature:
Enhanced HMAC only

What does an example look like?#

cURL
curl https://sekalipay.com/api/v1/gateway/payment/ORDER-2026-00184 \
  -H "X-API-Key: $SEKALIPAY_API_KEY" \
  -H "Accept: application/json"
200 OK
{
  "status": true,
  "message": "OK",
  "data": {
    "merchant_ref_id": "ORDER-2026-00184",
    "invoice": "SPY1791446400K3QZ",
    "status": "paid",
    "amount": 150000,
    "fee": 1500,
    "total": 151500,
    "payment_code": "QRIS",
    "payment_link": "https://sekalipay.com/payment/SPY1791446400K3QZ",
    "qr_link": "https://sekalipay.com/payment/SPY1791446400K3QZ/qris",
    "virtual_account": null,
    "checkout_url": null,
    "payment_guide": null,
    "expired_at": "2026-10-08T08:30:00.000000Z",
    "created_at": "2026-10-08T08:00:00.000000Z",
    "paid_at": "2026-10-08T08:05:12.000000Z"
  }
}

What does the response contain?#

The fields match the create payment response without is_sandbox, plus two timestamps:

created_atstring
When the payment was created, ISO 8601 UTC.
paid_atstring | null
When it was paid, ISO 8601 UTC. null until paid.

What does each status mean?#

StatusMeaningWhat to do
pendingWaiting for payment.Wait for the webhook. Do not ship.
paidPaid (production).Fulfil the order.
completedPaid (sandbox simulation).Treat it exactly like paid.
canceledExpired without payment.Treat it as unpaid, but keep a path for it turning paid (see below).
failedPayment failed.If the buyer wants to try again, create a new payment with a different merchant_ref_id.

canceled is not always final

A payment the partner confirms shortly after the deadline is still accepted: the status goes back to paid and a paid webhook is sent. Do not delete orders or permanently release stock without a path for this case.

How often may I check?#

The limit is 30 requests per minute per API key, shared across all refs. Rely on webhooks; status checks are for periodic reconciliation and for when a webhook has not arrived a few minutes after the buyer returned to your site.

Which errors are specific to this endpoint?#

HTTPCodeMeaning
404PAYMENT_NOT_FOUNDNo payment with that merchant_ref_id exists on this account.
500INTERNAL_SERVER_ERRORAn error on our side; details are not sent. Retry, or contact support with the time and merchant_ref_id.
404 Not Found
{
  "status": false,
  "message": "PAYMENT_NOT_FOUND"
}

Ready to use your own keys?

Sign in to the merchant dashboard to copy your API key and secret key, set the access mode and webhook URL, and download a Postman collection with your account's keys.

Sign in to the dashboard