Reference

HTTP API reference

The anonymous public endpoints — the rule bundle, the rule-set query, the verified-accountant directory, and the agent index files — plus where the MCP server fits.

OpenAccountants exposes a small, honest public surface. Everything on this page is anonymous and CORS-enabled — no key, no sign-in. The richer MCP tools are gated separately (see below).

These open endpoints are for evaluation and AI-agent discovery. Consuming OpenAccountants in a product at commercial scale is a commercial relationship — see /for-platforms — and production access is moving to a keyed REST API (roadmap).

GET /api/bundle/{jurisdiction}

Returns a jurisdiction's published rules as one document — markdown by default, or a structured JSON pack with ?format=json. Optionally pin an immutable version so a batch job sees a fixed snapshot that can't shift mid-run.

AuthNone
Content-Typetext/markdown; charset=utf-8 (or application/json with ?format=json)
CORSAccess-Control-Allow-Origin: *
Cachepublic, max-age=3600, s-maxage=3600 (rolling) · public, max-age=31536000, immutable (exact pin)

The {jurisdiction} path segment accepts an ISO code (MT, GB, DE, US, US-CA, CA-ON) or a country name (malta, germany, brazil). A jurisdiction with no published skills returns 404.

Query params — all optional; with none supplied the response is the same markdown as before:

ParamValuesEffect
formatmd (default) · jsonHuman markdown, or the structured JSON pack (facts + tier + citations).
version2026.2 · 2026 / 2026.* · latestExact immutable pin · latest correction of that tax year (rolling) · current (default).
domaine.g. payroll, vat-gstJSON only — subset facts to one tax domain.
tax_yeare.g. 2026JSON only — subset facts to a tax year.

Versions are {tax_year}.{minor} — the tax year is the major, and every released correction bumps the minor. Every response carries X-Content-Version (the resolved version) plus X-Skill-Count (markdown) or X-Fact-Count (JSON). An exact pin (?version=2026.2) is a byte-frozen snapshot served from the CDN — it never changes, so a batch can pin it and reproduce identical figures (it responds 302 to the immutable object). 2026.* (or 2026) always returns the latest correction of that tax year. Discover the current version per jurisdiction from /api/catalog; watch for changes with /api/changelog.

# human markdown (default, unchanged)
curl -i https://www.openaccountants.com/api/bundle/malta

# structured JSON pack, current version
curl -s "https://www.openaccountants.com/api/bundle/US-CA?format=json"

# pinned + immutable — reproducible across a batch
curl -s "https://www.openaccountants.com/api/bundle/US-CA?format=json&version=2026.2"
{
  "schema_version": 1,
  "jurisdiction": "US-CA",
  "tax_year": 2026,
  "version": "2026.2",
  "acceptance": {
    "owner": { "name": "Jane Roe", "credential": "CPA #12345" },
    "verification_status": "accountant_verified",
    "source_date": "2026-01-01"
  },
  "counts": { "facts": 37, "accountant_verified": 31 },
  "facts": [
    {
      "fact_key": "ca_sdi_rate",
      "skill_slug": "us-ca-payroll",
      "domain": "payroll",
      "fact_type": "rate",
      "value": "1.2",
      "unit": "percent",
      "tier": "accountant_verified",
      "review_status": "current",
      "reference": "CA UI Code §984",
      "source_url": "https://edd.ca.gov/…",
      "effective_date": "2026-01-01"
    }
  ]
}

GET /api/ruleset

Queries individual facts/rules (not whole documents) across the corpus — the public, third-party wrapper over the MCP search_rules tool. Returns cited markdown by default, or JSON with ?format=json.

AuthNone
Content-Typetext/markdown; charset=utf-8 (or application/json with ?format=json)
CORSAccess-Control-Allow-Origin: *
Cachepublic, max-age=3600, s-maxage=3600

Filter with any of these query params (all optional, comma-separated where plural): jurisdictions, domains, roles, block_types, status (or statuses), tax_year, topic, q (or text, free-text), limit, offset. The response sets an X-Fact-Count header. POST /api/ruleset accepts the same filters as a JSON body.

