The REST API is in beta. Endpoints, request formats, and response shapes may change. Pin your integration to a specific API version once versioning is available.
Base URL
Authentication
All API requests require a Bearer token. Create an API key in the dashboard and include it in theAuthorization header:
API access requires an active Developer or Professional plan. Trial subscriptions (
status: trialing), legacy accounts within their 14-day grace period, and grandfathered accounts also retain API access. You can revoke keys from the dashboard at any time.Rate limits
Limits are tiered by endpoint cost and applied per API key. Every non-first-party request also passes through a pre-auth gate before any DB lookup: 60 per minute, bucketed by(client IP, first 16 chars of the supplied bearer token). This gate applies to all requests, not just failed ones, so probes with different partial keys from the same IP each get their own bucket, while a single key+IP combination is throttled before any DB lookup.
In addition, heavy endpoints have a per-key concurrency cap of 4 in-flight requests. Calls that arrive while four heavy requests are already in progress on the same key return
429. Issue heavy requests sequentially, or fan them out across multiple keys, to stay under the cap.
First-party sync clients identified by user agent (redbark-sure-sync, redbark-actual-sync) use a separate 300 / minute pre-auth bucket keyed only by IP. This is not relevant for third-party integrations but explains why two distinct pre-auth limits exist.
Every response includes rate limit headers:
Truncation and deprecation headers
Some endpoints set additional response headers to signal operational state:
Separately,
/v1/transactions fetches each account with a per-request page cap of ceil((offset + limit) / 1000) + 2 upstream pages. In an unusually dense date window this cap can stop paging before the window is exhausted without setting X-Redbark-Truncated, and the page can come back with hasMore: false. If you need every row in a very dense window, narrow the date range and page through smaller windows.
Error format
All errors return a JSON envelope:400 validation error includes a details array. Date-validation errors raised by the service layer carry their own message; schema-layer validation failures use the generic "Invalid request parameters" message:
Stable
code values currently emitted:
HTTP status codes
Pagination
List endpoints supportlimit and offset query parameters:
Paginated responses include a
pagination object:
Caching
Banking endpoints may serve responses from a short-lived, per-connection server-side cache. Within the freshness window below, repeat requests can return the same data; once the window passes, the next request fetches fresh data from the banking provider./v1/accounts and /v1/connections are served live from Redbark’s own records (no provider fetch, no cache). Brokerage endpoints (/v1/holdings, /v1/trades) are not cached; every request fetches live from the brokerage provider. /v1/categories is a static list, not per-connection data.
A few behaviours to note:
- Cached data is purged immediately when a consent is revoked or a connection is deleted.
- You can opt out entirely in the dashboard under Settings → Performance cache. With the cache disabled, nothing is stored for your account and every request goes straight to the provider.
- Responses carry no cache-status header. Treat any banking response as potentially up to the maximum age above.
- During a banking-provider outage, requests may return
503with aRetry-Afterheader while the circuit breaker is open. See Upstream provider errors.
Date validation
from and to accept either YYYY-MM-DD (a bare date) or RFC 3339 with an explicit timezone — Z for UTC or ±HH:MM for an offset. Naive datetimes like 2026-05-09T23:35:19 (no Z, no offset) are rejected with a 400 carrying:
400 instead of a misleading 503.
Upstream provider errors
When the banking provider rejects a request with a 4xx (validation issue we don’t catch locally), the response is surfaced as a400 with code: upstream_bad_request and message: "Upstream rejected request: <provider detail>". This avoids collapsing caller-input errors into the generic 503 "provider temporarily unavailable".
A per-(provider, userId, connectionId) circuit breaker protects /v1/transactions. After 3 upstream failures within a 60-second rolling window, the breaker opens for 60 seconds and subsequent requests for that connection fail fast with a 503, code: upstream_breaker_open, and a Retry-After header. The breaker is in-process per worker isolate, so one tripped isolate does not stop others from attempting the upstream.
OpenAPI specification
A machine-readable OpenAPI 3.1 spec is available at:/doc via Swagger UI.
Quick start
1
Get your API key
Go to Settings > API Keys in the dashboard and create a new key. Copy the key. It is only shown once.
2
List your connections
3
List accounts
4
Get balances
Use account IDs (UUIDs) from step 3:
5
Fetch transactions
Use a
connectionId (from step 2) and an accountId (from step 3). accountId is required: the connectionId-only form was removed on 2026-06-30 and now returns 410 account_id_required.