Skip to main content

PFM

Introduction

The Personal Financial Manager (PFM) today is the hub of digital banking. Fabrick's PFM product is an independent project that provides the Retail Customer with a "personal trainer" with personalized tips and advice for managing their financial situation and budget in order to better manage their money and find a good financial balance .

PFM is mainly dedicated to retail (consumer) accounts, in case of business accounts it is possible to request an in-depth meeting on the project called BFM (Business Financial Manager).

The project is very broad and describing all its features and potential is out of scope of this guide, in which we will focus only on a single service: GET GetPfmTransactions. This service returns the list of PSU transaction exactly like the services relating to the transactions described up to now, but also enriches, in real time (Near real-time), every single transaction with a series of additional information.

For both TPP and FPP the response obtained following a request for PFM transactions is exactly the same and is described below. The request APIs instead vary slightly and you can refer to the related documentation for implementation details, in any case this is the path:

.../movements/transactions

An update is available in which all fields are in English. It is possible to choose one or the other model by simply inserting en in the path as shown below:

.../movements/en/transactions

To date, Pass products still only have the italian version. It will be updated soon

A response example is shown below:

{
"errors": [],
"status": "OK",
"payload": {
"list": [{
"id": 4237,
"bankId": "5",
"bankProfileId": "2964",
"accountId": 10105,
"userId": "1",
"tppUid": "123456",
"isTemporary": false
"propBankTransactionCode": null,
"tipoOperazione": "alt",
"importo": 1.0,
"stato": "ESEGUITO",
"tipo": "income",
"causaleStructured": null,
"causale": "VOSTRADISPOSIZIONEBONIFICOURG./ISTANTANEO",
"remittanceDescriptions": []
"remittanceAdditionalInfo": []
"bankReference": "123"
"data": 1621893600000,
"valueDate": 1621893600000,
"createdDate": 1623140347621,
"accounted": true,
"recurrent": false,
"categoria": "entertainment",
"sottoCategoria": "sportEvents",
"cro": null,
"nomeBeneficiario": null,
"merchant": "aMerchant",
"merchantCity": "Milano",
"mcc": "1234",
"numeroContoAddebito": null,
"numeroContoAccredito": null,
"reference": null,
"entryReference": null,
"divisa": "EUR",
"eseguitoDa": null,
"ibanBeneficiario": null,
"saldo": 3020803002.84,
"saldoDisponibile": 3020803002.84,
"isBookingDateForged": false,
"normalizedMerchant": null
}, {
"id": 4238,
...
}]
}
}

According to the PSD2 regulation the only mandatory fields are amount, reason and date. All the fields described below will therefore be filled in only if the final bank returns that particular information. Some information is returned directly, while others are enhanced thanks to an analysis work by Fabrick on the complete bank reason (obviously more complete than the reason entered by the customer).

All unvalued parameters will not appear in the response and will therefore be considered null.

As regards the categoria, sottoCategoria and tipoOperazione parameters, refer to next tables.

Some details about the output:

  • saldo: indicates the account balance updated to Fabrick's latest request to the bank. It's based on the currency of the account, for example if the account currency is in EUR saldo will be in EUR and if the account currency is USD the saldo will be in USD currency. It is recommended to use the most complete service dedicated to get the balances information (see doc Balances details)
  • importo: indicates the amount of the transaction
  • currency: the currency of the account

In the event that it is a currency transaction, the following additional parameters will be available:

  • importoDivisa
  • tassoCambio

The value of the importo parameter will be calculated as importoDIvisa / tassoCambio.

In the answer you can find another paramater:

  • tassoBce: for PSD2 you can ignore this parameter, it is useful only for native transactions and not for PSD2 transactions.

In the request you can specify the following query parameters to filter and / or sort the required resources:

  • fromDate and toDate (will be deprecated, see "Searching by date" section): the time interval within which the transactions are to be displayed; They refer to the data parameter; they have to be in epochTime in ms.
  • fromCreatedDate and toCreatedDate (will be deprecated, see "Searching by date" section): the time interval within which the transactions are to be displayed; they refer to the createdDate parameter; they have to be in epochTime in ms.
  • sortBy: it allows you to sort the transactions according to any parameter relating to the response model, the default value is createdDate. Use or ‘-’ for descending order (es. sortBy=-data)).
  • future: flag that allows, if true, to show pending transactions (only for TPP and depends on the final banks if they are available);
  • category: any valid category. Multiple values allowed;
  • type: the transaction type, income or outcome;
  • fromAmount: to obtain the list of transactions with an amount greater than or equal to the decimal indicated
  • toAmount: to obtain the list of transactions with an amount less than or equal to the decimal indicated
  • operationType: it is possible to filter by type of operation, see table below. Multiple values allowed.

