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?#
/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 https://sekalipay.com/api/v1/gateway/payment/ORDER-2026-00184 \
-H "X-API-Key: $SEKALIPAY_API_KEY" \
-H "Accept: application/json"{
"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.
nulluntil paid.
What does each status mean?#
| Status | Meaning | What to do |
|---|---|---|
pending | Waiting for payment. | Wait for the webhook. Do not ship. |
paid | Paid (production). | Fulfil the order. |
completed | Paid (sandbox simulation). | Treat it exactly like paid. |
canceled | Expired without payment. | Treat it as unpaid, but keep a path for it turning paid (see below). |
failed | Payment 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?#
| HTTP | Code | Meaning |
|---|---|---|
| 404 | PAYMENT_NOT_FOUND | No payment with that merchant_ref_id exists on this account. |
| 500 | INTERNAL_SERVER_ERROR | An error on our side; details are not sent. Retry, or contact support with the time and merchant_ref_id. |
{
"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
