Send a full or partial refund against a POS transaction ID.
Refund a POS transaction using the transaction ID from Find the transaction. You can refund the full amount or part of it.
Endpoint
POST /unified-reporting/merchants/{merchantId}/transactions/{transactionId}/refund
Headers
| Header | Required | Value |
|---|---|---|
Authorization | Required | Bearer <access_token> |
Content-Type | Required | application/vnd.ni.unified-reporting.v1+json |
Accept | Required | application/vnd.ni.unified-reporting.v1+json |
Path parameters
| Parameter | Required | Description |
|---|---|---|
merchantId | Required | Your merchant reference, the same UUID as in the search. |
transactionId | Required | items[].id from the search response |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
amount.currencyCode | String | Required | ISO 4217 code. Must match the original transaction's currency. |
amount.value | Integer | Required | Amount to refund, in minor units: 100 is AED 1.00. No more than what is left to refund. |
Sample request
curl --request POST \
'https://api-gateway.sandbox.ngenius-payments.com/unified-reporting/merchants/<merchant_id>/transactions/<transaction_id>/refund' \
--header 'Authorization: Bearer <access_token>' \
--header 'Content-Type: application/vnd.ni.unified-reporting.v1+json' \
--header 'Accept: application/vnd.ni.unified-reporting.v1+json' \
--data '{
"amount": { "currencyCode": "AED", "value": 100 }
}'The response
A declined refund also returns HTTP 200Check
statusin the body, not the HTTP code.REFUNDEDmeans the refund went through;DECLINEDmeans it did not.
Refund succeeded
{
"id": "01a0145b-d208-7da4-a542-e2ef0fa6c848",
"channel": "POS",
"timestamp": "2026-08-18T10:12:37Z",
"type": "REFUND",
"status": "REFUNDED",
"amount": { "currencyCode": "AED", "value": 1000 },
"payment": {
"paymentMethod": "MASTERCARD",
"card": { "maskedPan": "XXXXXX******XXXX", "expiryDate": 3104 }
},
"identifiers": {
"rrn": "000000000XXX",
"merchantId": "00X0000000XX",
"terminalId": "XXXXXXXX"
},
"originalTransaction": { "id": "01a00f29-0e40-78d1-913f-19295181f8d8" }
}Refund declined
{
"id": "019fa776-5168-7d1f-9e94-fbbfcd7c0384",
"channel": "POS",
"type": "REFUND",
"status": "DECLINED",
"amount": { "currencyCode": "AED", "value": 100 },
"originalTransaction": { "id": "757d7d02-1905-467f-8b23-fb82d1bd6573" }
}A declined refund still gets its own id, different from the transaction you tried to refund.
| Field | Meaning |
|---|---|
id | The refund's own ID, whether it succeeded or was declined |
type | Always REFUND |
status | REFUNDED or DECLINED |
amount | The amount refunded, in minor units |
originalTransaction.id | The transaction you refunded |
Partial refunds
Send a refund for less than the original amount to make a partial refund. You can send further partial refunds against the same transaction until the full amount has been refunded. A refund for more than what is left fails. See Errors and troubleshooting.

