actual-budgetQuery and manage personal finances via the official Actual Budget Node.js API. Use for budget queries, transaction imports/exports, account management, categorization, rules, schedules, and bank sync with self-hosted Actual Budget instances.
Install via ClawdBot CLI:
clawdbot install ThisIsJeron/actual-budgetOfficial Node.js API for Actual Budget. Runs headless — works on local budget data synced from your server.
npm install @actual-app/api
| Variable | Required | Description |
|----------|----------|-------------|
| ACTUAL_SERVER_URL | Yes | Server URL (e.g., https://actual.example.com) |
| ACTUAL_PASSWORD | Yes | Server password |
| ACTUAL_SYNC_ID | Yes | Budget Sync ID (Settings → Advanced → Sync ID) |
| ACTUAL_DATA_DIR | No | Local cache directory for budget data (defaults to cwd) |
| ACTUAL_ENCRYPTION_PASSWORD | No | E2E encryption password, if enabled |
| NODE_EXTRA_CA_CERTS | No | Path to CA certificate file for self-signed certs |
If your Actual Budget server uses a self-signed certificate:
NODE_EXTRA_CA_CERTS=/path/to/your-ca.pem to trust your specific CAAvoid disabling TLS verification entirely — it exposes you to man-in-the-middle attacks.
const api = require('@actual-app/api');
await api.init({
dataDir: process.env.ACTUAL_DATA_DIR || '/tmp/actual-cache',
serverURL: process.env.ACTUAL_SERVER_URL,
password: process.env.ACTUAL_PASSWORD,
});
await api.downloadBudget(
process.env.ACTUAL_SYNC_ID,
process.env.ACTUAL_ENCRYPTION_PASSWORD ? { password: process.env.ACTUAL_ENCRYPTION_PASSWORD } : undefined
);
// ... do work ...
await api.shutdown();
$50.00 = 5000, -1200 = expense of $12.00YYYY-MM-DD, months use YYYY-MMgetIDByName(type, name) to look up by nameapi.utils.amountToInteger(123.45) → 12345const months = await api.getBudgetMonths(); // ['2026-01', '2026-02', ...]
const jan = await api.getBudgetMonth('2026-01'); // { categoryGroups, incomeAvailable, ... }
const accounts = await api.getAccounts();
const balance = await api.getAccountBalance(accountId);
const newId = await api.createAccount({ name: 'Checking', type: 'checking' }, 50000); // $500 initial
await api.closeAccount(id, transferToAccountId); // transfer remaining balance
// Get transactions for date range
const txns = await api.getTransactions(accountId, '2026-01-01', '2026-01-31');
// Import with deduplication + rules (preferred for bank imports)
const { added, updated } = await api.importTransactions(accountId, [
{ date: '2026-01-15', amount: -2500, payee_name: 'Grocery Store', notes: 'Weekly run' },
{ date: '2026-01-16', amount: -1200, payee_name: 'Coffee Shop', imported_id: 'bank-123' },
]);
// Update a transaction
await api.updateTransaction(txnId, { category: categoryId, cleared: true });
const categories = await api.getCategories();
const groups = await api.getCategoryGroups();
const payees = await api.getPayees();
// Create
const catId = await api.createCategory({ name: 'Subscriptions', group_id: groupId });
const payeeId = await api.createPayee({ name: 'Netflix', category: catId });
await api.setBudgetAmount('2026-01', categoryId, 30000); // budget $300
await api.setBudgetCarryover('2026-01', categoryId, true);
const rules = await api.getRules();
await api.createRule({
stage: 'pre',
conditionsOp: 'and',
conditions: [{ field: 'payee', op: 'is', value: payeeId }],
actions: [{ op: 'set', field: 'category', value: categoryId }],
});
const schedules = await api.getSchedules();
await api.createSchedule({
payee: payeeId,
account: accountId,
amount: -1500,
date: { frequency: 'monthly', start: '2026-01-01', interval: 1, endMode: 'never' },
});
await api.runBankSync({ accountId }); // GoCardless/SimpleFIN
await api.sync(); // push/pull changes to server
await api.shutdown(); // always call when done
For complex queries, use ActualQL:
const { q, runQuery } = require('@actual-app/api');
// Sum expenses by category this month
const { data } = await runQuery(
q('transactions')
.filter({
date: [{ $gte: '2026-01-01' }, { $lte: '2026-01-31' }],
amount: { $lt: 0 },
})
.groupBy('category.name')
.select(['category.name', { total: { $sum: '$amount' } }])
);
// Search transactions
const { data } = await runQuery(
q('transactions')
.filter({ 'payee.name': { $like: '%grocery%' } })
.select(['date', 'amount', 'payee.name', 'category.name'])
.orderBy({ date: 'desc' })
.limit(20)
);
Operators: $eq, $lt, $lte, $gt, $gte, $ne, $oneof, $regex, $like, $notlike
Splits: .options({ splits: 'inline' | 'grouped' | 'all' })
// Look up ID by name
const acctId = await api.getIDByName('accounts', 'Checking');
const catId = await api.getIDByName('categories', 'Food');
const payeeId = await api.getIDByName('payees', 'Amazon');
// List budgets
const budgets = await api.getBudgets(); // local + remote files
Transfers use special payees. Find transfer payee by transfer_acct field:
const payees = await api.getPayees();
const transferPayee = payees.find(p => p.transfer_acct === targetAccountId);
await api.importTransactions(fromAccountId, [
{ date: '2026-01-15', amount: -10000, payee: transferPayee.id }
]);
await api.importTransactions(accountId, [{
date: '2026-01-15',
amount: -5000,
payee_name: 'Costco',
subtransactions: [
{ amount: -3000, category: groceryCatId },
{ amount: -2000, category: householdCatId },
]
}]);
For migrating from another app:
await api.runImport('My-New-Budget', async () => {
for (const acct of myData.accounts) {
const id = await api.createAccount(acct);
await api.addTransactions(id, myData.transactions.filter(t => t.acctId === id));
}
});
Full API: https://actualbudget.org/docs/api/reference
ActualQL: https://actualbudget.org/docs/api/actual-ql
Generated Mar 1, 2026
A user wants to build a personal finance dashboard that aggregates budget data from their self-hosted Actual Budget instance. They use the API to fetch monthly budget summaries, transaction histories, and account balances, then visualize this data in a custom web interface. This allows for personalized reporting beyond the standard Actual Budget UI.
A small business owner integrates the API with their accounting software to automatically import bank transactions into Actual Budget. They set up rules via the API to categorize recurring expenses like subscriptions and vendor payments, ensuring accurate budget tracking without manual entry each month.
A financial analyst develops a tool that uses ActualQL queries to analyze historical spending patterns and predict future budget needs. By querying transaction data grouped by category and date, they generate forecasts to help users plan for seasonal expenses or savings goals.
A developer creates a service that periodically triggers bank syncs via the API to keep transaction data up-to-date across multiple accounts. It logs sync results and alerts users of any failures, ensuring reliable data synchronization for budgeting accuracy.
A nonprofit organization uses the API to export transaction data and generate custom reports for grant compliance. They filter transactions by payee and category to track restricted funds, then format the data for submission to donors or auditors.
A company builds a platform that connects Actual Budget with other financial tools like invoicing software or tax services via its API. They charge a subscription fee for seamless data synchronization and enhanced workflow automation, targeting users who want an all-in-one financial management solution.
A consultancy offers services to help businesses set up and customize their Actual Budget instances using the API. They provide development for custom integrations, data migration, and automation scripts, generating revenue through project-based fees or retainer contracts.
A startup analyzes aggregated, anonymized budget data from multiple Actual Budget users via the API to provide insights into spending trends and savings opportunities. They monetize by offering premium reports and personalized recommendations to subscribers.
💬 Integration Tip
Ensure all required environment variables are set before initialization, and always call shutdown() to clean up resources. Use getIDByName() to avoid hardcoding UUIDs for better maintainability.
Query Copilot Money personal finance data (accounts, transactions, net worth, holdings, asset allocation) and refresh bank connections. Use when the user asks about finances, account balances, recent transactions, net worth, investment allocation, or wants to sync/refresh bank data.
Stripe API integration with managed OAuth. Manage customers, subscriptions, invoices, products, prices, and payments. Use this skill when users want to process payments, manage billing, or handle subscriptions with Stripe. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
QuickBooks API integration with managed OAuth. Manage customers, invoices, payments, bills, and run financial reports. Use this skill when users want to interact with QuickBooks accounting data. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Advanced financial calculator with future value tables, present value, discount calculations, markup pricing, and compound interest. Use when calculating investment growth, pricing strategies, loan values, discounts, or comparing financial scenarios across different rates and time periods. Includes both CLI and interactive web UI.
Track expenses via natural language, get spending summaries, set budgets
Track business income and expenses in structured CSV format. Categorize transactions, monitor cash flow, generate P&L summaries, and spot spending trends.