BryanLabsBryanLabs
Menu

API changelog

What changed, when, and what is being retired. Deprecations are announced here first and signalled on the wire with Deprecation and Sunset headers.

Policy: breaking changes ship under a new path version. Removals are announced at least 90 days ahead with a sunset date. Additive changes (new fields, new endpoints) may land at any time. See the conventions.

2026-11-09

  1. Changed

    Tax API: every error is a problem, every read sends RateLimit headers

    tax

    Every /api/tax/v1 read answers with RateLimit, RateLimit-Policy and X-RateLimit-Limit, -Remaining and -Reset (60 requests per minute per IP); over the limit is a 429 rate_limited problem with Retry-After.

    The file routes (forms, export, statement, evidence-bundle, reconcile-1099da), entities, preferences and the delegator-report refusals now answer RFC 9457 problems with a request_id. The file routes keep `message` as a deprecated alias of `detail` until 2027-04-01.

    A report refused for flagged receipts has the stable code asset_review_required, the pending count and a link to /api/tax/v1/asset-review.

    Dates are checked as real calendar days: 2026-02-30 or 2026-13-01 is a 400, not an empty report.

    The OpenAPI document (1.5.0) now describes every response field the API sends, the 429 on every read, and an example on every parameter. scripts/api-audit/contract.py checks the live API against it.

  2. Security

    Tax API rate limit keyed on the address HAProxy saw

    tax

    The limit counted the first X-Forwarded-For entry, which a caller can set. It now counts the last entry, the one the edge appended, so a forged header no longer gets a fresh bucket.

  3. Added

    Where validator commission went

    tax

    GET /api/tax/v1/validator-commission-flows follows one validator's withdrawn commission to where it was spent, sold or kept, per month, by fifo or pro_rata; GET /api/tax/v1/commission-flows sums it over every traced Hub validator.

    Honest status: the daily trace job has not published its first traces yet, so the per-validator route answers 404 and the Hub sum reports 0 validators until it does.

  4. Changed

    Methodology v16 and v17: IBC denom traces, Gravity DEX, the Hub before Gaia v6

    tax

    v16 prices an IBC token as its home-chain asset once its denom trace is proven hop by hop, with the home chain's decimals.

    Gravity DEX (2021 to 2023) deposits, withdrawals and swaps are read from the block's batch settlement events: a settled swap is the offer coin plus its fee for the demand coin received.

    Before the Gaia v6 upgrade (block 8,695,000 on 2021-12-14) the Hub emitted no coin events, so amounts are read from messages and module events.

    v17 refuses a past-date balance the rebuild cannot read yet: any date before the end of 2021-12-14, and a date before Gaia v15 (2024-03-20) when the wallet delegated, undelegated or redelegated between the date and the upgrade. The 409 says which.

  5. Changed

    Year presets follow index coverage

    tax

    The report and statement pages offer every earlier calendar year that is fully indexed; years still being backfilled are left off rather than shown with partial data.

2026-11-07

  1. Added

    Past-date balances and quarter-end statements

    tax

    GET /api/tax/v1/balances?date=YYYY-MM-DD rebuilds a wallet at the end of a UTC day from the indexed chain: every bank denom, staked and unbonding ATOM per validator, USD values, and status exact or approximate with max_error_base.

    GET /api/tax/v1/balance-statement gives the four quarter ends of a year, or up to 12 listed dates, as JSON or CSV. Unclaimed rewards are not rebuilt for a past date and say so.

2026-11-05

  1. Added

    Index coverage on every tax report

    tax

    GET /api/tax/v1/index-coverage gives per-year coverage of the Hub history backfill.

    Every report and export says whether its own period is complete: index_coverage in JSON bodies, the X-Index-Coverage headers on JSON and CSV, and a -not-fully-indexed marker in download filenames.

2026-10-16

  1. Changed

    Every account action on the site works with an API key

    upgrades · snapshots · tax

    Upgrade webhooks (list, create, change, delete, test, delivery history), favorite chains and GET /api/upgrades/users/me accept an API key with the upgrades:webhooks scope; before, the scope existed but every route asked for the site session.

    Custom snapshots (request, list, visibility, quota) accept a key with the new snapshots:request scope. Snapshot downloads and latest accept a key with snapshots:download, which ties the URL to the account and reaches its own custom snapshots; anonymous downloads are unchanged.

    GET/POST /api/tax/entities, PATCH/DELETE /api/tax/entities/{id} and GET/PUT /api/tax/preferences accept a key with tax:read or tax:write. GET /api/snapshots/v1/auth/me accepts any valid key and names the account it belongs to.

    The snapshots:read and wasm:read scopes are retired: no route ever checked them, because the data they named is public. Keys can no longer be created with them.

    Still browser only, on purpose: creating, rotating and revoking keys, linking a wallet or email, profile changes, deleting the account, and Ask Tia history.

