Skip to content

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:

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.

reasonCodeForDescription
DUPLRecallsDuplicate payment
TECHRecallsTechnical problem
FRADRecallsFraudulent origin (these are not subject to a webhook as they are fully analyzed by Treezor)
CUSTRROsCustomer's reason
AM09RROsWrong amount
AC03RROsInvalid creditor account number

Types of Recall Rejection (negativeResponseReasonCode)

When rejecting a Recall, the reason may be any of the following.

negativeResponseReasonCodeDescription
NOORThe associated transaction (SCTR/SCTR Inst) was not received
ARDTThe associated transaction has already been returned
AC04The associated account is closed
NOASThe beneficiary didn't answer (neither accepted nor declined)
CUSTThe beneficiary rejected the recall
AM04The beneficiary has insufficient funds
LEGLLegal decision (regulatory rules)
Info icon

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, and DUPL.
  • Pass on the decision-making to you for recalls of type CUST, AM09, and AC03.

If an SCTR recall is pass on to you, then the following occurs:

  1. Treezor informs you of the Recall request using a recallR.need_response webhook.
  2. Treezor blocks immediately the funds on the involved Wallet using a payinrefund.create webhook.
  3. 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.
Bulb icon

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)

statusIdStatusNotes
pending1PENDINGPending analysis by you (or by Treezor for recalls of type FRAD, TECH, and DUPL)
pending2PENDING_PAYIN_REFUND_CREATEDFor simulation purposes.
pending3PENDING_ANSWER_REQUESTEDTreezor is awaiting an answer.
warning7IN_ERROR
canceled6CANCELED
no cross5REJECTED
yes checkmark4ACCEPTED
Warning icon

Caution – When receiving FRAD, TECH, and DUPL recalls

  • You can't respond to these recalls. Only Treezor is accountable (unless for ).
  • You must not inform the end users of the reception of FRAD 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"					
}

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
}

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
}

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 exist
  • 115001 – Unable to answer because status is not PENDING nor ANSWER 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:

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)

statusLabelDescription
pendingPENDINGReceived recall, it is being analyzed by you (or by Treezor for recalls of type FRAD, TECH, and DUPL)Intermediate
pendingPENDING_REJECTED_WAITING_ACKRejected recall, waiting for interbanking system confirmationIntermediate
pendingPENDING_ACCEPTED_WAITING_ACKAccepted recall, waiting for interbanking system confirmationIntermediate
no crossREJECTEDRejected recallFinal
yes checkmarkACCEPTEDAccepted recallFinal
Warning icon

Caution – When receiving FRAD, TECH, and DUPL recalls

  • You can't respond to these recalls. Only Treezor is accountable (unless for ).
  • You must not inform the end users of the reception of FRAD 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
}

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
}

The negativeResponseAdditionalInformation attribute is limited to 202 alphanumeric characters and is:

  • Mandatory when the recall reasonCode was FRAD or DUPL or TECH and negativeResponseReasonCode is LEGL
  • Optional when
    • The recall reasonCode was FRAD and negativeResponseReasonCode is not LEGL or
    • The recall reasonCode was AC03
  • 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 or DUPL recalls and 13 months for RRO and FRAD 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

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:

Delays to abide by are the same as for SCTE Recalls:

  • You have up to 10 open banking days for TECH or DUPL recalls and 13 months for RRO and FRAD recalls.
  • The corresponding bank has up to 15 open banking days from the reception of your recall request to respond.
Bulb icon

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.

AttributeTypeDescription
payoutId stringThe unique identifier of the payout (SCTE Inst) for which the recall is to be made.
reasonCode stringThe reasons of the Recall.
requestAmountfloatThe amount of the recall request. Defaults to the initial payout amount.
requestCurrencyfloatThe 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}'

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"
}

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": ""
        }
    ]
}

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

EndpointScope
/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