API Endpoint Reference

Every endpoint by resource, with method, purpose, filters and the scope it needs. Plus the OpenAPI specification.

How to use this page

All paths are relative to https://app.beeswaxapp.com/new_api/v1. Every request needs Authorization: Bearer <token>. Listings take page, per_page (max 100) and updated_since; document listings also take the filters in Requests, responses & errors. Writes accept Idempotency-Key.

The OpenAPI 3.1 specification with every request and response schema lives in the Beeswax repository at docs/openapi.yaml and is the authoritative source for field names and types. Load it into Postman, Insomnia, Bruno or an OpenAPI code generator to get a typed client for free. A hosted, browsable version of the reference is planned; until then this page is the human-readable index.

Scope notation: invoices:read / invoices:write means reads need the first and writes the second. A :write scope always includes its :read.

The scope is not the only check. Every endpoint also applies the token user's role on the account, so a listing holds only the rows that role sees in the web app. See Scopes and roles.


Connection

Method Path Purpose Scope
GET /meta Token introspection: bound account, user, scopes, server time, latest MCP version. Use as your connection check. any usable token
GET /users/me The token's user and their default project. any usable token
GET /accounts Accounts the token's user can see. accounts:read
POST /accounts/switch Revoke this token and issue one for another of the user's accounts. First-party use. all
POST /sessions Email + password → all-scope token. Reserved for Beeswax's own apps. none
DELETE /sessions Revoke the calling token. any usable token

Reference data (/active_account/…)

Method Path Purpose Scope
GET /active_account/users Members of the account. users:read
GET /active_account/projects, /active_account/projects/:id Projects. projects:read
GET /active_account/projects/:project_id/milestones A project's milestones. milestones:read
GET /active_account/transaction_accounts Chart of accounts. Rows carry type, account_type, active, system, default, bank_account, tax_id. transaction_accounts:read
GET /active_account/transaction_accounts/default The account's default income and expense accounts. transaction_accounts:read
GET /active_account/transaction_accounts/:id/transactions Per-account ledger for a period: from, to (YYYY-MM-DD). Posted postings oldest first, opening balance, running balance, debit and credit totals, closing balance. transaction_accounts:read and transactions:read
GET /active_account/taxes Tax codes. transaction_accounts:read
GET /active_account/companies, /active_account/companies/:id Clients and suppliers with contact people. Filters role=client or supplier, name. companies:read
POST, PATCH /active_account/companies, /active_account/companies/:id Create and update. Body company with name, client, supplier, address fields, web_address, invoice_details, default_tax_id, people[]. Owner and system companies are read-only. companies:write

Invoices and expenses

Same shape for both; substitute expenses for invoices. Expenses additionally take external_number.

Method Path Purpose Scope
GET /invoices List. Posted only by default; see the ledger rule. Filters state, project_id, company_id, company, from, to, outstanding, overdue, posted, include_drafts. invoices:read
GET /invoices/:id One invoice with groups[] and lines, paid, payable, editable, voided. invoices:read
GET /invoices/:id/transactions Ledger postings. Empty with reason for unposted; ?preview=true for would-be lines. invoices:read or transactions:read
POST /invoices Create whole document (header + groups[] + lines[]); lands as draft. status: "finalised" to post in one step. invoices:write
PATCH /invoices/:id Header fields only (title, content, sent_on, company_id, project_id, tax_inclusive, defaults). invoices:write
POST /invoices/:id/finalise Draft → finalised; postings written. Emails nobody. invoices:write
POST /invoices/:id/void Finalised and unpaid → voided. Keeps number and history. invoices:write
DELETE /invoices/:id Drafts only. invoices:write
GET, POST /invoices/:id/transaction_groups Sections. Body transaction_group (name, due_on, start_on). invoices:read / invoices:write
GET, PATCH, DELETE /invoices/:id/transaction_groups/:gid One section. invoices:read / invoices:write
POST /invoices/:id/transaction_groups/reorder Body group_ids[] in the new order. invoices:write
GET, POST /invoices/:id/transaction_groups/:gid/transactions Lines. Body transaction (description, transaction_account_id, transaction_template_id, quantity, unit_amount, amount, kind, tax_id, details, starts_on). invoices:read / invoices:write
GET, PATCH, DELETE /invoices/:id/transaction_groups/:gid/transactions/:tid One line. invoices:read / invoices:write
POST /invoices/:id/transaction_groups/:gid/transactions/reorder Body transaction_ids[]. invoices:write
GET /invoices/:id/versions, /invoices/:id/versions/:n Version history; one version in full. invoices:read
POST /invoices/:id/versions/:n/restore Write that version's content as the next version. invoices:write
GET, POST /invoices/:id/files Attachments: list; upload (multipart asset, or JSON file{name, content_type, base64}). invoices:read / invoices:write
DELETE /invoices/:id/files/:file_id Remove an attachment. invoices:write
GET /invoices/:id/files/:file_id/versions A file's version history. invoices:read
GET /projects/:project_id/invoices, …/:id Project-scoped reader (same as ?project_id=). invoices:read