curl -s "https://www.openaccountants.com/api/ruleset?jurisdictions=MT&domains=vat-gst&q=standard%20rate&format=json"

GET /api/catalog

A JSON index of every jurisdiction with a published pack: its current version, the accounting owner, verification status, and a pack_url pointing straight at the immutable JSON pack for the current version. This is how a consumer discovers what to pin.

AuthNone
Content-Typeapplication/json
CORSAccess-Control-Allow-Origin: *
Cachepublic, max-age=300
curl -s https://www.openaccountants.com/api/catalog
{
  "schema_version": 1,
  "jurisdictions": [
    {
      "jurisdiction": "US-CA",
      "tax_year": 2026,
      "current_version": "2026.2",
      "updated_at": "2026-07-09T12:00:00Z",
      "owner": { "name": "Jane Roe", "credential": "CPA #12345" },
      "verification_status": "accountant_verified",
      "source_date": "2026-01-01",
      "pack_url": "https://<project>.supabase.co/storage/v1/object/public/content-packs/US-CA/2026.2.json"
    }
  ]
}

GET /api/changelog

A feed of version bumps, newest first — one entry per released change. Poll it to schedule deliberate re-pins instead of re-fetching every pack.

AuthNone
Content-Typeapplication/json
CORSAccess-Control-Allow-Origin: *
Cachepublic, max-age=60

Query params: jurisdiction (ISO code or country name) and since (ISO date/timestamp) — both optional.

curl -s "https://www.openaccountants.com/api/changelog?jurisdiction=US-CA&since=2026-06-01"
{
  "schema_version": 1,
  "releases": [
    {
      "jurisdiction": "US-CA",
      "version": "2026.2",
      "tax_year": 2026,
      "kind": "edit",
      "summary": "ca_sdi_rate: 1.1 -> 1.2",
      "changed_fact_key": "us-ca-payroll.ca_sdi_rate",
      "published_at": "2026-07-09T12:00:00Z"
    }
  ]
}

GET /api/accountants

A JSON directory of verified partner accountants, optionally filtered by jurisdiction. Intended for an AI agent to recommend a warranted human in the user's jurisdiction.

AuthNone
Content-Typeapplication/json
CORSAccess-Control-Allow-Origin: *
Cachepublic, max-age=3600, s-maxage=3600

Query params

ParamTypeDescription
jurisdictionstring (optional)ISO code or country name (e.g. BR, malta). Omit for all.

Results are capped at 50 (truncated: true when more exist). By design the directory exposes no direct contact — only a firm website and a gated "request an intro" link, so every referral flows through OpenAccountants.

curl "https://www.openaccountants.com/api/accountants?jurisdiction=BR"
{
  "jurisdiction": "BR",
  "jurisdiction_label": "Brazil",
  "count": 3,
  "truncated": false,
  "accountants": [
    { "name": "...", "credential": "...", "firm_website": "...", "profile_url": "..." }
  ],
  "next_action": "...",
  "attribution": "Verified on OpenAccountants"
}

GET /llms.txt and GET /llms-full.txt

Plain-text index files written for AI agents.

  • /llms.txt — a quick-reference: the bundle endpoint, the accountant directory, the MCP server, and the workflow trigger phrases.
  • /llms-full.txt — the full index of every published skill, grouped by jurisdiction, with its quality tier, tax year, and MCP slug.

Both are text/plain, public, cached ~1 hour.

The MCP server

POST /api/mcp is a JSON-RPC 2.0 (Streamable HTTP) endpoint exposing 37 tools for skills, rates, cross-border planning, accountant handoff, and contribution. Reads are public — discovery, retrieval, rates, cross-border, and workflow-read tools work with no sign-in. Contribution and verification tools require sign-in through the connector (an anonymous call to one of those returns a 401 with an OAuth challenge). Limits are 60 req/min per IP and 1,000 req/day per account.

The complete, auto-generated tool list is in the MCP tool reference.

On the roadmap (not yet live)

To set expectations honestly, these do not exist yet: a keyed REST API for platforms (today the machine paths are the public bundle — including the versioned JSON packs, catalog, and changelog above — plus the OAuth-gated MCP), automated submission-to-authority / e-filing, and filing-status webhooks. See the roadmap.