Accept or Reject a Refund
The OriginatorVASP calls this endpoint after reviewing a refund request. Use ACCEPT to provide the destination for the refund transfer, or REJECT and explain why the refund will not be accepted. GTR sends the result to the BeneficiaryVASP through REFUND_DECISION (callbackType: 22).
Required implementation role: OriginatorVASP
- Your role: OriginatorVASP
- Counterparty: BeneficiaryVASP
- Endpoint:
POST /api/verify/v3/refund/decision
Accept example
{
"refundBasicInfo": {"requestId": "beneficiary-exchange-550e8400-e29b-41d4-a716-446655440000"},
"refundDecision": {"decision": "ACCEPT"},
"refundAddress": {"address": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", "tag": ""},
"refundBlockchainInfo": {"network": "ETH", "ticker": "USDT"}
}
For ACCEPT, refundAddress.address, refundBlockchainInfo.network, and refundBlockchainInfo.ticker are mandatory. The BeneficiaryVASP must use this destination when executing the refund.
Reject example
{
"refundBasicInfo": {"requestId": "beneficiary-exchange-550e8400-e29b-41d4-a716-446655440000"},
"refundDecision": {
"decision": "REJECT",
"refundRejectReason": {
"rejectReasonType": "OTHER",
"rejectReason": "The requested asset and network are not supported for refunds"
}
}
}
For REJECT, include both the machine-readable rejectReasonType and a clear rejectReason. Valid reason types are UNIDENTIFIED_ORIGINATOR, ORIGINATOR_TRAVEL_RULE_INCOMPLETE, SCREENING_CHECK_TRIGGERED, and OTHER.
Parameters
| Field | Required | Description |
|---|---|---|
refundBasicInfo.requestId | Yes | Request ID received for the refund, maximum 128 characters. |
refundDecision.decision | Yes | ACCEPT or REJECT. CANCEL is reserved for the BeneficiaryVASP cancellation flow. |
refundDecision.refundRejectReason.rejectReasonType | For REJECT | Machine-readable rejection category, maximum 64 characters. |
refundDecision.refundRejectReason.rejectReason | For REJECT | Human-readable rejection reason, maximum 1,024 characters. |
refundAddress.address | For ACCEPT | Address to which the BeneficiaryVASP must return the assets, maximum 255 characters. |
refundAddress.tag | No | Destination tag or memo, maximum 64 characters. |
refundBlockchainInfo.network | For ACCEPT | Refund destination network, maximum 32 characters. Use a value from the Network List. |
refundBlockchainInfo.ticker | For ACCEPT | Refund asset ticker, maximum 64 characters. Use a value from the Ticker List. |
Only the recorded OriginatorVASP may submit the decision, and the request must still be pending.
cURL and response
curl --location --request POST '/api/verify/v3/refund/decision' \
--cert-type P12 --cert ./certificate.p12:'[CERTIFICATE_PASSWORD]' \
--header 'Authorization: Bearer [LOGIN_TOKEN]' \
--header 'Content-Type: application/json' \
--data-raw '[REQUEST_JSON]'
{"verifyStatus": 100000, "verifyMessage": "success", "data": null}
An accepted request remains pending until the BeneficiaryVASP notifies the refund transaction ID. A rejected request is terminal.
What happens next
After the OriginatorVASP submits its decision, the BeneficiaryVASP receives the Refund Decision callback. If the decision is ACCEPT, the BeneficiaryVASP executes the refund and submits its transaction ID.