Pascaline

Documentation

Build with Pascaline

REST + MCP over one deterministic calculation core. Every response is statute-cited and carries its parameter vintage. This page is the quickstart; each API has its own reference.

Quickstart

Base URL https://pascaline.io. All calculation calls are POST with a JSON body. During beta every API is free with a key.

curl -X POST https://pascaline.io/estate/calculate-state-tax \
  -H 'content-type: application/json' \
  -H 'x-api-key: <keyId>.<secret>' \
  -d '{"state":"MA","tax_year":2026,"gross_estate":4000000}'
const res = await fetch("https://pascaline.io/estate/calculate-state-tax", {
  method: "POST",
  headers: { "content-type": "application/json", "x-api-key": KEY },
  body: JSON.stringify({ state: "MA", tax_year: 2026, gross_estate: 4_000_000 }),
});
const { result, data_as_of, formula_version, citations, tier } = await res.json();

Authentication

Pass your key in the x-api-key header as keyId.secret. Create a key in the portal. GET requests (docs, demos) need no key; only POST calculation calls are authenticated and metered.

x-api-key: k_live_a1b2c3.s3cr3t_v4lue

Response envelope

Every successful response wraps the calculation in a standard envelope. tier tells you whether the numbers are beta (our golden tests pass) or verified (independently confirmed against primary sources) — see how we verify.

{
  "result": { "state_estate_tax": 180800, "cliff_warning": { "triggered": true } },
  "data_as_of": "2026-01-01",
  "formula_version": "2026.1",
  "citations": ["M.G.L. c.65C \u00a72A ..."],
  "tier": "beta"
}

Errors

Errors return a non-2xx status and a typed body: { "error": { "code", "message", "details" } }.

  • VALIDATION_ERROR (400) — request failed schema validation; details lists the field paths.
  • UNAUTHORIZED (401) — missing or invalid x-api-key.
  • UNSUPPORTED_TAX_YEAR (400) — parameters for that year are not loaded.
  • STATE_NOT_SUPPORTED / STATE_NOT_LOADED — no citable table for that jurisdiction (we return this rather than a wrong number).
  • UNKNOWN_7520_RATE (422) — the §7520 month isn't loaded; pass an override.
  • Data APIs additionally return a data_coverage block and a seed-dataset warning during beta.

MCP servers

The same calculation core is exposed to AI agents over the Model Context Protocol — one server per suite, streamable HTTP. Point any MCP client at the suite endpoint:

  • https://pascaline.io/mcp/estate — Estate Planning Suite (6 APIs)
  • https://pascaline.io/mcp/premium — Premium Tax Suite (8 APIs)
  • https://pascaline.io/mcp/retirement — Retirement & International Suite (5 APIs)
  • https://pascaline.io/mcp/compliance — Compliance & Data Suite (13 APIs)

Example client config:

{
  "mcpServers": {
    "pascaline-estate": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://pascaline.io/mcp/estate"]
    }
  }
}

OpenAPI

A machine-readable spec of the calculation endpoints (request bodies generated from our Zod schemas): openapi.json.

API reference

Every endpoint, grouped by suite. Each links to its full page with example requests and citations.

Estate Planning Suite MCP /mcp/estate

Premium Tax Suite MCP /mcp/premium

Retirement & International Suite MCP /mcp/retirement

Compliance & Data Suite MCP /mcp/compliance