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:
- return an accurate result for the request it received;
- avoid applying the same business action twice; and
- 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 endpoint | What the institution returns |
|---|---|
| The request was valid and the business action was accepted | HTTP 200 with the operation's accepted business status. |
| The request was valid but a business rule rejected the action | HTTP 200 with RJCT, a reason code, and a simple explanation. |
| The JSON envelope or required field was malformed | HTTP 400. Do not change account or financial state. |
| The signature, key, timestamp, or network identity was not trusted | HTTP 401 or 403. Do not change account or financial state. |
| The configured path does not exist | HTTP 404. |
| The same identifier arrived with different plaintext | HTTP 409, or the agreed protected RJCT result with DUPL. Do not process it. |
The media type was not application/json | HTTP 415. |
| The endpoint is temporarily limiting traffic | HTTP 429. |
| An unexpected server failure prevented a dependable result | HTTP 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."
}
}| Field | Meaning |
|---|---|
TxSts | Machine-readable result. RJCT means the requested business action did not complete. |
StsRsnInf | Object that explains the rejection. It is required when the status is RJCT. |
StsRsnInf.Orgtr.Nm | Name of the institution or component that made the decision. |
StsRsnInf.Rsn.Cd | Stable reason code that software can recognise. |
StsRsnInf.AddtlInf | A short, plain-English sentence explaining what was wrong. Do not expose protected data. |
Reason codes the institution can return
| Code | Plain meaning | When to return it |
|---|---|---|
MS05 | Invalid message ID | GrpHdr.MsgId has the wrong length or characters, contains an invalid time, uses the wrong sender code, or falls outside the permitted time window. |
MS03 | Unspecified technical rejection | An internal failure occurred or a more specific explanation cannot safely be returned. Keep the message ID in logs so both teams can investigate. |
FF01 | Invalid message structure | A required object or field is missing, has the wrong type, is malformed, or contains an unsupported value. |
RC01 | Incorrect routing institution | A member code does not identify the receiving or expected institution. |
DT01 | Invalid date or time | A required time is malformed, not UTC, too old, too far in the future, or inconsistent with another date field. |
AG01 | Signature verification failed | An institutional or customer-device signature is missing, invalid, untrusted, or does not match the exact plaintext. |
AG02 | Freshness check failed | x-timestamp is stale or outside the agreed clock-skew window. |
MD01 | Account link not found | Debit Authorization or Account Unlinking names an account link the institution cannot find. |
MD07 | Account link is not valid | The account link is cancelled, expired, inactive, mismatched, or otherwise cannot be used. |
BE17 | Creditor identifier mismatch | The creditor ID or scheme does not match the creditor stored with the account link. |
DUPL | Duplicate or conflicting request | An identifier was already used with different plaintext, or the request conflicts with stored state. Do not apply the action. |
NOOR | Original operation not found | Reverse names an original accepted debit the institution cannot find. |
AM09 | Reverse amount is wrong | The amount is zero, partial, or different from the full original debit amount. |
AM11 | Currency is wrong | The 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.
| Operation | Will Blinc retry it? | What the institution must implement |
|---|---|---|
| Account Linking | No | If 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 Unlinking | No | If 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 Authorization | No | After a timeout, expect Reverse with the original debit references. Do not expect Blinc to resend the debit. |
| Credit Notification | Yes | The same plaintext and business identifiers may arrive again. Return the stored result and do not record the notification twice. |
| Credit Transfer | Yes | The same plaintext and business identifiers may arrive again. Return the stored result and do not credit the account twice. |
| Reverse | Yes | The 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.
Updated 5 days ago