Overview
The Beeswax API is a JSON REST API over everything in your account: invoices, quotes, expenses, payments, the ledger, contacts, products & services, projects, tasks, time, documents and (for Australian accounts) tax returns. It is the same API that powers the Beeswax iOS app and the Beeswax MCP server for Claude and other AI assistants, so anything they can do, you can do.
Use it to:
- Sync your books into a data warehouse, reporting tool or another accounting system, incrementally and without missing a change.
- Automate bookkeeping: create invoices from your own systems, record payments as they land, post manual journals, keep contacts and your product catalogue current.
- Reconcile: read any account's posted ledger over a period with opening balance, running balance and closing balance.
- Connect no-code tools such as Zapier, Make and n8n with nothing more than an HTTP request block.
- Give an AI assistant safe, scoped access to an account through MCP.
Where things live
| I want to… | Read |
|---|---|
| Understand tokens, scopes and account binding | Authentication & scopes |
| Know the request/response conventions, errors and rate limits | Requests, responses & errors |
| Tell what is on the ledger and what is a draft | The ledger rule & document lifecycle |
| Keep a copy of my data in sync, and retry safely | Sync & safe retries |
| Copy a working example: invoice, payment, journal, contact, reconciliation | Recipes |
| Connect Zapier, Make, n8n, a script or an AI assistant | Automation tools & assistants |
| Build a production integration properly | Best practices for apps |
| Look up an endpoint or download the OpenAPI spec | Endpoint reference |
| See what changed | Changelog |
How access works
Three facts shape every integration. Everything else in these docs follows from them.
- One token, one account. A token is bound to exactly one Beeswax account at creation. The account is never a request parameter, so a token can never read or write another account's data, even one the same user belongs to. Bookkeepers create one token per client account.
- Scopes decide what a token may do. Each token carries a list of scopes such as
invoices:readorpayments:write. A request outside the token's scopes is refused with a 403 before any data is touched. Grant the least you need. - Tokens inherit the creating user's role. Scopes set the ceiling; the user's role on that account is still applied. A token with
journal_entries:writecreated by a user whose role cannot post journals gets a 403 on that action, exactly as the web app would refuse them. A token also lasts only as long as its user's membership: remove the person from the account and their tokens stop working.
Tokens are managed under Account Settings → API Tokens by Owners and Super Admins. API access is included on every plan, including Free and the trial.
Quickstart: your first request
What you need: an Owner or Super Admin login to a Beeswax account, and a terminal with curl (or any HTTP client).
1. Create a token
- Open Account Settings → API Tokens and click Create New Token.
- Name it after the thing that will use it, for example "Reporting sync (read only)". You will thank yourself when you have six.
- Tick only the scopes you need. For this walkthrough,
invoices:readandaccounts:readare enough. - Optionally set an expiry date. Save.
- Copy the token now. It is shown once. If you lose it, revoke it and create another.
Full details: API Tokens.
2. Check the connection
GET /meta works with any usable token and tells you what the token is: which account it is bound to, who created it, which scopes it carries, and the server clock.
curl https://app.beeswaxapp.com/new_api/v1/meta \
-H "Authorization: Bearer YOUR_API_TOKEN"
{
"latest_mcp_version": "1.7.0",
"account": { "id": 11, "name": "steam" },
"user": { "id": 3, "name": "Julian Chow" },
"scopes": ["invoices:read", "accounts:read"],
"server_time": "2026-09-07T06:41:12Z"
}
If you get 401 {"error":"Authorization header required"} the header is missing or misspelt. 401 {"error":"Invalid or expired token"} means the token was mistyped, revoked or expired, its account's subscription is not active, or its user no longer belongs to the account.
3. List some invoices
curl "https://app.beeswaxapp.com/new_api/v1/invoices?per_page=2" \
-H "Authorization: Bearer YOUR_API_TOKEN"
{
"invoices": [
{
"id": 16102,
"type": "Invoice",
"number": "INV-1043",
"title": "Brand refresh, phase 2",
"state": "finalised",
"posted": true,
"sent_on": "2026-08-28",
"due_on": "2026-09-11",
"total": "4950.0",
"paid": "0.0",
"payable": "4950.0",
"fully_paid": false,
"overdue": false,
"currency_code": "AUD",
"updated_at": "2026-08-28T03:12:45.120Z",
"project": { "id": 88, "name": "Acme rebrand" }
}
],
"meta": {
"current_page": 1,
"total_pages": 212,
"total_count": 423,
"per_page": 2,
"filter": { "posted": true, "updated_since": null },
"server_time": "2026-09-07T06:41:20.004Z"
}
}
Three things to notice, because they recur everywhere:
- Every listing is wrapped in a key named after the resource plus a
metablock with pagination and the filters that were applied. posted: trueis the only reliable sign that a document is on the ledger. By default listings return posted documents only. See the ledger rule.- Money is a decimal string (
"4950.0"), never a binary float. Parse it with a decimal type.
4. Try a filter
Overdue invoices on one project, dated this year:
curl "https://app.beeswaxapp.com/new_api/v1/invoices?overdue=true&project_id=88&from=2026-01-01" \
-H "Authorization: Bearer YOUR_API_TOKEN"
5. Make a write (optional)
Writes need the matching :write scope and an Idempotency-Key header so a retry can never create a duplicate. The Recipes article walks through creating and finalising an invoice, recording a payment and posting a manual journal, step by step.
Ground rules worth knowing before you build
- Nothing in the API emails your clients. Creating or finalising an invoice or quote never sends it. Sending, and marking a quote accepted, stay human actions in the web app.
- Ledger documents are voided, never deleted.
DELETEworks on drafts only. A finalised invoice or expense is voided, which keeps its number and history and removes it from the ledger. - There is no separate sandbox. Sign up for a free Beeswax account to develop against. It has the full API, and nothing you do there touches a real set of books. See Best practices.
- Rate limits apply per token. 300 requests a minute. A 429 tells you how long to wait. See Requests, responses & errors.
- Changes are announced. New fields and endpoints are added without notice in the changelog. Anything that changes existing behaviour is called out there as a behaviour change, with the date.
Getting help
- Search this help centre; the Developers articles are indexed alongside everything else.
- The in-app Help drawer on the API Tokens page shows the token article and answers questions with these docs.
- Ask a question or report a problem: Contact, or the Report a Bug link in the app footer, which captures the page and account for you. Include the
X-Request-Idheader from the failing response and we can find the exact request in our logs.