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.
| Permission | read-gateway |
| Idempotency | Not applicable — it reads |
| Answers | 200, or 404 |
Request
Section titled “Request”GET /v1/partners/payments/0f3c…Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxx-partner-signature: <hmac-sha256 of the raw body, hex>Response
Section titled “Response”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_…"}The statuses
Section titled “The statuses”status | is_final | Means |
|---|---|---|
pending | false | The customer has something to pay with and has not paid |
succeeded | true | Paid. The net is yours |
failed | true | The provider refused it. failure_code says why |
expired | true | Nobody 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.
Not yours answers 404
Section titled “Not yours answers 404”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