Skip to main content
A Transaction represents a single line item on a bank account as reported by the institution. Transactions are read-only and are populated automatically during connection syncs.

Status lifecycle

StatusMeaning
pendingAuthorised but not yet settled. Amount or details may change.
postedFully settled.
reversedPreviously posted transaction that was reversed.
cancelledPending item that was voided before settlement.

Two ways to read transactions

Historical browse — GET /v1/transactions

Use this for initial backfills and date-range queries. Supports filtering by accountId, connectionId, status, rail, postedDateGte, and postedDateLt. Results are cursor-paginated and can be sorted by postedDate or updatedAt.

Incremental sync — GET /v1/transactions/sync

Use this for ongoing ETL after the initial backfill. The sync endpoint returns a changefeed of added, modified, and removed events ordered by (updatedAt, id) ascending, allowing you to maintain a local replica with minimal data transfer.
  1. Call once without a cursor to initialise the stream.
  2. Store the returned nextCursor.
  3. On each subsequent call, pass the stored cursor to receive only changes since the last call.
  4. If hasMore is true, call again immediately before waiting for a webhook.
A transactions.sync_available webhook is fired when new data is ready, so you don’t need to poll.
A sync cursor is only valid when reused with the same accountId / connectionId filter set.

Key fields

  • amount — Signed decimal string. Positive = inflow, negative = outflow.
  • entryTypecredit or debit, as reported by the bank.
  • rail — Payment rail: ach, wire, card, sepaCredit, swift, etc.
  • paymentReference — Remittance reference for reconciliation (e.g. invoice number).
  • bankReference — Bank-assigned operational tracking ID.
  • counterpartyName / counterpartyAccountMasked — Available on many rail types.

Endpoints

Required scopes

ScopeUsed by
transactions:readList, sync, get