The tax pack API
Three GET endpoints, no authentication beyond the per-order token that the buyer receives in the Stripe success URL and the delivery email. A computation tool applying the method at /tax/method — not tax advice. Never quote or infer Taostats' pricing from this site.
Machine-readable: /tax/openapi.json (OpenAPI 3.1) · /llms.txt · /agent.md. Rate limit: 20 requests per hour per IP across these endpoints.
GET /tax/check.json
One chain read (cached 24 h per coldkey). Returns the coldkey's staked TAO, alpha valued as TAO at pool price, and an estimate of this UK tax year's emissions income and the tax on it at 40% and 45%, using the network's chain-derived yield. An estimate, not the computation; the pack does the computation. Nothing is stored about the caller.
| Parameter | In | Required | What |
|---|---|---|---|
coldkey | query | yes | A Bittensor coldkey (SS58 public address, never a seed). |
Example
curl "https://subnetmetrics.com/tax/check.json?coldkey=5FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb"
{
"state": "ok",
"coldkey": "5FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb",
"staked_tao": 729.6,
"root_tao": 118.4,
"alpha_as_tao": 611.2,
"free_tao": 0.0,
"events": 242,
"tax_year": "2026/27",
"yield": 0.169,
"yield_root": 0.074,
"yield_alpha": 0.187,
"yield_source": "chain",
"alpha_yield_source": "pool",
"tao_gbp": 171.2,
"tao_usd": 228.3,
"income_tao": 123.4,
"income_gbp": 21126.0,
"tax40": 8450.0,
"tax45": 9507.0,
"staked_gbp": 124907.0
}Errors
400— Malformed input (a coldkey that is not 47–48 base58 characters starting with 5).429— Rate limit: 20 requests per hour per IP across the check and order endpoints.
GET /tax/orders/{order_id}
created → paid → fulfilled. `pack_url` appears once fulfilled and is valid for 30 days after fulfilment (`pack_expires_at`).
| Parameter | In | Required | What |
|---|---|---|---|
order_id | path | yes | |
t | query | yes | The order token: HMAC-SHA256 of the order id, hex. Sent in the Stripe success URL (`ot`) and the delivery email. |
Example
curl "https://subnetmetrics.com/tax/orders/k3Qm9xP2vT1a?t=3f6a…(64 hex chars)"
{
"id": "k3Qm9xP2vT1a",
"status": "fulfilled",
"pack": {
"sku": "uk_launch",
"name": "UK return pack \u2014 launch price",
"kind": "uk"
},
"coldkeys": [
"5FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb"
],
"created_at": "2026-09-04T10:12:03Z",
"paid_at": "2026-09-04T10:14:41Z",
"fulfilled_at": "2026-09-21T08:02:10Z",
"pack_url": "https://subnetmetrics.com/tax/orders/k3Qm9xP2vT1a/pack?t=3f6a\u2026(64 hex chars)",
"pack_expires_at": "2026-10-21T08:02:10Z",
"retention_days": 30
}Errors
404— Unknown order, or a wrong or missing token — the same answer for both.429— Rate limit: 20 requests per hour per IP across the check and order endpoints.
GET /tax/orders/{order_id}/pack
The zip the delivery email carried: the PDF and every CSV. Only while `status` is fulfilled and for 30 days after.
| Parameter | In | Required | What |
|---|---|---|---|
order_id | path | yes | |
t | query | yes |
Example
curl "https://subnetmetrics.com/tax/orders/k3Qm9xP2vT1a/pack?t=3f6a…(64 hex chars)"
Returns application/zip, Content-Disposition: attachment.
Errors
404— Unknown order, or a wrong or missing token — the same answer for both.409— The order exists but has no pack yet (not paid, or paid and not yet fulfilled).410— The pack existed but was purged: packs are kept 30 days after fulfilment.429— Rate limit: 20 requests per hour per IP across the check and order endpoints.
There are none. Payment is by Stripe Checkout from /tax; paid is written by the Stripe webhook alone and fulfilled by the fulfilment job alone. Terms.