{"openapi":"3.1.0","info":{"title":"Cosmos Tax API","version":"1.1.0","description":"Public, no-auth read API for Cosmos tax data on Cosmos Hub. Pull taxable events (staking rewards, income, transfers, IBC in/out, swaps, fees) for one or more addresses over a date range as JSON or CSV, and look up pre-indexed ATOM holdings (liquid, staked, unclaimed rewards) at any date.\n\nCosmos Hub mainnet is enabled. Indexing covers recent history; older periods may be incomplete while backfill runs. Governance votes and other non-taxable activity are excluded. This returns records for tax preparation, not tax advice.\n\n**Wallet-by-wallet**: cost basis and capital-gain lots are computed separately per address and never pooled across wallets (universal basis pooling ended 2025-01-01 under Rev. Proc. 2024-28). A multi-address query returns each wallet's own events/lots concatenated, each attributable to its address; combined totals shown anywhere (e.g. a summary card) are a sum of independent per-wallet figures, not a shared basis pool.\n\n**Rate limit**: 60 requests/minute per IP across this API. Over the limit returns 429 with a Retry-After header.\n\n**Discover first**: `/api/tax/v1/catalog` lists every event category the indexer classifies (and whether it is taxable), the reward triggers, the CosmWasm contracts and protocols it knows, the bookkeeping tags, the export formats and the Gaia releases it has reviewed. `/api/tax/v1/tags` is the tag vocabulary for the `tags` parameter. The raw document is served at `/api/tax/v1/openapi.json`; a plain-text orientation for agents is at `/llms.txt`. Every error is an RFC 9457 problem (`application/problem+json`) with a stable `code`, every response carries `X-Request-Id`, rate-limited endpoints send `RateLimit` and `RateLimit-Policy`, and a 429 or 503 carries `Retry-After`. Authenticate with the site session or an API key (`Authorization: Bearer blk_...`, created under Account). Full conventions: https://bryanlabs.net/api-docs/conventions."},"servers":[{"url":"/","description":"bryanlabs.net"}],"tags":[{"name":"Events","description":"Taxable events for one or more addresses."},{"name":"Balances","description":"Pre-indexed ATOM holdings for an address."},{"name":"Pricing","description":"Published FMV methodology and the ATOM/USD price series it generates."},{"name":"Validators","description":"Validator operator statements, disclosed jurisdictions, and the delegator-report widget."},{"name":"Books","description":"Controller reports: general-ledger journal and open positions."},{"name":"Reference","description":"What the indexer tracks, the tag vocabulary, and chain release tracking."}],"paths":{"/api/tax/v1/events":{"get":{"tags":["Events"],"summary":"Tax events","description":"Returns taxable events for one or more addresses, optionally filtered by type and date range.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated public address(es), e.g. cosmos1abc,cosmos1def"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["all","rewards","staking","income","transfers","ibc_in","ibc_out","swaps","fees"],"default":"all"},"description":"Event category. Default: all."},{"name":"tags","in":"query","required":false,"schema":{"type":"string"},"description":"Bookkeeping tags as a JSON object: {\"<TX_HASH>\": \"internal_transfer\", \"<TX_HASH>:<denom>\": \"spam\"}. Vocabulary at /api/tax/v1/tags. Changes the treatment of the tagged row in every export; never stored."},{"name":"asset_decisions","in":"query","required":false,"schema":{"type":"string"},"description":"Decisions for flagged receipts (suspected spam or identity mismatch), as a JSON object keyed by the record_id from /api/tax/v1/asset-review: {\"<record_id>\": {\"mode\": \"exclude\"}} to treat a receipt as valueless, or {\"<record_id>\": {\"mode\": \"override\", \"token\": \"ATOM\", \"quantity\": \"29.55\", \"value_usd\": \"120.10\", \"cost_basis_usd\": \"120.10\", \"acquired_date\": \"2026-03-04\"}} to supply your own identity and valuation. While any flagged receipt in the period has no decision the endpoint answers 409. Never stored server-side."},{"name":"start","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive start, YYYY-MM-DD or RFC3339. Default: all time."},{"name":"end","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive end, YYYY-MM-DD or RFC3339. Default: all time."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"default":"json"},"description":"json (default) or csv."}],"responses":{"200":{"description":"Tax events (JSON) or a CSV file when format=csv.","content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","example":"cosmoshub"},"type":{"type":"string","example":"rewards"},"addresses":{"type":"array","items":{"type":"string"}},"start":{"type":"string","nullable":true},"end":{"type":"string","nullable":true},"summary":{"type":"object","properties":{"taxableEvents":{"type":"integer","example":42},"stakingRewards":{"type":"number","example":12.34},"incomeUsd":{"type":"number","example":0.91},"totalReceived":{"type":"number","example":12.34},"totalSent":{"type":"number","example":0},"totalFees":{"type":"number","example":0.01},"symbol":{"type":"string","example":"ATOM"},"firstDate":{"type":"string","example":"2026-01-02 09:14:00"},"lastDate":{"type":"string","example":"2026-06-20 21:03:00"}}},"count":{"type":"integer","example":42},"events":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","example":"2026-01-02 09:14:00"},"sentAmount":{"type":"string"},"sentCurrency":{"type":"string"},"receivedAmount":{"type":"string","example":"0.91"},"receivedCurrency":{"type":"string","example":"ATOM"},"feeAmount":{"type":"string"},"feeCurrency":{"type":"string"},"label":{"type":"string","example":"reward"},"description":{"type":"string"},"txHash":{"type":"string","example":"ABC123..."},"category":{"type":"string","example":"reward","description":"Indexer classification; the full list is /api/tax/v1/catalog."},"taxable":{"type":"boolean","description":"False for record-only rows (delegation principal, internal transfer, protocol deposit)."},"detail":{"type":"string","description":"Human-readable context: the contract, protocol, or auto-claim trigger."},"userTag":{"type":"string","description":"The tag supplied in `tags` for this row, echoed back."},"validatorAddress":{"type":"string"},"validatorMoniker":{"type":"string"},"rewardTrigger":{"type":"string","example":"delegate"},"valueUsd":{"type":"number"}}}}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Missing/invalid address, chain, type, format or asset_decisions."},"409":{"description":"Flagged receipts need a decision: pass asset_decisions (JSON keyed by record_id from /asset-review) or save the decisions in the report on the website first. The detail names how many are pending.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"This wallet's staking history is being replayed under the current methodology; Retry-After says when to try again. No totals are returned rather than a wrong number.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/balances":{"get":{"tags":["Balances"],"summary":"ATOM holdings","description":"Returns pre-indexed Cosmos Hub ATOM holdings (liquid, staked, unclaimed rewards) for an address, at the latest snapshot, as of a date, or as a full daily series.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"},"description":"A single public address, e.g. cosmos1abc..."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub."},{"name":"date","in":"query","required":false,"schema":{"type":"string"},"description":"Holdings as of this date, YYYY-MM-DD. Default: latest snapshot."},{"name":"history","in":"query","required":false,"schema":{"type":"boolean"},"description":"Set true to return the full daily series instead of a single point."}],"responses":{"200":{"description":"Holdings (a single point, or { history: [...] } when history=true).","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","example":"cosmos1abc..."},"date":{"type":"string","example":"2026-06-20"},"liquid":{"type":"number","example":12.5},"staked":{"type":"number","example":480},"reward":{"type":"number","example":3.21},"total":{"type":"number","example":495.71},"symbol":{"type":"string","example":"ATOM"}}}}}},"400":{"description":"Missing/invalid address or chain."}}}},"/api/tax/v1/price-series":{"get":{"tags":["Pricing"],"summary":"ATOM/USD price series","description":"Returns the daily USD reference price series for a denom (ATOM by default), generated by the same pricing pipeline every tax report uses. found=false means no price was published for that day (see the methodology endpoint for how that's handled). chain accepts cosmoshub, cosmoshub-4 or mainnet.","parameters":[{"name":"denom","in":"query","required":false,"schema":{"type":"string","default":"uatom"},"description":"Base denom. Default: uatom (ATOM)."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub."},{"name":"start","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive start, YYYY-MM-DD. Default: 90 days before end."},{"name":"end","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive end, YYYY-MM-DD. Default: today."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"default":"json"},"description":"json (default) or csv."}],"responses":{"200":{"description":"The price series (JSON) or a CSV file when format=csv.","content":{"application/json":{"schema":{"type":"object","properties":{"chain":{"type":"string","example":"cosmoshub"},"denom":{"type":"string","example":"uatom"},"methodology_version":{"type":"string","example":"v1"},"points":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-20"},"usd":{"type":"number","example":1.95},"found":{"type":"boolean","example":true}}}}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"end before start, or the range exceeds 730 days."}}}},"/api/tax/v1/methodology":{"get":{"tags":["Pricing"],"summary":"FMV pricing methodology","description":"Returns the published methodology behind every USD value in a report: price sources, timestamp granularity, aggregation rule, fallback order, and how missing prices are handled. Versioned and dated; a report's footer cites the version that priced it.","parameters":[],"responses":{"200":{"description":"The current methodology.","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string","example":"v1"},"effective_date":{"type":"string","example":"2026-07-04"},"sources":{"type":"array","items":{"type":"string"}},"timestamp_granularity":{"type":"string"},"aggregation_rule":{"type":"string"},"fallback_order":{"type":"array","items":{"type":"string"}},"missing_price_handling":{"type":"string"}}}}}}}}},"/api/tax/v1/recognition-policy":{"get":{"tags":["Pricing"],"summary":"Income recognition policy","description":"Returns the documented policy for WHEN staking rewards and validator commission are recognized as income. \"at-claim\" today (income at withdrawal, matching dominion-and-control under Rev. Rul. 2023-14); the field exists so recognition timing is a citable, versioned policy rather than an implicit assumption.","parameters":[],"responses":{"200":{"description":"The current recognition policy.","content":{"application/json":{"schema":{"type":"object","properties":{"policy":{"type":"string","example":"at-claim"},"effective_date":{"type":"string","example":"2026-07-04"},"explanation":{"type":"string"}}}}}}}}},"/api/tax/v1/delegator-report":{"get":{"tags":["Validators"],"summary":"Delegator staking-income report","description":"Returns a compact staking-income summary for one delegator address, for a validator's embedded widget (see /tax/widget/delegator-report). CORS-enabled unlike the rest of this API, since it's meant to be called directly from a validator's own site. Requires an api_key (email hello@bryanlabs.net to get one during this pilot phase); the key's allowed origin is enforced when the caller's browser sends an Origin header.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"},"description":"The delegator's public address, e.g. cosmos1abc..."},{"name":"api_key","in":"query","required":true,"schema":{"type":"string"},"description":"Your validator API key."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub."},{"name":"start","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive start, YYYY-MM-DD. Default: all time."},{"name":"end","in":"query","required":false,"schema":{"type":"string"},"description":"Inclusive end, YYYY-MM-DD. Default: all time."}],"responses":{"200":{"description":"The delegator's staking-income summary.","content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string"},"chain":{"type":"string","example":"cosmoshub"},"rewards_amount":{"type":"string","example":"12.345678"},"symbol":{"type":"string","example":"ATOM"},"rewards_usd":{"type":"string","example":"24.10"},"taxable_events":{"type":"integer","example":8},"price_missing_rows":{"type":"integer","example":0},"recognition_policy":{"type":"string","example":"at-claim"},"methodology_version":{"type":"string","example":"v1"},"powered_by":{"type":"string","example":"BryanLabs (bryanlabs.net/tax)"}}}}}},"401":{"description":"Missing or invalid api_key."},"403":{"description":"Origin not authorized for this key."},"429":{"description":"Rate limit exceeded."}}}},"/api/tax/v1/catalog":{"get":{"tags":["Reference"],"summary":"What the indexer tracks","description":"Every event category the indexer classifies with its taxable flag and group, the reward triggers, the CosmWasm contracts and protocols it recognizes (with first-seen height), the message types it replays, the bookkeeping tags, the export formats, the reports, the Gaia releases it has reviewed, and announced upstream changes. Read this first to learn what a report can contain. Human-readable form: /tax/coverage.","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."}],"responses":{"200":{"description":"The catalog.","content":{"application/json":{"schema":{"type":"object","properties":{"chain_id":{"type":"string","example":"cosmoshub"},"chain":{"type":"string","example":"cosmoshub-4"},"methodology_version":{"type":"string","example":"v8"},"methodology_date":{"type":"string","example":"2026-10-14"},"native_asset":{"type":"object"},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"taxable":{"type":"boolean"},"group":{"type":"string"},"description":{"type":"string"}}}},"triggers":{"type":"array","items":{"type":"object","properties":{"trigger":{"type":"string"},"categories":{"type":"string"},"description":{"type":"string"}}}},"contracts":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"protocol":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string"},"first_seen_height":{"type":"integer"}}}},"message_types":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"object"}},"export_formats":{"type":"array","items":{"type":"object"}},"reports":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"purpose":{"type":"string"}}}},"gaia_releases":{"type":"array","items":{"type":"object"}},"upcoming_changes":{"type":"array","items":{"type":"string"}}}}}}},"503":{"description":"Tax service unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/tags":{"get":{"tags":["Reference"],"summary":"Bookkeeping tag vocabulary","description":"The tags accepted by the `tags` parameter (GET) or `userTags` body field (POST) with the export treatment each produces. Keys are a transaction hash or hash:denom.","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."}],"responses":{"200":{"description":"The vocabulary.","content":{"application/json":{"schema":{"type":"object","properties":{"key_forms":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"label":{"type":"string"},"treatment":{"type":"string"}}}},"usage":{"type":"string"}}}}}},"503":{"description":"Tax service unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/journal":{"get":{"tags":["Books"],"summary":"General-ledger journal","description":"Double-entry journal in USD for a controller's books: one debit and one credit line per entry (Digital Assets: ATOM, Income: Staking Rewards, Expense: Network Fees, Realized Gain/Loss, ...), per wallet, FIFO, priced by the published methodology, in strict date order. Each line carries price_usd (the unit reference price, so a reporting currency can be applied at your own rate), counterparty, validator and validator_country (ISO code from the disclosure registry, or undisclosed) and methodology_version. Accepts asset_decisions and tags like /events. USD only: no reporting-currency conversion is provided.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated public address(es), e.g. cosmos1abc,cosmos1def"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Start date, YYYY-MM-DD (inclusive)."},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"End date, YYYY-MM-DD (inclusive)."},{"name":"tags","in":"query","required":false,"schema":{"type":"string"},"description":"Bookkeeping tags as a JSON object, e.g. {\"<TX_HASH>\": \"internal_transfer\"}. Vocabulary: /api/tax/v1/tags."},{"name":"asset_decisions","in":"query","required":false,"schema":{"type":"string"},"description":"Decisions for flagged receipts (suspected spam or identity mismatch), as a JSON object keyed by the record_id from /api/tax/v1/asset-review: {\"<record_id>\": {\"mode\": \"exclude\"}} to treat a receipt as valueless, or {\"<record_id>\": {\"mode\": \"override\", \"token\": \"ATOM\", \"quantity\": \"29.55\", \"value_usd\": \"120.10\", \"cost_basis_usd\": \"120.10\", \"acquired_date\": \"2026-03-04\"}} to supply your own identity and valuation. While any flagged receipt in the period has no decision the endpoint answers 409. Never stored server-side."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["csv","json"],"default":"csv"}}],"responses":{"200":{"description":"Journal lines.","content":{"text/csv":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"lines":{"type":"array","items":{"type":"object","properties":{"date_utc":{"type":"string"},"tx_hash":{"type":"string"},"entry_id":{"type":"string"},"account":{"type":"string"},"debit_usd":{"type":"string"},"credit_usd":{"type":"string"},"asset":{"type":"string"},"quantity":{"type":"string"},"category":{"type":"string"},"memo":{"type":"string"}}}}}}}}},"400":{"description":"Missing or invalid address, date or tag.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Flagged receipts need a decision: pass asset_decisions (JSON keyed by record_id from /asset-review) or save them in the report on the website first.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/positions":{"get":{"tags":["Books"],"summary":"Open positions","description":"Open lots and unrealized gain or loss per asset as of a date (default today), per wallet, FIFO, the same replay Form 8949 uses. Quantity with unknown basis arrived from outside our view (an exchange or IBC receipt): valued, but with no cost basis here. Lots come only from acquisitions in the indexed history (Cosmos Hub from 2025-12-31 onward); coins acquired before that are not represented. Staked and unbonding coins stay in quantity because delegating is not a disposal; the liquid, staked and unbonding split is on /balances. USD figures are rounded to cents.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated public address(es), e.g. cosmos1abc,cosmos1def"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"As-of date, YYYY-MM-DD. Default: today."},{"name":"tags","in":"query","required":false,"schema":{"type":"string"},"description":"Bookkeeping tags as a JSON object, e.g. {\"<TX_HASH>\": \"internal_transfer\"}. Vocabulary: /api/tax/v1/tags."},{"name":"asset_decisions","in":"query","required":false,"schema":{"type":"string"},"description":"Decisions for flagged receipts (suspected spam or identity mismatch), as a JSON object keyed by the record_id from /api/tax/v1/asset-review: {\"<record_id>\": {\"mode\": \"exclude\"}} to treat a receipt as valueless, or {\"<record_id>\": {\"mode\": \"override\", \"token\": \"ATOM\", \"quantity\": \"29.55\", \"value_usd\": \"120.10\", \"cost_basis_usd\": \"120.10\", \"acquired_date\": \"2026-03-04\"}} to supply your own identity and valuation. While any flagged receipt in the period has no decision the endpoint answers 409. Never stored server-side."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"default":"json"}}],"responses":{"200":{"description":"Positions.","content":{"application/json":{"schema":{"type":"object","properties":{"as_of":{"type":"string"},"methodology_version":{"type":"string"},"note":{"type":"string"},"count":{"type":"integer"},"positions":{"type":"array","items":{"type":"object","properties":{"address":{"type":"string"},"asset":{"type":"string"},"denom":{"type":"string"},"quantity":{"type":"string"},"cost_basis_usd":{"type":"string"},"basis_unknown_quantity":{"type":"string"},"market_price_usd":{"type":"string"},"market_value_usd":{"type":"string"},"unrealized_gain_usd":{"type":"string"},"price_missing":{"type":"boolean"},"lots":{"type":"integer"},"oldest_lot":{"type":"string"}}}}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Missing or invalid address or date.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"Flagged receipts need a decision: pass asset_decisions (JSON keyed by record_id from /asset-review). Decisions for receipts after the as-of date are accepted and ignored.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/validator-statement":{"get":{"tags":["Validators"],"summary":"Validator operator statement","description":"Commission the operator withdrew and the rewards delegators actually withdrew through this validator (claims and auto-withdrawals), by month, with unique delegators and the operator's disclosed jurisdiction. Aggregated in the database over indexed columns, so a large validator over a full year answers in a few seconds. The coverage object says what the index covers (Cosmos Hub from 2025-12-31 onward) and whether the methodology replay has finished; months still being replayed carry incomplete=true. price_missing_events counts reward events priced at $0 for lack of a reference price.","parameters":[{"name":"validator","in":"query","required":true,"schema":{"type":"string"},"description":"Operator address, cosmosvaloper1..."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."},{"name":"start","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"Start date, YYYY-MM-DD (inclusive)."},{"name":"end","in":"query","required":false,"schema":{"type":"string","format":"date"},"description":"End date, YYYY-MM-DD (inclusive)."},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv"],"default":"json"}}],"responses":{"200":{"description":"The statement.","content":{"application/json":{"schema":{"type":"object","properties":{"validator":{"type":"string"},"moniker":{"type":"string"},"jurisdiction":{"type":"string","example":"CH","description":"ISO country code from a public disclosure, or undisclosed."},"methodology_version":{"type":"string"},"recognition_policy":{"type":"string"},"months":{"type":"array","items":{"type":"object","properties":{"month":{"type":"string","example":"2026-09"},"symbol":{"type":"string"},"commission_amount":{"type":"string"},"commission_usd":{"type":"string"},"delegator_rewards_amount":{"type":"string"},"delegator_rewards_usd":{"type":"string"},"reward_events":{"type":"integer"},"unique_delegators":{"type":"integer"},"price_missing_days":{"type":"integer"},"price_missing_events":{"type":"integer"},"incomplete":{"type":"boolean"}}}},"total":{"type":"object"},"coverage":{"type":"object","properties":{"index_start":{"type":"string","format":"date"},"index_end":{"type":"string","format":"date"},"replay_cursor":{"type":"string"},"complete":{"type":"boolean"},"note":{"type":"string"}}}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Missing or invalid date, or the operator address failed its bech32 checksum (a typo).","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No validator with this operator address on the chain, now or in the indexed history.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Tax service unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/validators/jurisdictions":{"get":{"tags":["Validators"],"summary":"Disclosed validator jurisdictions","description":"Validators with a publicly disclosed country of establishment (the operator's own website or company registration), matched to their operator addresses. A delegator whose treatment depends on the payer's country splits reward income by validator country with this. Undisclosed validators are reported as undisclosed, never guessed. Corrections: the disclosure form under the registry table on /tax/coverage, or POST /api/tax/v1/wasm/submissions with kind validator_jurisdiction, the operator address as contract_address and a note containing the country and a public source URL.","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."}],"responses":{"200":{"description":"The registry.","content":{"application/json":{"schema":{"type":"object","properties":{"basis":{"type":"string"},"validators_on_chain":{"type":"integer"},"validators_disclosed":{"type":"integer"},"undisclosed_label":{"type":"string"},"jurisdictions":{"type":"array","items":{"type":"object","properties":{"moniker":{"type":"string"},"country":{"type":"string"},"entity":{"type":"string"},"source":{"type":"string"},"reviewed":{"type":"string"},"operator_addresses":{"type":"array","items":{"type":"string"},"nullable":true}}}}}}}}},"503":{"description":"Tax service unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/chain/releases":{"get":{"tags":["Reference"],"summary":"Gaia release tracking","description":"Every Gaia (Cosmos Hub) release the indexer has reviewed with its tax-layer impact, the upstream changes announced but not released, and the latest run of the daily release watcher: the node's version and SDK, the newest upstream release, any pending upgrade plan, and whether a release needs review (attention).","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"cosmoshub"},"description":"Chain id. Default: cosmoshub. Enabled values: cosmoshub."}],"responses":{"200":{"description":"Release tracking.","content":{"application/json":{"schema":{"type":"object","properties":{"attention":{"type":"boolean"},"stale":{"type":"boolean"},"latest_reviewed":{"type":"object"},"releases":{"type":"array","items":{"type":"object","properties":{"version":{"type":"string"},"date":{"type":"string"},"cosmos_sdk":{"type":"string"},"summary":{"type":"string"},"indexer_impact":{"type":"string"},"reviewed":{"type":"boolean"}}}},"upcoming_changes":{"type":"array","items":{"type":"string"}},"watcher":{"type":"object","nullable":true}}}}}},"503":{"description":"Tax service unavailable.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/api/tax/v1/openapi.json":{"get":{"tags":["Reference"],"summary":"This document","description":"The OpenAPI 3.1 document for this API, raw.","parameters":[],"responses":{"200":{"description":"OpenAPI document.","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"Session":{"type":"apiKey","in":"cookie","name":"__Secure-bryanlabs.session-token","description":"The site session. Browser calls carry it automatically."},"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"blk_...","description":"A personal API key from Account, sent as Authorization: Bearer. Carries the scopes it was created with."}},"schemas":{"Problem":{"type":"object","description":"RFC 9457 Problem Details. `code` is the stable, documented reason; `detail` is for humans.","required":["type","title","status","detail","code"],"properties":{"type":{"type":"string","format":"uri","description":"Link to the code's entry in the API conventions."},"title":{"type":"string","description":"Short summary of the status."},"status":{"type":"integer"},"detail":{"type":"string","description":"What went wrong, for a person."},"code":{"type":"string","description":"Stable machine-readable reason, safe to branch on."},"instance":{"type":"string","description":"Path of the request."},"request_id":{"type":"string","description":"Same value as the X-Request-Id header. Quote it when asking for help."},"retry_after":{"type":"integer","description":"Seconds until the request can succeed, when the refusal is temporary."},"error":{"type":"string","deprecated":true,"description":"Alias of detail. Sunset 2027-04-01."},"success":{"type":"boolean","deprecated":true,"description":"Always false. Sunset 2027-04-01."}},"additionalProperties":true,"examples":[{"type":"https://bryanlabs.net/api-docs/conventions#not_found","title":"Not Found","status":404,"detail":"No snapshot for that chain.","code":"not_found","instance":"/api/snapshots/v1/chains/nope/snapshots/latest","request_id":"3b1e4f0a-7c2d-4e8b-9a61-1f0c2d3e4a5b"}]}}}}