2026-10-15

  1. Added

    Tia, the site assistant

    tia

    POST /api/tia/v1/session starts a voice or text conversation with Tia (an ElevenLabs agent) and returns a single-use credential. Limited per connection and site-wide; 429 rate_limited or tia_busy when exceeded, 503 tia_voice_budget when the month's voice time is used up.

    Tia can pass feature requests, problem reports, service questions, and messages to Dan. They are screened (scope, abuse, duplicates add a vote) and reviewed before anything reaches the issue tracker. The tool and inbox endpoints under /api/tia/v1 are internal and need their own secrets.

  2. Added

    Bulk tagging and default classifications

    tax

    New POST /api/tax/reports/{id}/tags/bulk tags every transaction that matches an events type filter (and/or a list of hashes) in one call, with fill or overwrite modes and a dry run. Needs tax:write.

    GET /api/tax/v1/tags now carries `defaults`: what each kind of row is before any tag (staking income, fee, record only, receipt, disposal, swap and NFT legs) and how Form 1040, 1120-S, retirement accounts and non-US regimes treat it, so an agent does not tag rows that are already classified.

    The events type filter gained ibc (in and out), delegations (principal only) and nfts.

  3. Fixed

    type=rewards on /api/tax/v1/events matched nothing

    tax

    The backend labels reward and commission receipts "staking" (delegation principal is "staking-deposit" and "staking-withdrawal"), but the rewards filter only looked for the word reward, so type=rewards returned zero rows. It now returns reward and commission receipts; type=staking still returns rewards plus principal moves.

    type=transfers, ibc_in and ibc_out now also match the transfer-in and transfer-out labels.

  4. Added

    Saved reports and bookkeeping tags by API key

    tax

    GET/POST /api/tax/reports and GET/PATCH/DELETE /api/tax/reports/{id} now accept an API key as well as the site session. New scopes: tax:read (list and read your saved reports) and tax:write (create and change them).

    New PATCH /api/tax/reports/{id}/tags merges single tags ({set, clear}) and PUT replaces the whole map, so an agent can tag transactions (internal_transfer, payment, income, gift, airdrop, protocol_deposit, expense, spam, lost) without the browser. GET returns the tags with the vocabulary.

    Errors on these routes are now RFC 9457 problems with stable codes (invalid_tags, invalid_asset_decisions, duplicate_report_name, not_found).

2026-10-14

  1. Changed

    One error envelope: RFC 9457 Problem Details

    snapshots · upgrades · tax · wasm · faucet · account

    Every error now answers application/problem+json with type, title, status, detail, a stable code, instance and request_id.

    The old error and success members are still present as aliases of detail and false so existing clients keep working.

    Sunset 2027-04-01

  2. Added

    X-Request-Id on every API response

    all

    Send your own id (8 to 128 characters of letters, digits, '.', '_' or '-') and it is echoed; otherwise one is minted. The id appears in the error body and in our logs.

  3. Added

    Standard rate-limit headers

    snapshots · upgrades · faucet

    Limited endpoints send RateLimit and RateLimit-Policy (IETF draft structured fields) alongside the older X-RateLimit-* trio. A 429 or a 503 always carries Retry-After.

  4. Added

    Personal API keys with scopes

    account · faucet

    Create keys under Account, send them as Authorization: Bearer blk_... Each key carries only the scopes it was created with and can be rotated or revoked. Usage is shown on the account page and at GET /api/account/usage.

  5. Added

    Idempotency-Key on faucet requests

    faucet

    POST /api/networks/v1/faucet/{chain}/request accepts an Idempotency-Key. A retry with the same key and body replays the first answer for 24 hours instead of asking the faucet twice.

  6. Changed

    Faucet refusals for faucet-wide limits collapse to busy

    faucet

    When the faucet as a whole is over its hourly or daily allowance the code is busy with retry_after, instead of naming the limit. Per-requester codes (address_limit, ip_limit, subnet_limit, identity_limit, pow_required) are unchanged.

  7. Added

    JSON 404 for unknown API paths

    all

    A path under /api that does not exist answers a route_not_found problem instead of the HTML not-found page.

  8. Deprecated

    Legacy snapshots auth endpoints

    snapshots

    POST /api/snapshots/v1/auth/login, /logout and /token have answered 410 since the unified sign-in. They now also send Deprecation and Sunset headers and will be removed on the sunset date. Use /api/auth/* or an API key.

    Sunset 2027-04-01

  9. Added

    Faucet API published

    faucet

    Status, recent payouts, challenge and request endpoints at /api/networks/v1/faucet/{chain}, documented at /faucets/api-docs.

  10. Security

    security.txt, security page and status page

    all

    /.well-known/security.txt (RFC 9116) and /security describe how to report a vulnerability and how the platform is run. /status shows live checks and 30-day availability, also as JSON at /api/meta/v1/status.