Export your books
Your books are yours. Any time, on every plan, and even when the books are read-only (a trial that ended, a failed payment) or the account is suspended, the company's owner or CPA can take a complete copy: every table, the audit log, the receipt files and a SQL dump that restores into your own Evenbead. Exporting is never metered. (Dated 2026-10-12; format evenbead-books/1.)
In the app
Settings, Export, then Prepare an export. The archive is made in the background, usually in under a minute. The page shows a passphrase once: copy it into a password manager. Evenbead does not keep it, and it opens the archive. When the export is ready, Download gives a ZIP that stays downloadable for 24 hours. One export can be in progress at a time, six a day per company. The request and every download are recorded in the audit log.
Open the ZIP with 7-Zip (Windows, Linux), Keka or The Unarchiver (macOS), WinZip, or bun run books. It is encrypted with AES-256 (WinZip's AE-2 format); the Finder's built-in unzip and Windows Explorer cannot open encrypted ZIPs.
What is inside
| Path | What it is |
|---|---|
README.md | Describes every file, the conventions and what is not exported, and why. |
manifest.json | Format, company, schema version, every table with row counts and columns, the SHA-256 of every file, and the checks below. |
tables/<table>.jsonl | One JSON object per row per line. The most faithful copy. |
parquet/<table>.parquet | The same rows as Apache Parquet: open them in DuckDB, pandas, Polars, Spark or a spreadsheet that reads Parquet. |
sql/company.sql | A PostgreSQL script that restores this company, and only this company, into an Evenbead database at the same version. |
audit/chain.jsonl | The hash-chained audit log, with the exact text each event's hash covers. |
receipts/ | Receipt and document files, decrypted, named by their SHA-256, with an index. |
checks/ | The trial balance and AR/AP aging at the export date, as computed when the export was made. |
tools/verify.mjs | A verifier that needs only Node.js 18+ or Bun. |
Money is integer cents everywhere (12345 is $123.45). Timestamps are UTC. Left out: credentials (API key hashes, sessions, passkeys, authenticator secrets, sign-in links, Plaid and Intuit tokens) and the hosted service's own billing records; the README lists each with the reason. Accounting firms you granted access appear by name and role only.
Verify it
Unzip, then from the folder:
node tools/verify.mjs
It checks every file against manifest.json and walks the audit chain: each event's hash is SHA-256 of the previous hash plus the event's canonical text, starting from 64 zeros, and must end at the head hash in the manifest. A changed, removed or reordered event breaks the chain. With Evenbead's own tools: bun run books verify export.zip.
Restore it on your own server
The self-host package imports it:
components/deploy/selfhost/bin/import.sh evenbead-yourcompany-20261012-091500-1a2b3c4d.zip
The import checks the archive, restores the company as the database superuser (refusing another schema version or a company that is already there), re-encrypts the receipt files with your server's own key, then recomputes the trial balance, AR and AP aging and the audit chain and compares them with the export. It prints identical, or what differs and exits with an error. Then it prints the owner's one-time sign-in link command.
By hand, with standard PostgreSQL tools only: psql -v ON_ERROR_STOP=1 -d evenbead -f sql/company.sql as the superuser of an Evenbead database at the same version. The script copies the rows exactly, then verifies the audit chain, that every journal entry balances and the row counts before it commits; receipt files need the import tool.
For agents (REST and MCP)
An agent can request an export only if the owner or CPA gave it the export scope, on the agent and on its key. No agent has it by default, connected AI apps (OAuth) never do, and neither do an accounting firm's agents.
curl -X POST https://api.evenbead.com/v1/exports \
-H "Authorization: Bearer $EVENBEAD_AGENT_KEY" -H "X-Agent-Model: your-model@version" \
-H "Idempotency-Key: export-2026-10-12" -H "Content-Type: application/json" -d '{"include_receipts": true}'
The response (202) carries the export and the passphrase, once; a replay of the same Idempotency-Key returns passphrase: null. GET /v1/exports/{id} shows the status; when ready, GET /v1/exports/{id}/download returns the ZIP. MCP tools: request_books_export, list_books_exports, get_books_export (the download itself is REST: binary). Errors: export_refused (403, no right to export), export_limited (429, one at a time or six a day), export_invalid (409, not ready or expired).