REST API Guide
Orientation for the BankSync REST API: base URL, authentication, resources, errors, and rate limits by plan.
5 min read
On this page
The BankSync REST API gives you programmatic access to everything in your workspace: banks, accounts, transactions, balances, investments, loans, feeds, sync jobs, and enrichments. Use it to build custom integrations, automate reporting, or wire BankSync into your own application.
This page is the orientation map. Each topic links to a focused guide, and every endpoint is documented in the generated API reference.
RESTful design
Standard HTTP methods, JSON requests and responses
Scoped API keys
Per-key permission scopes, enforced server-side
Full workspace access
Read data, manage feeds, and trigger syncs
Base URL#
All requests use the same base URL:
https://api.banksync.io/v1Quick start#
Make your first request
Create an API key
In the BankSync app, open Settings > Developers and create a key. Copy the bsk_ secret when it is shown; it appears only once. See the API keys guide for scopes and expiration.Authenticate with the X-API-Key header
Send the key on every request. Keys are bound to one workspace, so no workspace ID header is needed.List your feeds
Call GET /feeds to confirm the key works and see your configured feeds.
curl -X GET "https://api.banksync.io/v1/feeds" \ -H "X-API-Key: bsk_your_api_key_here"A 200 OK with a JSON body means you are authenticated and correctly scoped.
Authentication#
Every request requires your API key in the X-API-Key header. Keys carry resource:action scopes (for example feeds:read, jobs:write) that you choose at creation, so each integration gets exactly the access it needs.
Keep your API key secure
- Authentication: header format, scopes, and request examples in curl, JavaScript, and Python.
- API keys: creating, scoping, rotating, and revoking keys.
Resources#
Everything hangs off your workspace. Banks contain accounts; accounts expose transactions, balances, trades, holdings, and loans; feeds move that data to your connected apps and produce jobs each time they run.
Financial data
Transactions, balances, trades, holdings, and loans from the latest available provider refresh
Banks & accounts
List connected institutions and the accounts under each connection
Feeds & jobs
Read and manage feed configurations, trigger syncs (POST /feeds/:fid/sync), and track job status
Enrichments
Create and manage all sixteen enrichment types — rulesets, lookups, guards, watches and AI — that run during syncs
See Resources & data types for the full hierarchy, key fields per resource, pagination, and sync modes, or browse every endpoint in the API reference.
Rate limits#
API throughput is set by your workspace plan. Free and Starter do not include REST API access with an API key.
| Plan | API access | Rate limit |
|---|---|---|
| Free | No | n/a |
| Starter | No | n/a |
| Standard | Yes | 10 requests/min |
| Professional | Yes | 20 requests/min |
| Business | Yes | 30 requests/min |
| Enterprise | Yes | By agreement |
How requests are counted:
- Per workspace. The limit is one budget shared by every API key and installed app in the workspace. It is not per key or per endpoint.
- Every
/v1request counts. Listing banks or accounts, reading transactions,GET /v1/whoami, and requests that later fail (a404, say) count the same as any other. Only requests rejected for a missing or invalid credential aren't counted. - Refused requests count too. A client that keeps retrying immediately after a
429keeps its own budget used up. Wait forRetry-Afterbefore sending again. - Over a rolling 60-second period. Limits are enforced at the edge and are approximate across locations, so you may sometimes get a little more than the table shows. Design for the number in the table, not above it.
- Scheduled syncs don't count. Feeds that sync on a schedule run inside BankSync and never use your API budget.
- Installed apps. An app's requests count toward the same workspace budget. An app installed on a Free or Starter workspace can still use the API there at the Standard rate.
When you exceed your limit the API returns 429 Too Many Requests with these headers:
| Header | Example | Meaning |
|---|---|---|
Retry-After | 60 | Seconds to wait before retrying |
X-RateLimit-Limit | 20 | Requests per minute allowed on your plan |
X-RateLimit-Policy | 20;w=60 | The same limit and its window in seconds |
There is no remaining-count header.
Polling many accounts#
Transactions are read one account at a time, so a full polling pass costs one request per bank to list its accounts plus one request per account. A workspace with 4 banks and 13 accounts needs 17 requests per pass. Sent back to back, that is more than Standard's 10 per minute, so part of the pass is refused.
Either of these patterns fixes it:
- Pace the pass. Space requests at least
60 / limitseconds apart, plus a little margin: about 7 seconds on Standard, 3.5 on Professional, 2.5 on Business. The 17-request pass above then finishes in about two minutes with no refusals. - Resume after a
429. When a request is refused, wait theRetry-Afterseconds, then retry that same request and carry on with the rest of the pass. Don't abandon the pass, and don't start it again from the beginning.
To keep each pass small, list banks and accounts once and cache the IDs instead of re-listing them every poll. Use from/to to fetch only the recent date range you need, and page with cursor. If you consistently need more headroom, upgrade your plan or contact support.
Error handling#
The API uses conventional HTTP status codes and returns structured JSON errors with a success: false flag and a human-readable error message.
| Code | Meaning |
|---|---|
| 400 | Bad request: missing fields or invalid format |
| 401 | Missing, invalid, or revoked API key |
| 403 | Key lacks the required scope |
| 404 | Resource not found |
| 422 | Feed configuration failed validation |
| 429 | Rate limit exceeded |
| 503 | Bank consent required (reconnect in the app) |
The Error handling guide covers the response format, validation errors, and a troubleshooting walkthrough for each code.
AI agents instead of code?#
If you want an AI assistant (Claude, Cursor, ChatGPT, and others) to work with your BankSync data rather than writing HTTP calls yourself, use the hosted MCP server at https://mcp.banksync.io. It authenticates with the same API keys. See the MCP server guide.
SDKs coming soon
Browse the API reference
Related guides#
- Authentication: how to authenticate every request with
X-API-Key. - API keys: create least-privilege keys and rotate them safely.
- Resources & data types: the data model behind every endpoint.
- MCP server guide: the same data exposed to AI agents over MCP.
Use this page with your AI assistant
Every BankSync doc is available as plain Markdown for agents and LLMs.
