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
| Item | Value |
|---|---|
| Block type | plaid |
| Studio name | Finances (Plaid) |
| Connection | Bank 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 pin | config.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 |
| Accounts | config.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.
| Action | What it does | Required config |
|---|---|---|
getInstitution | Read the institution's name, country codes, URL and logo; optionally its status | connection |
listAccounts | List the connection's cached accounts, filtered by type, subtype and currency. Makes no Plaid call; balances is null | connection |
getBalances | Read current balances for the selected accounts | connection, accountIds |
listTransactions | Read transactions for a date range, with filters | connection, accountIds, dateMode |
syncTransactions | Pull every change since the last sync for each selected account and upsert the rows into a Data Table | connection, accountIds, destinationTableId |
Fields
| Field | Type | Used by | Meaning |
|---|---|---|---|
includeStatus | boolean | getInstitution | Include the institution's status |
accountType | all, depository, credit | listAccounts | Account type filter |
subtype | all, checking, savings, credit card | listAccounts | Subtype filter |
currency | all, USD, CAD, GBP, EUR | listAccounts | Currency filter |
destinationTableId | string | syncTransactions | Data Table the rows are upserted into by eventId |
changeTypes | array of added, modified, removed | syncTransactions | Change types to emit (default all three). Removed transactions are emitted whatever the date filter says |
dateMode | none, absolute, relative:<days> | Transaction actions | Date window. Required on listTransactions; on syncTransactions it only limits what is emitted |
startDate, endDate | YYYY-MM-DD | Transaction actions, absolute mode | Inclusive dates in the workflow's timezone |
dateField | posted, authorized | syncTransactions | Which date the window applies to. listTransactions always uses the posted date |
status | all, posted, pending | Transaction actions | Status filter |
direction | all, inflow, outflow | Transaction actions | Cash direction. Money entering the account is an inflow, for credit cards too |
amountMin, amountMax | decimal string | Transaction actions | Absolute amount bounds |
search | string | Transaction actions | Case-insensitive match on merchant, description, check number and payment reference |
categories | array | Transaction actions | Plaid primary categories, such as INCOME, BANK_FEES, TRANSFER_OUT |
limit | number | listTransactions | Total 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.
| Field | Meaning |
|---|---|
schemaVersion, provider, operation, fetchedAt | Envelope metadata |
source | connectionId, connectionName, providerItemId, environment |
institution | id, name, countryCodes, url, logoUrl, status |
accounts | id, providerAccountId, name, mask, type, subtype, currency, balances |
transactions | id, eventId, changeType, status, amount { value, absolute, currency, direction, providerValue }, dates, description, category, account. Money is a decimal string; inflows are positive |
pagination | limit, returned, total, truncated (listTransactions) |
sync | initialSync, startedFromCursor, hasMore, pages, counts { added, modified, removed, emitted, filteredOut }, lastSuccessfulSyncAt (syncTransactions) |
warnings | Non-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: pinconfig.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.listTransactionsrejectsdateField: "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.
PandaDoc actions
Reference for the PandaDoc actions: the API key and MCP connections, every action id, the fields each one takes, outputs and a complete example.
QuickBooks Online actions
Reference for the QuickBooks Online actions: the connection type, each action and what it does, its inputs and outputs, and the live catalog call.
Loopfour