Quotes

As invoices, with these differences: quotes never post (posted is always false, no posted default on listings), finalise is an internal state change, there is no void (quotes DELETE), no version history, and editable is false once marked accepted in the web app.

Method Path Scope
GET /quotes, /quotes/:id, /quotes/:id/transactions quotes:read
POST, PATCH, DELETE /quotes, /quotes/:id quotes:write
POST /quotes/:id/finalise quotes:write
GET, POST, PATCH, DELETE /quotes/:id/transaction_groups…, …/transactions…, …/reorder quotes:read / quotes:write
GET, POST, DELETE /quotes/:id/files… quotes:read / quotes:write
GET /projects/:project_id/quotes, …/:id quotes:read

Payments

Method Path Purpose Scope
GET /payments, /payments/:id Payments with paid_on, bank_account_id, amount, applied_to[]. Filters as for documents. payments:read
GET /payments/:id/transactions Bank and receivable/payable postings. payments:read or transactions:read
POST /payments Apply. Body payment{bank_account_id, paid_on, allocations[{journal_entry_id, amount}]}. One side (invoices or expenses) per payment; all-or-nothing. payments:write
DELETE /payments/:id Remove a payment and reopen the document. payments:write

Manual journals

Method Path Purpose Scope
GET /raw_journal_entries, /raw_journal_entries/:id List (posted by default) and view, with lines. journal_entries:read
POST /raw_journal_entries Body manual_journal{date, narration (≤255), status?, lines[{account_id, debit or credit, description}]}. Posts immediately unless status: "draft". Must balance. journal_entries:write
POST /raw_journal_entries/:id/finalise Post a draft. journal_entries:write
DELETE /raw_journal_entries/:id Drafts only. journal_entries:write

Bank reconciliations (statement checks)

The reconciliation page, as an API: one reconciliation per bank account per statement period. A row is a Beeswax transaction on the bank account in the period; tick it with remittance_id (an individual payment, transfer or manual journal) or line_item_id (several payments on one bank-feed line, which tick as one). Every write is pushed to the page over Turbo Streams, so a person watching it sees rows tick off live. Writes need a role that may manage reconciliations (owner or accountant).

Method Path Purpose Scope
GET /reconciliations Periods with balances, totals, signed difference and state (pending_statement, reconciled, balanced, unreconciled). Filters bank_account_id, state. reconciliations:read
GET /reconciliations/:id Header, every row (ticked or not, with received/spent, the document and what it pays for), row_counts, and the processed statement PDF's statement_lines with their match status. reconciliations:read
POST /reconciliations Body reconciliation with bank_account_id, start_on, finish_on, opening_balance, closing_balance — or just bank_account_id plus statement: { name, base64 } to let Beeswax extract the period from the PDF and run its matcher. reconciliations:write
PATCH /reconciliations/:id Period and balances. reconciliations:write
POST /reconciliations/:id/confirm, /unconfirm Body remittance_ids[], line_item_ids[]. Ids that are not rows here come back under unknown, untouched. reconciliations:write
POST /reconciliations/:id/statement Upload a statement PDF (statement: { name, base64 }, 25 MB) for AI extraction and matching. reconciliations:write
GET /reconciliations/:id/statement_status Poll that run: pending, extracting, matching, completed, failed, date_mismatch. reconciliations:read
POST /reconciliations/:id/statement_lines/:line_id/match, /unmatch Tie a statement line to a row (remittance_id, reasoning) and tick it; unmatch with untick: true also unticks. reconciliations:write
GET /reconciliations/possible_duplicates reconciliation_id or bank_account_id + from + to, window_days (7). Groups of payments (same amount, same company, within the window; same_document = one bill paid twice), documents (the same bill entered twice) and statement (the same movement twice on the PDF). reconciliations:read

Ledger readers

Method Path Purpose Scope
GET /journal_entries Untyped reader across every document type. ?type=invoices or expenses or quotes or payments or credits or bank_transfers or payrolls. the type's read scope; all for a bare list or a long-tail type
GET /journal_entries/:id One entry of any type. all
GET /journal_entries/:id/transactions Its postings (ledger rule applies). all or transactions:read
GET /active_account/transaction_accounts/:id/transactions Per-account ledger (see Reference data). transaction_accounts:read and transactions:read

