Integrating with Fabrick's BaaS APIs enables you to:
- Automate financial operations;
- Reconcile transactions;
- Reduce manual work;
- Build sophisticated financial workflows;
- Provide a seamless payment experience for your customers.
This guide is designed to help you rapidly integrate Fabrick’s Banking as a Service (BaaS) solution into your backend systems.
This guide provides the technical foundation you need to get up and running in your sandbox and production environments, to build a robust, maintainable integration that scales with your business.
Banking as a Service API Integration Guide
This integration guide covers:
- Authentication and setup - How to configure your API credentials securely;
- Account management - Retrieving and managing your Fabrick cash accounts;
- Creating wire transfers - Step-by-step instructions for initiating money transfers;
- Monitoring transfer status - Real-time tracking of your transactions;
- Banking availability rules - Understanding execution dates and business day logic;
- Error handling - Common issues and how to resolve them.
Integrating Banking as a Service API
Prerequisites
Ensure you have:
-
A Fabrick subscription
- A Sella cash account linked to your Fabrick subscription;
-
API credentials
Integration Flow
Integration Steps
Step 1: Retrieve Your Accounts
Note: Ensure you are using the correct environment and API credentials.
- sandbox.fabrick.com (SANDBOX);
- api.fabrick.com (LIVE)
For example, using sandbox API tokens in the sandbox environment.
Before you can send payments or monitor transactions, you need to retrieve your cash accounts and their unique identifiers.
To retrieve your cash accounts, use the GET Accounts endpoint:
'https://api.fabrick.com/api/gbs/banking/v4.0/accounts'
Request Example
curl --location 'https://api.fabrick.com /api/gbs/banking/v4.0/accounts' \
--header 'Content-Type: application/json' \
--header 'Api-Key: {{YOUR_API_KEY}}' \
--header 'Auth-Schema: S2S' Response Example json
{
"status": "OK",
"errors": [],
"payload": {
"list": [
{
"accountId": "30493889",
"iban": "IT80R0326822300052819105040",
"abiCode": "03268",
"cabCode": "22300",
"accountNumber": "0052819105040",
"accountName": "Company Operating Account",
"activationDate": "2024-01-15",
"currency": "EUR"
}
]
}
}
Each account object contains important account information:
| Field | Description | Usage |
|---|---|---|
| accountId | Unique Sella account identifier for the cash account | Required in all transaction requests |
| iban | Full IBAN number (SEPA format) | For SEPA transfers and reconciliation |
| abiCode | Italian Banking Association code | Reference information |
| cabCode | Branch code | Reference information |
| currency | Account denomination (EUR) | Validation and conversion for currency |
| activationDate | When the account became active | Account lifecycle tracking |
To Retrieve Specific Account Details
It is useful to get detailed information on a single account, so you can work with specific data, for example the current balance, or account configuration.
Use the GET Accounts endpoint and include the accountID in the URL for the specific account.
curl --location 'https://api.fabrick.com/api/gbs/banking/v4.0/accounts/{{accountId}}' \
--header 'Content-Type: application/json' \
--header 'apikey: {{YOUR_API_KEY}} ' \
--header 'Auth-Schema: S2S'
Using the Cash Account Management API package you can also:
-
GET Account Balance: Retrieves the balance of a specific cash account; -
GET Account Transactions: Retrieves the transactions of a specific cash account; -
GET Account Reserved Entries: Retrieves the reserved entry list of an account.
Step 2: Creating Wire Transfers: The Core Operation
Money transfer creation is the fundamental operation for automated payments.
Both standard SEPA Credit Transfer (SCT) (next-business-day execution) and SEPA Instant Credit Transfer (SCT Inst) transfers are supported. Before creating a transfer, you must understand when transfers can be executed.
For more information, see Validate Execution Dates.
Prequisites
Before initiating a transfer, ensure:
- Account Verification - You have a valid accountId from the Get Accounts call;
See: Step 1: Retrieve Your Accounts. - Creditor Information - Complete details of the payment recipient;
-
Defined your Verification of Payee (VoP) strategy.
The Verification of Payee (VoP) process applies to SEPA Credit Transfers and ensures that the IBAN provided for a transfer matches the intended beneficiary’s name. This helps to prevent fraud and misdirected payments.
To enable the verification for each payment, it is
requiredto set the X-VoP-Force-Verification header totrue.For more information see: Verification of Payee trough API.
Create a Wire Transfer
Use the POST Create Money Transfer endpoint to initiate a payment:
'https://api.fabrick.com/api/gbs/banking/v4.1/accounts/{{accountId}}/payments/money-transfers'
For more information, see: Create Money Transfer v4.1.
Request Headers (Required)
Header Descriptions:
- X-Time-Zone - Always set to Europe/Rome;
- Auth-Schema - Always "S2S" for server-to-server authentication;
- Api-Key - Your assigned Fabrick API key;
- accountId - The source account (as header parameter).
curl --location 'https: //api.fabrick.com/api/gbs/banking/v4.1/accounts/{{accountId}}/payments/money-transfers'
--header 'apikey: {
{YOUR_API_KEY}
}'
--header 'Auth-Schema: S2S'
--header 'Content-Type: application/json'
--header 'X-Time-Zone: Europe/Rome'
--data '{
"creditor": {
"name": "John Doe",
"account": {
"accountCode": "IT59B0300203280461484318754"
}
},
"executionDate": "2025-05-28",
"description": "Refund from ACME SPA",
"amount": 55.50,
"currency": "EUR",
"isUrgent": false,
"isInstant": false,
"feeType": "SHA"
} '
Field Descriptions
| Field | Type | Description |
|---|---|---|
| creditor.name | String |
The recipient's full name. Note: This must be accurate for VoP compliance. |
| creditor.account.accountCode | String |
Use:
Note: For IBAN used outside of Italy the following additional fields are required:
|
| executionDate | Date (YYYY-MM-DD) |
The date when the transfer is executed. Note: This must follow banking availability rules. See, Validate Execution Dates. |
| description | String |
The transfer reason / causale. Format:
|
| amount | Number |
The transfer amount. Format:
|
| currency | String |
The currency of the money transfer (EUR). Note: If the account on which the money transfer is executed has a different currency, additional currency conversion fees may apply. |
| isInstant | Boolean |
Default value = false. To enable instant transfers, set the flag to true. Note: For SCT within the same bank (transferring money from one Sella account to another Sella account) this flag must be set to false. |
Step 3: Response Example (Success)
{
"status": "OK",
"errors": [],
"payload": {
"moneyTransferId": "628947306",
"cro": "4393165470703268",
"trn": null,
"status": "BOOKED",
"uri": "NOTPROVIDED",
"direction": "OUTGOING",
"debtor": {
"name": "ACME SPA",
"account": {
"accountCode": "ITXXXXXXXXXXXXXXXXX",
"bicCode": null
}
},
"creditor": {
"name": "JOHN DOE",
"account": {
"accountCode": "ITXXXXXXXXXXXXXXXX",
"bicCode": "UNCRITMMXXX"
}
},
"feeAccountId": "30493889",
"description": "Refund from ACME SPA",
"createdDatetime": "2025-10-27T17:37:59.225+0200",
"accountedDatetime": null,
"debtorValueDate": "2025-10-28",
"creditorValueDate": "2025-10-29",
"amount": {
"debtorAmount": 100.50,
"debtorCurrency": "EUR",
"creditorAmount": 100.50,
"creditorCurrency": "EUR",
"currencyRatio": 1
},
"isUrgent": false,
"isInstant": false,
"feeType": "SHA",
"fees": [],
"hasTaxRelief": false
}
}
Key Response Fields:
| Field | Meaning |
|---|---|
| moneyTransferId |
Unique identifier for this transfer. Note: Use this for status tracking. |
| CRO |
Causale Reference Order - Italian banking reference number. This is used when the SCT is sent within the same Bank (for example, a transfer from one Sella account to another Sella account). |
| TRN |
Transaction Reference Number. International standard identifier (ISO 20022) used in SEPA messages to track the transaction. |
| status |
The current transfer state. Properties:
|
| debtorValueDate | The date when the funds leave your account. |
| creditorValueDate | The date when the funds will arrive in the recipient's account. |
| fees | Any fees associated with the transfer. |
Step 4: Transfer Status Codes
The status field in the response of the wire transfer request, will display one of the following status codes:
| Status Code | Description |
| WORK_IN_PROGRESS | Transfer created before 16:00 PM, still processing. |
| BOOKED | Transfer created after 16:00 PM, scheduled for the next business day. |
| EXECUTED | Successfully processed by the bank. |
| REJECTED | Transfer failed (for example, invalid IBAN, insufficient funds). |
Validate Execution Dates
Important! Before creating a transfer, you must understand when transfers can be executed. There are 2 kinds of SEPA SCT:
-
INST payment
(flag 'isInstant == true')
There is no need to specify the executionDate as the transfer is done in few seconds, 24 hours per day, 7 days per week, 365 days out of the year.
-
Ordinary SCT
The recommendation is to create the money transfer before the Bank’s cut off time at 16:00 (Europe/Rome timezone). The execution date is optional, as the system automatically calculates the first available date.
Note: If you need to complete this field, it is required to follow rules below:
Avoid all Non-Business Days:
- All Saturdays and Sundays;
- Italian public holidays: January 1, 25 April, 1 May, 2 June, 15 August, 1 November, 8 December, 25-26 December;
- Easter Monday (dates vary yearly).
Rules for Minimum Execution Date:
- If the current time is before 16:00 on a business day → minimum execution date is today;
- If the current time is after 16:00 on a business day → minimum execution date is tomorrow;
-
If today is a banking holiday → minimum execution date is the next business day.
Monitoring the Transfer Status
While INST SEPA transfers are executed immediately, standard SEPA transfers are settled on the next business day.
Occasionally, a transfer marked as EXECUTED can later be REJECTED by the receiving bank, if there are compliance issues.
Monitoring is essential for reconciliation and customer communication.
Fabrick provides the following complementary monitoring approaches:
Scheduled Monitoring
Set up an automated job that runs once a day (for example at 9:00 AM).
This catches all status changes without excessive API calls.
On-Demand Monitoring
Trigger a specific check when:
- A customer inquires about a specific transfer;
- You need immediate reconciliation;
- Testing or troubleshooting.
Account Monitoring
This service is a solution designed to provide near real-time detection and notification of events occurring on whitelisted bank accounts.
It continuously monitors specified accounts for Incoming and Outgoing transactions delivering specific notification callbacks related to the SCT events.
Searching for Transfers
To retrieve the current status of multiple transfers, use the Search Money Transfer API.
POST /money-transfers/search
POST /money-transfers/search HTTP/1.1
Host: api.fabrick.com
X-Time-Zone: Europe/Rome
Content-Type: application/json
Auth-Schema: S2S
Api-Key: {YOUR_API_KEY}
accountId: {ACCOUNT_ID}
{
"direction": "OUTGOING",
"createdDatetime": {
"from": "2025-05-18",
"to": "2025-05-27"
},
"pagination": {
"offset": 0,
"limit": 2000
}
}Search Parameters
Search Window Recommendation: Use a 7-day rolling window (from today - 7 days to today).
This captures all pending transfers even if there are holidays (or Fabrick downtime), while keeping response sizes manageable.
| Parameter | Description |
|---|---|
| direction |
Properties:
Note: Use OUTGOING for transfers you initiated while INCOMING for transfers you have received on your cash account. |
| createdDatetime.from |
The start date for the search window. For example, now() - 7 days. |
| createdDatetime.to |
The end date for the search window. For example, now(). |
| pagination.limit |
The maximum results per page. For example, 20. |
| pagination.offset |
The starting position. Note: This is helpful for the pagination of large result sets. |
Response Example json
{
"status": "OK",
"errors": [],
"payload": {
"list": [
{
"moneyTransferId": "628947306",
"cro": "4393165470703268",
"trn": "20250528ABCD1234",
"status": "EXECUTED",
"direction": "OUTGOING",
"debtor": {
"name": "YOUR COMPANY NAME",
"account": {
"accountCode": "IT80R0326822300052819105040"
}
},
"creditor": {
"name": "JOHN DOE",
"account": {
"accountCode": "IT59B0300203280461484318754",
"bicCode": "UNCRITMMXXX"
}
},
"description": "Refund from ACME SPA 12345",
"createdDatetime": "2025-10-27T17:37:59.225+0200",
"debtorValueDate": "2025-10-28",
"creditorValueDate": "2025-10-29",
"amount": {
"debtorAmount": 123.50,
"debtorCurrency": "EUR",
"creditorAmount": 123.50,
"creditorCurrency": "EUR"
},
"isUrgent": false,
"isInstant": false,
"feeType": "SHA"
}
],
"pagination": {
"offset": 0,
"limit": 2000,
"totalCount": 1
}
}
}Status Reconciliation Logic
For each transfer returned in the search response:
- Match to local records using moneyTransferId
- Compare status values:
- If status unchanged → no action needed;
- If status changed → update your database and trigger downstream processes.
- Handle special cases:
- REJECTED status → alert customer, investigate reason, potentially retry;
- EXECUTED status → confirm delivery to recipient, update records;
- BOOKED status → transfer still pending, monitor after the execution date.
Timeout Handling
Important consideration: Fabrick APIs have a specific response timeout.
If a request times out:
- Do NOT assume the transfer failed - it may have been created successfully;
- Log the timeout occurrence with the exact timestamp;
- When receiving errors (http 500 and http 504), perform a validation enquiry searching by beneficiary name: Note: Wait at least 100 seconds
- Iban;
- Amount;
- currency;
- description.
- Update status based on search results;
- Implement retry logic only after confirming via search.
This prevents duplicate transfers from timeout retry logic.
See our Money Transfer API for more information on:
-
Validate Money Transfer:
Validate whether a SCT or SCT-Inst payment order can be performed.
-
Money Transfer Accounting Proof:
Retrieves an existing accounting proof of money transfer.
-
Revert Money Transfer:
Reverts a specific money transfer.
This endpoint can be used to return a received money transfer by automatically taking details about the receiver, the currency and the description from the received money transfer.
Error Handling and Validation
HTTP Status Codes.
| Code | Meaning | Action |
|---|---|---|
| 200 OK | Request successful | Process response normally |
| 400 Bad Request | Invalid parameters | Validate request and retry with corrections |
| 401 Unauthorized | Invalid API key or authentication | Check credentials, regenerate tokens if needed |
| 403 Forbidden | Insufficient permissions | Verify account access and permissions |
| 429 Too Many Requests | Rate limit exceeded | Implement exponential backoff |
| 500+ Server Error | System error | Retry after 30 seconds. If this persists, contact Support. Link for Support. |
Troubleshooting Common Validation Errors
| Common Error | Error Description Example | Resolution |
|
Invalid IBAN
|
{
"status": "KO",
"errors": [
{
"code": "API000",
"description": "Coordinate IBAN errate o non aggiornate, non è possibile ricavare un BIC valido. Contattare il beneficiario per ottenere le coordinate IBAN aggiornate.",
"params": ""
}
]
}
|
Check the following:
|
|
Invalid Execution Date
|
{
"status": "KO",
"errors": [
{
"code": "API000",
"description": "DataEsecuzioneOrdine non valida, deve essere maggiore o uguale al primo giorno lavorativo disponibile per la lavorazione e non superiore a 30 gg lavorativi.",
"params": ""
}
]
}
|
Check the following:
|
| Invalid Description Field |
{
"status": "KO",
"errors": [
{
"code": "API000",
"description": "Il campo CausaleDescrittiva è formalmente errato",
"params": ""
}
]
}
|
Check the following:
|
Support and Additional Resources
Getting Help:
- See our FAQ Page.
- For any technical issues: contact Fabrick API Support team through our website here.
Getting Started with Fabrick APIs
Core Use-Case Scenarios
Fabrick customers can leverage the API for multiple business scenarios:
Reconciliation & Accounting
Automatically retrieve transaction lists for customer payment recognition and account reconciliation.
Your system can process incoming payments and trigger downstream actions without manual intervention.
Automated Payout Workflows
Streamline cash-out operations by automating refunds, loan disbursements, or customer reimbursements.
For instant transfers, customers can receive funds on the same business day.
Cash Pooling & Multi-Account Management
Consolidate financial data across multiple cash accounts belonging to the same company or legal entity.
Get real-time visibility into your entire cash position.
Local Payment Methods
Process F24 payments, simplified F24 transfers, PAgoPA (Public Administration), MAV/RAV, and Car TAX payments directly through Fabrick's infrastructure, avoiding complex registration procedures.
Safeguard Accounts
Manage custody accounts for regulated entities (IMEL, PI, SGR, SIM) with automatic collections and movements.
API Packages and Capabilities
The Fabrick Platform provides two main API packages for money transfer operations.
Both packages are essential for building a complete automated payment solution.
| API Package | Version | Purpose | Link |
| Cash Account Management | v4.0 | Retrieve account details, balances, and account transactions. | Developers - Fabrick |
| Payments / Money Transfers | v4.1 | Create transfers, track status, and monitor transactions. | Developers - Fabrick |
Authentication Methods
Fabrick supports secure authentication through:
- API Key Authentication (S2S)
For server-to-server communication; - OAuth 2.0
For delegated access and third-party integrations; - JWT (JSON Web Token)
For enhanced security and token-based access.
For most direct integrations, you will use S2S (Server-to-Server) authentication with your assigned API Key.
Please refer to the following section for more information.