Return clear errors and handle repeated deliveries

Return clear business results and prevent duplicate processing when Blinc delivers an eligible operation again.

The institution never calls a Blinc operation endpoint. Blinc calls the institution's endpoint, and the institution returns one protected response to that call.

The institution does not schedule retries or decide whether Blinc should try again. It only needs to:

  1. return an accurate result for the request it received;
  2. avoid applying the same business action twice; and
  3. keep enough records to recognise an earlier request if Blinc delivers it again.

Return an HTTP result and a business result

These two results answer different questions:

  • The HTTP status says whether the institution's endpoint could receive and understand the protected request.
  • The encrypted business status says whether the requested account or payment action was accepted.

For example, return HTTP 200 with business status RJCT when the protected request was valid but the account link did not exist. Do not use HTTP 500 for a normal business rejection.

What happened inside the institution endpointWhat the institution returns
The request was valid and the business action was acceptedHTTP 200 with the operation's accepted business status.
The request was valid but a business rule rejected the actionHTTP 200 with RJCT, a reason code, and a simple explanation.
The JSON envelope or required field was malformedHTTP 400. Do not change account or financial state.
The signature, key, timestamp, or network identity was not trustedHTTP 401 or 403. Do not change account or financial state.
The configured path does not existHTTP 404.
The same identifier arrived with different plaintextHTTP 409, or the agreed protected RJCT result with DUPL. Do not process it.
The media type was not application/jsonHTTP 415.
The endpoint is temporarily limiting trafficHTTP 429.
An unexpected server failure prevented a dependable resultHTTP 5xx. Do not claim the business action failed if it may already have completed.

Even an error response must not reveal private keys, decrypted payloads, institutional or customer signatures, or unnecessary customer data.

Return a business rejection

When a valid protected request fails a business rule, return RJCT and explain the decision:

{
  "TxSts": "RJCT",
  "StsRsnInf": {
    "Orgtr": { "Nm": "Example Issuer" },
    "Rsn": { "Cd": "MD01" },
    "AddtlInf": "The account-linking ID was not found."
  }
}
FieldMeaning
TxStsMachine-readable result. RJCT means the requested business action did not complete.
StsRsnInfObject that explains the rejection. It is required when the status is RJCT.
StsRsnInf.Orgtr.NmName of the institution or component that made the decision.
StsRsnInf.Rsn.CdStable reason code that software can recognise.
StsRsnInf.AddtlInfA short, plain-English sentence explaining what was wrong. Do not expose protected data.

Reason codes the institution can return

CodePlain meaningWhen to return it
MS05Invalid message IDGrpHdr.MsgId has the wrong length or characters, contains an invalid time, uses the wrong sender code, or falls outside the permitted time window.
MS03Unspecified technical rejectionAn internal failure occurred or a more specific explanation cannot safely be returned. Keep the message ID in logs so both teams can investigate.
FF01Invalid message structureA required object or field is missing, has the wrong type, is malformed, or contains an unsupported value.
RC01Incorrect routing institutionA member code does not identify the receiving or expected institution.
DT01Invalid date or timeA required time is malformed, not UTC, too old, too far in the future, or inconsistent with another date field.
AG01Signature verification failedAn institutional or customer-device signature is missing, invalid, untrusted, or does not match the exact plaintext.
AG02Freshness check failedx-timestamp is stale or outside the agreed clock-skew window.
MD01Account link not foundDebit Authorization or Account Unlinking names an account link the institution cannot find.
MD07Account link is not validThe account link is cancelled, expired, inactive, mismatched, or otherwise cannot be used.
BE17Creditor identifier mismatchThe creditor ID or scheme does not match the creditor stored with the account link.
DUPLDuplicate or conflicting requestAn identifier was already used with different plaintext, or the request conflicts with stored state. Do not apply the action.
NOOROriginal operation not foundReverse names an original accepted debit the institution cannot find.
AM09Reverse amount is wrongThe amount is zero, partial, or different from the full original debit amount.
AM11Currency is wrongThe currency differs from the original transaction or from the supported account or settlement currency.

Know which requests Blinc may deliver again

This table explains what may arrive at the institution endpoint. The institution does not initiate any of these retries.

OperationWill Blinc retry it?What the institution must implement
Account LinkingNoIf no response reaches Blinc, the customer starts again and a new request arrives with new identifiers. An unexpected duplicate must not create a second account link.
Account UnlinkingNoIf no response reaches Blinc, the customer starts again and a new request arrives with new identifiers. An unexpected duplicate must not change the account link twice.
Debit AuthorizationNoAfter a timeout, expect Reverse with the original debit references. Do not expect Blinc to resend the debit.
Credit NotificationYesThe same plaintext and business identifiers may arrive again. Return the stored result and do not record the notification twice.
Credit TransferYesThe same plaintext and business identifiers may arrive again. Return the stored result and do not credit the account twice.
ReverseYesThe same plaintext and business identifiers may arrive again. Return the stored result and do not return the funds twice.

For Credit Notification, Credit Transfer, and Reverse, Blinc creates a fresh HTTP delivery timestamp, signature, and encryption. The readable business message and business identifiers stay the same.

The institution must store enough information to tell these cases apart:

  • same permitted delivery again: same identifiers and same plaintext; return the stored result without another business action;
  • conflicting duplicate: same identifier but different plaintext; reject it without processing;
  • new customer action or instruction: new identifiers; validate and process it normally.

Handle a Reverse after a Debit Authorization timeout

Blinc does not resend a timed-out Debit Authorization. It sends Reverse with the original debit references:

Blinc sends Debit Authorization
        |
        v
No dependable response reaches Blinc
        |
        v
Blinc sends Reverse with the original debit references
        |
        +-- accepted debit exists --> return the full amount once
        |
        +-- no accepted debit exists --> return `RJCT` with `NOOR`

Store the original debit references even when the connection closes before the response is delivered. Never create a debit while processing Reverse.

Log safely

Log the operation name, safe correlation and message IDs, outcome code, validation stage, HTTP status, and duration. For the three operations Blinc may retry, also log the delivery attempt or duplicate outcome. Do not log private keys, institutional or customer signatures, decrypted bodies, or full customer and account identifiers.

Next

Prove the institution endpoints work by following Certify the integration.


Did this page help you?