Products & services

Method Path Purpose Scope
GET /transaction_templates, /transaction_templates/:id Catalogue. Filters kind (sell, buy, buy_and_sell), side=sell or buy, active, query. transaction_templates:read
POST, PATCH, DELETE /transaction_templates, /transaction_templates/:id Maintain the catalogue. kind is the buy/sell mode; income and expense accounts must be named explicitly and are type-checked. System templates are refused. transaction_templates:write

Projects, documents and themes

Method Path Purpose Scope
GET /project_documents, /project_documents/:id Project documents (freeform markdown and uploaded). project_documents:read
POST, PATCH /project_documents, /project_documents/:id Create and edit freeform documents; every edit lands in version history. project_documents:write
GET /project_documents/:id/versions, …/versions/:n Version history. project_documents:read
POST /project_documents/:id/versions/:n/restore Restore as the next version. project_documents:write
GET /themes, /themes/:key, /themes/spec Built-in and custom document themes; the theme specification. themes:read
POST, PATCH, DELETE /themes, /themes/:key Author custom themes (keys custom/<slug>). themes:write
POST /themes/:key/validate, /themes/activate Validate a theme; make one active for the account. themes:write
GET /themes/:key/preview Rendered preview. themes:read
GET /milestones, /milestones/:id Milestones. milestones:read

Tasks, time and calendar

Method Path Purpose Scope
GET /tasks, /tasks/:id, /tasks/completed Tasks. tasks:read
POST, PATCH, DELETE /tasks, /tasks/:id Create, update, delete. tasks:write
POST /tasks/:id/complete, /transition, /start_timer, /stop_timer, /to_event; /tasks/move, /tasks/import_to_invoice State changes, timers, moving, billing tasks onto an invoice. tasks:write
GET, POST, DELETE /tasks/:id/comments, …/comments/:comment_id, …/comments/mark_read Comments. tasks:read / tasks:write
GET, POST, DELETE /tasks/:id/files, …/files/:file_id, …/files/:file_id/versions Task files. tasks:read / tasks:write
GET, POST, DELETE /conversations/for_task/:task_id, /conversations/:id/messages, …/messages/:id, …/mark_read Task conversation threads. A conversation outside the token's account, or a direct message, is a 404. all
GET /time_entries, /time_entries/:id, /projects/:id/time_entries, /projects/:id/:timeable_type/:timeable_id/time_entries Time entries, optionally by project, task or event. time_entries:read
GET /events, /events/:id Calendar events visible to the token's user. events:read

Expense inbox (Beeswax AI processing)

Requires the expenses plan feature.

Method Path Purpose Scope
GET, POST, DELETE /invoice_uploads, /invoice_uploads/:id, …/:id/retry Upload supplier documents for processing; check status; retry. expenses:read / expenses:write
GET /expenses/uncategorized, /expenses/processed, /expenses/operating Inbox views (admins see all; others their own uploads). expenses:read
POST /expenses/uncategorized/:id/assign Assign to operating costs or a project. expenses:write

Tax returns (Australian accounts)

Method Path Purpose Scope
GET /tax_returns, /tax_returns/:id, /tax_returns/preflight_check Returns; readiness check. tax_returns:read
GET /tax_returns/:id/compare, …/conversation Compare with a prior year; the return's discussion thread. tax_returns:read
GET /tax_returns/:id/sections/:section/fields/:field/transactions, …/notes Ledger transactions and notes behind a field. tax_returns:read
POST /tax_returns Create a return. tax_returns:write
PATCH /tax_returns/:id/field Override a field (blank clears). tax_returns:write
POST, PATCH …/fields/:field/notes, …/sections/:section/notes/:note_id Add and edit notes. tax_returns:write
POST …/sections/:section/confirm, …/unconfirm Sign off a section, or reopen it. tax_returns:write
POST …/conversation/messages, …/repopulate, …/finalise, …/unfinalise Post to the discussion; repopulate from the ledger; finalise and unfinalise. tax_returns:write

Not in the API

So you do not go looking: sending a document by email, marking a quote accepted, bank-feed connections and allocations, payroll runs, BAS statements and VAT returns as documents, subscription and billing, user invitations. Read-only exposure of payrolls, credits and bank transfers is available through /journal_entries?type=. If you need one of these, tell us; the roadmap is driven by requests.

Browse Topics