The pfm manages pagination, for this reason it is also possible to add:

  • limit: the number of transactions to be obtained. The default value is 20 and the max is 300
  • offset: indicates the offset and refers to the transactions not to the page. The default value is 0.

In the response you will get a pagination object:

...
"pagination": {
"pageCount": 0,
"resultCount": 0,
"offset": 0,
"limit": 20
},
...

where offset and limit indicate the optional query parameters just described, pageCount and resultCount indicate the number of pages and elements respectively.

For example, if we have an account with 40 transactions and suppose to impose a limit of 20, we will make two different requests and evaluate the offset as follows to obtain the complete list:

/accounts/movements/transactions?accountId=123&offset=0&limit=20&sortBy=-data
/accounts/movements/transactions?accountId=123&offset=20&limit=20&sortBy=-data

Searching by date (available soon)

The API wiil let to filter for different type of date.

The fromDate and toDate indicate the range and dateFilter parameter indicates the type of date . This field can assume the following values:

  • data = the booking datetime
  • valueDate = the value datetime
  • createdDate = the created datetime
  • resyncDate = the resync datetime
  • createdModifiedDate = resyncDate + createdDate

Data are indicated in epochTime in ms, both those in the request and those returned in the response. Although they are in milliseconds, all the dates returned by the banks only contain information relating to the day (not the time), for this reason they will all be valued at midnight.

For example:

/movements/transactions?dateFilter=createdModifiedDate&fromDate=xxxx&toDate=yyyy

If no filter is indicated then all the transactions will be returned.

Some transactions can have valueDate null: if you use this parameter as a filter, transactions with valueDate null will not be returned. It is advisable to use the booking date (data) which is always present.

Given the definition of resyncDate for most transactions this value will be null: if you use this parameter as a filter, transactions with resyncDate null will not be returned. The purpose of this filter is to only show transactions that have been added, modified and deleted at a later time so that TPP can correct its archive / db.

Raw data vs Labeled data

Below is an example that showcases the difference between raw data and those obtained through the service:

pfmLabeledData

As mentioned the PFM is a much larger project, so the TPP will always be able to enrich its UI by integrating many other PFM features: for more information and explanations, refer to the dedicated documentation.

At the bottom of this page there are tables showing the list of all returned parameters and further details

Mapping between raw and labeled data (available soon)

To retrieve the list of movements, two different services are available:

  • GET getTransaction (deprecated)
  • GET getPFMTransactions (described in this document)

To reconcile the two movements you can rely on the reconciliationId parameter, a GUID created by Fabrick which will be inserted for each movement in response to the two aforementioned services.

In this way it will be possible to make the transition from the GET getTransaction service to the GET getPFMTransactions service before disposal.

Additional Data

As a value added option you can get some additional information. To date, the additional information are nomeBeneficiario and eseguitoDa.

If you are a TPP you can get it simply by adding the query param additionalData = true. Below is an example of a request:

GET /api/fabrick/.../transactions?...&additionalData=true

In the case of FPP no modification is necessary (no need to add the additionalData parameter), it will be already included,

Response parameters

