Reversal: return an accepted debit
Return the customer's money when a debit cannot be completed.
Reversal returns the customer's money when a debit cannot be completed. The institution must first find an accepted original debit, confirm that every reference and amount matches, and check that the debit has not already been reversed.
Before you begin
- Implement Secure every request and response.
- Follow Format identifiers and date-times.
- Read Understand common payment fields.
- Read Understand code values.
- Store accepted debits by message, instruction, end-to-end, transaction, and clearing references.
- Store the original amount, currency, parties, settlement date, and reversal state.
Endpoint and headers
Create an HTTPS POST endpoint and provide its complete URL to Blinc. For example:
https://sandbox.examplebank.com/blinc/reversalEvery request must contain Content-Type: application/json, Accept: application/json, x-timestamp, and x-signature. Every response, including a business rejection, must contain Content-Type: application/json, x-timestamp, and x-signature. See Secure every request and response for what each header protects and how to validate it. Decrypt first, then verify the signature against the exact recovered plaintext.
Decrypted request
{
"GrpHdr": {
"MsgId": "00000120260817140000000000000000050",
"CreDtTm": "2026-08-17T14:00:00.000Z",
"NbOfTxs": 1,
"SttlmInf": {
"SttlmMtd": "CLRG",
"ClrSys": {
"Prtry": "NIP"
},
"ClrChanl": "RTNS"
}
},
"OrgnlGrpInf": {
"OrgnlMsgId": "00000120260817101530123000000000001",
"OrgnlMsgNmId": "pacs.003.001.11"
},
"TxInf": {
"OrgnlEndToEndId": "DD-E2E-0001",
"OrgnlInstdAmt": {
"Amt": 1500.0,
"Ccy": "NGN"
},
"RvsldIntrBkSttlmAmt": {
"Amt": 1500.0,
"Ccy": "NGN"
},
"IntrBkSttlmDt": "2026-08-17T14:00:00.000Z",
"RvslRsnInf": {
"Orgtr": {
"Nm": "Blinc"
},
"Rsn": {
"Cd": "TECH"
},
"AddtlInf": "Debit Authorization response was not received within the timeout window."
},
"OrgnlTxRef": {
"Dbtr": {
"Nm": "Ada Okafor",
"Id": {
"Othr": {
"Id": "12345678901",
"SchmeNm": {
"Cd": "BVN"
}
}
}
},
"Cdtr": {
"Nm": "Example Store",
"Id": {
"Othr": {
"Id": "CREDITOR-001",
"SchmeNm": {
"Cd": "BLINC"
}
}
}
}
}
}
}Return the money safely
- Decrypt the body and verify the institutional signature headers.
- Validate the delivery timestamp, message creation time, message ID, and replay state.
- Find the original accepted debit using
OrgnlMsgIdandOrgnlEndToEndId. - Confirm the message family identifies Debit Authorization.
- Compare the original amount, reversal amount, currency, settlement date, debtor, and creditor with the stored debit.
- Require a full reversal. Partial reversals are not part of this contract.
- If the same Reversal was already accepted, send the same outcome without returning the money a second time.
- If the identifiers were reused with different content, reject the request.
- Return the customer's money exactly once, record the outcome, then sign and encrypt the response.
Request field reference
| JSON path | Type / required | Meaning and source | Construction, validation, and relationship |
|---|---|---|---|
GrpHdr | Object / Required | Header for this Reversal message. Blinc creates it. | Contains the five fields below. Reject the whole request if the object is absent. |
GrpHdr.MsgId | 35-digit text / Required | Unique ID for this Reversal message. | Build it using the documented sender-code, UTC timestamp, and sequence structure. Use it for duplicate detection. |
GrpHdr.CreDtTm | UTC date-time / Required | Time Blinc created the readable Reversal message. | Use canonical milliseconds and Z; it must agree with the timestamp inside MsgId. |
GrpHdr.NbOfTxs | Integer / Required | Number of reversals in the message. | Must be 1 because TxInf contains one reversal. |
GrpHdr.SttlmInf | Object / Required | Describes the settlement route. | Must contain SttlmMtd, ClrSys, and ClrChanl. |
GrpHdr.SttlmInf.SttlmMtd | Text / Required | Blinc sends the settlement method. CLRG means the Reversal uses the agreed clearing system. | The documented Reversal value is CLRG. Validate it rather than filling it in when absent. |
GrpHdr.SttlmInf.ClrSys | Object / Required | Container naming the clearing system. | Must contain Prtry. |
GrpHdr.SttlmInf.ClrSys.Prtry | Text / Required | Proprietary clearing-system code. | Must equal the agreed value, such as BLINC. |
GrpHdr.SttlmInf.ClrChanl | Text / Required | Clearing route for the Reversal. RTNS means real-time processing with net settlement. Blinc sends it. | Core Switch sends RTNS for Reversal. Validate it and never infer a missing value. |
OrgnlGrpInf | Object / Required | Identifies the original Debit Authorization message. | Both child fields must match the stored debit. |
OrgnlGrpInf.OrgnlMsgId | Text / Required | Exact GrpHdr.MsgId from the original debit. Blinc copies it. | Do not trim or change it. Reject an unknown or mismatched value. |
OrgnlGrpInf.OrgnlMsgNmId | Text / Required | Names the original message family. | Must be pacs.003.001.11 for the documented Debit Authorization. |
TxInf | Object / Required | Reversal transaction details. | Validate every child before changing a balance or ledger. |
TxInf.OrgnlEndToEndId | Text / Required | End-to-end ID of the original debit. | Must exactly equal the stored debit value and remain unchanged when Blinc delivers the same Reversal request again. |
TxInf.OrgnlInstdAmt | Object / Required | Amount originally instructed for the debit. | Contains Amt and Ccy; both must match the stored debit. |
TxInf.OrgnlInstdAmt.Amt | Decimal / Required | Original debit amount in normal currency units. | Must be positive and equal the stored instructed amount. |
TxInf.OrgnlInstdAmt.Ccy | Three-letter text / Required | Currency of the original debit, for example NGN. | Must be supported and equal the stored currency. |
TxInf.RvsldIntrBkSttlmAmt | Object / Required | Amount to return through inter-institution settlement. | Full reversal only; it must equal OrgnlInstdAmt. |
TxInf.RvsldIntrBkSttlmAmt.Amt | Decimal / Required | Numeric amount to return. | Must equal the original amount. Reject zero, negative, larger, or partial amounts. |
TxInf.RvsldIntrBkSttlmAmt.Ccy | Three-letter text / Required | Currency to return. | Must equal OrgnlInstdAmt.Ccy. |
TxInf.IntrBkSttlmDt | UTC date-time / Required | Settlement date applied to the reversal. | Use the canonical UTC form; validate against the permitted reversal settlement window. |
TxInf.RvslRsnInf | Object / Required | Explains who requested the reversal and why. | Must contain Orgtr, Rsn, and useful AddtlInf when the code alone is insufficient. |
TxInf.RvslRsnInf.Orgtr | Object / Required | Container identifying the reversal originator. | Must contain Nm. |
TxInf.RvslRsnInf.Orgtr.Nm | Text / Required | Human-readable name of the party initiating the reversal. | Use for audit; do not use the name alone for security decisions. |
TxInf.RvslRsnInf.Rsn | Object / Required | Container for the reason the money must be returned. | Must contain Cd. |
TxInf.RvslRsnInf.Rsn.Cd | Text / Required | Blinc sends why the Reversal is required: CUST customer request, DUPL duplicate debit, TECH technical problem, or FRAD suspected fraud. | The documented timeout-recovery example uses TECH. Validate the supplied code; do not default from AddtlInf. |
TxInf.RvslRsnInf.AddtlInf | Text or null / Optional | Plain explanation that helps operations teams understand the reason. | Do not place secrets or unnecessary personal data here. |
TxInf.OrgnlTxRef | Object / Required | Human-readable cross-check of the original parties. | Contains debtor and creditor; both must match the stored debit. |
TxInf.OrgnlTxRef.Dbtr | Object / Required | Original customer/debtor. | Must contain Nm; optional structured ID must match if supplied. |
TxInf.OrgnlTxRef.Dbtr.Nm | Text / Required | Customer name from the original debit. | Compare according to institution policy; identifiers remain authoritative. |
TxInf.OrgnlTxRef.Cdtr | Object / Required | Original creditor. | Must contain Nm; optional structured ID must match if supplied. |
TxInf.OrgnlTxRef.Cdtr.Nm | Text / Required | Creditor name from the original debit. | Must correspond to the stored original transaction. |
Response
Return the common signed and encrypted payment response. Use a new 35-digit response GrpHdr.MsgId, copy the request ID into GrpHdr.OrgnlMsgId, and copy the original debit references into TxInfAndSts.
{
"GrpHdr": {
"MsgId": "00000120260816103001000000000000103",
"CreDtTm": "2026-08-16T10:30:01.000Z",
"OrgnlMsgId": "12345620260816103000000000000000004",
"OrgnlMsgNmId": "pacs.007.001.09"
},
"TxInfAndSts": {
"OrgnlInstrId": "DD-INSTR-0001",
"OrgnlEndToEndId": "DD-E2E-0001",
"OrgnlTxId": "DD-TX-0001",
"TxSts": "ACSC",
"StsRsnInf": null,
"SplmtryData": {
"PlcAndNm": "AdditionalDetails",
"Envlp": { "CustomParam": { "ReversalReference": "REV-POST-0001" } }
}
}
}ACSC means the reversal was accepted and recorded. RJCT means it was rejected. On rejection, populate StsRsnInf.Orgtr.Nm, StsRsnInf.Rsn.Cd, and StsRsnInf.AddtlInf with the decision owner, stable reason code, and corrective explanation. Every Orgnl... response field must identify the request or original debit it names; never generate replacement original IDs.
| Response path | Type / required | Meaning and validation |
|---|---|---|
GrpHdr | Object / Required | Response header created by the institution. |
GrpHdr.MsgId | 35-digit text / Required | New response message ID built with the institution member code. It must not reuse the request ID. |
GrpHdr.CreDtTm | UTC date-time / Required | Time the response was created, in canonical UTC form. |
GrpHdr.OrgnlMsgId | Text / Required | Exact copy of this Reversal request's GrpHdr.MsgId. |
GrpHdr.OrgnlMsgNmId | Text / Required | Reversal message family: pacs.007.001.09. |
TxInfAndSts | Object / Required | Result for the reversed transaction. |
TxInfAndSts.OrgnlInstrId | Text / Required | Instruction ID from the original debit. |
TxInfAndSts.OrgnlEndToEndId | Text / Required | End-to-end ID from the original debit and Reversal request. |
TxInfAndSts.OrgnlTxId | Text / Required | Transaction ID from the original debit. |
TxInfAndSts.TxSts | Text / Required | The institution returns ACSC only after returning the full original debit once, or RJCT when no reversal was completed. There is no automatic default. |
TxInfAndSts.StsRsnInf | Object or null / Conditional | null on success; required on rejection. |
...StsRsnInf.Orgtr.Nm | Text / Conditional | Institution/component that rejected the Reversal. |
...StsRsnInf.Rsn.Cd | Text / Conditional | Stable reason code such as NOOR, AM09, AM11, or DUPL that explains why the money was not returned. |
...StsRsnInf.AddtlInf | Text / Conditional | Simple cause and correction without protected data. |
TxInfAndSts.SplmtryData | Object / Required | Container for agreed response references. |
...SplmtryData.PlcAndNm | Text / Required | Label AdditionalDetails. |
...SplmtryData.Envlp | Object / Required | Container for CustomParam. |
...Envlp.CustomParam | Object or null / Optional | Agreed name/value references; do not place secrets here. |
...CustomParam.ReversalReference | Text / Conditional | Institution-generated posting reference used for reconciliation. |
Common mistakes
| Mistake | Correct behaviour |
|---|---|
| Creating a new credit when the original debit cannot be found | Return RJCT with NOOR; never guess the original transaction. |
| Accepting a partial amount | Return RJCT with AM09; this contract supports full reversal only. |
| Returning money twice after a timeout | Find the original Reversal and send its earlier outcome without returning the money again. |
| Comparing only the end-to-end ID | Also compare original message, amount, currency, settlement, and party references. |
Test before certification
- An accepted original debit reverses once and returns
ACSC. - The same Reversal request delivered again returns the earlier outcome without returning the money a second time.
- Unknown, rejected, cancelled, or already reversed debit returns
RJCT. - Mismatched amount, currency, parties, message family, or identifiers returns
RJCT. - A partial amount returns
RJCT. - Invalid encryption, signature, timestamp, or replay state fails before any ledger change.
Next
If the institution is a payment facilitator receiving successful-credit notifications, continue with Notify the payment facilitator about a successful credit. If you are an acquiring institution that sends money to beneficiaries, continue with Send money to a beneficiary. Otherwise, go to Return clear errors and handle repeated deliveries.
Updated 5 days ago