Evenbead docs

The firm workflow

What an accounting firm checks on the first call, and how each works over the API, MCP and the app: the trial balance for tax software, projects, budgets, recurring journal entries, comparative statements, the cash flow and the month-end close packet. Every write takes an Idempotency-Key, accepts dry_run: true, and is in the audit log with who (and which model) did it. (Dated 2026-10-12.)

Tax software

Set the company's return type once (POST /v1/tax/profile, approve scope): 1120S, 1065, 1120 or SCHC (Schedule C of Form 1040). Then map each account to a line of that return:

GET  /v1/tax/lines?return_type=1120S        # the lines (IRS form lines) and what each package supports
POST /v1/tax/mapping/defaults               # fill unmapped accounts with suggested lines (never overwrites yours)
POST /v1/tax/mapping   {"mappings": [{"account": "6700", "tax_line": "1120S:11"}]}
GET  /v1/tax/trial-balance?as_of=2026-12-31 # unadjusted, adjustments, adjusted, line per account, tie-out
GET  /v1/tax/export?package=ultratax&as_of=2026-12-31

Line codes are ours, over the IRS forms' own line numbers: 1120S:1a (gross receipts), 1120S:L10b (Schedule L, less accumulated depreciation), 1120S:1125A-2 (purchases, Form 1125-A), 1120S:M1-DEPR (book depreciation, reconciled through Schedule M-1), SCHC:20b, and NONE for an account deliberately not on the return (a sole proprietor's balance sheet).

The adjustments column is every entry posted with adjusting: true on POST /v1/journal-entries/propose (or the "Adjusting entry" box in the app) in the fiscal year. Entries are never edited, so mark an adjustment when you post it.

An export is refused while any account with a balance has no line (422 tax_mapping_invalid, with the list), and unless every account ties to the balance sheet and P&L to the cent. Each export is recorded with a version per package and period end (GET /v1/tax/exports); re-export after more adjustments and the version goes up.

What each package gets. We write only what each vendor documents publicly; where a vendor publishes nothing we say so.

PackageFileWhat it does in the product
UltraTax CS.xlsx with Account Number, Description, Unit, Tax Code, AmountFor Utilities > Trial Balance Excel Import: map the five columns in the wizard. Tax codes come from Thomson Reuters' published list. We write one signed amount (debits positive) and leave Unit empty; confirm both on your install before relying on it.
Lacerte.csv with Account Number, Account Name, Type (A/L/R/E), Debit, Credit, Balance, and our line for referenceFor the Trial Balance Utility: File > Import > From Excel (a CSV is read as the first sheet). Map the columns in the wizard and choose Do Not Import for our line; Lacerte assigns tax lines itself (its codes are not public, so we cannot fill them). The file name has no date because re-imports match by name.
Drake Tax.csv entry worksheet: each return line's total and the accounts behind itDrake imports trial balances only from its own Excel template, filled in by hand, and publishes no other format. Key the totals from the worksheet into the template or the data-entry screens.
Any software.csv (evenbead-tb-mapped/1): unadjusted, adjustments, adjusted, line and form line per accountRead it with anything.

Over MCP: set_tax_profile, get_tax_mapping, apply_default_tax_mapping, set_tax_mapping, get_tax_trial_balance, export_tax_package (the file base64-encoded), list_tax_exports.

Projects (job costing)

A project is a tag on journal-entry, invoice, bill, sales-receipt, expense and check lines, beside the class: a line can carry both. POST /v1/projects {"name": "Smith wedding", "customer_id": "…"}, then "project": "Smith wedding" on lines. The project's P&L: GET /v1/reports/profit-and-loss?from=…&to=…&project=Smith%20wedding (accrual or cash basis). Job costing across projects: GET /v1/reports/projects?from=…&to=…; its total equals the P&L. A deactivated project keeps its history but no new line can use it. Estimates take no project; the invoice an estimate becomes does.

Budgets

POST /v1/budgets for one fiscal year, for the whole company or one class or one project:

{"name": "FY2027 plan", "fiscal_year": 2027, "method": "actuals", "percent_change": 5}
{"name": "FY2027 plan", "fiscal_year": 2027, "lines": [{"account": "6700", "annual_cents": 2400000}, {"account": "4000", "months": [ …12 amounts… ]}]}

From actuals, each month is last year's same month plus the percentage, rounded to the cent. An annual amount is spread over twelve months to the cent. Change amounts with POST /v1/budgets/{id}/lines; archive with POST /v1/budgets/{id}. Budget vs actual for whole months: GET /v1/budgets/{id}/vs-actual?from=2027-01-01&to=2027-03-31 (JSON, format=csv or format=pdf): actual, budget, variance, variance percent of the budget, and whether it is favorable (more income, or less expense).

Recurring journal entries

POST /v1/recurring-entries schedules one of:

  • accrual: fixed lines each period, reversed the next day (the first day of the next month for a month-end accrual) unless auto_reverse: false;
  • fixed: fixed lines, not reversed;
  • depreciation or amortization: total_cents over periods, debiting an expense account and crediting an asset account (accumulated depreciation, or the prepaid asset). Every period is the total divided by the periods; the last one takes the remainder, so the schedule adds up to the total exactly.

Nothing posts until the schedule is run: POST /v1/recurring-entries/{id}/run {"through": "2026-10-31"}, or every schedule at once with POST /v1/recurring/journal-entries/run. Each date is generated once, however often it is run. A person's run posts. An agent's run posts within its posting threshold; above it, the occurrence waits as a proposal, and approving it posts the entry and its reversal.

Statements

  • GET /v1/reports/profit-and-loss/comparative?from=…&to=…&compare=prior_period,prior_year
  • GET /v1/reports/balance-sheet/comparative?as_of=…&compare=prior_period
  • GET /v1/reports/cash-flow?from=…&to=…: indirect method (net income, non-cash items such as depreciation, working capital, investing, financing). ties_out says the net change equals the change in the cash accounts.

Each answers JSON, format=csv or format=pdf.

The month-end close packet

GET /v1/close/packet?date=2026-09-30 returns one PDF for the client's file: the close checklist status, trial balance, the month's and the year's P&L, balance sheet, cash flow, AR and AP aging, and the reconciliation report of every bank account reconciled in the period, with a bookmark per section. format=json returns what it would contain; format=base64 is what the get_close_packet MCP tool uses. Taking a packet is recorded in the audit log.