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

Query banks, accounts and transactions on desktop; prepare a read-only API key on mobile.

Base URL#

All requests use the same base URL:

https://api.banksync.io/v1

Quick start#

Make your first request

  1. 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.
  2. 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.
  3. List your feeds

    Call GET /feeds to confirm the key works and see your configured feeds.
Shell
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

Never expose your key in client-side code, public repositories, or logs. Store it in an environment variable or a secrets manager. If a key is compromised, revoke it immediately in Settings > Developers and create a new one.
  • 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.

PlanAPI accessRate limit
FreeNon/a
StarterNon/a
StandardYes10 requests/min
ProfessionalYes20 requests/min
BusinessYes30 requests/min
EnterpriseYesBy 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 /v1 request counts. Listing banks or accounts, reading transactions, GET /v1/whoami, and requests that later fail (a 404, 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 429 keeps its own budget used up. Wait for Retry-After before 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:

HeaderExampleMeaning
Retry-After60Seconds to wait before retrying
X-RateLimit-Limit20Requests per minute allowed on your plan
X-RateLimit-Policy20;w=60The 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 / limit seconds 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 the Retry-After seconds, 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.

CodeMeaning
400Bad request: missing fields or invalid format
401Missing, invalid, or revoked API key
403Key lacks the required scope
404Resource not found
422Feed configuration failed validation
429Rate limit exceeded
503Bank 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

We're working on official SDKs for Python, Node.js, and other languages. Until then, the API is plain HTTPS + JSON and works with any HTTP client.

Browse the API reference

Use this page with your AI assistant

Every BankSync doc is available as plain Markdown for agents and LLMs.