The REST API is in beta. Response shapes may change. These samples are kept in sync with the live API; the OpenAPI spec is the authoritative schema.
About the IDs
- Connection and account IDs are UUIDs generated by Redbark.
- Transaction IDs come from the banking provider (Fiskil) and are opaque strings — treat them as arbitrary strings, not UUIDs.
- Holding IDs are opaque strings from the brokerage provider (SnapTrade).
- Trade IDs are deterministic strings built from trade attributes (they are long and may contain hyphens). Treat them as opaque.
- All decimal values (balances, amounts, quantities, prices) are returned as strings to preserve precision — parse them with a decimal library, not a float.
The scenario
Two connections belonging to the same user:| Connection | Institution | Category | Accounts |
|---|---|---|---|
b7c4a1e2-8d3f-4e9a-9c5b-1f2a3e4d5c6b | Westpac | banking | 3 (transaction, savings, credit card) |
e8f1a2b3-7c4d-5e6f-8a9b-0c1d2e3f4a5b | Interactive Brokers | brokerage | 1 (investment) |
GET /v1/connections
Returns every active connection for the authenticated user. Connections with status deleting are excluded. Ordered by createdAt DESC (most recent first).
status values: active, invalidated, pending_mfa, revoked. institutionLogo and lastRefreshedAt are nullable. institutionId is an opaque provider-specific identifier (numeric strings for Fiskil, UUIDs for SnapTrade) — treat it as an arbitrary string. See the Connections reference.
GET /v1/accounts
Returns every account across both connections in a single paginated response. Ordered alphabetically by account name (ASC).
provider, institutionName, and accountNumber are nullable. accountNumber is masked to the last 4 digits as xxxx<last4>. See the Accounts reference.
GET /v1/balances?accountIds=...
Balances for all four accounts. Accepts a comma-separated list of up to 100 account UUIDs. Returned in the order the provider responds (not guaranteed to match the input order).
Request:
currentBalance can be negative (e.g. credit cards, overdrawn accounts). See the Balances reference.
GET /v1/transactions?connectionId=...
Transactions across the three Westpac accounts for the default 30-day window. Only transactions with status posted are returned — pending transactions are filtered out upstream at the provider.
Request:
GET /v1/holdings?connectionId=...
Holdings for the Interactive Brokers trading account. Holdings are only available on brokerage connections and require a Professional plan. Requesting holdings for a banking connection returns 400.
Request:
GET /v1/trades?connectionId=...
Trades on the IBKR account. pagination.total is -1 when hasMore is true (the total is only known once every page has been fetched). When hasMore is false, total is the exact count of returned trades.
Request:
Error responses
All errors return the same envelope regardless of endpoint:code and details are optional and omitted entirely when not set — the server never emits "code": null or "details": []. Only one machine-readable code is currently emitted ("code": "professional_required" on brokerage 403s). A 400 validation error on transactions includes details:
429 rate-limit error is accompanied by a Retry-After response header (seconds):
Webhook payload (transactions.synced)
If you’re building a webhook destination consumer, here’s the envelope sent when a bank transaction sync completes. Payload formatting differs significantly from the REST API — notably, amounts are integers in the smallest currency unit (e.g. cents), all field names use snake_case, and timestamps in the envelope are Unix epoch seconds.
trades.synced events with the same envelope but trade objects in data.new; quantities, prices, and fees are decimal strings (not integers) to preserve precision for fractional shares. See the Webhooks reference for payload fields, signature verification (HMAC-SHA256), chunking behaviour, and retry schedule.
Next steps
- Validate your parser against every response above.
- Pull the OpenAPI 3.1 spec and generate a typed client, or drive contract tests off it.
- When you’re ready, create an API key and swap fixtures for real calls.