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.
| Auth | None |
| Content-Type | text/markdown; charset=utf-8 (or application/json with ?format=json) |
| CORS | Access-Control-Allow-Origin: * |
| Cache | public, 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:
| Param | Values | Effect |
|---|---|---|
format | md (default) · json | Human markdown, or the structured JSON pack (facts + tier + citations). |
version | 2026.2 · 2026 / 2026.* · latest | Exact immutable pin · latest correction of that tax year (rolling) · current (default). |
domain | e.g. payroll, vat-gst | JSON only — subset facts to one tax domain. |
tax_year | e.g. 2026 | JSON 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.
| Auth | None |
| Content-Type | text/markdown; charset=utf-8 (or application/json with ?format=json) |
| CORS | Access-Control-Allow-Origin: * |
| Cache | public, 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.
| Auth | None |
| Content-Type | application/json |
| CORS | Access-Control-Allow-Origin: * |
| Cache | public, 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.
| Auth | None |
| Content-Type | application/json |
| CORS | Access-Control-Allow-Origin: * |
| Cache | public, 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.
| Auth | None |
| Content-Type | application/json |
| CORS | Access-Control-Allow-Origin: * |
| Cache | public, max-age=3600, s-maxage=3600 |
Query params
| Param | Type | Description |
|---|---|---|
jurisdiction | string (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.