Open-banking exports
Banks and aggregators that implement an open-banking standard can hand their customers the API’s own JSON as a download. UPC Accounting imports that JSON as a statement file: the member uploads it into one bank or card account of their books. There is no live API connection; see the overview.
Everything on Bank statements applies here too:
amounts signed from the holder’s side, booked lines only, the bank’s transactionId as the duplicate key, account
numbers masked to their last four characters, 10 MB per file.
Accepted JSON shapes
Section titled “Accepted JSON shapes”- One response (accounts, balances or transactions), several responses merged into one object, or a JSON array of responses. Lines are grouped into one statement per account id.
- Property names are matched exactly first, then ignoring case. Trailing commas and comments are tolerated.
- A file with several accounts imports the one whose last four characters match the bank account in the books; see Currency and account matching.
- The whole JSON document is parsed at once (not streamed), so the 10 MB cap is the bound. Nesting is limited to 64 levels.
The standard is recognized from property names alone:
| Standard | Recognized by |
|---|---|
| FDX | depositAccount, depositTransaction, locAccount, locTransaction, loanAccount, investmentAccount, accountNumberDisplay, debitCreditMemo, postedTimestamp |
| UK Open Banking | A Data object with Account, Balance, Transaction, AccountId, CreditDebitIndicator, TransactionId, BookingDateTime |
| Berlin Group | transactionAmount, balanceAmount, balanceType, bookingDate, booked, resourceId, cashAccountType, remittanceInformationUnstructured, creditorName, debtorName |
| Australia CDR | A data object with maskedNumber, productCategory, isDetailAvailable, postingDateTime, openStatus, executionDateTime |
FDX (Financial Data Exchange)
Section titled “FDX (Financial Data Exchange)”Used in the US and for Canada’s consumer-driven banking. Accepted: the accounts response, the transactions
response, both merged, or an array of responses. Entities may be wrapped (depositAccount, locAccount,
loanAccount, investmentAccount, depositTransaction, locTransaction, loanTransaction) or flat with
accountCategory (FDX v5 / v6).
| Read as | From |
|---|---|
| Account | accountNumberDisplay (else accountId) |
| Account type, name | accountType; nickname, displayName or productName |
| Currency | currency.currencyCode |
| Closing balance, date | currentBalance (negated for credit lines and loans: an amount owed) / balanceAsOf |
| Available balance | availableBalance / availableCredit |
| Transaction id | transactionId |
| Posted / value date | postedTimestamp / transactionTimestamp |
| Amount | amount, made negative when debitCreditMemo is DEBIT |
| Counterparty | payee, merchant.name |
| Memo / reference / code | description + memo / checkNumber or reference / transactionType |
| Status | PENDING and AUTHORIZATION are pending; MEMO is informational |
| Running balance, original amount | runningBalance; foreignAmount / foreignCurrency |
openingDayBalance is not used as the opening balance: it opens the as-of day, not the period of the lines.
{ "accounts": [ { "depositAccount": { "accountId": "acct-1001", "accountNumberDisplay": "...1234", "accountType": "CHECKING", "nickname": "Maple Grooming operating", "currency": { "currencyCode": "USD" }, "currentBalance": 3954.33, "availableBalance": 3954.33, "balanceAsOf": "2026-09-30T23:59:59Z" } } ], "transactions": [ { "depositTransaction": { "accountId": "acct-1001", "transactionId": "txn-0001", "postedTimestamp": "2026-09-03T15:00:00Z", "amount": 45.67, "debitCreditMemo": "DEBIT", "status": "POSTED", "description": "KIBBLE WHOLESALE", "memo": "Invoice 1042" } } ]}UK Open Banking Read/Write Data API v3.1
Section titled “UK Open Banking Read/Write Data API v3.1”Reads the Data.Account, Data.Balance and Data.Transaction payloads of the accounts, balances and transactions
endpoints, alone or merged.
| Read as | From |
|---|---|
| Account | Account[0].Identification |
| Institution | Servicer.Identification, else the sort code of a SortCodeAccountNumber |
| Account type / name | AccountSubType (else AccountType) / Nickname |
| Opening balance | Balance OpeningBooked (else PreviouslyClosedBooked) |
| Closing balance | ClosingBooked (else InterimBooked) |
| Available balance | ClosingAvailable (else InterimAvailable) |
| Transaction id | TransactionId |
| Amount | Amount.Amount, signed by CreditDebitIndicator |
| Posted / value date | BookingDateTime / ValueDateTime |
| Counterparty | MerchantDetails.MerchantName, else DebtorAccount.Name (money in) or CreditorAccount.Name (money out) |
| Memo / reference | TransactionInformation / TransactionReference |
| Bank code | BankTransactionCode Code-SubCode, else ProprietaryBankTransactionCode.Code |
| Running balance, status | Balance; Booked / Pending (Rejected is skipped) |
{ "Data": { "Account": [ { "AccountId": "acc-1", "Currency": "GBP", "AccountType": "Business", "AccountSubType": "CurrentAccount", "Nickname": "Maple Grooming", "Account": [ { "SchemeName": "UK.OBIE.SortCodeAccountNumber", "Identification": "00000012345678", "Name": "Maple Grooming Ltd" } ] } ], "Balance": [ { "AccountId": "acc-1", "Type": "OpeningBooked", "CreditDebitIndicator": "Credit", "DateTime": "2026-09-01T00:00:00+00:00", "Amount": { "Amount": "4000.00", "Currency": "GBP" } }, { "AccountId": "acc-1", "Type": "ClosingBooked", "CreditDebitIndicator": "Credit", "DateTime": "2026-09-30T23:59:59+00:00", "Amount": { "Amount": "3954.33", "Currency": "GBP" } } ], "Transaction": [ { "AccountId": "acc-1", "TransactionId": "tx-0001", "Status": "Booked", "CreditDebitIndicator": "Debit", "BookingDateTime": "2026-09-03T10:15:00+00:00", "Amount": { "Amount": "45.67", "Currency": "GBP" }, "TransactionInformation": "Invoice 1042", "CreditorAccount": { "Name": "Kibble Wholesale" } } ] }}Berlin Group NextGenPSD2 (XS2A v1.3)
Section titled “Berlin Group NextGenPSD2 (XS2A v1.3)”Reads the accounts list (accounts, cardAccounts), the balances response and the transactions response
(transactions.booked, pending and information; cardTransactions), alone or together, keyed by resourceId
or IBAN.
| Read as | From |
|---|---|
| Account | iban, bban or maskedPan |
| Currency, name, type, institution | currency, name, cashAccountType, bic |
| Opening balance | openingBooked |
| Closing balance | closingBooked, else interimBooked, else expected |
| Available balance | interimAvailable, closingAvailable or forwardAvailable |
| Transaction id | transactionId / cardTransactionId |
| Amount | transactionAmount.amount (already signed) |
| Posted / value date | bookingDate (pending: valueDate) / valueDate |
| Counterparty | Money out: creditorName; money in: debtorName |
| Memo | remittanceInformationUnstructured (or its array form), remittanceInformationStructured, transactionDetails, additionalInformation |
| Reference, bank code | endToEndId, checkId, mandateId, entryReference; bankTransactionCode |
{ "account": { "iban": "DE00000000000001234567", "currency": "EUR" }, "balances": [ { "balanceType": "openingBooked", "referenceDate": "2026-08-31", "balanceAmount": { "currency": "EUR", "amount": "4000.00" } }, { "balanceType": "closingBooked", "referenceDate": "2026-09-30", "balanceAmount": { "currency": "EUR", "amount": "3954.33" } } ], "transactions": { "booked": [ { "transactionId": "tx-0001", "bookingDate": "2026-09-03", "valueDate": "2026-09-03", "transactionAmount": { "currency": "EUR", "amount": "-45.67" }, "creditorName": "Kibble Wholesale GmbH", "endToEndId": "INV-1042", "remittanceInformationUnstructured": "Invoice 1042" } ], "pending": [] }}Australia Consumer Data Right (banking)
Section titled “Australia Consumer Data Right (banking)”Reads data.accounts, data.balances (or a single account’s balance in data) and data.transactions, alone or
together. Amounts are signed strings; the currency defaults to AUD, as the standard says.
| Read as | From |
|---|---|
| Account | maskedNumber |
| Account type / name | productCategory / nickname, displayName |
| Currency | The balance’s currency (default AUD) |
| Closing balance | currentBalance (already negative when money is owed) |
| Available balance | availableBalance |
| Transaction id | transactionId |
| Amount | amount (negative = money out) |
| Posted / value date | postingDateTime (else executionDateTime) / valueDateTime |
| Counterparty, memo, reference | merchantName or billerName; description; reference or crn |
| Status | PENDING is pending |
CDR exports carry no opening balance.
{ "data": { "accounts": [ { "accountId": "a-1", "maskedNumber": "xxxx xxxx 1234", "productCategory": "TRANS_AND_SAVINGS_ACCOUNTS", "nickname": "Maple Grooming", "displayName": "Business Everyday", "openStatus": "OPEN" } ], "balances": [ { "accountId": "a-1", "currentBalance": "3954.33", "availableBalance": "3954.33", "currency": "AUD" } ], "transactions": [ { "accountId": "a-1", "transactionId": "t-0001", "isDetailAvailable": false, "type": "PAYMENT", "status": "POSTED", "description": "Invoice 1042", "postingDateTime": "2026-09-03T10:15:00+10:00", "amount": "-45.67", "reference": "1042", "merchantName": "Kibble Wholesale" } ] }}Not recognized
Section titled “Not recognized”A JSON document that matches none of the four standards is refused as not recognized. Send a standard response shape rather than a custom one, or use the bank CSV layout.