Loopfour
Integrations

Plaid actions

Reference for the Plaid actions: the connection type, each action and what it does, its inputs and outputs, and the live catalog call.

The Plaid block, shown in Studio as Finances (Plaid), reads institutions, accounts, balances and transactions from bank and credit-card accounts linked through Plaid. For the plain-language overview, see Bank and card accounts (Plaid).

When to use it

Use syncTransactions on a schedule to keep a Data Table of bank and card transactions for reconciliation. Use listTransactions for a one-off date range, and getBalances for a balance check.

Connection

ItemValue
Block typeplaid
Studio nameFinances (Plaid)
ConnectionBank link. In Integrations, Connect institution asks for the bank's country (United States or Canada) and opens Plaid Link. One connection is one institution
Account pinconfig.connection is required. A Plaid step never uses the default connection and never falls back to another one; if the pinned connection is missing, expired or disconnected, the step fails
Accountsconfig.accountIds: Loopfour account ids for the selected connection (not Plaid account_id values). Required on getBalances, listTransactions and syncTransactions

Actions

The action id is plaid.<action>. All five are in the Studio Action list.

ActionWhat it doesRequired config
getInstitutionRead the institution's name, country codes, URL and logo; optionally its statusconnection
listAccountsList the connection's cached accounts, filtered by type, subtype and currency. Makes no Plaid call; balances is nullconnection
getBalancesRead current balances for the selected accountsconnection, accountIds
listTransactionsRead transactions for a date range, with filtersconnection, accountIds, dateMode
syncTransactionsPull every change since the last sync for each selected account and upsert the rows into a Data Tableconnection, accountIds, destinationTableId

Fields

FieldTypeUsed byMeaning
includeStatusbooleangetInstitutionInclude the institution's status
accountTypeall, depository, creditlistAccountsAccount type filter
subtypeall, checking, savings, credit cardlistAccountsSubtype filter
currencyall, USD, CAD, GBP, EURlistAccountsCurrency filter
destinationTableIdstringsyncTransactionsData Table the rows are upserted into by eventId
changeTypesarray of added, modified, removedsyncTransactionsChange types to emit (default all three). Removed transactions are emitted whatever the date filter says
dateModenone, absolute, relative:<days>Transaction actionsDate window. Required on listTransactions; on syncTransactions it only limits what is emitted
startDate, endDateYYYY-MM-DDTransaction actions, absolute modeInclusive dates in the workflow's timezone
dateFieldposted, authorizedsyncTransactionsWhich date the window applies to. listTransactions always uses the posted date
statusall, posted, pendingTransaction actionsStatus filter
directionall, inflow, outflowTransaction actionsCash direction. Money entering the account is an inflow, for credit cards too
amountMin, amountMaxdecimal stringTransaction actionsAbsolute amount bounds
searchstringTransaction actionsCase-insensitive match on merchant, description, check number and payment reference
categoriesarrayTransaction actionsPlaid primary categories, such as INCOME, BANK_FEES, TRANSFER_OUT
limitnumberlistTransactionsTotal output limit (pages until it is met)

Output

Every action returns the same envelope. Collections an action does not use are empty and objects are null.

FieldMeaning
schemaVersion, provider, operation, fetchedAtEnvelope metadata
sourceconnectionId, connectionName, providerItemId, environment
institutionid, name, countryCodes, url, logoUrl, status
accountsid, providerAccountId, name, mask, type, subtype, currency, balances
transactionsid, eventId, changeType, status, amount { value, absolute, currency, direction, providerValue }, dates, description, category, account. Money is a decimal string; inflows are positive
paginationlimit, returned, total, truncated (listTransactions)
syncinitialSync, startedFromCursor, hasMore, pages, counts { added, modified, removed, emitted, filteredOut }, lastSuccessfulSyncAt (syncTransactions)
warningsNon-fatal notices, for example a filter that matched no accounts

A later step loops over {{steps.<id>.transactions}} and should key on eventId, which is stable for each version of a transaction.

How the sync works

syncTransactions keeps a cursor per workflow, step, connection and account; you cannot set it. For each account it reads every page of changes, then in one database transaction stores the changes, upserts the rows into the Data Table by eventId and advances the cursor. If two runs overlap, the later one restarts from the cursor the first one saved. Filters decide only what the step emits; the Data Table receives every change.

The destination Data Table must already have these columns: eventId, connectionId, accountId, providerTransactionId, changeType, versionHash, status, postedDate, authorizedDate, amount, absoluteAmount, currency, direction, description, merchant, reference, category, pendingTransactionId, accountName, accountMask, reconciliationStatus, processedAt, lastError. The step checks them, and the table's row limit, before calling Plaid.

Example

{
  "id": "sync_bank",
  "type": "action",
  "name": "Sync operating account transactions",
  "action": "plaid.syncTransactions",
  "config": {
    "operation": "syncTransactions",
    "connection": "<plaid-connection-id>",
    "accountIds": ["<account-id>"],
    "destinationTableId": "<data-table-id>",
    "changeTypes": ["added", "modified", "removed"],
    "dateMode": "none",
    "status": "all",
    "direction": "all"
  }
}

Live catalog

GET /api/v1/blocks/plaid returns the fields and the five actions. See Block and action discovery.

Errors and limits

  • Financial Accounts steps require an explicit institution connection: pin config.connection.
  • requires accountIds: select at least one account on the step: an empty selection would read nothing, so the step fails instead.
  • DESTINATION_COLUMNS_MISSING, DESTINATION_COLUMNS_AMBIGUOUS, DESTINATION_TABLE_FULL: fix the Data Table and re-run. Nothing was synced and the cursor did not move.
  • listTransactions rejects dateField: "authorized", because Plaid's historical read filters on posted date only.
  • When the institution needs the user to sign in again, the step fails and the connection shows Requires action in Integrations.

On this page