# Reports and tax

> Reports, exports, insights, subscriptions and tax preparation.

MCP toolset: `reports` (https://app.getoatmilk.com/api/mcp?toolset=reports)

## company.shareholders

- [`company.shareholders.export`](https://app.getoatmilk.com/docs/api/company.shareholders.export.md) — Download the shareholder register as a spreadsheet with full tax numbers, to file Schedule 50 or T5 slips, with a reason. Only an administrator in the dashboard can; the download is audited with the reason and the number of shareholders, never the numbers. Not available to API keys or MCP clients.

- [`company.shareholders.get`](https://app.getoatmilk.com/docs/api/company.shareholders.get.md) — Read the shareholder register: the classes of shares (common or preferred, voting or not), each shareholder (person, corporation or trust; address; resident in Canada or not) with their holdings (number of shares, class, issue date, certificate, what was paid, end date), directors and officers, shares outstanding by class, each holder's share of the common, preferred and voting shares, the T2 Schedule 50 rows (holders of 10% or more, with the tax number masked), how much of the vote Canadians hold, and names found in company documents that aren't in the register yet. Tax numbers are only ever masked.

- [`company.shareholders.taxNumber`](https://app.getoatmilk.com/docs/api/company.shareholders.taxNumber.md) — Save or remove a shareholder's tax number for Schedule 50 and T5 slips: { holderId, kind (sin, bn with an optional program account, itn, or foreign with country), value, country? } or value null to remove it. SINs are checked with their check digit. The number is stored encrypted and only ever returned masked; it is never logged or audited.

- [`company.shareholders.update`](https://app.getoatmilk.com/docs/api/company.shareholders.update.md) — Replace the shareholder register with { register: { classes, holders, holdings, officers }, expectedRevision, idempotencyKey } (from company.shareholders.get, changed). Ids are 8 to 40 lowercase letters, digits and hyphens; shares are whole numbers; every holding names a holder and class in the register. Removing a shareholder removes their saved tax number. Audited with counts only.

## handoff

- [`handoff.export`](https://app.getoatmilk.com/docs/api/handoff.export.md) — Export a versioned professional handoff with stable record identifiers, unresolved items and provider control totals. Employee records require supporting originals access. Generates no ledger postings.

- [`handoff.get`](https://app.getoatmilk.com/docs/api/handoff.get.md) — Read professional handoff, separate authorizations, filing confirmations and calendar-year payroll completeness. Prepared records never establish filing or create ledger postings.

- [`handoff.update`](https://app.getoatmilk.com/docs/api/handoff.update.md) — Record one handoff item with its owner, source, state, original documents and current revision. Filing acceptance requires retained confirmation. Stores no full payroll identity numbers and creates no postings.

## insights.finance

- [`insights.finance.get`](https://app.getoatmilk.com/docs/api/insights.finance.get.md) — Read gross income, expenses, refunds, profit or loss and category totals per currency for an accounting period, with reviewed and unresolved coverage.

- [`insights.finance.trends`](https://app.getoatmilk.com/docs/api/insights.finance.trends.md) — Read up to 24 months of ledger income, expenses, profit or loss, net burn proxy and top vendors per currency, with period and review coverage.

## insights.forecast

- [`insights.forecast.get`](https://app.getoatmilk.com/docs/api/insights.forecast.get.md) — Read a 12-month finance projection for one currency from reviewed ledger history, with recurring item labels, seasonal assumptions and indicative ranges. No books are changed.

## insights.map

- [`insights.map.config.get`](https://app.getoatmilk.com/docs/api/insights.map.config.get.md) — Read availability of the interactive Google map and image export, plus its public referrer-restricted browser key. Private provider keys are never returned.

- [`insights.map.drilldown`](https://app.getoatmilk.com/docs/api/insights.map.drilldown.md) — Inspect up to 100 map records with the same filters, an optional returned clusterKey and an opaque nextCursor. Logical records and stable cursor paging preserve source access and missing-location coverage.

- [`insights.map.export`](https://app.getoatmilk.com/docs/api/insights.map.export.md) — Generate a private PNG of the permitted Insights Map filters and supplied viewport, with native map attribution. Return a short-lived private download URL; no accounting records change.

- [`insights.map.get`](https://app.getoatmilk.com/docs/api/insights.map.get.md) — Read a bounded geographic map of transactions, trips, saved hotel groups and saved event venues. Filter by layers, dates, transaction types, currency, search, explicit country/region/city, bounds and zoom; group by saved city/region or geographic grids. Counts include missing-location coverage, and transaction values stay separate by currency. Only locations and sources the actor can read are included; no geocoding or model calls.

- [`insights.map.view`](https://app.getoatmilk.com/docs/api/insights.map.view.md) — Create a safe local Insights Map URL from canonical filters and renderer center/selection. No financial records or saved locations change.

## insights.people

- [`insights.people.get`](https://app.getoatmilk.com/docs/api/insights.people.get.md) — Read all-time contractor cost, payments, hours and timesheet punctuality for one currency, with source coverage.

## insights.projects

- [`insights.projects.get`](https://app.getoatmilk.com/docs/api/insights.projects.get.md) — Read project-tag income and spending per currency for an accounting period, including deduplicated totals and overlapping tags.

## insights.tax

- [`insights.tax.get`](https://app.getoatmilk.com/docs/api/insights.tax.get.md) — Read summarized corporate or GST/HST tax workpaper readiness, issue counts and CAD lines for a period, without company details or transaction rows. This is a draft, not a filed return.

## reports

- [`reports.export`](https://app.getoatmilk.com/docs/api/reports.export.md) — Create a CSV or evidence ZIP export. Supply format, date filters and idempotencyKey. Tax exports require completed fiscal settings. Exports identify provisional records and unresolved items.

- [`reports.summary`](https://app.getoatmilk.com/docs/api/reports.summary.md) — Return accounting totals separated by currency and provisional or reviewed record counts.

## subscriptions.duplicates

- [`subscriptions.duplicates.check`](https://app.getoatmilk.com/docs/api/subscriptions.duplicates.check.md) — On demand, find plans billed by the same vendor in one currency: name rules first, then the Classifier over every plan's normalized merchant descriptor, dates and amounts, then a second opinion on uncertain groups. Never sends raw names, payee names, receipts, accounts or notes. Saves suggestions only; nothing is merged.

## subscriptions

- [`subscriptions.list`](https://app.getoatmilk.com/docs/api/subscriptions.list.md) — List software subscription candidates from reviewed ledger charges, saved finance corrections, evidence-backed quantities, actual paid totals by calendar year and annualized estimates. Plans a person merged are combined within one currency, and possible duplicate plans are listed with the classifier's and the second opinion's views. A possibly stopped charge is not proof of cancellation.

- [`subscriptions.save`](https://app.getoatmilk.com/docs/api/subscriptions.save.md) — Confirm or correct one subscription's cadence, status, renewal, amount or explicitly evidenced seat or usage quantity. Requires expectedRevision and idempotencyKey. Does not change accounting entries or cancel a provider subscription.

- [`subscriptions.suggest`](https://app.getoatmilk.com/docs/api/subscriptions.suggest.md) — On demand, use the Classifier over the dates and amounts of up to 32 software purchase patterns to suggest recurring or one-off, without sending merchant names or receipt contents to the model. Returns uncertainty and coverage; no records change.

## subscriptions.merges

- [`subscriptions.merges.create`](https://app.getoatmilk.com/docs/api/subscriptions.merges.create.md) — Merge two or more plans in the same currency by hand, combining their history and yearly estimate into one plan. Requires an idempotencyKey. Changes no accounting entries and can be undone.

- [`subscriptions.merges.decide`](https://app.getoatmilk.com/docs/api/subscriptions.merges.decide.md) — Merge suggested duplicate plans, or keep them separate so they are not suggested again, for one group or many at once. Requires each group's expectedRevision and an idempotencyKey. Changes no accounting entries and can be undone.

- [`subscriptions.merges.undo`](https://app.getoatmilk.com/docs/api/subscriptions.merges.undo.md) — Undo the last decision on one merge group: a merge returns to a suggestion (or, when made by hand, the plans stay separate), and plans kept separate return to a suggestion. Requires expectedRevision and idempotencyKey.

## tax.adjustments

- [`tax.adjustments.update`](https://app.getoatmilk.com/docs/api/tax.adjustments.update.md) — Record reviewed regular-method GST/HST adjustments, instalments, rebates and self-assessments in CAD minor units, with reason, source evidence, revision and the current ledger snapshot. This does not remit tax or file a return.

## tax.checks

- [`tax.checks.update`](https://app.getoatmilk.com/docs/api/tax.checks.update.md) — Record tax-preparation review evidence against the current workpaper snapshot, with revision checks. Later ledger changes invalidate completed checks.

## tax.entries

- [`tax.entries.review`](https://app.getoatmilk.com/docs/api/tax.entries.review.md) — Confirm recognition date, GST/HST treatment, supporting documentation, input tax credit eligibility and explicit CAD exchange-rate provenance for an entry. For GST/HST dated before the registration date, preRegistration records the decision: no_itc (a purchase with no input tax credit) or accountant. Requires both entry and tax-review revisions.

## tax

- [`tax.export`](https://app.getoatmilk.com/docs/api/tax.export.md) — Create a private year-end package for { period, expectedSnapshotHash, idempotencyKey }. The core zip (url) holds a README, a summary PDF, the workpaper JSON and CSV, record listings and a hash manifest; corporate years add a draft income statement by GIFI line, a general ledger, the year-end questionnaire, contractor payments and, when registered, a GST/HST summary, and GST/HST periods add the return lines and the period's records instead. Original receipts, statements, Stripe records and tax documents come as separate originals parts (parts[], each under 40 MB, hashed in the manifest). Repeating the request with the same key returns the same package with fresh links. Requires the current snapshot hash. Nothing is filed.

- [`tax.readiness`](https://app.getoatmilk.com/docs/api/tax.readiness.md) — Read draft corporate or GST/HST tax workpapers, reviewed totals, unresolved records and preparation tasks. This does not file a return or calculate final T2 liability.

## tax.filings

- [`tax.filings.get`](https://app.getoatmilk.com/docs/api/tax.filings.get.md) — Read a return or slips the company files itself, step by step: { kind: gst_hst (a GST/HST period), t4a (contractor T4A and T4A-NR slips for a calendarYear) or t2 (a corporate year), period? or calendarYear? (defaults to the newest one that ended) }. Returns the due dates (with weekend and holiday shifts), each walkthrough step and whether it's done, what was recorded (filed on, CRA confirmation number, paid on and amount, copies given), the matching compliance checklist items, the business number on file, the other periods to choose from and the official sources. The numbers to enter come from tax.prep.overview (GST/HST lines) and contractorOps.taxForms.get (slips). Oatmilk never files or pays anything.

- [`tax.filings.update`](https://app.getoatmilk.com/docs/api/tax.filings.update.md) — Record progress on a return or slips the company files itself: { kind, periodKey (from tax.filings.get), expectedRevision, idempotencyKey, steps? ({ stepKey: true|false }), filedOn?, confirmation? (the CRA confirmation number), paidOn?, amountPaidMinor?, copiesSentOn?, note? }. Once filed (and paid, or the copies given), the matching compliance checklist items are marked done. It only records what the person did on the CRA's site; nothing is sent to the CRA.

## tax.financialCounterparts

- [`tax.financialCounterparts.clear`](https://app.getoatmilk.com/docs/api/tax.financialCounterparts.clear.md) — Clear a separate financial counterpart using its current revision, source fingerprint and retry key. Releases versioned repayment allocations. Advances with active repayments cannot be cleared. Preserves imported records, earlier evidence and audit history. Legacy purposes require dashboard confirmation.

- [`tax.financialCounterparts.get`](https://app.getoatmilk.com/docs/api/tax.financialCounterparts.get.md) — Read an existing CAD transfer's current original bank evidence, full allocation proof and separately reviewed balance-sheet counterpart. Unsupported or changed sources remain unresolved. Read-only.

- [`tax.financialCounterparts.preview`](https://app.getoatmilk.com/docs/api/tax.financialCounterparts.preview.md) — Preview an explicit incoming or outgoing intercompany advance or repayment against its imported cash movement. Validates current source/review/obligation revisions, counterparties, original evidence, accounting dates, partial repayment allocations and remaining balances. No writes.

- [`tax.financialCounterparts.review`](https://app.getoatmilk.com/docs/api/tax.financialCounterparts.review.md) — Classify a supported CAD transfer with an explicit incoming advance, outgoing advance, incoming repayment or outgoing repayment. Uses current source/review/obligation revisions, original evidence, owner attestations, a posting preview and a retry key. Repayments allocate existing obligations and cannot overpay. Atomically saves the separate counterpart, balances and audit without duplicating imported cash or touching other companies. Legacy shareholder and share-capital purposes require dashboard confirmation.

## tax.gifi

- [`tax.gifi.confirm`](https://app.getoatmilk.com/docs/api/tax.gifi.confirm.md) — Confirm a corporate year's tax lines (GIFI) for { period, snapshotHash, idempotencyKey } once every category with activity has a confirmed GIFI code and every record has a category: saves the financial statements and GIFI mapping checks the way the tax lines step does. Refused (INVALID_STATE) while a category still needs a code (tax.gifi.update) or a record has no category. A changed snapshotHash means records changed: read again. Nothing is filed.

- [`tax.gifi.get`](https://app.getoatmilk.com/docs/api/tax.gifi.get.md) — Read the categories with records in a tax period ({ period }), their reviewed CAD totals, suggested and confirmed GIFI codes from the CRA RC4088 index, the supported code list, the mapping revision and a draft income statement by GIFI line. Suggestions are never saved until confirmed.

- [`tax.gifi.update`](https://app.getoatmilk.com/docs/api/tax.gifi.update.md) — Confirm GIFI codes for categories with mappings [{ categoryId, code }], the current mapping revision (expectedRevision) and an idempotency key. Codes must be in the supported GIFI list. Changes are audited and do not change any accounting record.

## tax.intercompanyCounterparties

- [`tax.intercompanyCounterparties.create`](https://app.getoatmilk.com/docs/api/tax.intercompanyCounterparties.create.md) — Create or reuse a named tenant-local intercompany counterparty with a retry key. Never creates a company, grants access, or writes reciprocal books.

- [`tax.intercompanyCounterparties.list`](https://app.getoatmilk.com/docs/api/tax.intercompanyCounterparties.list.md) — List stable counterparty IDs recorded locally in this organization. A counterparty grants no access to another company's books.

## tax.intercompanyObligations

- [`tax.intercompanyObligations.list`](https://app.getoatmilk.com/docs/api/tax.intercompanyObligations.list.md) — Inspect current intercompany advance IDs, revisions, allocated amounts and remaining CAD balances, optionally for one tenant-local counterparty. Retains committed allocations when later evidence needs review.

## tax.packages

- [`tax.packages.download`](https://app.getoatmilk.com/docs/api/tax.packages.download.md) — Download a ready package in Oatmilk: { packageId }. Returns a link that works for five minutes. Each download is audited.

- [`tax.packages.list`](https://app.getoatmilk.com/docs/api/tax.packages.list.md) — List the year-end data packages asked for in the last 60 days, newest first: each one's fiscal year, status (queued and building while it's being put together, then ready for seven days, failed or expired), size, what's inside (reports, bank statements, Stripe, company documents, shareholder register, and anything left out), who it was sent to, whether each person's email went out, and every download (through a link or in Oatmilk, and whether the person was signed in). Read-only; the links themselves are only ever in the emails.

- [`tax.packages.request`](https://app.getoatmilk.com/docs/api/tax.packages.request.md) — Ask for one ZIP of everything an outside accountant needs for a fiscal year: { period? (a corporate year; defaults to the newest ended one), recipients? (up to 10 email addresses besides the person asking), note? (up to 500 characters, shown in the email), idempotencyKey }. It's put together in the background, usually within a few minutes; the person asking and each recipient then get an email with their own download link, which works without signing in for seven days. Each download is audited. Tell the person it's being put together and that the email will come when it's ready; check on it with tax.packages.list.

- [`tax.packages.revoke`](https://app.getoatmilk.com/docs/api/tax.packages.revoke.md) — Turn off a package's download links: { packageId, linkId? (one person's link; leave it out to turn off every link), idempotencyKey }. The team can still download the package in Oatmilk until it expires.

- [`tax.packages.share`](https://app.getoatmilk.com/docs/api/tax.packages.share.md) — Send a package to more people: { packageId, emails (1 to 10 addresses), idempotencyKey }. Each new person gets their own link by email, at once if the package is ready, otherwise as soon as it is. Someone whose link was turned off gets a new one. A package can go to 25 people at most.

## tax.personalExpenses

- [`tax.personalExpenses.confirm`](https://app.getoatmilk.com/docs/api/tax.personalExpenses.confirm.md) — Confirm (confirmed: true) or withdraw (false) 'No business expenses were paid personally' for { period }, with an optional note, the current confirmation revision (0 when none) and an idempotency key. Audited.

- [`tax.personalExpenses.export`](https://app.getoatmilk.com/docs/api/tax.personalExpenses.export.md) — The personally paid expenses for { period } as a CSV for the accountant: { filename, csv }.

- [`tax.personalExpenses.get`](https://app.getoatmilk.com/docs/api/tax.personalExpenses.get.md) — The list the accountant asked for: business expenses paid personally in { period }, with date, amount, currency, category, merchant, who paid, receipt link, and whether each was reimbursed by Wise transfer, is still owed or was not claimed, plus totals and whether the company confirmed that none were paid personally.

## tax.prep

- [`tax.prep.overview`](https://app.getoatmilk.com/docs/api/tax.prep.overview.md) — Read the guided year-end checklist for a corporate (T2) fiscal year or a GST/HST period: steps with status, counts and the next action, progress, the periods to choose from and deadlines. Input { kind, year? | from and to?, summary?, includeWorkpaper? }; without a year it opens the newest ended period, even when it is done. summary: true leaves out the record lists (for a period's steps left). includeWorkpaper: true returns the same period's full workpaper alongside the checklist, or null when unsupported. Read-only; nothing is filed or paid.

## tax.prizes

- [`tax.prizes.events.save`](https://app.getoatmilk.com/docs/api/tax.prizes.events.save.md) — Create or edit a prize event (hackathon, competition, event) with its date, notes and the event or promo documents kept as evidence. Input { id?, expectedRevision, name, kind, heldOn?, notes, evidenceIds?, venue?, archived?, idempotencyKey }. Optional venue { lat, lon, label, address?, city?, region?, countryCode? } adds its location to Insights Map; countryCode is an explicit two-letter uppercase country code. Omit venue to keep it, or set null to remove it. Never infer a venue from an event name.

- [`tax.prizes.overview`](https://app.getoatmilk.com/docs/api/tax.prizes.overview.md) — Prize payouts for a calendar year (default: the latest with payouts): events, winners with masked details and intake link state, confirmed payouts, suggestions detected from outgoing transfers (never applied automatically), the per-winner total against the $500 T4A box 028 threshold with a plain status (under $500, T4A needed, waiting for winner details, ask your accountant), sponsorship invoices shown separately, and the checklist for the CRA RZ account and the filing deadline. Optional eventId includes that active workspace event when opening an older map result, without changing totals or other source counts. No HST applies to prizes. Nothing is sent or filed.

- [`tax.prizes.payouts.decide`](https://app.getoatmilk.com/docs/api/tax.prizes.payouts.decide.md) — Decide about one outgoing transfer or record: op record confirms it as a prize (optionally to a winner and event), dismiss says it wasn't a prize, update changes its winner, event, note or returned amount, undo puts it back to a suggestion. Never sends money.

- [`tax.prizes.recipients.link`](https://app.getoatmilk.com/docs/api/tax.prizes.recipients.link.md) — Issue a fresh winner details link, send a reminder (at most every 12 hours and six times), or copy the current link ({ recipientId, mode: issue|remind|copy }). Copying and issuing without an email return the private link and work in the signed-in dashboard only.

- [`tax.prizes.recipients.save`](https://app.getoatmilk.com/docs/api/tax.prizes.recipients.save.md) — Add a winner (individual or business), edit them, or archive them. With sendLink and an email address Oatmilk emails the winner a private, account-free link for their legal name, SIN or business number and mailing address, before any payment. The email never contains a number.

- [`tax.prizes.schedule`](https://app.getoatmilk.com/docs/api/tax.prizes.schedule.md) — The T4A summary schedule for a calendar year { year } as a CSV: winner, legal name, SIN or business number, address, amount, box 028 and payment dates. Numbers are masked. reveal { reason } shows full numbers to an administrator in the dashboard or to the accountant, and is audited with the reason.

## tax.questions

- [`tax.questions.answer`](https://app.getoatmilk.com/docs/api/tax.questions.answer.md) — Answer one year-end question of a corporate tax year: { period, question, answer: yes|no|not_sure, choice?, choice2?, text?, amount?, note?, evidenceIds?, snapshotHash, idempotencyKey }. tax.questions.list names the follow-up fields each answer needs; amounts are in dollars ("1250.00") and files are evidence ids, from tax.sources.confirm or an original already kept with a record. Oatmilk checks the answer as the questions step does, words it the same way and saves it as the question's tax checks at their current revisions, exactly like tax.checks.update. not_sure leaves the question open for the accountant. Returns the saved checks. A changed snapshotHash means records changed: read the questions again. Nothing is filed.

- [`tax.questions.list`](https://app.getoatmilk.com/docs/api/tax.questions.list.md) — Read the year-end questions of a corporate tax year ({ period }), the questions step of tax preparation: each question's key, title, question and plain hint; the answers it takes (yes, no, not_sure) with what each one means and the follow-up fields it asks for (choice and choice2 with their options, text, amount in dollars, note, files); the saved answer read back from the tax checks, open (left for the accountant) or stale (records changed after it was saved); Oatmilk's suggested answer from the books where it has one; progress; and the snapshotHash to answer with. Read-only.

## tax.reports

- [`tax.reports.download`](https://app.getoatmilk.com/docs/api/tax.reports.download.md) — Download those reports for { period, format (xlsx default, or pdf) } and either report (everything, financial_statements, trial_balance, balance_sheet, income_statement, general_ledger, gst_hst, stripe, contractors) or reports, a list of the ones a person picked (balance_sheet, income_statement, trial_balance, general_ledger, gst_hst, stripe, contractors), which come as one file. The period can be any fiscal year from tax.reports.overview or any dates up to a year apart. Excel workbooks have one sheet per report with formulas for the totals; everything is the whole workbook. Returns a short-lived download. Each request builds a fresh file and is audited.

- [`tax.reports.overview`](https://app.getoatmilk.com/docs/api/tax.reports.overview.md) — Read the reports an accountant asks for at year-end, for { period? (defaults to the newest ended fiscal year) }: the trial balance with debit and credit columns, the balance sheet and income statement (draft, from every record, in CAD, by account and GIFI line), plus GST/HST collected and claimed and money set aside for it, Stripe charges before fees with the fees and payouts, contractors and the T4A slips they likely need, key dates (balance due, GST/HST, T2, T4A) and the company documents on file. Also lists the fiscal years. Read-only.

## tax.requests

- [`tax.requests.add`](https://app.getoatmilk.com/docs/api/tax.requests.add.md) — Add one item to the accountant's checklist by hand, to a new request or to an existing one (requestId). Input { requestId?, kind, title, detail?, idempotencyKey }.

- [`tax.requests.extract`](https://app.getoatmilk.com/docs/api/tax.requests.extract.md) — Turn the text of an accountant's email into checklist items with a strict-schema AI extraction. The text is untrusted: instructions inside it are ignored, no tools run, only the accountant's short quotes are kept, and nothing is sent or changed besides the new checklist. Input { text, receivedOn?, from?, to?, idempotencyKey }.

- [`tax.requests.list`](https://app.getoatmilk.com/docs/api/tax.requests.list.md) — List what the accountant asked for as a checklist. Each item has a status (open, ready or sent), a link to where Oatmilk fulfils it, and whether Oatmilk already holds the answer (statements, personally paid expenses, payroll answer, accounting access). Also returns the one year-end question when the accountant names a year-end that differs from the company's. Input { from?, to? } picks the period whose facts decide what is ready.

- [`tax.requests.update`](https://app.getoatmilk.com/docs/api/tax.requests.update.md) — Change a checklist item ({ op: item, itemId, expectedRevision, status?: open|ready|sent|dismissed, note?, evidenceIds? }) or record how the year-end question was answered ({ op: year_end, requestId, expectedRevision, resolution: kept|changed }). Changing the company's year-end itself uses company.update.

## tax.sources

- [`tax.sources.confirm`](https://app.getoatmilk.com/docs/api/tax.sources.confirm.md) — Verify uploaded company/tax source original bytes and preserve evidence without creating accounting entries. Returns an evidence ID for source references.

- [`tax.sources.prepare`](https://app.getoatmilk.com/docs/api/tax.sources.prepare.md) — Prepare an immutable private PDF or photo company/tax source upload. Returns a signed upload URL; this does not create an expense or run AI.

## tax.statements

- [`tax.statements.acknowledge`](https://app.getoatmilk.com/docs/api/tax.statements.acknowledge.md) — Tell the accountant that an account's statement gap is known and nothing more can be done ({ period, accountId, acknowledged, note (required, plain words such as 'The card wasn't used this year'), expectedRevision (0 when new), idempotencyKey }). The account stops counting as needing attention, the gap stays listed for the accountant with the note, and the answer is audited. acknowledged false withdraws it.

- [`tax.statements.overview`](https://app.getoatmilk.com/docs/api/tax.statements.overview.md) — Read every bank, card and payment account's statement bundle for a period { period }: opening and closing balance as of the period end, transaction counts and totals, the original statement files kept, and a plain-words completeness check per account (no statements, a late start, an early end, a missing month, or balances that don't agree with the imported lines). Read-only.

- [`tax.statements.pack`](https://app.getoatmilk.com/docs/api/tax.statements.pack.md) — Build the statements pack for { period }: one folder per account with its balances, a CSV and a PDF transaction listing for the period, and the original statement files kept for it, plus an index and a completeness summary. Returns a short-lived download. Each request builds a fresh pack and is audited.

## tax.treatment

- [`tax.treatment.apply`](https://app.getoatmilk.com/docs/api/tax.treatment.apply.md) — Confirm a whole group of records at once for { period, code, entryIds, idempotencyKey }: each record listed that is still in the group gets the treatment Oatmilk suggests for that reason (for example no tax credit for purchases without a receipt), saved as a tax review in the caller's name and marked as confirmed together. Records that changed or are no longer in the group are skipped and reported. The closed-period and revision guards still apply.

- [`tax.treatment.auto`](https://app.getoatmilk.com/docs/api/tax.treatment.auto.md) — Settle the sales tax of every record in a tax period that the rules can prove, as Autopilot, for { period, snapshotHash, pass, idempotencyKey }: bank fees, interest, payments to companies outside Canada or to contractors, small purchases with no receipt (no credit claimed) and receipts whose tax adds up. Each is saved as the same tax review a person would save, marked automatic with its plain reason, and can be undone. Records a person reviewed or undid, and records that changed, are left alone. Returns { applied, skipped, remaining }.

- [`tax.treatment.undo`](https://app.getoatmilk.com/docs/api/tax.treatment.undo.md) — Undo a tax review that Autopilot or a group confirmation saved, for { entryId, expectedRevision, idempotencyKey }: the record goes back to open and Autopilot leaves it alone until it changes. A review a person saved cannot be undone this way. Refused in a closed period.
