Appearance
SEPA Credit Transfers (SCT)
SEPA Credit Transfers (SCT) allow the initiator of the transfer (sender) to make Euro-denominated payments to SEPA countries accounts.
At Treezor, SCT can be used in two directions:
SCTR
are Received into a Wallet and mapped to Payin objectsSCTE
are Emitted from a Wallet and mapped to Payout objects
Received Credit Transfers (SCTR)
When an SCTR is received, a Payin object is created, along with a payin.create
webhook.
Treezor receives batches of SCTR from other banks every worked day between 6:30 and 19:00 Paris local time. They are handled and Wallets are credited as they are received.
Tip – In addition to your usual IBAN, you can provide Virtual IBANs to receive SCTR
Virtual IBANs have many benefits over your main IBAN (restriction in the direction they can be used, restriction in validity period, easier funds movements categorization, etc.).
Structure of an SCTR Payin
json
{
"payins": [
{
"payinId": "12345",
"payinTag": null,
"walletId": "34567",
"userId": "852741", // Valued to 3 initially in Production. DO NOT USE.
"payinStatus": "VALIDATED", // Funds are available to the Wallet owner
"paymentMethodId": "20",
"messageToUser": "Transfer to my Wallet",
"subtotalItems": "100.00",
"subtotalServices": "0.00",
"subtotalTax": "0.00",
"amount": "100.00",
"currency": "EUR",
"createdDate": "2018-01-01 17:00:00",
"walletEventName": "Wallet Test",
"walletAlias": "test-wallet-abcd",
"userFirstname": "CMA",
"userLastname": "",
"codeStatus": "140005",
"informationStatus": "",
"refundAmount": null,
"ibanFullname": "ALEX OAK",
"DbtrIBAN": "FR763000401544999999999123",
"ibanBic": "BNPAFRPP",
"ibanTxEndToEndId": "XXXXXXXXX",
"ibanTxId": "180799999990123",
"forwardUrl": null,
"paymentAcceptedUrl": null,
"paymentRefusedUrl": null,
"paymentWaitingUrl": null,
"paymentExceptionUrl": null,
"paymentCanceledUrl": null,
"payinDate": null,
"mandateId": null,
"creditorName": "WILL OAK",
"creditorAddressLine": null,
"creditorCountry": null,
"creditorIban": "FR761679999999999999011456",
"creditorBIC": "TRZOFR21XXX",
"virtualIbanId": null,
"virtualIbanReference": null,
"ibanId": "995d69d1839999999999a6935979ea8110d3"
}
]
}
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
45
46
47
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
45
46
47
Caution – UserId
initial value in Production
In Production environment, all SCTR are initially received with userId
attribute valued to 3
. It is strictly forbidden to use this value, this is a technical user for Treezor use only.
Rejection of an SCTR
Immediate rejection
An SCTR can be immediately rejected for multiple reasons.
In this case, a sepa.return_sctr
webhook is sent with the reason code provided in the return_reason_code
attribute.
Delayed rejection
Treezor enforces AML/CFT checks before validating an SCTR.
When a suspicious SCTR is encountered, the SCTR funds are frozen and Treezor sends you:
- A
payinrefund.create
webhook withreasonTms
attribute set tonull
andpayinrefundStatus
attribute set toPENDING
(which freezes the funds). - A
payinrefund.update
webhook withreasonTms
attribute populated by an explanation.
Upon further inspection by Treezor, the following occurs depending on whether the anomaly is confirmed:
- No anomaly – A
payinrefund.cancel
webhook is sent (the wallet can be credited by the SCTR). - Anomaly confirmed – A
payinrefund.update
webhook is sent, with aVALIDATED
payinrefundStatus
(which refunds the SCTR).
Information – AML/CFT inspection by Treezor can last up to 48h
Therefore, an SCTR can be delayed by up to 48 hours.
Emitted Credit Transfers (SCTE)
Treezor allows you to send funds from wallets to external accounts using SCTE.
Requirements
- The sender's Wallet must be valid and not frozen
- The sender's User must be valid
- You have the IBAN of the recipient
- You have created an active Beneficiary using this IBAN
Although SCTE can be created an any time, they will only take place on a SEPA Open Banking Day.
Parameters
Attribute | Type | Description |
---|---|---|
walletId | integer | The unique identifier of the debited Wallet. |
beneficiaryId | integer | The unique identifier of the Beneficiary of the Transfer. You must have created the Beneficiary object beforehand. |
amount | number | The amount of the credit transfer. |
currency | string | The currency of the credit transfer. Must be EUR . |
supportFileLink | string | Mandatory if the payout exceeds €10,000 (B2C) or €50,000 (B2B) for supporting documents. See processing for more information. |
Request
bash
curl -X POST {baseUrl}/v1/payouts \
--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
{
"walletId":{walletId},
"beneficiaryId":{beneficiaryId},
"amount":1000,
"currency":"EUR"
}
1
2
3
4
5
6
2
3
4
5
6
Returns the Payout object, with its payoutStatus
set to PENDING
at first. You will then receive sequentially the following webhooks.
Webhook | When | Specific attributes |
---|---|---|
payout.update | When the SCTE is sent to the SEPA network. | PENDING status and 160014 codeStatus |
payout.update | When the SCTE sender's wallet is debited. | VALIDATED status |
json
{
"payouts":[
{
"payoutId":"2XX40",
"payoutTag":"25XXXXXXXXXXXXXXXX86f5cb",
"payoutStatus":"VALIDATED",
"payoutTypeId":"1",
"payoutType":"Credit Transfer",
"walletId":"85090",
"label":"Remboursement",
"payoutDate":"2017-10-04",
"amount":"1000.00",
"currency":"EUR",
"partnerFee":"0",
"createdDate":"2017-10-04 09:37:34",
"modifiedDate":"2017-10-04 09:55:57",
"walletEventName":"XXXXXXXAB",
"walletAlias":"XXXXXXXXXX",
"userLastname":"",
"userFirstname":"",
"userId":"636338",
"bankaccountIBAN":"XXXXXXXXXXXXXXXXXXXXXXXX",
"codeStatus":"160004",
"informationStatus":"",
"supportingFileLink":""
}
]
}
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
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
Processing
Emitted SEPA Credit Transfers (SCTE) are executed the next worked day when requested before the cutoff point (10AM).
When the SCTE exceeds €10,000 (B2C) or €50,000 (B2B), you must provide support documents in the supportFileLink
parameter:
- An invoice, bill, contract, or similar document.
- A RIB of the creditor, edited by the creditor's bank.
Support documents may be required for additional controls if Treezor deems the transaction of interest.
Treezor is entitled to refuse an SCTE when the aforementioned requirements are not met, or upon suspicion of fraudulent activity.
Rejection of an SCTE
A beneficiary's bank can reject an SCTE for multiple reasons.
In this situation a payoutrefund.create
webhook is sent, with the reasonCode
for the rejection provided.
Recalling an SCTE
To recall an SCTE, please check out the dedicated article.
Mass SCTE (Mass Payout)
Alert – This feature is not available yet
If you're interested in mass payouts, please contact your Treezor Account Manager for more information.
Information – Feature limitations
- Currently, a single Wallet can be debited per Mass Payout but many Beneficiaries can be credited. Attempts to debit multiple Wallets will be ignored.
- The Mass SCTE feature is incompatible with the Encryption feature.
The Mass Payout feature allows you to request several SEPA Credit Transfer emissions at once, using an XML file following the PAIN001.001.03 ISO 20022 standard.
This file contains an array of objects, each object specifying a debtor's IBAN, a creditor's IBAN and an amount.
The main use case is to handle exports from payroll and accounting software.
Tip – Both machine-to-machine and end user usage is possible
- When requested by end user, only the end user's wallets can be debited.
- When requested by machine-to-machine, only Wallets that you manage can be debited.
Upload
First, you upload the file using the following request.
bash
curl -X POST {baseUrl}/core-connect/mass-payouts/import \
--header 'Authorization: Bearer {accessToken}' \
--header 'Content-Type: application/json' \
--form 'file=@"/Path/to/your/file.xml"' \
--form 'reference="{yourImportReference}"'
1
2
3
4
5
2
3
4
5
Ensure your file conforms to the PAIN001.001.03 standard and doesn't exceed 10Mo.
Treezor immediately checks for integrity and ISO compliance. If the file complies to the expected format, the following object is returned.
json
{
"importId":"idOfTheImportAsUUIDv4",
"status":"PENDING"
}
1
2
3
4
2
3
4
The importId
, provided as UUIDv4, allows you to check on the import's status
later on.
Processing
Treezor process your file within a few hours after the upload. Therefore, if you need your mass payout processed before the cutoff time, you must anticipate this delay.
For each of the SCTE contained within the file, Treezor attempts to create a distinct SCTE.
If the associated Beneficiary doesn't already exist, it is automatically created. If it already exists but its usableForSct
is false
, the Beneficiary will be updated to usableForSct=true
.
- If the payout can be created, you receive a
payout.create
webhook - If the payout can't be created, an error is logged and can be retrieved at a later stage
For each created SCTE, its label indicates the following: CreditTransferTransactionInformation (<CdtTrfTxInf>
) → RemittanceInformation (<RmtInf>
) → Unstructured (<Ustrd>
)
`→` symbolize a children XML node.
In addition to usual Payout failure reasons, the following Mass Payout-specific reasons can be returned:
The debtor wallet was not found
The debtor wallet status is not VALIDATED
The beneficiary can not be created
The payout has already been executed
This reflects an internal error on your sideThe payout can not be created and max retry has been reached
This reflects an internal error on our side
Checking the status
List of available status
values.
Status | Description |
---|---|
PENDING | When the file has been uploaded |
COMPUTING | When checking the debtor and creditor |
COMPUTING_WITH_ERROR | When checking the debtor and creditor, with at least one error |
COMPLETED Final | When everything is successful |
COMPLETED_WITH_ERROR Final | When an error occurred while checking the debtor or one of the creditors |
To check the status of a previously created Mass Payout, you can use the following request:
bash
curl -X GET {baseUrl}/core-connect/mass-payouts/report/{reference}
--header 'Authorization: Bearer {accessToken}' \
--header 'Content-Type: application/json'
1
2
3
2
3
Returns either the following object with the url
attribute populated upon complete processing of the Mass Payout, providing you with an URL to download a CSV file.
json
{
"url": "string",
"status": "string",
"processed_creditors": int,
"total_creditors": int
}
1
2
3
4
5
6
2
3
4
5
6
Or the following object in case of a global error, preventing Treezor from parsing the uploaded file.
json
{
"status": "COMPLETED_WITH_ERROR",
"globalErrors": [
"The debtor's wallet with IBAN FR7616798000010000999999955 does not exist."
]
}
1
2
3
4
5
6
2
3
4
5
6
Global errors can be:
Error | Context |
---|---|
The debtor's wallet with IBAN file:IBAN does not exist. | When we are not able to identify the Wallet from the provided IBAN |
Unknown debtor with IBAN:file:IBAN. All linked creditors were skipped | When the Wallet doesn't belong to the currently authenticated User |
Debtor with IBAN:file:IBAN has a CANCELED wallet. All linked creditors were skipped | When the Wallet is in an CANCELED state |
Report
Errors contained in the report are comprised of CreditTransferTransactionInformation (<CdtTrfTxInf>
) → PaymentIdentification (<PmtId>
) → EndToEndIdentification (<EndToEndId>
)
Successful
The following illustrates a report without errors.
csv
"End To End Identification","Payment Id",Type,"Error Description"
"creditor 01",131545,PAYOUT,
"creditor 02",131544,PAYOUT,
"creditor 03",131546,PAYOUT,
"creditor 05",131547,PAYOUT,
1
2
3
4
5
2
3
4
5
With errors
The following illustrates a report with an error on the second creditor due to insufficient funds on the debited Wallet.
csv
"End To End Identification","Payment Id",Type,"Error Description"
"creditor 01",133166,PAYOUT,
"creditor 02",0,PAYOUT,"An error occurred while creating payout. EndToEndIdentification creditor 02. Error message: Impossible de creer le Payout. Amount too high for the wallet current balance"
1
2
3
2
3