Retrieve a single payment by its unique ID. Only Bearer token authentication is required — this endpoint is not signed.
Read the status from the body, not the HTTP code. A payment that exists always returns
200, whether it succeeded or failed. The outcome is inresult.paymentStatus; treating200as success will mark declined payments as paid. (404means no payment with that id.)
The payment is wrapped in a result object.
| Field | Meaning |
|---|---|
{id} / result.id | The payment's internal UID — the value this endpoint is keyed on |
result.reference | Your own merchant-side id, e.g. TXN-… |
| Field | Present when |
|---|---|
errorMessage | FAILED (not guaranteed — see below) |
settled_crypto_amount | COMPLETED |
crypto_tx_hash | COMPLETED |
destination_wallet | COMPLETED |
On FAILED, errorMessage carries the reason relayed from the payment processor. Numeric processor codes are translated to human-readable text before storage — for example 4004 becomes an insufficient-balance message, 4001 a CVV error, and 4018 "Payment was canceled by the user". Reasons that arrive without a code pass through verbatim, such as "Payment not funded", which means the order was created but never funded.
errorMessage is not guaranteed on every failure. Do not branch on its presence: the reliable "funds were not delivered" signal is paymentStatus: FAILED together with no crypto_tx_hash. Treat errorMessage as a human-readable explanation, not as a machine-readable status.
Two things here are deliberate, not typos — match them exactly:
- Casing is mixed. camelCase for
paymentStatus,paymentType,paymentMethod,cryptoAmount,cryptoCurrency,errorMessageandbillingAddress; snake_case forcrypto_fx,settled_crypto_amount,crypto_tx_hashanddestination_wallet(andtimezone_typeinsidecreated). - The two crypto amounts have different types.
cryptoAmountis a string ("53.36000000") whilesettled_crypto_amountis a number (53.35). Parse each accordingly rather than assuming one shape.
- https://api.napoleonpay.comhttps://api.napoleonpay.com/api/v1/payments/{id}
curl -i -X GET \
'https://api.napoleonpay.com/api/v1/payments/{id}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>'{ "result": { "id": "0199aaaa-bbbb-7ccc-dddd-eeeeffff0001", "paymentStatus": "FAILED", "created": { … }, "paymentType": "DEPOSIT", "description": "Deposit TXN-SAMPLE0000000000000001", "paymentMethod": "USER_CHOICE", "reference": "TXN-SAMPLE0000000000000001", "amount": 57.3, "cryptoAmount": "53.36000000", "cryptoCurrency": "USDC", "currency": "USD", "customer": { … }, "billingAddress": { … }, "errorMessage": "Payment not funded", "crypto_fx": 1.07383808 } }