Skip to main content
The REST API is in beta. This endpoint’s response shape may change.
Returns a paginated list of transactions for a given connection. By default only posted (settled) transactions are returned; pass includePending=true to also include pending transactions. Transactions are fetched live from the banking provider. No transaction data is stored on Redbark servers.

Request

Headers

Trialing customers retain full API access, including brokerage endpoints, regardless of trial plan.

Response headers

Caching

Transactions may be served from a short-lived server-side cache for up to 60 minutes. Cached data is purged immediately on consent revocation or connection deletion, and you can opt out entirely in app settings; see Caching.

Query parameters

connectionId and accountId are both required. Use List Connections for connection IDs and List Accounts for account IDs.
The all-accounts form (omitting accountId) was removed on 2026-06-30. It now returns 410 Gone with code account_id_required, alongside Deprecation: true and Sunset: Tue, 30 Jun 2026 23:59:59 GMT headers. Pass accountId (one request per account); list a connection’s accounts via List Accounts.

Response limits

To bound memory under wide date ranges, the service stops fetching upstream pages once it has roughly 5,000 matching rows for a single request. When this row ceiling fires:
  • The response sets X-Redbark-Truncated: true.
  • pagination.hasMore is true and pagination.total is a lower bound rather than the exact count.
  • Continue paginating with the next offset + limit window — the same cap applies per request, not per session.
Separately, each account is fetched with a per-request page cap of ceil((offset + limit) / 1000) + 2 upstream pages. This cap does not set X-Redbark-Truncated. In an unusually dense date window it can stop paging before the window is exhausted and return a page with hasMore: false that under-reports the total. If you need every row in a very dense window, narrow the date range and page through smaller windows.

Pending transactions

By default this endpoint returns only posted (settled) transactions. Pass includePending=true to also include pending ones, which appear with status: "pending".
Pending transactions are provisional — do not treat them as stable records. Under the Open Banking (CDR) standard there is no guarantee that a pending transaction can be correlated with the posted transaction it later becomes. In practice this means:
  • The id changes when a transaction settles. A pending transaction and its eventual posted version are two separate records with two different id values. There is no shared key linking them. If you upsert by id, a purchase you already stored as pending will land again as a brand-new posted row.
  • A pending transaction can disappear entirely. An authorisation hold that is reversed, declined, or voided may vanish without ever posting.
  • The details can change on settlement. amount, description, date, postDate, category, and merchantName may all differ once the transaction posts (e.g. a tip or currency-conversion adjustment changes the final amount).
  • postDate / postDatetime are usually null while a transaction is pending, since it hasn’t been booked to the account yet.
Recommended usage:
  • Reconcile on posted transactions. Treat posted rows as the source of truth for balances, exports, and anything you persist. Pending is best used as a read-only, real-time preview.
  • Don’t dedupe a pending row against its posted row by id — there is no reliable link. If you need to approximate one, match on a tuple like accountId + amount + a fuzzy date window and accept that it is heuristic, not exact.
  • Expect churn. Re-fetching the same window will add, remove, and mutate pending rows between calls. Cached responses (up to 60 minutes; see Caching) can also lag the current pending set.

Response

Transaction object

Three dates, three meanings. A transaction can carry up to three dates from the CDR feed, and they can differ (e.g. a weekend card purchase that books on the next business day):
  • date/datetime: the transaction (execution) date, i.e. when the transaction occurred.
  • postDate/postDatetime: the posting (booking) date, i.e. when it landed on the account and showed up on your statement. Key off postDate when reconciling against a bank’s per-day running balance.
  • valueDate/valueDatetime: the value date, i.e. when the funds actually become available or leave the account.
For most everyday transactions all three fall on the same day. postDate and valueDate are null when the provider doesn’t supply them (many AU banks omit the value date).
The amount field is a string to preserve decimal precision. Parse it as a decimal in your application — not a float.

Categories

The category field returns the raw CDR primary-category code (uppercase, underscored) as assigned by the banking provider — not a human-readable label. Not all transactions have a category (the field is nullable). Fetch this mapping programmatically from GET /v1/categories.
Categories depend on the banking provider and account type. Some transactions (e.g. direct debits, older transactions) may have a null category.

Pagination object

Error responses

Errors use the standard envelope { "error": { "message": string, "code"?: string, "details"?: string[] } }. The optional code field is set for the structured cases below — clients should branch on code rather than parsing message. Example error body:

Date validation

The from and to parameters accept:
  • Date strings: 2026-03-01
  • Full ISO 8601 / RFC 3339 with explicit timezone: 2026-03-01T00:00:00Z or 2026-03-01T00:00:00+10:00
Naive datetimes with no Z and no ±HH:MM offset are explicitly rejected. Invalid formats return a 400 with details:

Examples

Transactions for an account (last 30 days)

Filter by account and date range

Paginate

Python: fetch all pages

JavaScript: fetch all pages