Appearance
SEPA Recalls & RROs
In some situations (technical errors, fraud, human errors, etc.) the originator of a SEPA Credit Transfer (SCT) can ask to reverse the transfer.
The requests have different names depending on the requesting entity:
- RROs (initiated by the end user) – Must be requested within 13 months after the SCT.
- Recalls (initiated by the banking institution) – Must be requested within 10 open banking days after the SCT (or 13 months in case of
FRAUD
).
Treezor allows you to:
- Receive recalls when you unduly received funds.
- Emit recalls when you unduly sent funds.
Types of Recalls (reasonCode
)
When receiving or emitting a Recall, it can be any of the following types.
reasonCode | For | Description |
---|---|---|
DUPL | Recalls | Duplicate payment |
TECH | Recalls | Technical problem |
FRAD | Recalls | Fraudulent origin (these are not subject to a webhook as they are fully analyzed by Treezor) |
CUST | RROs | Customer's reason |
AM09 | RROs | Wrong amount |
AC03 | RROs | Invalid creditor account number |
Types of Recall Rejection (negativeResponseReasonCode
)
When rejecting a Recall, the reason may be any of the following.
negativeResponseReasonCode | Description |
---|---|
NOOR | The associated transaction (SCTR/SCTR Inst) was not received |
ARDT | The associated transaction has already been returned |
AC04 | The associated account is closed |
NOAS | The beneficiary didn't answer (neither accepted nor declined) |
CUST | The beneficiary rejected the recall |
AM04 | The beneficiary has insufficient funds |
LEGL | Legal decision (regulatory rules) |
Information – Beneficiary obligation to return the funds
Article 1376 of the French Civil Code states that in case of an error, the beneficiary is obligated to return the funds (i.e., accept the recall request). If the beneficiary rejects the Recall, they engage their own legal responsibility.
Receiving SCTR Recalls
SCTR Recalls are first analyzed by Treezor upon reception, to decide whether it is legitimate or not. Treezor may:
- Reject the recall directly (e.g., the account is closed).
- Handle the decision-making process for recalls of type
FRAD
,TECH
, andDUPL
. - Pass on the decision-making to you for recalls of type
CUST
,AM09
, andAC03
.
If an SCTR recall is pass on to you, then the following occurs:
- Treezor informs you of the Recall request using a
recallR.need_response
webhook. - Treezor blocks immediately the funds on the involved Wallet using a
payinrefund.create
webhook. - You decide if you want to accept or reject the recall (within 15 working days). To do so, use the dedicated request after receiving the
recallR.need_response
webhook.
Tip – Rely on the statusId
field
In the webhook recallR.need_response
or in the SCTR Recall object, if the statusId
field is set to 1
or 3
, it means you haven't provided a response yet.
Status (statusId
)
statusId | Status | Notes | |
---|---|---|---|
1 | PENDING | Pending analysis by you (or by Treezor for recalls of type FRAD , TECH , and DUPL ) | |
2 | PENDING_PAYIN_REFUND_CREATED | For simulation purposes. | |
3 | PENDING_ANSWER_REQUESTED | Treezor is awaiting an answer. | |
7 | IN_ERROR | ||
6 | CANCELED | ||
5 | REJECTED | ||
4 | ACCEPTED |
Caution – When receiving FRAD
, TECH
, and DUPL
recalls
Structure of an SCTR Recall
The structure of an SCTR Recall is as follows. While the recallR.need_response
webhooks only contain a subset of the following attributes, you may retrieve the Recall object by using the /recallRs/{recallId}
endpoint.
json
{
"id": 10,
"recallRSepaMessageId": 351170,
"cxlId": "401",
"txId": "401", // transaction id of the initial SCT.
"statusId": 3,
"statusLabel": "PENDING ANSWER REQUESTED",
"reasonCode": "TECH", // see available reasons list above
"additionalInformation": "",
"clientId": 878950,
"clientName": "trois_soc",
"userId": 1321404,
"userTypeId": 1,
"userName": "Alex Oak",
"userStatusId": 9,
"walletId": 714744, // related wallet id
"walletStatusId": 5,
"walletActivationDate": "2020-10-30 00:00:00",
"walletDesactivationDate": null,
"sctrId": 401, // related SCTR id
"sctrTxId": 0,
"sctrAmount": "1451.00", // related SCTR amount
"sctrSettlementDate": "2020-12-30 00:00:00",
"sctrDbtrIBAN": "FR7612548029981234567123456",
"sctrDbtrBIC": "AXABFRPP",
"sctrDbtrName": "Test name debitor",
"responseSepaMessageId": 0,
"receivedDate": null,
"payinId": 0,
"payinRefundId": 3566, // related Payin created to block the Authorized Balance
"responseType": false,
"negativeResponseReasonCode": "",
"negativeResponseAdditionalInformation": "",
"responseComment": "",
"boResponse": false,
"frozenWalletFollowingRecallR": false,
"automaticResponse": "",
"comment": "",
"fraudConfirmed": false, // is set to true if Treezor confirms a case of fraud
"partialRefund": false, // is set to true if the refunds was done outside of the Recall protocol
"inError": false,
"createdDate": "2020-12-30 15:01:12",
"updatedDate": "2020-12-30 15:01:12"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Responding to an SCTR Recall
Your response must be sent to the dedicated /v1/recallRs/{recallId}/response
endpoint.
Accept a Recall
Here is a payload example to accept a recall.
json
{
"responseType": 1, // mandatory, 1 for accepted
"negativeResponseAdditionalInformation": "",// must be kept empty
"negativeResponseReasonCode": "", // must be kept empty
"responseComment": "" // optional
}
1
2
3
4
5
6
2
3
4
5
6
Treezor sends a payinrefund.update
with a VALIDATED
status after receiving your acceptance of the SCTR Recall. This webhook indicates that the blocked funds will be debited.
Reject a Recall
Here is a payload example to reject a recall.
json
{
"responseType": 0, // mandatory, 0 for declined
"negativeResponseAdditionalInformation": "",// optional
"negativeResponseReasonCode": "", // mandatory, see "Types of Recall Rejection (negativeResponseReasonCode)" at the top of this page
"responseComment": "" // optional
}
1
2
3
4
5
6
2
3
4
5
6
Treezor sends a payinrefund.update
with a status CANCELED
and the Authorized Balance is freed up.
You may encounter the following errors while answering to a Recall:
115000
– This recall request does not exist115001
– Unable to answer because status is notPENDING
norANSWER REQUESTED
74001
– Input validation failed. The Recall does not belong to you
Processing flow
Here is a diagram for an SCTR Recall processing.
Receiving SCTR Inst Recalls
When a Recall regarding an SCTR Inst is received, Treezor sends:
- A
separecallsctrinst.reception
webhook. - A
payinrefund.create
webhook with aPENDING
status, hence blocking the funds on the involved Wallet.
If the recall reason allows you to answer, you have 15 working days to accept or reject the recall. If you don't answer within 15 days, Treezor sends a negative answer on your behalf and you receive a payinrefund.cancel
webhook with a REJECTED
status.
Status (statusLabel
)
statusLabel | Description | ||
---|---|---|---|
PENDING | Received recall, it is being analyzed by you (or by Treezor for recalls of type FRAD , TECH , and DUPL ) | Intermediate | |
PENDING_REJECTED_WAITING_ACK | Rejected recall, waiting for interbanking system confirmation | Intermediate | |
PENDING_ACCEPTED_WAITING_ACK | Accepted recall, waiting for interbanking system confirmation | Intermediate | |
REJECTED | Rejected recall | Final | |
ACCEPTED | Accepted recall | Final |
Caution – When receiving FRAD
, TECH
, and DUPL
recalls
Responding to an SCTR Inst Recall
Your response must be sent to the dedicated /v1/recall-sct-inst/{sctinstId}/{recallId}/response
endpoint within 15 working days, to which Treezor answers with an HTTP Status Code 201
.
Accept a Recall
Here is an example of payload to accept a recall.
json
{
"responseType": 1, // mandatory, 1 for accepted
"negativeResponseAdditionalInformation": "",// must be kept empty
"negativeResponseReasonCode": "", // must be kept empty
}
1
2
3
4
5
2
3
4
5
Treezor sends a payinrefund.update
webhook with an ACCEPTED
status and the Wallet is debited a few seconds later.
Reject a Recall
Here is an example of payload to reject a recall.
json
{
"responseType": 0, // mandatory, 0 for declined
"negativeResponseAdditionalInformation": "",// mandatory, optional or not expected depending on the situation, see details below
"negativeResponseReasonCode": "", // mandatory, see "Types of Recall Rejection (negativeResponseReasonCode)" at the top of this page
}
1
2
3
4
5
2
3
4
5
The negativeResponseAdditionalInformation
attribute is limited to 202 alphanumeric characters and is:
- Mandatory when the recall
reasonCode
wasFRAD
orDUPL
orTECH
andnegativeResponseReasonCode
isLEGL
- Optional when
- The recall
reasonCode
wasFRAD
andnegativeResponseReasonCode
is notLEGL
or - The recall
reasonCode
wasAC03
- The recall
- Not expected (must be left empty) in any other situations.
Treezor sends a payinrefund.cancel
with a status REJECTED
and the Authorized Balance is freed up.
Processing flow
Here is a diagram for an SCTR Inst Recall processing.
Emitting SCTE Recalls
When requesting a recall, you are not guaranteed to receive the funds back. The decision regarding the recall request is up to the corresponding bank and depends on various factors, including funds availability and compliance with delays.
- You have up to 10 open banking days for
TECH
orDUPL
recalls and 13 months forRRO
andFRAD
recalls. - The corresponding bank has up to 15 open banking days from the reception of your recall request to respond.
Process to recall an SCTE
- You open a ticket containing the details of the SCTE and the appropriate recall reason.
- Treezor initiates the request on the interbanking system and sends you a
payoutrefund.create
webhook. - Treezor receives the response from the corresponding bank:
- If it is accepted, Treezor credits the Wallet with the recalled amount and sends you:
- A
payoutrefund.update
webhook with the statusVALIDATED
. - A
transaction.create
webhook. - A
balance.update
webhook.
- A
- If it is declined, Treezor sends a
payoutrefund.cancel
webhook.
- If it is accepted, Treezor credits the Wallet with the recalled amount and sends you:
Processing flow
Here is a diagram for an SCTE Recall processing.
Emitting SCTE Inst Recalls
When requesting a recall, you are not guaranteed to receive the funds back. The decision regarding the recall request is up to the corresponding bank and depends on various factors, including funds availability and compliance with delays.
Requests for SCTE Inst recalls can be done:
- Directly by you – For
CUST
,AM09
, andAC03
reasons. - By opening a ticket – For
TECH
,FRAD
, andDUPL
reasons.
Delays to abide by are the same as for SCTE Recalls:
- You have up to 10 open banking days for
TECH
orDUPL
recalls and 13 months forRRO
andFRAD
recalls. - The corresponding bank has up to 15 open banking days from the reception of your recall request to respond.
Tip – can emit recalls for all types of reasons
They don't need to create a ticket for TECH
, FRAD
, and DUPL
reasons.
Create a Recall
Recalls for SCTE Inst payouts are created with the payoutRefunds request.
Parameters
Below some of the key attributes for SCTE.
Attribute | Type | Description |
---|---|---|
payoutId | string | The unique identifier of the payout (SCTE Inst) for which the recall is to be made. |
reasonCode | string | The reasons of the Recall. |
requestAmount | float | The amount of the recall request. Defaults to the initial payout amount. |
requestCurrency | float | The currency of the recall request. Defaults to the initial payout currency. |
Request example
bash
curl -X POST '{baseUrl}/v1/payoutRefunds' \
--header 'Authorization: Bearer {accessToken}' \
--header 'Content-Type: application/json' \
-d '{payload}'
1
2
3
4
2
3
4
Here is an example of {payload}
:
json
{
"payoutId": "bf9367cb-22be-4a86-ad68-8f30fxxxx15",
"accessTag": "test {{timestampMs}}", // max. 250 characters
"payoutRefundTag": "test", // max. 250 characters
"requestAmount": 1000.10,
"requestCurrency": "EUR",
"reasonCode": "DUPL"
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Returns a payoutRefund object.
json
{
"payoutRefunds": [
{
"id": "f0eb0186-1592-4fb8-84a1-a65db6901234",
"payoutRefundTag": "test",
"codeStatus": "790001",
"informationStatus": "PENDING",
"payoutId": "bf9367cb-22be-4a86-ad68-8f30fxxxx15",
"requestAmount": 1000.1,
"requestCurrency": "EUR",
"requestComment": "",
"reasonCode": "DUPL",
"refundAmount": 1000.1,
"refundCurrency": "EUR",
"refundDate": "",
"refundComment": "",
"negativeResponseReasonCode": "",
"createdDate": "2024-03-14 17:09:19",
"modifiedDate": ""
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Treezor also sends a payoutRefund.create
webhook with a payoutStatus
attribute set to PENDING
.
You can retrieve a SCTE Inst Recall by suing the GET /v1/payoutRefunds/{payoutRefundId}
endpoint.
Processing flow
Here is a diagram for an SCTE Inst Recall processing.
Endpoints
Endpoint | Scope |
---|---|
/v1/recallR Search for SCT Recalls | read_only |
/v1/recallRs/{recallRId} Retrieve an SCT Recall or RRO by its id | read_only |
/v1/recallRs/{recallRId}/response/ Provide your decision following an SCT Recall request | read_write |
/v1/recall-sct-inst/{sctInstId}/{recallId} Retrieve an SCT Inst Recall | |
/v1/recall-sct-inst/{sctinstId}/{recallId}/response Provide your decision following an SCT Inst Recall | |
/v1/payinrefunds/{recallId} Retrieve a payinrefund following a Recall | |
/v1/payoutRefund Create a Recall (SCTE Inst only) | read_write |
/v1/payoutRefund/{payoutRefundId} Create a Recall (SCTE Inst only) | read_only |
/simulation/sct-inst/payin Emulate an SCTR, to test the procedure sandbox-only | |
/simulation/sct-inst/recall Emulate a reception of a SCTR inst recall, to test the procedure sandbox-only | |
/simulation/recall-r Emulate a Recallr, to test the procedure sandbox-only |