Automate Your Budget: Connect Any Data Source with the Tallyroot API
Tallyroot now has a public ingest API. Push transactions, FX trades, transfers, and balance snapshots from any source — your bank, your accounting software, or a simple script.
You have accounts at three banks. One has a direct integration with your budgeting app. The other two? You’re downloading CSVs every week, importing them manually, and hoping you didn’t miss anything.
What if your budget just stayed in sync — automatically, for every account?
The problem with closed budgeting apps
Most budgeting tools are closed boxes. They support a handful of bank connections, and if your bank isn’t on the list, you’re stuck waiting for someone else to build the integration. Maybe they will. Maybe they won’t.
This is especially painful if you’re managing finances across multiple currencies. You might have a EUR account at one bank, a USD account at another, and a GBP account at a third. The odds of all three being natively supported? Low.
And even when a connection exists, it might not work the way you need. Maybe it doesn’t pull pending transactions. Maybe it misses FX trades. Maybe it only syncs once a day when you need real-time data.
The core issue: your budget is only as good as the data flowing into it, and you have no control over that flow.
The answer: a public API
Tallyroot now has a public ingest API. If something can make an HTTP request, it can feed your budget.
Push transactions, FX trades, internal transfers, and balance snapshots from any source — your bank, your accounting software, a spreadsheet processor, a cron job. You’re not waiting for us to build the integration. You build it yourself, exactly the way you need it.
The API is RESTful, uses JSON, and is designed around idempotent upserts. Send the same transaction twice and it updates the existing record instead of creating a duplicate. This makes it safe to run sync scripts repeatedly without worrying about double-counting.
What you can do with it
- Build a connector for your bank. If your bank has an API (or even a downloadable export), you can write a script that pulls transactions and pushes them to Tallyroot automatically.
- Sync from accounting software. Pull transactions from QuickBooks, Xero, or any system with an export and route them into your personal budget.
- Automate CSV imports. Instead of uploading files manually, write a script that watches a folder, parses new files, and pushes the data via API.
- Push balance snapshots. Send your account balances at the end of each day for reconciliation — Tallyroot will flag drift between your transaction history and actual balances.
- Get alerts when things break. The API includes an alert endpoint so your connectors can notify you when a sync fails.
How it works
Authenticate with a Bearer token, then push data to the ingest endpoints. Here’s a transaction upsert:
curl -X PUT https://app.tallyroot.com/api/v1/ingest/transactions \
-H "Authorization: Bearer bk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"source": "my-bank-script",
"transactions": [
{
"externalTxnId": "bank-txn-9382",
"accountId": "your-account-uuid",
"bookedAt": "2026-04-10T14:30:00Z",
"currency": "EUR",
"amountMinor": "-4550",
"merchantName": "Grocery Store",
"bookingStatus": "booked"
}
]
}'
A few things to note:
Amounts are strings in minor units. EUR 45.50 becomes "-4550". Debits are negative, credits are positive. Strings avoid floating-point precision issues — important when you’re dealing with money.
externalTxnId is your deduplication key. Use a stable ID from your source system. If you push the same ID again with updated fields, Tallyroot updates the record instead of creating a duplicate.
Transactions have a lifecycle. A card authorization starts as pending, settles to booked, or gets reversed to voided. Push the same externalTxnId with a new bookingStatus to transition between states.
The API also supports FX trades (with from/to currency pairs), internal transfers (between your own accounts), and balance snapshots. See the full API documentation for all endpoints.
Node.js SDK
If you’re building in Node.js, there’s an official SDK that wraps the API with typed methods and error handling:
npm install @tallyroot/sdk
import { TallyrootClient, toMinor } from '@tallyroot/sdk';
const client = new TallyrootClient({
apiKey: 'bk_your_api_key',
source: 'my-connector',
});
await client.upsertTransactions([{
externalTxnId: 'bank-txn-9382',
accountId: 'your-account-uuid',
bookedAt: '2026-04-10T14:30:00Z',
currency: 'EUR',
amountMinor: toMinor('-45.50', 2),
merchantName: 'Grocery Store',
bookingStatus: 'booked',
}]);
The SDK includes money helpers (toMinor, formatMinor, negateMinor) and typed error handling for rate limits and plan requirements. Full documentation is on GitHub.
Rate limits and pricing
The API allows 120 requests per minute per workspace. Since each request can contain many transactions in the array, this is more than enough for even aggressive sync schedules.
The API is available on the Free plan, which includes one API key. Premium (from EUR 3.99/month + VAT) removes that limit if you want a separate key per connector. Create your key in Settings > API Keys and start pushing data immediately.
Get started
- Create a free account if you haven’t already
- Create an API key in Settings > API Keys
- Read the API documentation
- Push your first transaction
Your budget shouldn’t be limited by which banks your app happens to support. With the Tallyroot API, it isn’t.