{"openapi":"3.1.0","info":{"title":"zexplorer","version":"1.0.0","description":"Public Zexplorer API. A typed BFF that fronts the Zinder gRPC plane and never exposes shielded counterparties from public chain data.\n\n**Envelope.** Every per-network read response is shaped `{ data, freshness, capabilities }`. `freshness` separates where the network is from what the response reflects: `chain_tip_height`/`chain_tip_hash` (the network chain tip), `indexed_tip_height`/`indexed_tip_hash`/`indexed_tip_block_time_unix_seconds` (the block the served data actually reflects), `lag_blocks` (their gap), `freshness_status` (the readiness verdict: `live | catching_up | awaiting_upstream`), `capability_version`, and `observed_at_millis`. `capabilities` is the live, sorted list of explorer capabilities the upstream advertises right now; consumers must gate every feature on this list, never on hard-coded versions. Operator-facing state (writer phase, canonical-store lag, derive health) is exposed only on `/{network}/network` under `data.operator`; public consumers may ignore it.\n\n**Capabilities.** Identifiers are `explorer.<domain>.<view>_v1`. The closed vocabulary lives in `packages/zcash/src/capabilities.ts` and is wire-typed on the envelope as `capabilities: enum[...]`. Adding a new identifier requires a human description in `apps/web/components/capability-grid.tsx`; the type system enforces coverage. Wallet-plane capabilities (`wallet.*`) are intentionally not surfaced here; they are internal to the BFF -> Zinder link.\n\n**Errors.** Every failure is `application/problem+json` (RFC 7807) with a stable `error_code` (closed enum). The closed registry lives in `packages/zcash/src/error-codes.ts`; the human-readable map is at `docs/reference/error-vocabulary.md`. Broadcast outcomes (`duplicate`, `rejected`, `invalid_encoding`, `unknown`) are NOT error codes: the broadcast route always returns 200 with a typed `outcome` field. Pagination cursor invalidation returns 410 `cursor_expired`.\n\n**Privacy invariants.** `paid_fee_zat` is always null when a transaction has any shielded input. Shielded counterparties are never returned. Raw transaction bytes are not part of any typed read; the explorer plane is fact-first per the upstream Zinder model."},"servers":[{"url":"/api/v1"}],"components":{"schemas":{"ProcessHealthzResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"revision":{"type":"string","nullable":true,"description":"Git commit of the running build; null when built without provenance."},"networks_served":{"type":"array","items":{"type":"string","enum":["mainnet","testnet","regtest"]}},"networks":{"type":"array","items":{"type":"object","properties":{"network":{"type":"string","enum":["mainnet","testnet","regtest"]},"zinder_reachable":{"type":"boolean"}},"required":["network","zinder_reachable"]}}},"required":["status","revision","networks_served","networks"]}},"required":["data"]},"Problem":{"type":"object","properties":{"type":{"type":"string","format":"uri","description":"Stable problem-type URI keyed by `error_code`. Identifies the failure class for client-side switch logic."},"title":{"type":"string","description":"Human-readable summary derived from the error code. Stable per code."},"status":{"type":"integer","description":"HTTP status this response carries. Mirrors `status`."},"detail":{"type":"string","description":"Free-text explanation of this specific failure. Safe to log; never contains secrets."},"error_code":{"type":"string","enum":["zinder_unavailable","capability_unavailable","not_found","invalid_argument","rate_limited","broadcast_disabled","block_not_in_best_chain","chain_epoch_pin_unavailable","cursor_expired","dependency_not_configured","internal"],"description":"Closed vocabulary; see `packages/zcash/src/error-codes.ts`. Clients branch on this value, never on `status` or `title`."},"retry_posture":{"type":"string","enum":["retryable","not_retryable","requires_operator"],"description":"Stable per `error_code`. `retryable` for transient upstream failures, `not_retryable` for client-fixable failures, `requires_operator` for failures that need an out-of-band intervention."},"upstream_reason":{"type":"string","nullable":true,"description":"Verbatim gRPC reason string from the upstream Zinder when the failure originated there. Null when the API synthesized the failure or the upstream provided no reason."}},"required":["type","title","status","detail","error_code","retry_posture","upstream_reason"]},"ChainFreshness":{"type":"object","properties":{"network":{"type":"string","enum":["mainnet","testnet","regtest"]},"chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Best-known network chain tip: the latest block the node has committed to its canonical store. Null before the node reports a tip."},"chain_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Hash of the chain-tip block. Null when `chain_tip_height` is null."},"indexed_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"The block this response's data reflects: the highest block the queryable derive projections have materialized. Equals `chain_tip_height` on a healthy node and trails it while the index catches up. Null before the first block is indexed; treat null as unknown, not at-tip."},"indexed_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Hash of the indexed-tip block; the snapshot identity of the served data. Compare across responses to detect a changed view. Null when nothing is indexed yet."},"indexed_tip_block_time_unix_seconds":{"type":"integer","nullable":true,"description":"Unix-seconds header time of the indexed-tip block. Consumers compute the real age of the served data from this (e.g. \"12 seconds ago\", or a date far in the past while the index is catching up). Null when nothing is indexed yet."},"lag_blocks":{"type":"integer","nullable":true,"description":"`chain_tip_height - indexed_tip_height`: how many blocks the served data trails the chain tip. Zero (within a small tolerance) means the data tracks the tip; large means reads reflect a historical block. Null when either height is unknown."},"freshness_status":{"type":"string","enum":["live","catching_up","awaiting_upstream"],"description":"Server-computed data-readiness verdict, the single field UI and agents gate on. `live`: data tracks the chain tip. `catching_up`: data is materially behind (the index is replaying or frozen); render a historical / progress state, never as current. `awaiting_upstream`: the node has no usable tip yet. Whether a node can serve a capability at all is separate; see `capabilities`."},"capability_version":{"type":"string","description":"Capability identifier the response was served against (for example `explorer.transaction.detail_v1`). Stable per route; clients pin client-side handlers against this value."},"observed_at_millis":{"type":"integer","description":"Wall-clock millis at which the BFF observed the upstream response. Useful for client-side staleness checks independent of the underlying upstream lag signals."}},"required":["network","chain_tip_height","chain_tip_hash","indexed_tip_height","indexed_tip_hash","indexed_tip_block_time_unix_seconds","lag_blocks","freshness_status","capability_version","observed_at_millis"]},"NetworkHealthzResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded"],"description":"`healthy` when the upstream is reachable and answered server-info; `degraded` when reachable but the call failed."},"zinder":{"type":"object","properties":{"reachable":{"type":"boolean"},"service":{"type":"string","nullable":true,"description":"Service identity from the upstream server-info handshake. Null when the upstream is unreachable."},"service_version":{"type":"string","nullable":true,"description":"Semver-style upstream version. Null when the upstream is unreachable."}},"required":["reachable","service","service_version"]}},"required":["status","zinder"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"NetworkOperatorState":{"type":"object","nullable":true,"properties":{"ingest_phase":{"type":"string","nullable":true,"enum":["unspecified","awaiting_upstream","bulk_catchup","following_tip"],"description":"Closed enum: `unspecified | awaiting_upstream | bulk_catchup | following_tip`. Canonical-plane phase only. `following_tip` proves the canonical store is at the upstream Zebra tip; it does NOT prove the derive projections are caught up (see `derive_health`). Null when IngestControl is not wired for this network."},"canonical_lag_blocks":{"type":"integer","nullable":true,"description":"Blocks the canonical store trails the upstream Zebra tip by. Prefer the readiness gap when IngestControl reports it; otherwise derived from upstream committed tip minus canonical visible tip when both are known. Zero when the writer is at the tip. Null when neither source can measure the gap."},"upstream_committed_tip_height":{"type":"integer","nullable":true,"description":"Highest block height the upstream node has locally verified (Zebra's `blocks` from `getblockchaininfo`), copied from the explorer freshness envelope's `UpstreamObservation`. Null when the source-plane probe has not fired yet; treat as unknown, not zero."},"upstream_estimated_tip_height":{"type":"integer","nullable":true,"description":"Upstream node's wall-clock-extrapolated estimate of the real chain tip (Zebra's `estimatedheight` from `getblockchaininfo`), copied from the explorer freshness envelope's `UpstreamObservation`. The UI uses this as the denominator for sync-progress (\"block X of Y\"). Always `>= upstream_committed_tip_height`. Null when the probe has not fired yet."},"derive_health":{"type":"string","nullable":true,"enum":["unspecified","live","catching_up","paused"],"description":"Closed enum: `unspecified | live | catching_up | paused`. The derive plane's own health, reported by the ingest plane: `live` at the canonical tip, `catching_up` replaying behind, `paused` frozen (e.g. memory pressure). `paused` is what distinguishes a stalled index from a transient catch-up. Null when the node has not written a derive-status record."},"indexed_tip_height":{"type":"integer","nullable":true,"description":"Highest block the derive projections have materialized, from the derive-status record. The operator-plane counterpart of the envelope's `indexed_tip_height`. Null when no record has been written."}},"required":["ingest_phase","canonical_lag_blocks","upstream_committed_tip_height","upstream_estimated_tip_height","derive_health","indexed_tip_height"],"description":"Operator-facing state for this network. Carries the ingest writer phase and canonical-store lag (from `/readyz`), the derive plane's health and indexed tip height (from the explorer `derive_status`), and the upstream node's own committed/estimated tip heights (from the explorer freshness envelope). Present when at least one source produced a signal; null when all are unavailable. Public consumers may ignore this field; the live-sync chip, indexer-health panel, and catch-up banner depend on it. Upstream and derive fields are null when their source has not reported yet (treat as unknown, not zero)."},"NetworkData":{"type":"object","properties":{"service":{"type":"string","description":"Upstream service identifier reported by Zinder's ServerInfo.","example":"zinder-explorer"},"service_version":{"type":"string","description":"Upstream service version string.","example":"0.4.0"},"vendor":{"type":"string","description":"Upstream vendor name (typically `Zinder`).","example":"Zinder"},"operator":{"$ref":"#/components/schemas/NetworkOperatorState"}},"required":["service","service_version","vendor","operator"]},"NetworkResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/NetworkData"},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"OverviewSnapshotResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tip_block_time_unix_seconds":{"type":"integer","description":"Header-block timestamp of the snapshot's tip in Unix seconds. Zero when the upstream has no committed blocks."},"mempool":{"type":"object","properties":{"transaction_count":{"type":"integer","minimum":0},"total_size_bytes":{"type":"integer","minimum":0,"description":"Sum of `size_bytes` across every mempool entry."},"oldest_entry_age_millis":{"type":"integer","minimum":0,"description":"Age in milliseconds of the oldest mempool entry vs. the bundle's observation instant. Zero when the mempool is empty."},"newest_entry_age_millis":{"type":"integer","minimum":0,"description":"Age in milliseconds of the newest mempool entry vs. the bundle's observation instant. Zero when the mempool is empty."}},"required":["transaction_count","total_size_bytes","oldest_entry_age_millis","newest_entry_age_millis"]},"mempool_events":{"type":"object","properties":{"window_seconds":{"type":"integer","minimum":60,"maximum":3600,"description":"Effective window size after server clamping (range [60, 3600] seconds)."},"added_count":{"type":"integer","minimum":0},"mined_count":{"type":"integer","minimum":0},"invalidated_count":{"type":"integer","minimum":0},"suppressed_count":{"type":"integer","minimum":0,"description":"Number of ZIP-401-style admission refusals observed during the window. Stays zero for sources that do not surface this event class."}},"required":["window_seconds","added_count","mined_count","invalidated_count","suppressed_count"]},"fee_summary":{"type":"object","properties":{"block_count":{"type":"integer","minimum":0,"description":"Effective number of blocks the aggregate covered after server clamping."},"transaction_count":{"type":"integer","minimum":0,"description":"Number of non-coinbase transactions across the aggregated block window."},"total_zip317_conventional_fee_zat":{"type":"string","description":"Sum of ZIP-317 conventional-fee floors across the window's non-coinbase transactions. Decimal-string zatoshis. Zero when the window has no non-coinbase transactions."},"min_zip317_conventional_fee_zat":{"type":"string","description":"Smallest ZIP-317 conventional-fee floor observed in the window. Decimal-string zatoshis. Zero when `transaction_count == 0`."},"max_zip317_conventional_fee_zat":{"type":"string","description":"Largest ZIP-317 conventional-fee floor observed in the window. Decimal-string zatoshis. Zero when `transaction_count == 0`."}},"required":["block_count","transaction_count","total_zip317_conventional_fee_zat","min_zip317_conventional_fee_zat","max_zip317_conventional_fee_zat"]},"value_pools":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Pool identifier: one of `transparent`, `sprout`, `sapling`, `orchard`, `ironwood`, or a future consensus pool id."},"monitored":{"type":"boolean","description":"Whether the upstream node tracks this pool. Some deployments disable sprout monitoring."},"chain_value_zat":{"type":"string","nullable":true,"description":"Cumulative zatoshis held in this pool at the chain tip. Null when the pool is not monitored or the upstream has not reported a value. Decimal-string zatoshis when populated."}},"required":["id","monitored","chain_value_zat"]}},"recent_blocks":{"type":"array","items":{"type":"object","properties":{"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_time_unix_seconds":{"type":"integer","description":"Block timestamp as Unix seconds. The consensus-recorded time the block claims, not when the explorer observed it."},"transaction_count":{"type":"integer","minimum":0,"description":"Number of transactions in the block, including coinbase."},"previous_block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"total_size_bytes":{"type":"integer","minimum":0,"description":"Wire-encoded byte size of the entire block."},"fees_collected_zat":{"type":"string","description":"Sum of ZIP-317 conventional-fee floors across every non-coinbase transaction in the block. Decimal-string zatoshis."},"coinbase_reward_zat":{"type":"string","description":"Total zatoshis paid to the miner by the coinbase transaction. Decimal-string zatoshis. Includes both the protocol subsidy and any included fees the coinbase chooses to claim."},"sapling_output_count":{"type":"integer","minimum":0,"description":"Total Sapling output components across every transaction in the block. Counts are public; amounts are not."},"orchard_action_count":{"type":"integer","minimum":0,"description":"Total Orchard action components across every transaction in the block. Counts are public; amounts are not."},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components across every transaction in the block. Counts are public; amounts are not."},"confirmations":{"type":"integer","minimum":0,"description":"Depth below the current best-chain tip. Zero on the tip block; grows by one each new block."},"is_canonical":{"type":"boolean","description":"True when the block currently lives on the best chain. False during an active reorg pass for blocks that have been orphaned."},"fee_transaction_count":{"type":"integer","nullable":true,"minimum":0,"description":"Number of non-coinbase transactions in the block. Null when the upstream has not yet populated this field."},"min_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Smallest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."},"max_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Largest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."}},"required":["block_height","block_hash","block_time_unix_seconds","transaction_count","previous_block_hash","total_size_bytes","fees_collected_zat","coinbase_reward_zat","sapling_output_count","orchard_action_count","ironwood_action_count","confirmations","is_canonical","fee_transaction_count","min_zip317_conventional_fee_zat","max_zip317_conventional_fee_zat"]},"description":"Top-K canonical block summaries ending at the snapshot's tip, descending by height. `recent_blocks[0]` is the tip."},"recent_transactions":{"type":"array","items":{"type":"object","properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_time_unix_seconds":{"type":"integer"},"is_coinbase":{"type":"boolean"},"privacy_shape":{"type":"string","enum":["transparent_only","shielding","deshielding","shielded_only","mixed","unclassified"]},"size_bytes":{"type":"integer","minimum":0},"zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"ZIP-317 conventional-fee floor. Null on coinbase transactions (no inputs to charge a fee on). Decimal-string zatoshis when populated."},"paid_fee_zat":{"type":"string","nullable":true,"description":"Null whenever the transaction has any shielded input (privacy invariant) or prevout resolution is incomplete. Decimal-string zatoshis when populated."},"logical_action_count":{"type":"integer","minimum":0,"description":"ZIP-317 logical action count: inputs plus outputs, used for fee-floor accounting."},"component_counts":{"type":"object","properties":{"transparent_input_count":{"type":"integer","minimum":0},"transparent_output_count":{"type":"integer","minimum":0},"sapling_spend_count":{"type":"integer","minimum":0},"sapling_output_count":{"type":"integer","minimum":0},"orchard_action_count":{"type":"integer","minimum":0},"sprout_joinsplit_count":{"type":"integer","minimum":0},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components. Counts are public; amounts are not."}},"required":["transparent_input_count","transparent_output_count","sapling_spend_count","sapling_output_count","orchard_action_count","sprout_joinsplit_count","ironwood_action_count"]}},"required":["transaction_id","block_height","block_hash","block_time_unix_seconds","is_coinbase","privacy_shape","size_bytes","zip317_conventional_fee_zat","paid_fee_zat","logical_action_count","component_counts"]},"description":"Newest-first canonical transactions. Drives both the overview transaction display and the privacy-mix aggregation on the consumer side."}},"required":["tip_block_time_unix_seconds","mempool","mempool_events","fee_summary","value_pools","recent_blocks","recent_transactions"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"ValuePoolSummaryResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tip_height":{"type":"integer","minimum":0},"pools":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Pool identifier: one of `transparent`, `sprout`, `sapling`, `orchard`, `ironwood`, or a future consensus pool id."},"monitored":{"type":"boolean","description":"Whether the upstream node tracks this pool. Some deployments disable sprout monitoring."},"chain_value_zat":{"type":"string","nullable":true,"description":"Cumulative zatoshis held in this pool at the chain tip. Null when the pool is not monitored or the upstream has not reported a value. Decimal-string zatoshis when populated."}},"required":["id","monitored","chain_value_zat"]}}},"required":["tip_height","pools"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"FeeSummaryResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"block_count":{"type":"integer","minimum":0,"description":"Number of blocks the aggregate was computed over."},"transaction_count":{"type":"integer","minimum":0,"description":"Total non-coinbase transactions seen across the aggregated blocks."},"total_zip317_conventional_fee_zat":{"type":"string","description":"Sum of ZIP-317 conventional-fee floors across every non-coinbase transaction in the aggregate. Decimal-string zatoshis. This is a derived floor, not miner-collected fee."},"min_zip317_conventional_fee_zat":{"type":"string","description":"Smallest ZIP-317 conventional-fee floor seen across the aggregate. Decimal-string zatoshis."},"max_zip317_conventional_fee_zat":{"type":"string","description":"Largest ZIP-317 conventional-fee floor seen across the aggregate. Decimal-string zatoshis."}},"required":["block_count","transaction_count","total_zip317_conventional_fee_zat","min_zip317_conventional_fee_zat","max_zip317_conventional_fee_zat"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"BlockListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"blocks":{"type":"array","items":{"type":"object","properties":{"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_time_unix_seconds":{"type":"integer","description":"Block timestamp as Unix seconds. The consensus-recorded time the block claims, not when the explorer observed it."},"transaction_count":{"type":"integer","minimum":0,"description":"Number of transactions in the block, including coinbase."},"previous_block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"total_size_bytes":{"type":"integer","minimum":0,"description":"Wire-encoded byte size of the entire block."},"fees_collected_zat":{"type":"string","description":"Sum of ZIP-317 conventional-fee floors across every non-coinbase transaction in the block. Decimal-string zatoshis."},"coinbase_reward_zat":{"type":"string","description":"Total zatoshis paid to the miner by the coinbase transaction. Decimal-string zatoshis. Includes both the protocol subsidy and any included fees the coinbase chooses to claim."},"sapling_output_count":{"type":"integer","minimum":0,"description":"Total Sapling output components across every transaction in the block. Counts are public; amounts are not."},"orchard_action_count":{"type":"integer","minimum":0,"description":"Total Orchard action components across every transaction in the block. Counts are public; amounts are not."},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components across every transaction in the block. Counts are public; amounts are not."},"confirmations":{"type":"integer","minimum":0,"description":"Depth below the current best-chain tip. Zero on the tip block; grows by one each new block."},"is_canonical":{"type":"boolean","description":"True when the block currently lives on the best chain. False during an active reorg pass for blocks that have been orphaned."},"fee_transaction_count":{"type":"integer","nullable":true,"minimum":0,"description":"Number of non-coinbase transactions in the block. Null when the upstream has not yet populated this field."},"min_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Smallest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."},"max_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Largest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."}},"required":["block_height","block_hash","block_time_unix_seconds","transaction_count","previous_block_hash","total_size_bytes","fees_collected_zat","coinbase_reward_zat","sapling_output_count","orchard_action_count","ironwood_action_count","confirmations","is_canonical","fee_transaction_count","min_zip317_conventional_fee_zat","max_zip317_conventional_fee_zat"]}},"block_window":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"Oldest block height in the requested list window after server-side clamping."},"end_height":{"type":"integer","minimum":0,"description":"Newest block height in the requested list window after server-side clamping."},"tip_height":{"type":"integer","minimum":0,"description":"Best-chain tip height used to clamp this block-list window."},"row_count":{"type":"integer","minimum":0,"description":"Number of block rows returned in this response. Can be smaller than the requested limit near genesis or while the upstream index is catching up."}},"required":["start_height","end_height","tip_height","row_count"]},"next_cursor":{"type":"string","nullable":true,"description":"Opaque base64url cursor for the next (older) page, or null at the start of the chain. Pass it back as the `cursor` query param; treat it as opaque and never construct or parse it."}},"required":["blocks","block_window","next_cursor"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"BlockDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"summary":{"type":"object","properties":{"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_time_unix_seconds":{"type":"integer","description":"Block timestamp as Unix seconds. The consensus-recorded time the block claims, not when the explorer observed it."},"transaction_count":{"type":"integer","minimum":0,"description":"Number of transactions in the block, including coinbase."},"previous_block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"total_size_bytes":{"type":"integer","minimum":0,"description":"Wire-encoded byte size of the entire block."},"fees_collected_zat":{"type":"string","description":"Sum of ZIP-317 conventional-fee floors across every non-coinbase transaction in the block. Decimal-string zatoshis."},"coinbase_reward_zat":{"type":"string","description":"Total zatoshis paid to the miner by the coinbase transaction. Decimal-string zatoshis. Includes both the protocol subsidy and any included fees the coinbase chooses to claim."},"sapling_output_count":{"type":"integer","minimum":0,"description":"Total Sapling output components across every transaction in the block. Counts are public; amounts are not."},"orchard_action_count":{"type":"integer","minimum":0,"description":"Total Orchard action components across every transaction in the block. Counts are public; amounts are not."},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components across every transaction in the block. Counts are public; amounts are not."},"confirmations":{"type":"integer","minimum":0,"description":"Depth below the current best-chain tip. Zero on the tip block; grows by one each new block."},"is_canonical":{"type":"boolean","description":"True when the block currently lives on the best chain. False during an active reorg pass for blocks that have been orphaned."},"fee_transaction_count":{"type":"integer","nullable":true,"minimum":0,"description":"Number of non-coinbase transactions in the block. Null when the upstream has not yet populated this field."},"min_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Smallest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."},"max_zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"Largest ZIP-317 conventional-fee floor among the block's non-coinbase transactions. Decimal-string zatoshis. Null when the upstream has not yet populated this field or the block carries no non-coinbase transactions."}},"required":["block_height","block_hash","block_time_unix_seconds","transaction_count","previous_block_hash","total_size_bytes","fees_collected_zat","coinbase_reward_zat","sapling_output_count","orchard_action_count","ironwood_action_count","confirmations","is_canonical","fee_transaction_count","min_zip317_conventional_fee_zat","max_zip317_conventional_fee_zat"]},"transaction_ids":{"type":"array","items":{"type":"string"}}},"required":["summary","transaction_ids"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"ChainReorgHistoryResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"event_sequence":{"type":"integer","minimum":0,"description":"Monotonic sequence from Zinder's chain-event log. This is an explorer incident identifier, not a Zcash block height or chain-native ID."},"event_cursor":{"type":"string","minLength":1,"description":"Opaque base64url upstream event cursor. Treat it as row identity; list pagination is expressed by `reorg_window`, `limit`, and `offset`."},"chain_epoch_id":{"type":"string","minLength":1,"description":"Decimal-string Zinder chain epoch identifier visible after the reorg."},"chain_epoch_created_unix_millis":{"type":"integer","minimum":0,"description":"Zinder wall-clock creation time for the post-reorg chain epoch, in Unix milliseconds."},"chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Best visible block height after the reorg."},"chain_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Best visible block hash after the reorg."},"settled_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Highest settled block height after the reorg."},"settled_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Highest settled block hash after the reorg."},"reverted_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Previously visible range invalidated by this reorg."},"committed_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Replacement range committed by this reorg."}},"required":["event_sequence","event_cursor","chain_epoch_id","chain_epoch_created_unix_millis","chain_tip_height","chain_tip_hash","settled_tip_height","settled_tip_hash","reverted_range","committed_range"]}},"reorg_window":{"type":"object","properties":{"row_count":{"type":"integer","minimum":0,"description":"Number of reorg incident rows returned in this response."},"row_offset":{"type":"integer","minimum":0,"description":"Effective newest-first row offset after clamping to the available matching incident history."},"visible_page_index":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"One-based page index derived from the effective row offset and requested limit."},"matching_reorg_count":{"type":"integer","minimum":0,"description":"Number of scanned incidents matching the optional height filter. Equals `recorded_reorg_count` when no height filter is present."},"recorded_reorg_count":{"type":"integer","minimum":0,"description":"Number of recorded incidents scanned before returning this window."},"scanned_api_page_count":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Number of upstream reorg-history pages scanned to build this window."},"reached_scan_limit":{"type":"boolean","description":"True when the API stopped at its bounded upstream scan limit before reaching the end of recorded reorg history."},"has_newer_reorgs":{"type":"boolean","description":"True when a lower offset would return newer matching incidents."},"has_older_reorgs":{"type":"boolean","description":"True when a higher offset would return older matching incidents."},"max_invalidated_block_count":{"type":"integer","minimum":0,"description":"Largest invalidated block count among matching scanned incidents."},"latest_matched_event":{"type":"object","nullable":true,"properties":{"event_sequence":{"type":"integer","minimum":0,"description":"Monotonic sequence from Zinder's chain-event log. This is an explorer incident identifier, not a Zcash block height or chain-native ID."},"event_cursor":{"type":"string","minLength":1,"description":"Opaque base64url upstream event cursor. Treat it as row identity; list pagination is expressed by `reorg_window`, `limit`, and `offset`."},"chain_epoch_id":{"type":"string","minLength":1,"description":"Decimal-string Zinder chain epoch identifier visible after the reorg."},"chain_epoch_created_unix_millis":{"type":"integer","minimum":0,"description":"Zinder wall-clock creation time for the post-reorg chain epoch, in Unix milliseconds."},"chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Best visible block height after the reorg."},"chain_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Best visible block hash after the reorg."},"settled_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Highest settled block height after the reorg."},"settled_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Highest settled block hash after the reorg."},"reverted_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Previously visible range invalidated by this reorg."},"committed_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Replacement range committed by this reorg."}},"required":["event_sequence","event_cursor","chain_epoch_id","chain_epoch_created_unix_millis","chain_tip_height","chain_tip_hash","settled_tip_height","settled_tip_hash","reverted_range","committed_range"],"description":"Newest matching incident across the scanned history, or null when no incident matched."},"oldest_matched_event":{"type":"object","nullable":true,"properties":{"event_sequence":{"type":"integer","minimum":0,"description":"Monotonic sequence from Zinder's chain-event log. This is an explorer incident identifier, not a Zcash block height or chain-native ID."},"event_cursor":{"type":"string","minLength":1,"description":"Opaque base64url upstream event cursor. Treat it as row identity; list pagination is expressed by `reorg_window`, `limit`, and `offset`."},"chain_epoch_id":{"type":"string","minLength":1,"description":"Decimal-string Zinder chain epoch identifier visible after the reorg."},"chain_epoch_created_unix_millis":{"type":"integer","minimum":0,"description":"Zinder wall-clock creation time for the post-reorg chain epoch, in Unix milliseconds."},"chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Best visible block height after the reorg."},"chain_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Best visible block hash after the reorg."},"settled_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Highest settled block height after the reorg."},"settled_tip_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Highest settled block hash after the reorg."},"reverted_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Previously visible range invalidated by this reorg."},"committed_range":{"type":"object","properties":{"start_height":{"type":"integer","minimum":0,"description":"First block height in the inclusive range."},"end_height":{"type":"integer","minimum":0,"description":"Last block height in the inclusive range."}},"required":["start_height","end_height"],"description":"Replacement range committed by this reorg."}},"required":["event_sequence","event_cursor","chain_epoch_id","chain_epoch_created_unix_millis","chain_tip_height","chain_tip_hash","settled_tip_height","settled_tip_hash","reverted_range","committed_range"],"description":"Oldest matching incident across the scanned history, or null when no incident matched."}},"required":["row_count","row_offset","visible_page_index","matching_reorg_count","recorded_reorg_count","scanned_api_page_count","reached_scan_limit","has_newer_reorgs","has_older_reorgs","max_invalidated_block_count","latest_matched_event","oldest_matched_event"]},"recorded_history":{"type":"object","properties":{"oldest_event_sequence":{"type":"integer","nullable":true,"minimum":0,"description":"Earliest recorded reorg incident sequence, when the upstream exposes it. Null means this bound is unavailable."},"latest_event_sequence":{"type":"integer","nullable":true,"minimum":0,"description":"Latest recorded reorg incident sequence, when the upstream exposes it. Null means this bound is unavailable."},"oldest_event_unix_millis":{"type":"integer","nullable":true,"minimum":0,"description":"Wall-clock creation time for the earliest recorded reorg incident, in Unix milliseconds, when the upstream exposes it."},"latest_event_unix_millis":{"type":"integer","nullable":true,"minimum":0,"description":"Wall-clock creation time for the latest recorded reorg incident, in Unix milliseconds, when the upstream exposes it."},"oldest_chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Visible chain tip height at the earliest recorded reorg incident, when the upstream exposes it."},"latest_chain_tip_height":{"type":"integer","nullable":true,"minimum":0,"description":"Visible chain tip height at the latest recorded reorg incident, when the upstream exposes it."}},"required":["oldest_event_sequence","latest_event_sequence","oldest_event_unix_millis","latest_event_unix_millis","oldest_chain_tip_height","latest_chain_tip_height"],"description":"Bounds of Zinder's recorded reorg incident history, when the upstream exposes them. These bounds are not an automatic all-time chain-history claim."}},"required":["events","reorg_window","recorded_history"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"TransactionListResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"transactions":{"type":"array","items":{"type":"object","properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_time_unix_seconds":{"type":"integer"},"is_coinbase":{"type":"boolean"},"privacy_shape":{"type":"string","enum":["transparent_only","shielding","deshielding","shielded_only","mixed","unclassified"]},"size_bytes":{"type":"integer","minimum":0},"zip317_conventional_fee_zat":{"type":"string","nullable":true,"description":"ZIP-317 conventional-fee floor. Null on coinbase transactions (no inputs to charge a fee on). Decimal-string zatoshis when populated."},"paid_fee_zat":{"type":"string","nullable":true,"description":"Null whenever the transaction has any shielded input (privacy invariant) or prevout resolution is incomplete. Decimal-string zatoshis when populated."},"logical_action_count":{"type":"integer","minimum":0,"description":"ZIP-317 logical action count: inputs plus outputs, used for fee-floor accounting."},"component_counts":{"type":"object","properties":{"transparent_input_count":{"type":"integer","minimum":0},"transparent_output_count":{"type":"integer","minimum":0},"sapling_spend_count":{"type":"integer","minimum":0},"sapling_output_count":{"type":"integer","minimum":0},"orchard_action_count":{"type":"integer","minimum":0},"sprout_joinsplit_count":{"type":"integer","minimum":0},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components. Counts are public; amounts are not."}},"required":["transparent_input_count","transparent_output_count","sapling_spend_count","sapling_output_count","orchard_action_count","sprout_joinsplit_count","ironwood_action_count"]}},"required":["transaction_id","block_height","block_hash","block_time_unix_seconds","is_coinbase","privacy_shape","size_bytes","zip317_conventional_fee_zat","paid_fee_zat","logical_action_count","component_counts"]}},"transaction_window":{"type":"object","properties":{"row_count":{"type":"integer","minimum":0,"description":"Number of transaction rows returned in this response. Can be smaller than the requested limit at the end of the projection."},"has_older_transactions":{"type":"boolean","description":"True when `next_cursor` is populated and the caller can request an older transaction window."}},"required":["row_count","has_older_transactions"]},"next_cursor":{"type":"string","nullable":true,"description":"Opaque base64url cursor for the next older transaction window. Pass it back as the `cursor` query param; treat it as opaque and never construct or parse it."}},"required":["transactions","transaction_window","next_cursor"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"TransactionDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"status":{"type":"string","enum":["mined","pending","conflicting","invalidated","suppressed","not_found","unavailable"]},"privacy_shape":{"type":"string","enum":["transparent_only","shielding","deshielding","shielded_only","mixed","unclassified"]},"block_height":{"type":"integer","nullable":true,"minimum":0,"description":"Null while the transaction is in the mempool only; populated once mined."},"block_hash":{"type":"string","nullable":true,"pattern":"^[0-9a-f]{64}$","description":"Null while the transaction is in the mempool only."},"block_time_unix_seconds":{"type":"integer","nullable":true,"description":"Null while the transaction is in the mempool only."},"confirmations":{"type":"integer","nullable":true,"minimum":0,"description":"Null while the transaction is in the mempool only."},"first_seen_unix_seconds":{"type":"integer","nullable":true,"description":"Mempool observation time as Unix seconds. Null for transactions that arrived through a mined block and were never seen in mempool."},"size_bytes":{"type":"integer","nullable":true,"minimum":0,"description":"Wire-encoded transaction size. Null when size has not been computed (rare; usually mempool ingestion races)."},"expiry_height":{"type":"integer","nullable":true,"minimum":0,"description":"Zcash expiry height. Null when the transaction has no expiry (coinbase or `expiry_height == 0`)."},"is_coinbase":{"type":"boolean"},"zip317_conventional_fee_zat":{"type":"string","description":"ZIP-317 conventional-fee floor (a recommended minimum) computed from logical action counts. Decimal-string zatoshis. Always present."},"paid_fee_zat":{"type":"string","nullable":true,"description":"Null whenever the transaction has any shielded input (privacy invariant: revealing the paid fee would leak shielded value) or prevout resolution is incomplete. Decimal-string zatoshis when populated."},"prevout_resolution_status":{"type":"string","enum":["unspecified","resolved","partial","unavailable"],"description":"Closed enum: `unspecified | resolved | partial | unavailable`. Explains why per-input `value_zat` and `paid_fee_zat` are or are not populated."},"transparent_inputs":{"type":"array","items":{"type":"object","properties":{"input_index":{"type":"integer","minimum":0},"value_zat":{"type":"string","nullable":true,"description":"Null while the upstream prevout-resolution worker has not yet fetched the producing output. Decimal-string zatoshis when populated."}},"required":["input_index","value_zat"]}},"component_counts":{"type":"object","properties":{"transparent_input_count":{"type":"integer","minimum":0},"transparent_output_count":{"type":"integer","minimum":0},"sapling_spend_count":{"type":"integer","minimum":0},"sapling_output_count":{"type":"integer","minimum":0},"orchard_action_count":{"type":"integer","minimum":0},"sprout_joinsplit_count":{"type":"integer","minimum":0},"ironwood_action_count":{"type":"integer","minimum":0,"description":"Total NU6.3/Ironwood action components. Counts are public; amounts are not."}},"required":["transparent_input_count","transparent_output_count","sapling_spend_count","sapling_output_count","orchard_action_count","sprout_joinsplit_count","ironwood_action_count"]}},"required":["transaction_id","status","privacy_shape","block_height","block_hash","block_time_unix_seconds","confirmations","first_seen_unix_seconds","size_bytes","expiry_height","is_coinbase","zip317_conventional_fee_zat","paid_fee_zat","prevout_resolution_status","transparent_inputs","component_counts"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"TransactionWatchResponseData":{"type":"object","properties":{"watch_id":{"type":"string","minLength":1,"description":"Opaque identifier for the registered watch. Callers do not interpret the format; the server uses it to deduplicate retries."},"expires_at_unix_seconds":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Unix seconds at which the server will discard the watch if the threshold is not met."}},"required":["watch_id","expires_at_unix_seconds"]},"TransactionWatchResponse":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TransactionWatchResponseData"}},"required":["data"]},"TransactionWatchRequest":{"type":"object","properties":{"callback_url":{"type":"string","format":"uri","description":"Absolute https:// URL the server POSTs to when the confirmation threshold is reached. Loopback URLs are accepted for local development."},"target_confirmations_count":{"type":"integer","minimum":1,"maximum":100,"description":"Number of mined confirmations required before the callback fires. The server reads confirmations from the upstream Zinder explorer at each chain advance and dispatches the first time the threshold is met."},"expires_at_unix_seconds":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Unix seconds at which the watch expires if the threshold is not met. The server discards expired watches without firing the callback. The watch is fire-once; callers re-register on retry."},"hmac_secret_b64":{"type":"string","description":"Per-watch HMAC secret used to sign the callback body. Base64url, 32-byte minimum. The server retains the secret only for the lifetime of the watch and never logs it."}},"required":["callback_url","target_confirmations_count","expires_at_unix_seconds","hmac_secret_b64"]},"MempoolSummaryResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"transaction_count":{"type":"integer","minimum":0},"total_size_bytes":{"type":"integer","minimum":0},"oldest_entry_age_millis":{"type":"integer","minimum":0},"newest_entry_age_millis":{"type":"integer","minimum":0},"privacy_shape_distribution":{"type":"array","items":{"type":"object","properties":{"shape":{"type":"string","enum":["transparent_only","shielding","deshielding","shielded_only","mixed","unclassified"]},"count":{"type":"integer","minimum":0}},"required":["shape","count"]}}},"required":["transaction_count","total_size_bytes","oldest_entry_age_millis","newest_entry_age_millis","privacy_shape_distribution"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"MempoolActivityResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"first_seen_unix_millis":{"type":"integer","minimum":0,"description":"When the upstream first observed this transaction."},"size_bytes":{"type":"integer","minimum":0},"privacy_shape":{"type":"string","enum":["transparent_only","shielding","deshielding","shielded_only","mixed","unclassified"]},"zip317_conventional_fee_zat":{"type":"string","description":"ZIP-317 conventional-fee floor (a recommended minimum). Decimal-string zatoshis. Always present."},"paid_fee_zat":{"type":"string","nullable":true,"description":"Null whenever the transaction has any shielded input (privacy invariant) or prevout resolution is incomplete. Decimal-string zatoshis when populated."},"logical_action_count":{"type":"integer","minimum":0,"description":"ZIP-317 logical action count. Inputs (transparent inputs, sapling spends, orchard actions, sprout joinsplits) plus outputs, used for fee-floor accounting."}},"required":["transaction_id","first_seen_unix_millis","size_bytes","privacy_shape","zip317_conventional_fee_zat","paid_fee_zat","logical_action_count"]}}},"required":["entries"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"MempoolEventCountsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"window_seconds":{"type":"integer","minimum":0,"exclusiveMinimum":true},"added_count":{"type":"integer","minimum":0},"mined_count":{"type":"integer","minimum":0},"invalidated_count":{"type":"integer","minimum":0},"suppressed_count":{"type":"integer","minimum":0}},"required":["window_seconds","added_count","mined_count","invalidated_count","suppressed_count"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"SearchResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["block"]},"height":{"type":"number","description":"Best-chain block height (decimal). Always non-negative."},"hash":{"type":"string","description":"Lowercase block hash hex; matches the canonical form."}},"required":["kind","height","hash"],"description":"A block matched by height or 64-hex hash query."},{"type":"object","properties":{"kind":{"type":"string","enum":["chain_reorgs"]},"height":{"type":"integer","minimum":0,"description":"Block height to open in the recorded reorg-history height filter."}},"required":["kind","height"],"description":"Navigation candidate for recorded reorg incidents touching a numeric block-height query."},{"type":"object","properties":{"kind":{"type":"string","enum":["transaction"]},"transaction_id":{"type":"string"},"in_mempool":{"type":"boolean","description":"True when the transaction is currently in the mempool snapshot the explorer can see."},"mined_block_height":{"type":"number","nullable":true,"description":"Null while the transaction is in mempool only. Decimal height once mined."}},"required":["kind","transaction_id","in_mempool","mined_block_height"],"description":"A transaction identified by lowercase 64-hex txid."},{"type":"object","properties":{"kind":{"type":"string","enum":["transparent_address"]},"canonical_form":{"type":"string"},"is_p2pkh":{"type":"boolean"},"address_label":{"type":"object","nullable":true,"properties":{"label":{"type":"string","minLength":1},"kind":{"type":"string","enum":["exchange","mining_pool","foundation","service"]}},"required":["label","kind"],"description":"Curated known-entity label for this transparent address, or null when the address is not in the reviewed registry. See ADR 0018."}},"required":["kind","canonical_form","is_p2pkh","address_label"],"description":"Transparent address (`t1`/`t2`/`t3`/`tm` prefix). Public history is available at `/transparent-addresses/{address}`."},{"type":"object","properties":{"kind":{"type":"string","enum":["tex_address"]},"canonical_tex_form":{"type":"string"},"equivalent_p2pkh":{"type":"string"},"transparent_source_only":{"type":"boolean","description":"True when the TEX address only accepts transparent inputs (ZIP-320 constraint)."},"address_label":{"type":"object","nullable":true,"properties":{"label":{"type":"string","minLength":1},"kind":{"type":"string","enum":["exchange","mining_pool","foundation","service"]}},"required":["label","kind"],"description":"Curated known-entity label for this TEX address, or null when the address is not in the reviewed registry. See ADR 0018."}},"required":["kind","canonical_tex_form","equivalent_p2pkh","transparent_source_only","address_label"],"description":"ZIP-320 TEX address (`tex1`/`textest1` prefix). Carries the equivalent P2PKH form for callers that need it."},{"type":"object","properties":{"kind":{"type":"string","enum":["unified_address"]},"canonical_form":{"type":"string"},"network":{"type":"string"},"receiver_count":{"type":"number"}},"required":["kind","canonical_form","network","receiver_count"],"description":"ZIP-316 unified address (`u1`/`utest1` prefix). The explorer cannot derive shielded history; this entry only confirms parseability."},{"type":"object","properties":{"kind":{"type":"string","enum":["private_by_design"]},"reason":{"type":"string","enum":["shielded_address","shielded_address_mainnet","shielded_address_testnet","shielded_receiver_in_unified","unified_address_no_transparent_receiver","viewing_key"],"description":"Closed enum from `packages/zcash/src/privacy-reasons.ts`. Names which privacy-protected form was detected (shielded address, viewing key, transparent receiver of a unified address, etc.)."},"human_reason":{"type":"string","description":"Pre-rendered English copy suitable for surfacing to humans. Never echoes the canonical form."}},"required":["kind","reason","human_reason"],"description":"The query parsed as a privacy-protected form (shielded address, viewing key, unified address transparent receiver). No history page is opened; the canonical form is intentionally not echoed back."},{"type":"object","properties":{"kind":{"type":"string","enum":["payment_disclosure"]},"hint":{"type":"string"}},"required":["kind","hint"],"description":"The query looks like a ZIP-311 payment-disclosure payload. Use `/payment-disclosures/verify` to validate."},{"type":"object","properties":{"kind":{"type":"string","enum":["unclassified"]},"hint":{"type":"string"}},"required":["kind","hint"],"description":"The explorer could not classify the query. `hint` carries a short copy explaining why."}]}}},"required":["query","results"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"TransparentAddressDetailResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"address":{"type":"string"},"confirmed_zat":{"type":"string"},"unconfirmed_delta_zat":{"type":"string"},"utxos":{"type":"array","items":{"type":"object","properties":{"outpoint_txid":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"outpoint_index":{"type":"integer","minimum":0},"value_zat":{"type":"string"},"block_height":{"type":"integer","minimum":0},"block_hash":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical block hash in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."}},"required":["outpoint_txid","outpoint_index","value_zat","block_height","block_hash"]}},"address_label":{"type":"object","nullable":true,"properties":{"label":{"type":"string","minLength":1},"kind":{"type":"string","enum":["exchange","mining_pool","foundation","service"]}},"required":["label","kind"],"description":"Curated known-entity label for this transparent address, or null when the address is not in the reviewed registry. Closed `kind` vocabulary: `exchange | mining_pool | foundation | service`. See ADR 0018."}},"required":["address","confirmed_zat","unconfirmed_delta_zat","utxos","address_label"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"TransparentAddressActivityResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"address":{"type":"string"},"address_label":{"type":"object","nullable":true,"properties":{"label":{"type":"string","minLength":1},"kind":{"type":"string","enum":["exchange","mining_pool","foundation","service"]}},"required":["label","kind"],"description":"Curated known-entity label for the queried address, or null when the address is not in the reviewed registry. Carried once on the response wrapper, never per activity row. See ADR 0018."},"entries":{"type":"array","items":{"type":"object","properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"block_height":{"type":"integer","minimum":0},"block_time_unix_seconds":{"type":"integer"},"net_value_zat":{"type":"string","nullable":true,"description":"Net signed transparent value delta for this address (`outputs minus inputs`). Null when prevout resolution is incomplete (the upstream cannot price the inputs yet). Decimal-string zatoshis when populated."},"input_count":{"type":"integer","minimum":0},"output_count":{"type":"integer","minimum":0},"prevout_resolution_status":{"type":"string","enum":["unspecified","resolved","partial","unavailable"],"description":"Closed enum: `unspecified | resolved | partial | unavailable`. Explains why `net_value_zat` is or is not populated."}},"required":["transaction_id","block_height","block_time_unix_seconds","net_value_zat","input_count","output_count","prevout_resolution_status"]}}},"required":["address","address_label","entries"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"BroadcastResponse":{"type":"object","properties":{"data":{"oneOf":[{"type":"object","properties":{"outcome":{"type":"string","enum":["accepted"]},"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."}},"required":["outcome","transaction_id"],"description":"The upstream node accepted the broadcast and returned a transaction id."},{"type":"object","properties":{"outcome":{"type":"string","enum":["duplicate"]},"upstream_message":{"type":"string"}},"required":["outcome","upstream_message"],"description":"The upstream node already has this transaction (mempool or recently mined). Treated as success."},{"type":"object","properties":{"outcome":{"type":"string","enum":["invalid_encoding"]},"upstream_message":{"type":"string"}},"required":["outcome","upstream_message"],"description":"The hex bytes did not decode as a valid Zcash transaction. Resubmit with corrected encoding."},{"type":"object","properties":{"outcome":{"type":"string","enum":["rejected"]},"upstream_message":{"type":"string"}},"required":["outcome","upstream_message"],"description":"The upstream node refused the transaction. `upstream_message` carries the node's reason."},{"type":"object","properties":{"outcome":{"type":"string","enum":["unknown"]},"upstream_message":{"type":"string"}},"required":["outcome","upstream_message"],"description":"The upstream returned an outcome the explorer does not recognize. Inspect `upstream_message` for detail."}]}},"required":["data"]},"BroadcastRequest":{"type":"object","properties":{"raw_transaction_hex":{"type":"string","minLength":2,"maxLength":4000000,"pattern":"^[0-9a-fA-F]+$","description":"Redacted at the API boundary. Accepted as input; never returned in responses or written to structured logs (ADR 0016 + ADR 0005)."},"network":{"type":"string","enum":["mainnet","testnet","regtest"]}},"required":["raw_transaction_hex","network"]},"PaymentDisclosureVerifyResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["valid","invalid_signature","transaction_not_found","malformed","unspecified"],"description":"Closed enum: `valid | invalid_signature | transaction_not_found | malformed | unspecified`. Only `valid` carries `public_facts`."},"public_facts":{"type":"object","nullable":true,"properties":{"transaction_id":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"payment_id_hex":{"type":"string","description":"ZIP-311 payment identifier as lowercase hex. Public component of the disclosure; safe to surface."},"disclosed_value_zat":{"type":"string","description":"Value disclosed by the proof (the recipient amount). Decimal-string zatoshis."}},"required":["transaction_id","payment_id_hex","disclosed_value_zat"],"description":"Populated only when `verdict` is `valid`. Null otherwise."}},"required":["verdict","public_facts"]}},"required":["data"]},"PaymentDisclosureVerifyRequest":{"type":"object","properties":{"payment_disclosure_hex":{"type":"string","minLength":2,"maxLength":100000,"pattern":"^[0-9a-fA-F]+$","description":"Redacted at the API boundary. Accepted as input; never returned in responses or written to structured logs (ADR 0016 + ADR 0005)."}},"required":["payment_disclosure_hex"]},"MigrationOverviewResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"total_migrated_ironwood_zat":{"type":"string","description":"Sum of migrated Ironwood output amounts across the range, restricted to loose-predicate migrations (an Orchard outflow paired with an Ironwood inflow in the same transaction). Decimal-string zatoshis."},"migration_count":{"type":"integer","minimum":0,"description":"Number of migrations counted into the total."},"first_height":{"type":"integer","nullable":true,"minimum":0,"description":"First block height carrying a counted migration. Null when the range contains no counted migration."},"last_height":{"type":"integer","nullable":true,"minimum":0,"description":"Last block height carrying a counted migration. Null when the range contains no counted migration."},"orchard_outflow_zat":{"type":"string","description":"Net value that left the Orchard pool across the range. Decimal-string zatoshis."},"ironwood_inflow_zat":{"type":"string","description":"Net value that entered the Ironwood pool across the range. Decimal-string zatoshis. Compared against `orchard_outflow_zat`, this is the two-sided supply audit: the two should closely track each other net of fees."}},"required":["total_migrated_ironwood_zat","migration_count","first_height","last_height","orchard_outflow_zat","ironwood_inflow_zat"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"MigrationCohortsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"cohorts":{"type":"array","items":{"type":"object","properties":{"orchard_anchor":{"type":"string","description":"Shared Orchard anchor identifying the cohort, as 64 lowercase hex characters (32 bytes, canonical wire order)."},"member_count":{"type":"integer","minimum":0,"description":"Number of migrations in the cohort."},"total_migrated_zat":{"type":"string","description":"Sum of migrated Ironwood output amounts across the cohort. Decimal-string zatoshis."},"conformant_member_count":{"type":"integer","minimum":0,"description":"Members whose migration shape is conformant (genuinely privacy-preserving). Always <= member_count."}},"required":["orchard_anchor","member_count","total_migrated_zat","conformant_member_count"]},"description":"One entry per distinct Orchard anchor observed in the range."},"cohort_count":{"type":"integer","minimum":0},"avg_member_count":{"type":"integer","minimum":0,"description":"Average cohort member count. Zero when there are no cohorts."},"min_member_count":{"type":"integer","minimum":0,"description":"Smallest cohort member count. Zero when there are no cohorts."},"max_member_count":{"type":"integer","minimum":0,"description":"Largest cohort member count. Zero when there are no cohorts."}},"required":["cohorts","cohort_count","avg_member_count","min_member_count","max_member_count"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"MigrationDenominationsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"bins":{"type":"array","items":{"type":"object","properties":{"denomination_zat":{"type":"string","description":"The bucket's representative amount: the power-of-ten floor of its members' migrated Ironwood amount. Decimal-string zatoshis."},"count":{"type":"integer","minimum":0,"description":"Number of conformant migrations in this bucket."}},"required":["denomination_zat","count"]},"description":"One entry per populated power-of-ten bucket, ascending by `denomination_zat`."},"total_tx":{"type":"integer","minimum":0,"description":"Total conformant migrations binned across the range."}},"required":["bins","total_tx"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]},"NetworkUpgradeStatusResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"tip_height":{"type":"integer","minimum":0,"description":"Tip height the `active` flags are computed against."},"upgrades":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Upgrade name as reported by the node (for example \"Sapling\", \"NU5\", \"NU6.3\"), carried verbatim so unknown future upgrades still render."},"branch_id_hex":{"type":"string","description":"Consensus branch id in canonical 8-character lowercase hex."},"activation_height":{"type":"integer","minimum":0,"description":"Block height at which this upgrade's rules first apply."},"active":{"type":"boolean","description":"`true` when `activation_height <= tip_height`."}},"required":["name","branch_id_hex","activation_height","active"]},"description":"One entry per advertised upgrade, ascending by activation height."},"active_upgrade_name":{"type":"string","nullable":true,"description":"Name of the upgrade active at `tip_height`. Null when no advertised upgrade has activated yet."},"active_upgrade_branch_id_hex":{"type":"string","nullable":true,"description":"Branch id of the upgrade active at `tip_height`, 8-character lowercase hex. Null when no advertised upgrade has activated yet."}},"required":["tip_height","upgrades","active_upgrade_name","active_upgrade_branch_id_hex"]},"freshness":{"$ref":"#/components/schemas/ChainFreshness"},"capabilities":{"type":"array","items":{"type":"string","enum":["explorer.server_info_v1","explorer.block.summary_v1","explorer.block.detail_v1","explorer.chain.reorg_history_v1","explorer.transaction.detail_v1","explorer.transaction.recent_v1","explorer.transaction.fees_v1","explorer.transparent_address.activity_v1","explorer.search_v1","explorer.mempool.summary_v1","explorer.mempool.activity_v1","explorer.mempool.event_counts_v1","explorer.fee.summary_v1","explorer.value_pool.summary_v1","explorer.payment_disclosure.verify_v1","explorer.overview.snapshot_v1","explorer.network_upgrade.status_v1","explorer.migration.overview_v1","explorer.migration.cohorts_v1","explorer.migration.denominations_v1"]},"description":"Closed vocabulary; see `packages/zcash/src/capabilities.ts`. Sorted alphabetically. Gate every UI feature on this live array, never on hard-coded version strings."}},"required":["data","freshness","capabilities"]}},"parameters":{}},"paths":{"/healthz":{"get":{"summary":"Process-level liveness probe across every served network.","description":"Returns a single JSON object that names every network this API process serves and whether the upstream Zinder for each is reachable. The aggregate `status` is `healthy` when every network reports reachable; `degraded` when at least one is reachable; `unhealthy` when none are. Load balancers should probe this endpoint, not the per-network detail.","tags":["ops"],"responses":{"200":{"description":"Process health.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessHealthzResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/healthz":{"get":{"summary":"Per-network liveness probe with upstream capability set.","description":"Returns the status of one configured network plus the freshness envelope (capability set and tip lag). Use this for ops/monitoring; load balancers should probe `/healthz` instead.","tags":["ops"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"responses":{"200":{"description":"Per-network health.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkHealthzResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/network":{"get":{"summary":"Service identity, capability set, and operator state.","description":"Calls ExplorerQuery.ServerInfo on the upstream Zinder for the network in the path and returns a normalized envelope. Capabilities echo Zinder's advertised set; clients gate features on this list, not on hard-coded version strings. `data.operator` carries writer-phase and canonical-lag signals for the live-sync chip and the indexer-health panel; both are null when IngestControl is not configured for the network.","tags":["network"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"responses":{"200":{"description":"Server identity, capability set, and operator state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/overview":{"get":{"summary":"Coherent point-in-time bundle of every overview-dashboard field.","description":"Returns one `ExplorerFreshness` plus every field a consumer needs to render an overview dashboard: tip identity, mempool counts, sliding-window mempool event counts, fee summary, value pools, recent blocks, recent transactions. Every sub-field shares the same snapshot identity (`freshness.indexed_tip_hash`). Replaces the per-card fan-out across `/blocks`, `/transactions`, `/mempool`, `/fees/summary`, and `/value-pools` for callers that render a unified dashboard. Capability-gated on `explorer.overview.snapshot_v1`.","tags":["overview"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":16,"default":8,"description":"Number of `recent_blocks` entries to return, newest-first. Clamped server-side to [1, 16]."},"required":false,"name":"recent_blocks_limit","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":64,"default":32,"description":"Number of `recent_transactions` entries to return, newest-first. Clamped server-side to [1, 64]."},"required":false,"name":"recent_transactions_limit","in":"query"},{"schema":{"type":"integer","minimum":60,"maximum":3600,"default":300,"description":"Sliding-window size for `mempool_events`. Clamped server-side to [60, 3600] seconds."},"required":false,"name":"mempool_window_seconds","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":256,"default":50,"description":"Lookback for `fee_summary`, in blocks ending at the snapshot's tip. Clamped server-side to [1, 256]."},"required":false,"name":"fee_summary_block_count","in":"query"}],"responses":{"200":{"description":"Overview snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OverviewSnapshotResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/value-pools":{"get":{"summary":"Chain value pool totals at the upstream tip.","description":"Cumulative per-pool zatoshi totals reported by the upstream node. Capability-gated on `explorer.value_pool.summary_v1`.","tags":["value-pools"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"responses":{"200":{"description":"Value pool totals.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValuePoolSummaryResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/fees/summary":{"get":{"summary":"ZIP-317 conventional fee floors over recent blocks.","description":"Aggregates ZIP-317 conventional fees across the most recent blocks. Capability-gated on `explorer.fee.summary_v1`. Values are floors, not miner-collected fees.","tags":["fees"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":50},"required":false,"name":"lookback","in":"query"}],"responses":{"200":{"description":"Recent fee summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeeSummaryResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/blocks":{"get":{"summary":"Recent block summaries.","description":"Capability-gated on `explorer.block.summary_v1`. Returns 503 with `capability_unavailable` when the upstream block-summary derive consumer has not caught up.","tags":["blocks"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque pagination cursor from a previous response's `next_cursor`. Omit for the newest page. Malformed cursors return 422 `invalid_argument`."},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"description":"Optional newest block height to anchor the returned window. Distinct from `cursor`; use it for jump-to-height flows. Values above the current tip are clamped to the tip."},"required":false,"name":"from_height","in":"query"}],"responses":{"200":{"description":"Recent blocks.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockListResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/blocks/{selector}":{"get":{"summary":"Block detail by height or hash.","description":"The `selector` is a decimal block height or a 64-character lowercase block hash. Capability-gated on `explorer.block.detail_v1`.","tags":["blocks"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string","minLength":1},"required":true,"name":"selector","in":"path"}],"responses":{"200":{"description":"Block detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockDetailResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/reorgs":{"get":{"summary":"Recorded chain reorg history.","description":"Capability-gated on `explorer.chain.reorg_history_v1`. Returns recorded Zinder `ChainReorged` incidents. A new durable incident projection backfills retained chain events on first deployment and preserves future incidents beyond chain-event retention.","tags":["reorgs"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"description":"Maximum visible reorg incident rows to return."},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"description":"Newest-first row offset into the matching recorded incidents."},"required":false,"name":"offset","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"description":"Optional block height filter. A reorg matches when the height appears in either the invalidated segment or canonical replacement segment."},"required":false,"name":"height","in":"query"}],"responses":{"200":{"description":"Recorded chain reorg history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainReorgHistoryResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/transactions":{"get":{"summary":"Newest-first mined transaction list.","description":"Reads the upstream `RecentTransactions` projection in one streaming round trip. Omitting `cursor` starts at the newest mined transactions; passing `next_cursor` continues to older mined transactions. Each entry carries privacy shape, component counts, size, ZIP-317 conventional fee floor, and the actual paid fee only when prevout resolution is complete and the transaction has no shielded inputs. Capability-gated on `explorer.transaction.recent_v1`.","tags":["transactions"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":64,"default":20},"required":false,"name":"limit","in":"query"},{"schema":{"type":"string","description":"Opaque pagination cursor from a previous response's `next_cursor`. Omit for the newest transaction window. Malformed cursors return 422 `invalid_argument`."},"required":false,"name":"cursor","in":"query"}],"responses":{"200":{"description":"Newest-first mined transactions.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/transactions/{transaction_id}":{"get":{"summary":"Public facts about a transaction.","description":"Returns the canonical transaction facts, location (mined or mempool), confirmations, component counts, privacy shape, and ZIP 317 conventional fee. Shielded counterparties are never returned. Raw transaction bytes are NOT part of any typed read; the explorer plane is fact-first per the upstream Zinder model.","tags":["transactions"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"required":true,"description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`.","name":"transaction_id","in":"path"}],"responses":{"200":{"description":"Transaction facts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionDetailResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/transactions/{transaction_id}/watch":{"post":{"summary":"Register a confirmation-threshold watch for a single txid.","description":"Subscribes the caller to a single mined-confirmation event for the txid. The server signs the callback payload with HMAC-SHA256 using the caller-supplied secret and dispatches once when the threshold is reached. The watch is fire-once and expires at the supplied deadline if the threshold is not met.","tags":["transactions"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string","pattern":"^[0-9a-f]{64}$","description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`."},"required":true,"description":"Canonical transaction id in RPC byte order (64 lowercase hex characters). Reference: Zcash protocol spec term `\\rpcByteOrder`.","name":"transaction_id","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionWatchRequest"}}}},"responses":{"200":{"description":"Watch accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionWatchResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/mempool":{"get":{"summary":"Mempool snapshot summary.","description":"Aggregate counters across the current mempool snapshot. Capability-gated on `explorer.mempool.summary_v1`. Use the WebSocket stream at `/api/v1/stream` for live updates.","tags":["mempool"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"responses":{"200":{"description":"Snapshot summary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MempoolSummaryResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/mempool/activity":{"get":{"summary":"Recent mempool entries.","description":"Newest-first mempool entries with privacy shape, ZIP-317 conventional fee floor, and paid fee when prevout resolution is complete and the transaction has no shielded inputs. Capability-gated on `explorer.mempool.activity_v1`. Mempool state is transient; consumers should expect churn.","tags":["mempool"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Mempool entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MempoolActivityResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/mempool/events":{"get":{"summary":"Rolling counts of mempool lifecycle events.","description":"Returns added / mined / invalidated / suppressed counts observed by the upstream derive consumer over the last `window_seconds` (default 300; clamped to [60, 3600] by the server). Capability-gated on `explorer.mempool.event_counts_v1`. The effective window after server clamping is echoed in the response. For per-event delivery in real time use the WebSocket stream at `/api/v1/stream`.","tags":["mempool"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":60,"maximum":3600,"default":300},"required":false,"name":"window_seconds","in":"query"}],"responses":{"200":{"description":"Mempool event counts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MempoolEventCountsResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/search":{"get":{"summary":"Typed search across blocks, transactions, and address candidates.","description":"Returns one or more typed result candidates for the named network. Shielded addresses and viewing keys always return `private_by_design`; this endpoint never opens a shielded history page.","tags":["search"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string","minLength":1,"maxLength":4096},"required":true,"name":"q","in":"query"}],"responses":{"200":{"description":"Result candidates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/transparent-addresses/{address}":{"get":{"summary":"Transparent address balance and UTXOs.","description":"Returns the confirmed balance, signed mempool delta, and unspent outputs for a transparent address. Balance and unspent outputs are served by the always-on wallet plane.","tags":["transparent-addresses"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string"},"required":true,"name":"address","in":"path"}],"responses":{"200":{"description":"Address detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransparentAddressDetailResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/transparent-addresses/{address}/activity":{"get":{"summary":"Confirmed transparent-address activity feed.","description":"Returns newest-first confirmed activity rows for a transparent address. Each row carries the signed net value (when prevouts resolve), per-row input and output counts, and a `prevout_resolution_status` chip that explains why `net_value_zat` is or is not set. Mempool activity is served separately via `/mempool/activity`. Capability-gated on `explorer.transparent_address.activity_v1`.","tags":["transparent-addresses"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"string"},"required":true,"name":"address","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Activity entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransparentAddressActivityResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/broadcast":{"post":{"summary":"Broadcast a raw transaction to the upstream node.","description":"Accepts a hex-encoded raw transaction and forwards it to the upstream node. Returns a typed outcome (`accepted`, `duplicate`, `invalid_encoding`, `rejected`, or `unknown`). The raw hex is never logged or stored.","tags":["broadcast"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastRequest"}}}},"responses":{"200":{"description":"Broadcast outcome.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BroadcastResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/payment-disclosures/verify":{"post":{"summary":"Verify a ZIP-311 payment disclosure.","description":"Forwards the hex-encoded disclosure bytes to the upstream verifier for the named network. Capability-gated on `explorer.payment_disclosure.verify_v1`; returns `503 capability_unavailable` when the upstream Zinder does not advertise the verifier. Disclosure payloads are never logged or persisted at the API layer.","tags":["payment-disclosures"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDisclosureVerifyRequest"}}}},"responses":{"200":{"description":"Verification verdict.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDisclosureVerifyResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/migrations/overview":{"get":{"summary":"Aggregate Orchard-to-Ironwood migration totals.","description":"Aggregate migration totals and the two-sided Orchard/Ironwood pool audit over a block range. Omit both bounds for full chain history. Capability-gated on `explorer.migration.overview_v1`.","tags":["migrations"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","nullable":true,"minimum":0},"required":false,"name":"start_height","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0},"required":false,"name":"end_height","in":"query"}],"responses":{"200":{"description":"Migration overview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationOverviewResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/migrations/cohorts":{"get":{"summary":"Migrations grouped by shared privacy cohort.","description":"Groups migrations in the inclusive block range by shared Orchard anchor, reporting per-cohort size, migrated value, and conformant-member share. The range may not exceed 4096 blocks. Capability-gated on `explorer.migration.cohorts_v1`.","tags":["migrations"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":4096,"default":1000},"required":false,"name":"lookback","in":"query"}],"responses":{"200":{"description":"Migration cohorts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationCohortsResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/migrations/denominations":{"get":{"summary":"Migrated-amount denomination distribution.","description":"Bins conformant migrations in the inclusive block range by the power-of-ten floor of their migrated Ironwood amount. The range may not exceed 4096 blocks. Capability-gated on `explorer.migration.denominations_v1`.","tags":["migrations"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":4096,"default":1000},"required":false,"name":"lookback","in":"query"}],"responses":{"200":{"description":"Migration denomination bins.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationDenominationsResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/{network}/network-upgrade-status":{"get":{"summary":"Network-upgrade activation table.","description":"The node-discovered network-upgrade activation table and which upgrade is active at the current tip. Capability-gated on `explorer.network_upgrade.status_v1`.","tags":["network-upgrade-status"],"parameters":[{"schema":{"type":"string","enum":["mainnet","testnet","regtest"]},"required":true,"name":"network","in":"path"}],"responses":{"200":{"description":"Network upgrade status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkUpgradeStatusResponse"}}}},"400":{"description":"Request rejected by the upstream node.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Resource not found in the indexed state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"Pagination cursor expired; restart from the head.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"Request did not validate.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate limit exceeded.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"500":{"description":"Internal failure reaching upstream.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Upstream Zinder unavailable or capability missing.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}}}