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

Endpoint and headers

Create an HTTPS POST endpoint and provide its complete URL to Blinc. For example:

https://sandbox.examplebank.com/blinc/reversal

Every 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

  1. Decrypt the body and verify the institutional signature headers.
  2. Validate the delivery timestamp, message creation time, message ID, and replay state.
  3. Find the original accepted debit using OrgnlMsgId and OrgnlEndToEndId.
  4. Confirm the message family identifies Debit Authorization.
  5. Compare the original amount, reversal amount, currency, settlement date, debtor, and creditor with the stored debit.
  6. Require a full reversal. Partial reversals are not part of this contract.
  7. If the same Reversal was already accepted, send the same outcome without returning the money a second time.
  8. If the identifiers were reused with different content, reject the request.
  9. Return the customer's money exactly once, record the outcome, then sign and encrypt the response.

Request field reference

JSON pathType / requiredMeaning and sourceConstruction, validation, and relationship
GrpHdrObject / RequiredHeader for this Reversal message. Blinc creates it.Contains the five fields below. Reject the whole request if the object is absent.
GrpHdr.MsgId35-digit text / RequiredUnique ID for this Reversal message.Build it using the documented sender-code, UTC timestamp, and sequence structure. Use it for duplicate detection.
GrpHdr.CreDtTmUTC date-time / RequiredTime Blinc created the readable Reversal message.Use canonical milliseconds and Z; it must agree with the timestamp inside MsgId.
GrpHdr.NbOfTxsInteger / RequiredNumber of reversals in the message.Must be 1 because TxInf contains one reversal.
GrpHdr.SttlmInfObject / RequiredDescribes the settlement route.Must contain SttlmMtd, ClrSys, and ClrChanl.
GrpHdr.SttlmInf.SttlmMtdText / RequiredBlinc 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.ClrSysObject / RequiredContainer naming the clearing system.Must contain Prtry.
GrpHdr.SttlmInf.ClrSys.PrtryText / RequiredProprietary clearing-system code.Must equal the agreed value, such as BLINC.
GrpHdr.SttlmInf.ClrChanlText / RequiredClearing 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.
OrgnlGrpInfObject / RequiredIdentifies the original Debit Authorization message.Both child fields must match the stored debit.
OrgnlGrpInf.OrgnlMsgIdText / RequiredExact GrpHdr.MsgId from the original debit. Blinc copies it.Do not trim or change it. Reject an unknown or mismatched value.
OrgnlGrpInf.OrgnlMsgNmIdText / RequiredNames the original message family.Must be pacs.003.001.11 for the documented Debit Authorization.
TxInfObject / RequiredReversal transaction details.Validate every child before changing a balance or ledger.
TxInf.OrgnlEndToEndIdText / RequiredEnd-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.OrgnlInstdAmtObject / RequiredAmount originally instructed for the debit.Contains Amt and Ccy; both must match the stored debit.
TxInf.OrgnlInstdAmt.AmtDecimal / RequiredOriginal debit amount in normal currency units.Must be positive and equal the stored instructed amount.
TxInf.OrgnlInstdAmt.CcyThree-letter text / RequiredCurrency of the original debit, for example NGN.Must be supported and equal the stored currency.
TxInf.RvsldIntrBkSttlmAmtObject / RequiredAmount to return through inter-institution settlement.Full reversal only; it must equal OrgnlInstdAmt.
TxInf.RvsldIntrBkSttlmAmt.AmtDecimal / RequiredNumeric amount to return.Must equal the original amount. Reject zero, negative, larger, or partial amounts.
TxInf.RvsldIntrBkSttlmAmt.CcyThree-letter text / RequiredCurrency to return.Must equal OrgnlInstdAmt.Ccy.
TxInf.IntrBkSttlmDtUTC date-time / RequiredSettlement date applied to the reversal.Use the canonical UTC form; validate against the permitted reversal settlement window.
TxInf.RvslRsnInfObject / RequiredExplains who requested the reversal and why.Must contain Orgtr, Rsn, and useful AddtlInf when the code alone is insufficient.
TxInf.RvslRsnInf.OrgtrObject / RequiredContainer identifying the reversal originator.Must contain Nm.
TxInf.RvslRsnInf.Orgtr.NmText / RequiredHuman-readable name of the party initiating the reversal.Use for audit; do not use the name alone for security decisions.
TxInf.RvslRsnInf.RsnObject / RequiredContainer for the reason the money must be returned.Must contain Cd.
TxInf.RvslRsnInf.Rsn.CdText / RequiredBlinc 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.AddtlInfText or null / OptionalPlain explanation that helps operations teams understand the reason.Do not place secrets or unnecessary personal data here.
TxInf.OrgnlTxRefObject / RequiredHuman-readable cross-check of the original parties.Contains debtor and creditor; both must match the stored debit.
TxInf.OrgnlTxRef.DbtrObject / RequiredOriginal customer/debtor.Must contain Nm; optional structured ID must match if supplied.
TxInf.OrgnlTxRef.Dbtr.NmText / RequiredCustomer name from the original debit.Compare according to institution policy; identifiers remain authoritative.
TxInf.OrgnlTxRef.CdtrObject / RequiredOriginal creditor.Must contain Nm; optional structured ID must match if supplied.
TxInf.OrgnlTxRef.Cdtr.NmText / RequiredCreditor 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 pathType / requiredMeaning and validation
GrpHdrObject / RequiredResponse header created by the institution.
GrpHdr.MsgId35-digit text / RequiredNew response message ID built with the institution member code. It must not reuse the request ID.
GrpHdr.CreDtTmUTC date-time / RequiredTime the response was created, in canonical UTC form.
GrpHdr.OrgnlMsgIdText / RequiredExact copy of this Reversal request's GrpHdr.MsgId.
GrpHdr.OrgnlMsgNmIdText / RequiredReversal message family: pacs.007.001.09.
TxInfAndStsObject / RequiredResult for the reversed transaction.
TxInfAndSts.OrgnlInstrIdText / RequiredInstruction ID from the original debit.
TxInfAndSts.OrgnlEndToEndIdText / RequiredEnd-to-end ID from the original debit and Reversal request.
TxInfAndSts.OrgnlTxIdText / RequiredTransaction ID from the original debit.
TxInfAndSts.TxStsText / RequiredThe institution returns ACSC only after returning the full original debit once, or RJCT when no reversal was completed. There is no automatic default.
TxInfAndSts.StsRsnInfObject or null / Conditionalnull on success; required on rejection.
...StsRsnInf.Orgtr.NmText / ConditionalInstitution/component that rejected the Reversal.
...StsRsnInf.Rsn.CdText / ConditionalStable reason code such as NOOR, AM09, AM11, or DUPL that explains why the money was not returned.
...StsRsnInf.AddtlInfText / ConditionalSimple cause and correction without protected data.
TxInfAndSts.SplmtryDataObject / RequiredContainer for agreed response references.
...SplmtryData.PlcAndNmText / RequiredLabel AdditionalDetails.
...SplmtryData.EnvlpObject / RequiredContainer for CustomParam.
...Envlp.CustomParamObject or null / OptionalAgreed name/value references; do not place secrets here.
...CustomParam.ReversalReferenceText / ConditionalInstitution-generated posting reference used for reconciliation.

Common mistakes

MistakeCorrect behaviour
Creating a new credit when the original debit cannot be foundReturn RJCT with NOOR; never guess the original transaction.
Accepting a partial amountReturn RJCT with AM09; this contract supports full reversal only.
Returning money twice after a timeoutFind the original Reversal and send its earlier outcome without returning the money again.
Comparing only the end-to-end IDAlso 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.


Did this page help you?