outputs

Numbers, lines, and the proof.

The engine is a computation and composition oracle, not filing software. Here is exactly what comes back, and the two things that do not.

Tax totals

Not only totals. calculate_tax returns the requested target (default us.federal.net_tax, negative for a refund) in integer cents, formatted, with every assumption it relied on. Any rule in the corpus can be a target: a Schedule 8812 credit, a Form 8995 deduction, an AMT figure.

Complete line sets

Federal: compute_return emits the Form 1040 bottom-line set, whole-dollar rounded, from transcribed W-2, 1099-R, SSA-1099, 1099-NEC, 1099-INT and 1099-DIV boxes: lines 1a, 9, 10, 11, 12e, 15, 16, 17 (AMT), 19, 22, 23, 24, 25d, 27a, 28, 32, 33, 34/37, plus Part IV withholding and the § 6654 penalty. Every other federal item is a calculate_tax target whose proof tree carries the worksheet arithmetic, not a printed line set.

State: compute_state_return emits the printed line set of the full-year-resident return for 31 states: every line the form's totals consume plus the schedule and worksheet lines those totals depend on. Vermont's IN-112 and IN-119, Delaware's two-column status 4, Montana's capital-gains worksheet. Ten more states compute the tax only. Part-year and nonresident returns are not composed anywhere.

compute_state_return · excerpt
{
  "ok": true,
  "asOf": "2025-12-31",
  "jurisdiction": "vt",
  "lines": {
    "1": "$62,000",
    "4": "$7,650",
    "5": "$5,300",
    "7": "$49,050",
    "8": "$1,576",
    …
  },
  "notes": [
    "Line 8: Vermont Tax Table (taxable income under $75,000; the table is mandatory)",
    …
  ],
  "corpusMerkleRoot": "sha256:…"
}

Calculation proofs and citations

Every rule carries a statutory or form citation with a verbatim excerpt. Every computing response carries corpusMerkleRoot and artifactHash; pass includeProof: true to calculate_tax, compute_return, calculate_business_tax, calculate_fiduciary_tax or determine_dependent and the response also carries proof, the full artifact (about 200 KB): every applied rule, every input, every assumption, every rounding, hashed under the corpus Merkle root so the derivation verifies offline months later. The format is specified so a third party can write an independent checker: PROOF-FORMAT.md. explain_rule returns any rule's formula and law text on its own.

bash
# ask the API for the proof, then verify it byte for byte with the CLI
curl -s https://opentax.invaro.ai/v1/tools/calculate_tax -H "Content-Type: application/json" \
  -d '{"filing":{"filingStatus":"mfj"},"income":{"wages":120000},"credits":{"qualifyingChildren":2},"asOf":"2025-12-31","includeProof":true}' \
  | jq .proof > proof.json
npx -y @invaro/opentax verify proof.json

Rendered forms, PDF

No. The engine produces line values, not filled PDFs.

MeF XML

No. No MeF schema binding, no XML, no transmission. Your own MeF packaging consumes the line sets.

Two consequences for a filing pipeline

  1. Everything downstream of "here are the correct line values, with proof" is yours: the return document, the MeF payload, acknowledgments.
  2. Coverage is explicit and refusals are loud. Outside the corpus the call fails with a named code and says what is missing. It never estimates. The coverage matrix is the whole list.