Skip to content

Payment detail

GET /v1/partners/payments/{id}

One payment, as it stands right now. Poll this when a webhook has not arrived and you need to know.

Permissionread-gateway
IdempotencyNot applicable — it reads
Answers200, or 404
GET /v1/partners/payments/0f3c…
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx
x-partner-signature: <hmac-sha256 of the raw body, hex>

The same shape the create call returned, with the current status.

{
"data": {
"id": "0f3c…",
"reference": "INV-2026-0912",
"status": "succeeded",
"is_final": true,
"method": "virtual_account",
"amount": "100000.0000",
"net_amount": "96000.0000",
"fee": "4000.0000",
"currency": "IDR",
"payment_code": "888801000157508",
"expires_at": "2026-09-04T07:00:00.000Z",
"created_at": "2026-09-03T07:00:00.000Z",
"finalized_at": "2026-09-03T07:20:00.000Z"
},
"request_id": "req_…"
}
statusis_finalMeans
pendingfalseThe customer has something to pay with and has not paid
succeededtruePaid. The net is yours
failedtrueThe provider refused it. failure_code says why
expiredtrueNobody paid in time. Nothing went wrong

Branch on is_final rather than on the list of statuses. A status added later would be terminal without your code knowing the word, and is_final is what tells you to stop polling.

An expiry is confirmed by the provider where possible and swept by Moria where it is not, so expires_at is a deadline you can act on rather than a hint.

Another partner’s id answers 404, not 403 — whether an id exists somewhere in Moria is not something worth leaking. The same applies to an id that never existed.

  • Webhooks — so you stop needing to poll
  • List payments — when the question is about a period rather than an id