**Name **English nameDescription
accountedaccountedIf the transaction has been accounted. It indicates whether the transaction is booked or pending. Fabrick doesn't apply any logic, the value it based on the information provided by the bank: if that transaction is indicated as booked then accounted will be true. According to the BG specifications, the possibility of managing pending transactions is optional, therefore some banks could only provide the booked ones.m
accountIdaccountIdAccount Idm
bankIdbankIdBank Idm
bankProfileIdbankProfileIdBank profile Idm
bankReferencebankReferenceThe optional transaction id provided by the banko
categoriacategoryThe category of transaction (v. next table)m
causaledescriptionremittanceInformationUnstructured - psd2. Contains the description of the transaction. It can contain a maximum of 140 charactersm
causaleStructureddescriptionStructuredremittanceInformationStructured - psd2. Contains structured transaction information. To date, banks do not use this fieldo
createdDatecreatedDateDate when te record was written - This is the (system) date on which the record of the transaction was received in Fabrick by querying the bank. It is not bank valuem
crocroBank Internal Ido
databookingDateInsert date in Contabile system It is the value date of the transaction, communicated by the bank - Booking date (day on which the transaction was done by the user = accounting date)m
divisacurrencyCurrencym
entryReferenceentryReferenceEntry reference as received in transactions.o
eseguitoDaexecutedByName and surname of the debtoro
ibanBeneficiariobeneficiaryIbanThe beneficiary IBAN.o
ididtransactionidm
importoamountAmount of the transactionm
importoDivisaoriginalAmountAmount in original currencyo
isBookingDateForgedisBookingDateForgedBoolean field that describes if the booking date is altered on Agata to fill in.m
isTemporaryisTemporary[DEPRECATED: see resyncType]
if true the id parameter is not yet definitive and it surely will change the value. Some others parameters could change as well (bankReference, description,..). If false all parameters will be final and will not change their value. Useful if the TPP/ FPP needs to archive transactions
o
mccmccMerchant classification code. This parameter is valued only if operationType is crd or poso
merchantmerchantMerchant nameo
merchantCitymerchantCityMerchant cityo
nomeBeneficiariobeneficiaryNameBeneficiary name. if the transfer is incoming it is therefore obviously recoverable (corresponds to the account holder itself), but if outgoing it is recovered from the information returned by the bank, it may therefore not be valued in all caseso
normalizedMerchantnormalizedMerchantnormalized merchant name associated with the merchant of this transaction (example: merchant = Esselunga Biella => normalizedMerchant = Esselungao
numeroContoAccreditocreditAccountNumberCredited account number. if the transfer is incoming it is therefore obviously recoverable (corresponds to the account number itself); if outgoing it is recovered from the information returned by the banko
numeroContoAddebitodebitAccountNumberDebited account number. if the transfer is outgoing it is therefore obviously recoverable (corresponds to the account holder itself), but if incoming it is recovered from the information returned by the banko
propBankTransactionCodepropBankTransactionCodeProprietary final bank transaction codeo
recurrentrecurrenttrue if it is a recurring transactionm
referencereferenceTransaction reference. Any additional details retrieved from the Fabrick classification system. It corresponds to the pattern found in the causal by the semantic analysiso
remittanceAdditionalInforemittanceAdditionalInfoIt is an array containing additional information. For example, information entered by the user can be where the bank allows it. It generally consists of a single elemento
remittanceDescriptionsremittanceDescriptionsremittanceInformationUnstructuredArray - psd2. It is an array containing the description of the transaction. Each array element can contain a maximum of 140 characters. Es:
[
"COMUNE DI BIELLA",
"Data Regolamento: 23/12/22",
"Coord.Ordinante: ITxx xxxx xxxx xxxx xxxx xxxx xxx",
"Banca Ordinante: xxxxxx-xxx",
"Cro: C0xxxxxxxxx",
"Note: a note... - FATT. NR. xxxxxxx",
"Id.Operazione: 12345",
"(BP)"
]
o
resyncTyperesyncTypetype of the resyncm
resyncDateresyncDatedate of the resync phaseo
saldobalanceBalance updated to Fabrick's latest requestm
saldoDisponibilebalanceAvailableAvailable balance updated to Fabrick's latest requestm
sottoCategoriasubCategoryThe sub category of the transaction (v. next section)m
statostatusStatus of the transaction (v file next section)m
tassoCambioexchangeRateExchange Rateo
tipotypeincome or expense: it can assume the following values: 'income' and 'outcome'm
tipoOperazioneoperationTypeOperation type (v. next table)m
tppUidtppUidTPP IDm
userIduserIdUser Idm
valueDatevalueDateOperation Date or Currency - Date at which the transaction is effective (available date)o

causale vs remittanceDescriptions

The causale parameter can contain a maximum of 140 characters, for this reason the BG standard has added the remittanceDescriptions parameter, to allow to overcome this limit and prevent the TPP from obtaining a truncated description. Unfortunately, not all banks have implemented this evolution. In addition, the standard has left the banks free to interpret, for this reason it is not possible to establish a uniform rule. In other words, there could be different cases:

  • causale and remittanceDescriptions contain exactly the same value
  • causale contains the first part of the description, up to the 140th character, while remittanceDescriptions contains the entire description on several elements of the vector
  • causale contains the first part of the description, up to the 140th character and remittanceDescriptions contains only the excess part, that is the truncated one.
  • remittanceDescriptions could have ordered elements, that is an element for each type of information or maximize the element until reaching the limit of 140 characters and then continue on the second element

Below is an example.

{
...
"causale": "GIROFONDI BANCHE ... Iban Beneficiario : IT... Data ordine: 14/0",
"remittanceDescriptions": ["GIROFONDI BANCHE ...", "Iban Beneficiario : IT...", "Data ordine: 14/07/2022 Data reg. benef.: 14/07/2022", "CASSA AZIENDA", "FIL: 00282 N.DIST.: ..."]
...
}

Given the complexity, at the moment Fabrick does not carry out any mapping on these fields and returns them exactly as retrieved by the ASPSP.

Resync deepening

Sometimes banks return some transactions days after the bookingDate of the transaction itself, generally they are for example the commissions of a bank transfer or expenses related to the account perhaps close to the end of the quarter; usually we talk about 1 or 2 days.

For this reason Fabrick continues to get the transaction list with a booking date in the past, consequently some transactions could appear after the expected date.

To better manage this case, the two following parameters have been added:

  • resyncType

  • resyncDate

resyncType: indicates the status of the transaction. It can take the following values:

  • CREATED_TEMPORARY: the transaction was just fetched from the bank, the transaction id can still change, so we suggest to avoid to archive it. This is the only state where the transaction id is still temporary (replace the deprecated boolean isTemporary).
  • CREATED: the transaction is definitive, the id parameter will remain unique and invariable.
  • INSERTED: a transaction added later, the id parameter will remain unique and invariable
  • MODIFIED: a transaction description modified at a later time, the id won't be changed
  • DELETED: a transaction deleted later (replace the old boolean isDeleted)

resyncType will be always present, this means that most of the parameters will be set to CREATED.

If the consent expires while some transactions are in the CREATED_TEMPORARY state, then it will not be possible to update the state to CREATED. The update from CREATED_TEMPORARY to CREATED will take place at the next consent renewal (obviously the transaction date must be included in the required post-consent time frame).

resyncDate: indicates the last datetime the transaction changed because of a second synchronization (resync). This means that this parameter will be valued only for the INSERTED, MODIFIED, DELETED states and it will be null for CREATED_TEMPORARY and CREATED states. Obviously in case of INSERTED it will be the same of createdDate.

Both parameters are available only in production environment

Categories and subcategories

Once the transactions have been recovered and saved on Fabrick's DBs, they are immediately available. But the categorization process starts in the same moment so it can take a few seconds. It is therefore possible to see a variation of this parameter initialized as alt (other)

DIRECTIONCATEGORYSUBCATEGORY
INGOINGgiroEntrancena
INGOINGinboundCashManagementna
INGOINGsubsistencena
INGOINGgiftAndDonationsna
INGOINGrentIncomingna
INGOINGrefundsna
INGOINGbondsIncomena
INGOINGmedicalRefundna
INGOINGworkna
INGOINGpensionna
INGOINGloanna
INGOINGwinna
INGOINGinsuranceIncomena
INGOINGothersEntrancena
INGOINGdepositsEntrancena
OUTGOINGtaxfinancialsCommission
OUTGOINGtransfersextcreditCard
OUTGOINGgirogiro
OUTGOINGdepositsdeposits
OUTGOINGrestaurantsbar
OUTGOINGrestaurantsrestaurantsPizza
OUTGOINGrestaurantstakeAway
OUTGOINGrestaurantsothersRestaurants
OUTGOINGentertainmentcinema
OUTGOINGentertainmentmusicAndFilm
OUTGOINGentertainmentbet
OUTGOINGentertainmentbooks
OUTGOINGentertainmentpapers
OUTGOINGentertainmenttheater
OUTGOINGentertainmentmuseums
OUTGOINGentertainmentsportEvents
OUTGOINGentertainmentvideogames
OUTGOINGentertainmentothersEntertainment
OUTGOINGhealthrelax
OUTGOINGhealthdrugs
OUTGOINGhealthaid
OUTGOINGhealthmedical
OUTGOINGhealthgym
OUTGOINGhealthsport
OUTGOINGhealthonlus
OUTGOINGhealthothersHealth
OUTGOINGtaxfines
OUTGOINGtaxfinancialsFees
OUTGOINGtaxtaxes
OUTGOINGtaxbillsPay
OUTGOINGtaxbusinessConsultants
OUTGOINGtaxexpenseReport
OUTGOINGtaxoffices
OUTGOINGtaxlawyers
OUTGOINGtaxothersTax
OUTGOINGhomerent
OUTGOINGhomesupermarket
OUTGOINGhomemortgages
OUTGOINGhomeinterior
OUTGOINGhomehomeDevices
OUTGOINGhomemaintenance
OUTGOINGhomecondoFees
OUTGOINGhomebills
OUTGOINGhomesubscriptions
OUTGOINGhomechildHood
OUTGOINGhomecareGiven
OUTGOINGhomelaundry
OUTGOINGhomebabySitter
OUTGOINGhomeveterinary
OUTGOINGhomeinsurance
OUTGOINGhomeinternet
OUTGOINGhomeothersHome
OUTGOINGtransferscreditCard
OUTGOINGtransfersinvestments
OUTGOINGtransferscashManagement
OUTGOINGtransfersothersTransfer
OUTGOINGschoolnursery
OUTGOINGschoolcourses
OUTGOINGschoolteachingMaterials
OUTGOINGschoolschoolEducation
OUTGOINGschooluniversity
OUTGOINGschoolothersSchool
OUTGOINGtravelcarMaintenance
OUTGOINGtraveltelepass
OUTGOINGtravelfuel
OUTGOINGtraveltrains
OUTGOINGtravelfly
OUTGOINGtravelpublicTransport
OUTGOINGtravelcarRent
OUTGOINGtravelbus
OUTGOINGtraveltaxy
OUTGOINGtravelhotel
OUTGOINGtravelholiday
OUTGOINGtravelcarSharing
OUTGOINGtravelboats
OUTGOINGtravelothersTravel
OUTGOINGshoppingclothing
OUTGOINGshoppingaccessories
OUTGOINGshoppingshoes
OUTGOINGshoppingjewelry
OUTGOINGshoppingelectronics
OUTGOINGshoppingsportingGoods
OUTGOINGshoppingothersShopping
OUTGOINGothersclubAndOnlus
OUTGOINGothersprofessionals
OUTGOINGotherstobaccoAndAlcool
OUTGOINGothersmaintenanceOthers
OUTGOINGothersmaintenance
OUTGOINGothersfunding
OUTGOINGothersatm
OUTGOINGothersgive
OUTGOINGothersothersOthers

Operation Type

You can get the updated list of values via API:

POST {{domain}}/access/transactions/operationType/search
{

}

is possible to filter for a specific value:

POST {{domain}}/access/transactions/operationType/search
{
"operationType": "ver"
}
tipoOperazioneOperationItalian description
aecAddebito e/c cartaAddebito e/c carta
aftAnticipo fatturaAnticipo fattura
altotherAltri movimenti
amzAmazon Gift Voucher PaymentGift Amazon
asscheckAssegno
atmdebit card atmPrelievo da sportello ATM
bafSCT fiscel reductionBonifico Agevolazione Fiscale
bapSCT foreign countriesSEPA Credit Transfer - estero
bilbillsBollettini postali
bltbillsBollette
boacar taxBollo auto
boggeneric SCT (deprecated)SCT generico (deprecated)
boiSCT instantSEPA Credit Transfer Instant
bolstamp taxImposta di bollo
bonSCT italySEPA Credit Transfer in Italia
bopperiodical SCTSEPA Credit Transfer ricorrente
canleaseCanone
casCommissioni assegniCommissioni assegni
cbiC-billPagamento bollettini postali
cblCommissioni bollettinoCommissioni bollettino
cbnCommissioni bonificoCommissioni bonifico
ccaCommissioni CartaCommissioni Carta
ccrcredit card (deprecated)Pagamento con cata di credito (deprecated)
cddCommissioni sddCommissioni sdd
cdsCommissioni distintaCommissioni distinta
cfiCommissioni fideiussioni/fidoCommissioni fideiussioni/fido
cidCommissioni insoluto sddCommissioni insoluto sdd
cirCommissioni insoluto ribaCommissioni insoluto riba
comcommissionCommissioni
cplCommissioni prelievoCommissioni prelievo
cpoCommissioni/canone POSCommissioni/canone POS
crddebit card ecommercePagamento online
crgCarte GenericCarte Generic
criCommissioni su presentazioni ri.baCommissioni su presentazioni ri.ba
divDividendi e cedoleDividendi e cedole
dstDistintaDistinta
f24F24Modello F24 utilizzato in Italia per il pagamento di gran parte delle imposte, delle tasse e dei contributi
fatinvoicePagamento fattura utenza
finFinanziamentiFinanziamenti
girtransfer entryGiroconto
iddInsoluti sddInsoluti sdd
insInsoluti effettiInsoluti effetti
intinterestsAccredito Interessi
irbInsoluti RIBAInsoluti RIBA
lindepositConto deposito
lorDiscount revenueRicavo sconto lordo
mavMAVMAV: Pagamento mediante avviso tramite bollettino
netrevenuesAltri ricavi
p2pbank transferTrasferimento bancario
parPartita prenotataLe partite prenotate sono delle voci in addebito che la banca rende indisponili in attesa di regolare le operazioni. Ad esempio gli assegni che versi sul tuo conto corrente sono indisponibili fino a quando l'istituto titolare dell'assegno comunica la copertura dello stesso.
polPolizzePolizze
posdebit card posPagamento tramite POS
ppaPagoPAsistema dei pagamenti a favore delle pubbliche amministrazioni e dei gestori di pubblici servizi in Italia
predeprecated
prsPrestitiPrestiti
ratCard RechargeRicarica carta
ravRAVRAV: Ruoli Mediante Avviso) - utilizzato per pagare somme iscritte a ruolo (ovvero tasse, tributi, sanzioni amministrative, ecc. verso l'Agenzia delle Entrate, Inps, Comuni, Province e Regioni)
rcpCard RechargeRicarica carta
rdcRicavo effetti al dopo incassoRicavo effetti al dopo incasso
ribRibaRiba (Ricevuta Bancaria) è uno strumento finanziario molto usato da imprese e professionisti che permette di agevolare i pagamenti tramite banca
ricmobile rechargeRicarica telefonica
rimreversalRimborso da altri enti
ritbank taxRitenuta su interessi
rtfRettificheRettifiche
rvsReversalStorno
sddSepa Direct DebitSDD, addebito diretto, o domiciliazione bancaria
spcSpese comunicazioniSpese comunicazioni
speexpenseSpese
spoPrelievo sportelloPrelievo sportello
ssbDisposizione SBF stornate/insoluteDisposizione SBF stornate/insolute
stisalaryAccredito stipendio/pensione
tastaxesPagamento imposte
titstocks and bondsTitoli e obbligazioni
utzgeneric paymentsPagamenti generici
verpayment / depositVersamento

Stato - Status

Tipo mov.Tipo op.statodescrizionedefault
Bonificolin , p2p , bon, boi , bap, baf ,girATTESA_AUTORda eliminare in attesa di autorizzazione
ATTESA_AUTOR_GRUPPONON IN USO - attesa di autorizazione gruppo
ATTESA_CONFERMA_DA_TESORERIAATTESA CONFERMA DA TESORERIA
ATTESA_CONF_RETEin attesa di conferma da rete
ATTESA_DI_AUTORIZZAZIONEin attesa di autorizzazione
ATTESA_DI_AUTORIZZA_GRUPPOattesa di autorizzazione gruppo
ATTESA_TESORin attesa di conferma da tesoreria
AUTORIZZATO_T2SAUTORIZZATO T2S
DA_AUTORIZZAREda autorizzare
DA_AUTORIZZARE_GRUPPOda autorizzare gruppo
DA_AUTORIZZARE_T2SDA AUTORIZZARE T2S
DA_CONTABILIZZARE_FTFDa contabilizzare ftf
DA_ESEGUIREda eseguire
DA_INVIARE_FTFda inviare via FTF
DA_INVIARE_OUT_T2SMessaggio da inviare in banca diretta senza ulteriore contabilizzazione
DA_INVIARE_OUT_T2S_DOPO_AUTda inviare come banca diretta in attesa di autorizzazione
DA_PREPARAREda preparare
INSERITO_RDC_T2SMessaggio da inviare in banca diretta con contabilizzazione su A7 della banca ordinante
INSERITO_T2SINSERITO T2S
INVIATOinviato
ESAURITObonifico altro istituto >> ESAURITO >> bonifico riaccreditato all'ordinante perchè rifiutatoX
bonifico stesso istituto >> ESAURITO >> bonifico accreditato sul conto beneficiario
bonifico in entrata >> ESAURITO >> bonifico accreditato sul conto beneficiario
INVIO_DATA_FUTURA_SEBAIn attesa di maturazione regolamento per invio SEBA
INVIO_DATA_FUTURA_SEPAIn attesa di maturazione regolamento per invio SEPA
IN_ATTESA_AUT_CAMBIO_E_CSSEIN_ATTESA_AUT_CAMBIO_E_CSSE
IN_ATTESA_DI_BIBOstato intermedio per banca indiretta quando viene registrato il bibo nella banca mittente
IN_ATTESA_DI_INVIOIN_ATTESA_DI_INVIO
IN_ATTESA_DI_INVIO_E_AUTda inviare come banca indiretta in attesa di aut. da banca ordinante
IN_ATTESA_DI_INVIO_E_CSSEIN_ATTESA_DI_INVIO_E_CSSE
IN_ATTESA_E_AUTda inviare come banca indiretta in attesa di aut. da banca mittente
IN_ATTESA_E_AUT_E_CSSEIN_ATTESA_E_AUT_E_CSSE
IN_ATTESA_E_CSSEIN_ATTESA_E_CSSE
IN_ATTESA_INVIO_E_AUT_E_CSSEIN_ATTESA_INVIO_E_AUT_E_CSSE
IN_ATTESA_PER_AUT_E_CAMBIOIN_ATTESA_PER_AUT_E_CAMBIO
IN_ATTESA_PER_AUT_E_CSSEIN_ATTESA_PER_AUT_E_CSSE
IN_ATTESA_PER_AUT_E_FISSAZIONE_CAMBIOcambio a listino inserito in attesa di autorizzazione e di fissazione cambio
IN_ATTESA_PER_CAMBIOIN_ATTESA_PER_CAMBIO
IN_ATTESA_PER_CAMBIO_E_CSSEIN_ATTESA_PER_CAMBIO_E_CSSE
IN_ATTESA_PER_CSSEIN_ATTESA_PER_CSSE
IN_ATTESA_PER_FISSAZIONE_CAMBIOcambio a listino inserito in attesa di fissazione cambio
IN_ATT_PER_SMISTAMENTOIn attesa di smistamento
IN_ATT_PER_SMISTAMENTO_E_AUTIn attesa di smistamento e autorizzazione
IN_ATT_PER_SMISTAMENTO_E_CSSEIN_ATT_PER_SMISTAMENTO_E_CSSE
IN_ATT_PER_SMIS_AUT_CSSEIN_ATT_PER_SMIS_AUT_CSSE
IN_ESECUZIONEin esecuzione
PRENOTATO 1Prenotato bonifico stesso istituto e bonifico altro istituto italia
PRENOTATO_LISTINOprenotato per listino
PRENOTATO_STESSO_OUT 1Prenotazione compravendita divisa o bonifico stesso istituto in divisa
PRENOTATO_T2S 1Prenotato Bonifico altro istituto estero
Bonifico Ordini PermanentibopESAURITOX
Debit Cardcrd, pos, atmNEGAZIONEDeclined
STORNOReversal or Cancelled
AUTORIZZAZIONE / PREAUTORIZZAZIONEAuthorized / PRE Authorized (is applicable for Fuel station cases)
Credit CardccrANNULLATO DA POS
CASH
RETTIFICA
SPESAX
STORNO
MAV/RAVmav/ravPagatoP (actual service response)X
PrenotatoI
AnnullatoA
StornatoN
Non Pagato / ErratoE
SconfinoS
F24f24PagataX
Prenotata
InSospeso
Annullata
NonPagata
CBILLcbiPAGATOX
CANCELLATO
INSERITO
PRENOTATO
Pago PAppaINSERITO
CANCELLATO
PAGATOX
PRENOTATO
BollettinibilINSERITO
PAGATOX
CANCELLATO
PRENOTATO
STORNATO
RiBaribPagatoX
Prenotato
Addebitato al cedente
Partita prenotataparPRENOTATO
Ricarica cellularericPRENOTATO
ESEGUITOX
Ricarica con cartaratESEGUITOX
Sepa Direct DebitsddESEGUITOX

PFM Guidelines

This document describes the guidelines and some recommendations regarding the PFM service.

GET getPfmTransactions

The API in question is the following:

/api/fabrick/pfm/psd2/fabrick/v4.0/movements/transactions

If the FPP invokes the service without any parameters (as above), the default values will be applied, namely:

  • dateFilter will be createdModifiedDate (created || resync)
  • toDate will be equal to the current day
  • fromDate will be equal to the current day - 1

The above request will therefore be equivalent to the following:

/api/fabrick/pfm/psd2/fabrick/v4.0/movements/transactions?dateFilter=createdModifiedDate&fromDate=[today-1]&toDate=[today]

Details regarding the input and output parameters are described in the specific PFM document.

When should the API be invoked?

Given the 4 automatic daily updates performed by Fabrick, we recommend invoking the API in succession after each of these 4 slots. As an additional safety margin, we also recommend allowing 1 hour after each Fabrick update, as there may be delays depending on the volume of data. The FPP could therefore invoke GET getPfmTransactions at the following slots:

  1. 09:30
  2. 12:30
  3. 15:30
  4. 18:30

It is possible to invoke the API at any time, but obviously within the three-hour gap between one slot and the next — or in the time window between evening and morning — the FPP will receive exactly the same output, since no updates will have occurred.

It is therefore recommended to implement a scheduler in order to optimise the number of daily requests.

If the FPP's goal is to archive data and it is not necessary to use the current day's data, the API could also be invoked just once a day.

How should the API be invoked?

As can be seen from the specification documentation, it is possible to filter by various parameters and also by different date types.

We recommend filtering by the createdModifiedDate date and setting a time interval of just one day, as shown in the following example:

/api/fabrick/pfm/psd2/fabrick/v4.0/movements/transactions?dateFilter=createdModifiedDate&fromDate=[today-1]&toDate=[today]

This optimises the volume of data returned in the response.

It is of course necessary for the consent to always be active, meaning the PSU must renew it before it expires. Otherwise, the FPP will need to be prepared to adjust the date and therefore the time range of the data request. For example, if the PSU renews their consent 20 days after its expiry, the FPP will need to request the list of movements for the past 20 days rather than just the last 24 hours.

Depending on the behaviour and booking processes of the various banks, it may happen that, for the same createdModifiedDate, the data parameter (booking date) differs — for example, by one or two days in the past.

If only createdDate were used as a filter, inserted movements would not be missed, but cancelled or modified movements would be.

Archiving: which parameter should be used?

This section contains a suggested guideline for all those FPP or TPP AISP companies that, in addition to recovering and viewing their customers' transactions, wish to archive them within their databases.

Unfortunately, the different behaviors of banks from the point of view of accounting and transactions management add a level of complexity that does not allow us to extract a general and effective rule.

Obviously for the FPP or TPP that creates an app retrieving the transactions from Fabrick only to view and/or show them to its customer, this does not cause any problem, as all the transactions are real.

The problem could arise se the FPP or TPP wanted to archive the transactions received in real time within their databases: it is obvious that today's transactions are neither total nor definitive. The main gap is certainly not being able to rely on a unique id for each transaction, in fact the referenceId which corresponds to the transaction id is not a mandatory parameter for the PSD2 regulation, in addition to the fact that it is not guaranteed to be unique. For this, and several other reasons, the FPP/TPP will have to be based on the resyncType parameter in response to the GET getPfmTransactions (see PFM doc).

If the FPP wishes to archive movements in their own database, we recommend using the id parameter as the basis. This parameter, defined by Fabrick, will always be definitive and unique, and can therefore be used as a primary key.

The only point to be aware of is to verify that the movement is not still in a temporary state, as in that case the id parameter may still change. To do so, it is necessary to evaluate the resyncType parameter and verify that it is different from CREATED_TEMPORARY.