{"ok":true,"schema_version":1,"data":{"artifact_contracts":[{"contract_version":"2026-07-03.2","id":"contracts","path":"/metagraph/contracts.json","retirement":null,"schema_ref":"#/components/schemas/ContractsArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"providers","path":"/metagraph/providers.json","retirement":null,"schema_ref":"#/components/schemas/ProvidersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"provider-detail","path":"/metagraph/providers/{slug}.json","retirement":null,"schema_ref":"#/components/schemas/ProviderArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"entities","path":"/metagraph/entities.json","retirement":null,"schema_ref":"#/components/schemas/EntitiesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"provider-endpoints","path":"/metagraph/providers/{slug}/endpoints.json","retirement":null,"schema_ref":"#/components/schemas/ProviderEndpointsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"api-index","path":"/metagraph/api-index.json","retirement":null,"schema_ref":"#/components/schemas/ApiIndexArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"openapi","path":"/metagraph/openapi.json","retirement":null,"schema_ref":"#/components/schemas/OpenApiArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"type-definitions","path":"/metagraph/types.d.ts","retirement":null,"schema_ref":null,"status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"changelog","path":"/metagraph/changelog.json","retirement":null,"schema_ref":"#/components/schemas/ChangelogArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnets","path":"/metagraph/subnets.json","retirement":null,"schema_ref":"#/components/schemas/SubnetsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"metagraph-latest","path":"/metagraph/metagraph/latest.json","retirement":null,"schema_ref":"#/components/schemas/SubnetsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-detail","path":"/metagraph/subnets/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-overview","path":"/metagraph/overview/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetOverviewArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"profiles","path":"/metagraph/profiles.json","retirement":null,"schema_ref":"#/components/schemas/SubnetProfilesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"profile-detail","path":"/metagraph/profiles/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetProfileArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"surfaces","path":"/metagraph/surfaces.json","retirement":null,"schema_ref":"#/components/schemas/SurfacesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"surface-aliases","path":"/metagraph/surface-aliases.json","retirement":null,"schema_ref":"#/components/schemas/SurfaceAliasesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"surfaces-subnet","path":"/metagraph/surfaces/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetSurfacesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"endpoints","path":"/metagraph/endpoints.json","retirement":null,"schema_ref":"#/components/schemas/EndpointsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"endpoints-subnet","path":"/metagraph/endpoints/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetEndpointsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"candidates","path":"/metagraph/candidates.json","retirement":null,"schema_ref":"#/components/schemas/CandidatesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"candidates-subnet","path":"/metagraph/candidates/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetCandidatesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-queue","path":"/metagraph/review-queue.json","retirement":null,"schema_ref":"#/components/schemas/ReviewQueueArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"search","path":"/metagraph/search.json","retirement":null,"schema_ref":"#/components/schemas/SearchArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"search-index","path":"/metagraph/search-index.json","retirement":null,"schema_ref":"#/components/schemas/SearchIndexArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"coverage","path":"/metagraph/coverage.json","retirement":null,"schema_ref":"#/components/schemas/CoverageArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"coverage-depth","path":"/metagraph/coverage-depth.json","retirement":null,"schema_ref":"#/components/schemas/CoverageDepthArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"economics","path":"/metagraph/economics.json","retirement":null,"schema_ref":"#/components/schemas/EconomicsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"ask","path":"/metagraph/ai/ask.json","retirement":null,"schema_ref":"#/components/schemas/AskArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"search-semantic","path":"/metagraph/ai/search-semantic.json","retirement":null,"schema_ref":"#/components/schemas/SemanticSearchArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"webhook-subscription","path":"/metagraph/webhooks/subscriptions/{id}.json","retirement":null,"schema_ref":"#/components/schemas/WebhookSubscriptionArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"alert-trigger","path":"/metagraph/alerts/triggers/{id}.json","retirement":null,"schema_ref":"#/components/schemas/AlertTriggerArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"surface-verify","path":"/metagraph/surfaces/{surface_id}/verify.json","retirement":null,"schema_ref":"#/components/schemas/SurfaceVerifyArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"emission-pipeline","path":"/metagraph/chain/emission-pipeline.json","retirement":null,"schema_ref":"#/components/schemas/EmissionPipelineArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"deregistration-ranking","path":"/metagraph/chain/deregistration-ranking.json","retirement":null,"schema_ref":"#/components/schemas/SubnetDeregistrationRankingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"economics-trends","path":"/metagraph/economics/trends.json","retirement":null,"schema_ref":"#/components/schemas/EconomicsTrendsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"registry-summary","path":"/metagraph/registry-summary.json","retirement":null,"schema_ref":"#/components/schemas/RegistrySummaryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"lineage","path":"/metagraph/lineage.json","retirement":null,"schema_ref":"#/components/schemas/LineageArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"fixtures-index","path":"/metagraph/fixtures.json","retirement":null,"schema_ref":"#/components/schemas/FixturesIndexArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"agent-resources","path":"/metagraph/agent-resources.json","retirement":null,"schema_ref":"#/components/schemas/AgentResourcesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"fixture-detail","path":"/metagraph/fixtures/{surface_id}.json","retirement":null,"schema_ref":"#/components/schemas/FixtureArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"curation","path":"/metagraph/curation.json","retirement":null,"schema_ref":"#/components/schemas/CurationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"gaps","path":"/metagraph/gaps.json","retirement":null,"schema_ref":"#/components/schemas/GapsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"verification","path":"/metagraph/verification/latest.json","retirement":null,"schema_ref":"#/components/schemas/VerificationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"verification-subnet","path":"/metagraph/verification/subnets/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetVerificationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"freshness","path":"/metagraph/freshness.json","retirement":null,"schema_ref":"#/components/schemas/FreshnessArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"source-health","path":"/metagraph/source-health.json","retirement":null,"schema_ref":"#/components/schemas/SourceHealthArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"source-snapshots","path":"/metagraph/source-snapshots.json","retirement":null,"schema_ref":"#/components/schemas/SourceSnapshotsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"evidence-ledger","path":"/metagraph/evidence-ledger.json","retirement":null,"schema_ref":"#/components/schemas/EvidenceLedgerArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"evidence-subnet","path":"/metagraph/evidence/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetEvidenceArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-latest","path":"/metagraph/health/latest.json","retirement":{"code":"retired_artifact","http_status":410,"message":"Current-state health artifacts are retired; use the live API health endpoints instead."},"schema_ref":"#/components/schemas/HealthLatestArtifact","status":"retired","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-summary","path":"/metagraph/health/summary.json","retirement":{"code":"retired_artifact","http_status":410,"message":"Current-state health artifacts are retired; use the live API health endpoints instead."},"schema_ref":"#/components/schemas/HealthSummaryArtifact","status":"retired","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-history","path":"/metagraph/health/history/{date}.json","retirement":null,"schema_ref":"#/components/schemas/HealthHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-subnet","path":"/metagraph/health/subnets/{netuid}.json","retirement":{"code":"retired_artifact","http_status":410,"message":"Current-state health artifacts are retired; use the live API health endpoints instead."},"schema_ref":"#/components/schemas/HealthSubnetArtifact","status":"retired","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-badge","path":"/metagraph/health/badges/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/HealthBadgeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-trends","path":"/metagraph/health/trends/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/HealthTrendsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-trends-bulk","path":"/metagraph/health/trends.json","retirement":null,"schema_ref":"#/components/schemas/BulkHealthTrendsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-percentiles","path":"/metagraph/health/percentiles/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/HealthPercentilesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"health-incidents","path":"/metagraph/health/incidents/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/HealthIncidentsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-trajectory","path":"/metagraph/subnets/{netuid}/trajectory.json","retirement":null,"schema_ref":"#/components/schemas/SubnetTrajectoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-concentration","path":"/metagraph/subnets/{netuid}/concentration.json","retirement":null,"schema_ref":"#/components/schemas/SubnetConcentrationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-performance","path":"/metagraph/subnets/{netuid}/performance.json","retirement":null,"schema_ref":"#/components/schemas/SubnetPerformanceArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-idle-stake","path":"/metagraph/subnets/{netuid}/idle-stake.json","retirement":null,"schema_ref":"#/components/schemas/SubnetIdleStakeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-performance-history","path":"/metagraph/subnets/{netuid}/performance/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetPerformanceHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-concentration-history","path":"/metagraph/subnets/{netuid}/concentration/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetConcentrationHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-turnover","path":"/metagraph/subnets/{netuid}/turnover.json","retirement":null,"schema_ref":"#/components/schemas/SubnetTurnoverArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-weights","path":"/metagraph/subnets/{netuid}/weights.json","retirement":null,"schema_ref":"#/components/schemas/SubnetWeightsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-weight-setters","path":"/metagraph/subnets/{netuid}/weights/setters.json","retirement":null,"schema_ref":"#/components/schemas/SubnetWeightSettersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-serving","path":"/metagraph/subnets/{netuid}/serving.json","retirement":null,"schema_ref":"#/components/schemas/SubnetServingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-prometheus","path":"/metagraph/subnets/{netuid}/prometheus.json","retirement":null,"schema_ref":"#/components/schemas/SubnetPrometheusArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-stake-transfers","path":"/metagraph/subnets/{netuid}/stake-transfers.json","retirement":null,"schema_ref":"#/components/schemas/SubnetStakeTransfersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-stake-moves","path":"/metagraph/subnets/{netuid}/stake-moves.json","retirement":null,"schema_ref":"#/components/schemas/SubnetStakeMovesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-registrations","path":"/metagraph/subnets/{netuid}/registrations.json","retirement":null,"schema_ref":"#/components/schemas/SubnetRegistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-axon-removals","path":"/metagraph/subnets/{netuid}/axon-removals.json","retirement":null,"schema_ref":"#/components/schemas/SubnetAxonRemovalsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-deregistrations","path":"/metagraph/subnets/{netuid}/deregistrations.json","retirement":null,"schema_ref":"#/components/schemas/SubnetDeregistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-stake-flow","path":"/metagraph/subnets/{netuid}/stake-flow.json","retirement":null,"schema_ref":"#/components/schemas/SubnetStakeFlowArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-stake-quote","path":"/metagraph/subnets/{netuid}/stake-quote.json","retirement":null,"schema_ref":"#/components/schemas/SubnetStakeQuoteArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-validator-economics","path":"/metagraph/subnets/{netuid}/validator-economics.json","retirement":null,"schema_ref":"#/components/schemas/SubnetValidatorEconomicsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-validator-economics-history","path":"/metagraph/subnets/{netuid}/validator-economics-history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetValidatorEconomicsHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"validator-economics-ranking","path":"/metagraph/validators/economics.json","retirement":null,"schema_ref":"#/components/schemas/ValidatorEconomicsRankingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-alpha-volume","path":"/metagraph/subnets/{netuid}/volume.json","retirement":null,"schema_ref":"#/components/schemas/SubnetAlphaVolumeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-ohlc","path":"/metagraph/subnets/{netuid}/ohlc.json","retirement":null,"schema_ref":"#/components/schemas/SubnetOhlcArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-movers","path":"/metagraph/subnets/movers.json","retirement":null,"schema_ref":"#/components/schemas/SubnetMoversArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"global-validators","path":"/metagraph/validators.json","retirement":null,"schema_ref":"#/components/schemas/GlobalValidatorsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"validator-operator-directory","path":"/metagraph/validators/operators.json","retirement":null,"schema_ref":"#/components/schemas/ValidatorOperatorDirectoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"accounts-list","path":"/metagraph/accounts.json","retirement":null,"schema_ref":"#/components/schemas/AccountsListArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-holder-directory","path":"/metagraph/accounts/directory.json","retirement":null,"schema_ref":"#/components/schemas/AccountHolderDirectoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"top-holders","path":"/metagraph/top-holders.json","retirement":null,"schema_ref":"#/components/schemas/TopHoldersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"validator-detail","path":"/metagraph/validators/{hotkey}.json","retirement":null,"schema_ref":"#/components/schemas/ValidatorDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"validator-nominators","path":"/metagraph/validators/{hotkey}/nominators.json","retirement":null,"schema_ref":"#/components/schemas/ValidatorNominatorsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"validator-history","path":"/metagraph/validators/{hotkey}/history.json","retirement":null,"schema_ref":"#/components/schemas/ValidatorHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-metagraph","path":"/metagraph/subnets/{netuid}/metagraph.json","retirement":null,"schema_ref":"#/components/schemas/SubnetMetagraphArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-neuron","path":"/metagraph/subnets/{netuid}/neurons/{uid}.json","retirement":null,"schema_ref":"#/components/schemas/NeuronDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-hyperparameters","path":"/metagraph/subnets/{netuid}/hyperparameters.json","retirement":null,"schema_ref":"#/components/schemas/SubnetHyperparametersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-hyperparameters-history","path":"/metagraph/subnets/{netuid}/hyperparameters/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetHyperparamsHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-lifecycle","path":"/metagraph/subnets/{netuid}/lifecycle.json","retirement":null,"schema_ref":"#/components/schemas/SubnetLifecycleArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-subnet-lifecycle","path":"/metagraph/chain/subnet-lifecycle.json","retirement":null,"schema_ref":"#/components/schemas/ChainSubnetLifecycleArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-validators","path":"/metagraph/subnets/{netuid}/validators.json","retirement":null,"schema_ref":"#/components/schemas/SubnetValidatorsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-yield","path":"/metagraph/subnets/{netuid}/yield.json","retirement":null,"schema_ref":"#/components/schemas/SubnetYieldArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-yield-history","path":"/metagraph/subnets/{netuid}/yield/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetYieldHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-emission-split-history","path":"/metagraph/subnets/{netuid}/emission-split/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetEmissionSplitHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-miner-fairness","path":"/metagraph/subnets/{netuid}/miner-fairness.json","retirement":null,"schema_ref":"#/components/schemas/SubnetMinerFairnessArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-cost-to-participate","path":"/metagraph/subnets/{netuid}/cost-to-participate.json","retirement":null,"schema_ref":"#/components/schemas/SubnetCostToParticipateArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-treasury","path":"/metagraph/subnets/{netuid}/treasury.json","retirement":null,"schema_ref":"#/components/schemas/SubnetTreasuryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-owner-capture","path":"/metagraph/subnets/{netuid}/owner-capture.json","retirement":null,"schema_ref":"#/components/schemas/SubnetOwnerCaptureArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-events","path":"/metagraph/subnets/{netuid}/events.json","retirement":null,"schema_ref":"#/components/schemas/SubnetEventsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-event-summary","path":"/metagraph/subnets/{netuid}/event-summary.json","retirement":null,"schema_ref":"#/components/schemas/SubnetEventSummaryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-neuron-history","path":"/metagraph/subnets/{netuid}/neurons/{uid}/history.json","retirement":null,"schema_ref":"#/components/schemas/NeuronHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-history","path":"/metagraph/subnets/{netuid}/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-identity-history","path":"/metagraph/subnets/{netuid}/identity-history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetIdentityHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-summary","path":"/metagraph/accounts/{ss58}.json","retirement":null,"schema_ref":"#/components/schemas/AccountSummaryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-entities","path":"/metagraph/accounts/{ss58}/entities.json","retirement":null,"schema_ref":"#/components/schemas/AccountEntitiesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-events","path":"/metagraph/accounts/{ss58}/events.json","retirement":null,"schema_ref":"#/components/schemas/AccountEventsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-history","path":"/metagraph/accounts/{ss58}/history.json","retirement":null,"schema_ref":"#/components/schemas/AccountHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-extrinsics","path":"/metagraph/accounts/{ss58}/extrinsics.json","retirement":null,"schema_ref":"#/components/schemas/AccountExtrinsicsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-transfers","path":"/metagraph/accounts/{ss58}/transfers.json","retirement":null,"schema_ref":"#/components/schemas/AccountTransfersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-counterparties","path":"/metagraph/accounts/{ss58}/counterparties.json","retirement":null,"schema_ref":"#/components/schemas/AccountCounterpartiesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-stake-flow","path":"/metagraph/accounts/{ss58}/stake-flow.json","retirement":null,"schema_ref":"#/components/schemas/AccountStakeFlowArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-stake-moves","path":"/metagraph/accounts/{ss58}/stake-moves.json","retirement":null,"schema_ref":"#/components/schemas/AccountStakeMovesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-deregistrations","path":"/metagraph/accounts/{ss58}/deregistrations.json","retirement":null,"schema_ref":"#/components/schemas/AccountDeregistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-prometheus","path":"/metagraph/accounts/{ss58}/prometheus.json","retirement":null,"schema_ref":"#/components/schemas/AccountPrometheusArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-axon-removals","path":"/metagraph/accounts/{ss58}/axon-removals.json","retirement":null,"schema_ref":"#/components/schemas/AccountAxonRemovalsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-serving","path":"/metagraph/accounts/{ss58}/serving.json","retirement":null,"schema_ref":"#/components/schemas/AccountServingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-weight-setters","path":"/metagraph/accounts/{ss58}/weight-setters.json","retirement":null,"schema_ref":"#/components/schemas/AccountWeightSettersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-registrations","path":"/metagraph/accounts/{ss58}/registrations.json","retirement":null,"schema_ref":"#/components/schemas/AccountRegistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-subnets","path":"/metagraph/accounts/{ss58}/subnets.json","retirement":null,"schema_ref":"#/components/schemas/AccountSubnetsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-portfolio","path":"/metagraph/accounts/{ss58}/portfolio.json","retirement":null,"schema_ref":"#/components/schemas/AccountPortfolioArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-positions","path":"/metagraph/accounts/{ss58}/positions.json","retirement":null,"schema_ref":"#/components/schemas/AccountPositionsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-subnet-position-history","path":"/metagraph/accounts/{ss58}/subnets/{netuid}/history.json","retirement":null,"schema_ref":"#/components/schemas/AccountPositionHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-identity","path":"/metagraph/accounts/{ss58}/identity.json","retirement":null,"schema_ref":"#/components/schemas/AccountIdentityArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-identity-history","path":"/metagraph/accounts/{ss58}/identity-history.json","retirement":null,"schema_ref":"#/components/schemas/AccountIdentityHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-balance","path":"/metagraph/accounts/{ss58}/balance.json","retirement":null,"schema_ref":"#/components/schemas/AccountBalanceArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-root-claim","path":"/metagraph/accounts/{ss58}/root-claim.json","retirement":null,"schema_ref":"#/components/schemas/AccountRootClaimArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-children","path":"/metagraph/accounts/{ss58}/children.json","retirement":null,"schema_ref":"#/components/schemas/AccountChildrenArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"account-parents","path":"/metagraph/accounts/{ss58}/parents.json","retirement":null,"schema_ref":"#/components/schemas/AccountParentsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"evm-address-mapping","path":"/metagraph/evm/address/{h160}.json","retirement":null,"schema_ref":"#/components/schemas/EvmAddressMappingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"sudo-key","path":"/metagraph/sudo/key.json","retirement":null,"schema_ref":"#/components/schemas/SudoKeyArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"network-parameters","path":"/metagraph/network/parameters.json","retirement":null,"schema_ref":"#/components/schemas/NetworkParametersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"randomness","path":"/metagraph/network/randomness.json","retirement":null,"schema_ref":"#/components/schemas/RandomnessArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-revenue","path":"/metagraph/subnets/{netuid}/revenue.json","retirement":null,"schema_ref":"#/components/schemas/SubnetRevenueArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-wallets","path":"/metagraph/subnets/{netuid}/wallets.json","retirement":null,"schema_ref":"#/components/schemas/SubnetWalletsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-owner-cut","path":"/metagraph/subnets/{netuid}/owner-cut.json","retirement":null,"schema_ref":"#/components/schemas/SubnetOwnerCutArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-revenue-coverage","path":"/metagraph/chain/revenue-coverage.json","retirement":null,"schema_ref":"#/components/schemas/ChainRevenueCoverageArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-recycled","path":"/metagraph/subnets/{netuid}/recycled.json","retirement":null,"schema_ref":"#/components/schemas/SubnetRecycledArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-burn","path":"/metagraph/subnets/{netuid}/burn.json","retirement":null,"schema_ref":"#/components/schemas/SubnetBurnArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-burn-history","path":"/metagraph/subnets/{netuid}/burn-history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetBurnHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-holders","path":"/metagraph/subnets/{netuid}/holders.json","retirement":null,"schema_ref":"#/components/schemas/SubnetHoldersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"tao-usd","path":"/metagraph/network/tao-usd.json","retirement":null,"schema_ref":"#/components/schemas/TaoUsdArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-surface-history","path":"/metagraph/subnets/{netuid}/surface-history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetSurfaceHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"emission-gate-changes","path":"/metagraph/chain/governance/emission-changes.json","retirement":null,"schema_ref":"#/components/schemas/EmissionGateChangesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-holders","path":"/metagraph/chain/holders.json","retirement":null,"schema_ref":"#/components/schemas/ChainHoldersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"failure-reasons","path":"/metagraph/health/failure-reasons.json","retirement":null,"schema_ref":"#/components/schemas/FailureReasonsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"indexer-lag","path":"/metagraph/chain/indexer-lag.json","retirement":null,"schema_ref":"#/components/schemas/IndexerLagArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"search-resolve","path":"/metagraph/search/resolve.json","retirement":null,"schema_ref":"#/components/schemas/SearchResolveArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-concentration-history","path":"/metagraph/chain/concentration/history.json","retirement":null,"schema_ref":"#/components/schemas/ChainConcentrationHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-emission-pipeline-history","path":"/metagraph/subnets/{netuid}/emission-pipeline/history.json","retirement":null,"schema_ref":"#/components/schemas/PipelineHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-deregistration-ranking-history","path":"/metagraph/subnets/{netuid}/deregistration-ranking/history.json","retirement":null,"schema_ref":"#/components/schemas/DeregistrationHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-burn","path":"/metagraph/chain/burn.json","retirement":null,"schema_ref":"#/components/schemas/ChainBurnArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-ownership-history","path":"/metagraph/subnets/{netuid}/ownership-history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetOwnershipHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-conviction","path":"/metagraph/subnets/{netuid}/conviction.json","retirement":null,"schema_ref":"#/components/schemas/SubnetConvictionArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-lease","path":"/metagraph/subnets/{netuid}/lease.json","retirement":null,"schema_ref":"#/components/schemas/SubnetLeaseArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"crowdloans","path":"/metagraph/crowdloans.json","retirement":null,"schema_ref":"#/components/schemas/CrowdloansArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"crowdloan-detail","path":"/metagraph/crowdloans/{crowdloan_id}.json","retirement":null,"schema_ref":"#/components/schemas/CrowdloanDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-lease-history","path":"/metagraph/subnets/{netuid}/lease/history.json","retirement":null,"schema_ref":"#/components/schemas/SubnetLeaseHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"blocks-feed","path":"/metagraph/blocks.json","retirement":null,"schema_ref":"#/components/schemas/BlocksFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"blocks-summary","path":"/metagraph/blocks/summary.json","retirement":null,"schema_ref":"#/components/schemas/BlocksSummaryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"block-detail","path":"/metagraph/blocks/{ref}.json","retirement":null,"schema_ref":"#/components/schemas/BlockDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"block-extrinsics","path":"/metagraph/blocks/{ref}/extrinsics.json","retirement":null,"schema_ref":"#/components/schemas/BlockExtrinsicsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"block-events","path":"/metagraph/blocks/{ref}/events.json","retirement":null,"schema_ref":"#/components/schemas/BlockEventsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"export-chain-events","path":"/metagraph/export/chain-events.json","retirement":null,"schema_ref":"#/components/schemas/ChainEventsFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-events-feed","path":"/metagraph/chain-events.json","retirement":null,"schema_ref":"#/components/schemas/ChainEventsFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"block-chain-events","path":"/metagraph/blocks/{ref}/chain-events.json","retirement":null,"schema_ref":"#/components/schemas/BlockChainEventsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-events-stats","path":"/metagraph/chain-events/stats.json","retirement":null,"schema_ref":"#/components/schemas/ChainEventsStatsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"extrinsics-feed","path":"/metagraph/extrinsics.json","retirement":null,"schema_ref":"#/components/schemas/ExtrinsicsFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"extrinsic-detail","path":"/metagraph/extrinsics/{hash}.json","retirement":null,"schema_ref":"#/components/schemas/ExtrinsicDetailArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"sudo-calls","path":"/metagraph/sudo.json","retirement":null,"schema_ref":"#/components/schemas/ExtrinsicsFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"governance-config-changes","path":"/metagraph/governance/config-changes.json","retirement":null,"schema_ref":"#/components/schemas/ExtrinsicsFeedArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"network-capabilities","path":"/metagraph/networks.json","retirement":null,"schema_ref":"#/components/schemas/NetworkCapabilitiesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"runtime-versions","path":"/metagraph/runtime.json","retirement":null,"schema_ref":"#/components/schemas/RuntimeVersionsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-activity","path":"/metagraph/chain/activity.json","retirement":null,"schema_ref":"#/components/schemas/ChainActivityArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-calls","path":"/metagraph/chain/calls.json","retirement":null,"schema_ref":"#/components/schemas/ChainCallsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-signers","path":"/metagraph/chain/signers.json","retirement":null,"schema_ref":"#/components/schemas/ChainSignersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-transfers","path":"/metagraph/chain/transfers.json","retirement":null,"schema_ref":"#/components/schemas/ChainTransfersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-transfer-pairs","path":"/metagraph/chain/transfer-pairs.json","retirement":null,"schema_ref":"#/components/schemas/ChainTransferPairsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-stake-flow","path":"/metagraph/chain/stake-flow.json","retirement":null,"schema_ref":"#/components/schemas/ChainStakeFlowArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-alpha-volume","path":"/metagraph/chain/alpha-volume.json","retirement":null,"schema_ref":"#/components/schemas/ChainAlphaVolumeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-weights","path":"/metagraph/chain/weights.json","retirement":null,"schema_ref":"#/components/schemas/ChainWeightsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-weight-setters","path":"/metagraph/chain/weights/setters.json","retirement":null,"schema_ref":"#/components/schemas/ChainWeightSettersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-serving","path":"/metagraph/chain/serving.json","retirement":null,"schema_ref":"#/components/schemas/ChainServingArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-axon-removals","path":"/metagraph/chain/axon-removals.json","retirement":null,"schema_ref":"#/components/schemas/ChainAxonRemovalsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-prometheus","path":"/metagraph/chain/prometheus.json","retirement":null,"schema_ref":"#/components/schemas/ChainPrometheusArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-registrations","path":"/metagraph/chain/registrations.json","retirement":null,"schema_ref":"#/components/schemas/ChainRegistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-deregistrations","path":"/metagraph/chain/deregistrations.json","retirement":null,"schema_ref":"#/components/schemas/ChainDeregistrationsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-stake-transfers","path":"/metagraph/chain/stake-transfers.json","retirement":null,"schema_ref":"#/components/schemas/ChainStakeTransfersArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-stake-moves","path":"/metagraph/chain/stake-moves.json","retirement":null,"schema_ref":"#/components/schemas/ChainStakeMovesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-fees","path":"/metagraph/chain/fees.json","retirement":null,"schema_ref":"#/components/schemas/ChainFeesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-concentration","path":"/metagraph/chain/concentration.json","retirement":null,"schema_ref":"#/components/schemas/ChainConcentrationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-concentration-subnets","path":"/metagraph/chain/concentration/subnets.json","retirement":null,"schema_ref":"#/components/schemas/ChainConcentrationSubnetsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-performance","path":"/metagraph/chain/performance.json","retirement":null,"schema_ref":"#/components/schemas/ChainPerformanceArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-idle-stake","path":"/metagraph/chain/idle-stake.json","retirement":null,"schema_ref":"#/components/schemas/ChainIdleStakeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-identity-history","path":"/metagraph/chain/identity-history.json","retirement":null,"schema_ref":"#/components/schemas/ChainIdentityHistoryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"self-health","path":"/metagraph/self-health.json","retirement":null,"schema_ref":"#/components/schemas/SelfHealthArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-yield","path":"/metagraph/chain/yield.json","retirement":null,"schema_ref":"#/components/schemas/ChainYieldArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"chain-turnover","path":"/metagraph/chain/turnover.json","retirement":null,"schema_ref":"#/components/schemas/ChainTurnoverArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-uptime","path":"/metagraph/subnets/{netuid}/uptime.json","retirement":null,"schema_ref":"#/components/schemas/UptimeArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"global-incidents","path":"/metagraph/incidents.json","retirement":null,"schema_ref":"#/components/schemas/GlobalIncidentsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"registry-leaderboards","path":"/metagraph/registry/leaderboards.json","retirement":null,"schema_ref":"#/components/schemas/RegistryLeaderboardsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"compare","path":"/metagraph/compare.json","retirement":null,"schema_ref":"#/components/schemas/CompareArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"compare-validators","path":"/metagraph/compare/validators.json","retirement":null,"schema_ref":"#/components/schemas/CompareValidatorsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"domains","path":"/metagraph/domains.json","retirement":null,"schema_ref":"#/components/schemas/DomainsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"domain-summary","path":"/metagraph/domains/{tag}/summary.json","retirement":null,"schema_ref":"#/components/schemas/DomainSummaryArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"rpc-usage","path":"/metagraph/rpc/usage.json","retirement":null,"schema_ref":"#/components/schemas/RpcUsageArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"rpc-endpoints","path":"/metagraph/rpc-endpoints.json","retirement":null,"schema_ref":"#/components/schemas/RpcEndpointsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"rpc-pools","path":"/metagraph/rpc/pools.json","retirement":null,"schema_ref":"#/components/schemas/RpcPoolsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"endpoint-pools","path":"/metagraph/endpoint-pools.json","retirement":null,"schema_ref":"#/components/schemas/EndpointPoolsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"endpoint-incidents","path":"/metagraph/endpoint-incidents.json","retirement":null,"schema_ref":"#/components/schemas/EndpointIncidentsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"operational-surfaces","path":"/metagraph/operational-surfaces.json","retirement":null,"schema_ref":"#/components/schemas/OperationalSurfacesArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"agent-catalog","path":"/metagraph/agent-catalog.json","retirement":null,"schema_ref":"#/components/schemas/AgentCatalogArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"agent-catalog-subnet","path":"/metagraph/agent-catalog/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/AgentCatalogSubnetArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"schema-drift","path":"/metagraph/schema-drift.json","retirement":null,"schema_ref":"#/components/schemas/SchemaDriftArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"schema-index","path":"/metagraph/schemas/index.json","retirement":null,"schema_ref":"#/components/schemas/SchemaIndexArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"schema-snapshot","path":"/metagraph/schemas/{surface_id}.json","retirement":null,"schema_ref":"#/components/schemas/JsonObject","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"adapter","path":"/metagraph/adapters/{slug}.json","retirement":null,"schema_ref":"#/components/schemas/AdapterArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"r2-manifest","path":"/metagraph/r2-manifest.json","retirement":null,"schema_ref":"#/components/schemas/R2ManifestArtifact","status":"live","storage_tier":"dual"},{"contract_version":"2026-07-03.2","id":"review-curation","path":"/metagraph/review/curation.json","retirement":null,"schema_ref":"#/components/schemas/ReviewCurationArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-gap-priorities","path":"/metagraph/review/gap-priorities.json","retirement":null,"schema_ref":"#/components/schemas/ReviewGapPrioritiesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"subnet-gaps","path":"/metagraph/review/gaps/{netuid}.json","retirement":null,"schema_ref":"#/components/schemas/SubnetGapsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-profile-completeness","path":"/metagraph/review/profile-completeness.json","retirement":null,"schema_ref":"#/components/schemas/ReviewProfileCompletenessArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-adapter-candidates","path":"/metagraph/review/adapter-candidates.json","retirement":null,"schema_ref":"#/components/schemas/ReviewAdapterCandidatesArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-enrichment-queue","path":"/metagraph/review/enrichment-queue.json","retirement":null,"schema_ref":"#/components/schemas/ReviewEnrichmentQueueArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-enrichment-evidence","path":"/metagraph/review/enrichment-evidence.json","retirement":null,"schema_ref":"#/components/schemas/ReviewEnrichmentEvidenceArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-enrichment-targets","path":"/metagraph/review/enrichment-targets.json","retirement":null,"schema_ref":"#/components/schemas/ReviewEnrichmentTargetsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-attribution-candidates","path":"/metagraph/review/attribution-candidates.json","retirement":null,"schema_ref":"#/components/schemas/AttributionCandidatesReviewArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"review-decisions","path":"/metagraph/review/maintainer-decisions.json","retirement":null,"schema_ref":"#/components/schemas/ReviewDecisionsArtifact","status":"live","storage_tier":"r2"},{"contract_version":"2026-07-03.2","id":"build-summary","path":"/metagraph/build-summary.json","retirement":null,"schema_ref":"#/components/schemas/BuildSummaryArtifact","status":"live","storage_tier":"r2"}],"base_path":"/api/v1","contract_version":"2026-07-03.2","feeds":[{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"The site-wide \"what changed\" feed: subnets, surfaces, and coverage added, removed, renamed, or updated in the metagraphed registry, plus Bittensor runtime upgrade activity (#8702). Served as RSS 2.0, Atom 1.0, or JSON Feed 1.1 — append `.rss`/`.atom`/`.json`, or negotiate with the `Accept` header on the bare path. Use `?tag=upgrade` to narrow to runtime upgrades alone.","formats":["rss","atom","json"],"id":"feed-registry","kind":"registry","method":"GET","path":"/api/v1/feeds/registry","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"Operational incidents across Bittensor subnet surfaces — probe-detected downtime only, never hand-authored. Same three serializations and window/tag filters as the registry feed.","formats":["rss","atom","json"],"id":"feed-incidents","kind":"incidents","method":"GET","path":"/api/v1/feeds/incidents","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"Ranked subnet enrichment targets: missing surfaces, contributor lanes, and the recommended next action for each. The contributor-facing view of registry coverage debt.","formats":["rss","atom","json"],"id":"feed-gaps","kind":"gaps","method":"GET","path":"/api/v1/feeds/gaps","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"Bittensor runtime upgrade activity (#8702): subtensor releases, observed mainnet/testnet spec-version changes, and BIT documents. Reports observed states only — the foundation publishes no deploy schedule, so this feed carries what has happened and never when something will.","formats":["rss","atom","json"],"id":"feed-upgrades","kind":"upgrades","method":"GET","path":"/api/v1/feeds/upgrades","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"Movement in subnet revenue coverage (#10480): material coverage-ratio moves, provenance changes, newly-readable revenue surfaces, and revenue surfaces that STOP returning a figure. The last is the reason this feed exists -- a feed that silently stops is indistinguishable from a subnet that never had revenue, and those are very different facts. Every item states what was observed and never why. Also folded into the registry feed, where `?tag=revenue` narrows to exactly these.","formats":["rss","atom","json"],"id":"feed-revenue","kind":"revenue","method":"GET","path":"/api/v1/feeds/revenue","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"Movement across declared subnet wallets (#10512): new attributions, maintainer reviews, material treasury flow, and OUTBOUND MOVEMENT FROM AN ADDRESS DECLARED UNSPENDABLE. That last item is the highest-consequence thing this API emits: it states the published claim, the observed movement and the delta between them, names our own misattribution as a possible explanation, and asserts nothing about intent. Do not repeat one without its reading. Also folded into the registry feed, where `?tag=wallets` narrows to exactly these.","formats":["rss","atom","json"],"id":"feed-wallets","kind":"wallets","method":"GET","path":"/api/v1/feeds/wallets","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"A personal watchlist feed built entirely from the URL: `?ids=s7,s64` selects subnets by netuid. Registry changes and incidents for the named entities only. There is no server-side subscription — anyone holding the URL sees which entities it tracks, so treat it as unlisted rather than private.","formats":["rss","atom","json"],"id":"feed-watch","kind":"watch","method":"GET","path":"/api/v1/feeds/watch","path_parameters":[],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Comma-separated kind-prefixed entities: `s<netuid>` (subnet), `v<hotkey>` (validator), `a<ss58>` (account). Up to 50 per URL (WATCH_MAX_IDS in src/feeds.ts; more is a 413). Validator/account ids are accepted and counted toward that cap but produce no items yet — no change-tracking source exists for them.","name":"ids","schema":{"maxLength":2500,"type":"string"}}]},{"content_types":["application/rss+xml","application/atom+xml","application/feed+json"],"description":"One subnet's combined feed: its registry changes and its surface incidents, merged chronologically. The per-subnet counterpart to the registry and incidents feeds.","formats":["rss","atom","json"],"id":"feed-subnet","kind":"subnet","method":"GET","path":"/api/v1/feeds/subnets/{netuid}","path_parameters":[{"description":"Subnet netuid.","name":"netuid","schema":{"minimum":0,"type":"integer"}}],"public":true,"query_parameters":[{"description":"Return only items carrying this tag (e.g. `upgrade`, `incident`, `subnet`). Exact match against the item's `tags` array.","name":"tag","schema":{"maxLength":100,"type":"string"}},{"description":"Inclusive lower bound on item timestamps, as an ISO-8601 date (`2026-06-01`, a whole UTC day) or date-time with an explicit offset. Malformed values are a 400, never silently ignored. Must not be later than the range's upper bound.","name":"since","schema":{"type":"string"}},{"description":"Inclusive upper bound, same format as `since`. A bare date covers the whole named UTC day. Must not be earlier than the range's lower bound.","name":"until","schema":{"type":"string"}},{"description":"Maximum items to return (1-50). Defaults to 50.","name":"limit","schema":{"default":50,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]}],"generated_at":"2026-09-20T12:26:49.169Z","networks":{"aliases":["finney","local","mainnet","test","testnet"],"data_aliases":["finney","mainnet","test","testnet"],"default":"mainnet","mainnet_only_route_count":173,"note":"Omit the network segment for mainnet. `finney` aliases `mainnet` and `test` aliases `testnet`. `local` is served but hosts no registry data — it returns a setup pointer for a self-run node.","path_form":"/api/v1/{network}/..."},"openapi_url":"/metagraph/openapi.json","primary_domain":"api.metagraph.sh","response_envelope":{"error_schema_ref":"#/components/schemas/ErrorEnvelope","fields":["ok","data","meta","error"],"notes":"Worker API routes wrap canonical /metagraph artifacts without changing artifact truth.","schema_version":1,"success_schema_ref":"#/components/schemas/SuccessEnvelope"},"routes":[{"artifact_path":"/metagraph/api-index.json","cache":"standard","description":"List backend API routes and response envelope metadata.","id":"api-index","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets.json","cache":"standard","description":"List active Finney subnets. The screening fields ride the `fields=` projection: `gpu_required`/`min_vram_gb` are the MINER hardware floor from the subnet's own min_compute.yml (four-valued -- `required`, `not-required`, `declared-inconsistently`, and null for the subnets whose repo publishes no readable file -- a null is NOT a no), and `also_on` names the testnet twin. The whole declaration, both roles and the commit it was read at, is the `compute_requirements` section on /subnets/{netuid}/overview.","id":"subnets","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/subnets","public":true,"query_collection":"subnets","query_filter_names":["netuid","netuids","coverage_level","curation_level","domain","status","subnet_type"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"description":"Comma-separated subnet ids to restrict the result to, e.g. `1,7,64`. At most 128 ids, each 0-65535. Unknown ids match nothing rather than erroring.","name":"netuids","schema":{"maxLength":767,"pattern":"^\\d{1,5}(,\\d{1,5}){0,127}$","type":"string"}},{"name":"coverage_level","schema":{"enum":["native-only","manifested","probed"],"type":"string"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"domain","schema":{"enum":["agents","compute","data","finance","inference","media","prediction","privacy","robotics","science","search","security","storage","training"],"type":"string"}},{"name":"status","schema":{"enum":["active","inactive"],"type":"string"}},{"name":"subnet_type","schema":{"enum":["root","application"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"min_block","schema":{"type":"number"}},{"name":"max_block","schema":{"type":"number"}},{"name":"min_candidate_count","schema":{"type":"number"}},{"name":"max_candidate_count","schema":{"type":"number"}},{"name":"min_integration_readiness","schema":{"type":"number"}},{"name":"max_integration_readiness","schema":{"type":"number"}},{"name":"min_mechanism_count","schema":{"type":"number"}},{"name":"max_mechanism_count","schema":{"type":"number"}},{"name":"min_participant_count","schema":{"type":"number"}},{"name":"max_participant_count","schema":{"type":"number"}},{"name":"min_probed_surface_count","schema":{"type":"number"}},{"name":"max_probed_surface_count","schema":{"type":"number"}},{"name":"min_surface_count","schema":{"type":"number"}},{"name":"max_surface_count","schema":{"type":"number"}},{"name":"min_tempo","schema":{"type":"number"}},{"name":"max_tempo","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["block","candidate_count","coverage_level","curation_level","integration_readiness","mechanism_count","name","netuid","participant_count","probed_surface_count","status","subnet_type","surface_count","tempo"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}.json","cache":"standard","description":"Fetch per-subnet detail.","id":"subnet-detail","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/subnets/{netuid}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Comma-separated top-level sections to return, e.g. `subnet,economics`. One of: candidate_surfaces, candidates, economics, endpoints, gaps, notes, subnet, surfaces, verified_surfaces. Selecting sections never removes the response envelope (schema_version, contract_version, generated_at, operational_observed_at, health_source) -- a smaller document still has to say what it is. An unknown name is rejected rather than ignored. A projected document omits every non-selected section, including ones the document schema marks required: `required` describes the unprojected response (#10960), so a client validating responses should skip validation or treat sections as optional when it sends this parameter. NOT the same parameter as `fields`, which projects columns out of the rows of a list.","name":"sections","schema":{"pattern":"^(?:candidate_surfaces|candidates|economics|endpoints|gaps|notes|subnet|surfaces|verified_surfaces)(?:,(?:candidate_surfaces|candidates|economics|endpoints|gaps|notes|subnet|surfaces|verified_surfaces))*$","type":"string"}}]},{"artifact_path":"/metagraph/profiles.json","cache":"standard","description":"List public-safe subnet profiles and completeness scores.","id":"profiles","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/profiles","public":true,"query_collection":"profiles","query_filter_names":["netuid","subnet_type","curation_level","review_state","confidence","profile_level"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"subnet_type","schema":{"enum":["root","application"],"type":"string"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"review_state","schema":{"maxLength":100,"type":"string"}},{"name":"confidence","schema":{"enum":["low","medium","high"],"type":"string"}},{"name":"profile_level","schema":{"enum":["directory-only","identity-partial","identity-complete","operational","adapter-backed"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["candidate_count","completeness_score","curation_level","interface_count","missing_critical_count","name","netuid","operational_interface_count","profile_level","review_state"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/profiles/{netuid}.json","cache":"standard","description":"Fetch public-safe profile detail for one subnet.","id":"subnet-profile","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/profile","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Comma-separated top-level sections to return, e.g. `subnet,profile`. One of: candidate_surfaces, endpoints, gaps, notes, profile, subnet, surfaces. Selecting sections never removes the response envelope (schema_version, contract_version, generated_at, operational_observed_at, health_source) -- a smaller document still has to say what it is. An unknown name is rejected rather than ignored. A projected document omits every non-selected section, including ones the document schema marks required: `required` describes the unprojected response (#10960), so a client validating responses should skip validation or treat sections as optional when it sends this parameter. NOT the same parameter as `fields`, which projects columns out of the rows of a list.","name":"sections","schema":{"pattern":"^(?:candidate_surfaces|endpoints|gaps|notes|profile|subnet|surfaces)(?:,(?:candidate_surfaces|endpoints|gaps|notes|profile|subnet|surfaces))*$","type":"string"}}]},{"artifact_path":"/metagraph/overview/{netuid}.json","cache":"standard","description":"Fetch a composed overview (profile + health + curation + gaps + counts) for one subnet.","id":"subnet-overview","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/overview","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Comma-separated top-level sections to return, e.g. `profile,health`. One of: compute_requirements, counts, curation, gap_priorities, gaps, health, name, netuid, notes, profile, slug, status. Selecting sections never removes the response envelope (schema_version, contract_version, generated_at, operational_observed_at, health_source) -- a smaller document still has to say what it is. An unknown name is rejected rather than ignored. A projected document omits every non-selected section, including ones the document schema marks required: `required` describes the unprojected response (#10960), so a client validating responses should skip validation or treat sections as optional when it sends this parameter. NOT the same parameter as `fields`, which projects columns out of the rows of a list.","name":"sections","schema":{"pattern":"^(?:compute_requirements|counts|curation|gap_priorities|gaps|health|name|netuid|notes|profile|slug|status)(?:,(?:compute_requirements|counts|curation|gap_priorities|gaps|health|name|netuid|notes|profile|slug|status))*$","type":"string"}}]},{"artifact_path":"/metagraph/agent-catalog.json","cache":"standard","description":"List subnets exposing callable services for AI agents (compact capability index).","id":"agent-catalog","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/agent-catalog","public":true,"query_collection":"agent-catalog","query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["netuid","callable_count","completeness_score","example_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/agent-catalog/{netuid}.json","cache":"standard","description":"Fetch the callable-services catalog for one subnet (each service with its schema + health).","id":"agent-catalog-subnet","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/agent-catalog/{netuid}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/surfaces.json","cache":"standard","description":"List curated public surfaces.","id":"surfaces","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/surfaces","public":true,"query_collection":"curated-surfaces","query_filter_names":["netuid","kind","provider","id","auth_required","public_safe","rate_limited"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"auth_required","schema":{"enum":["true","false"],"type":"string"}},{"name":"public_safe","schema":{"enum":["true","false"],"type":"string"}},{"name":"rate_limited","schema":{"enum":["true","false"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["id","kind","name","netuid","provider"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/surfaces/{netuid}.json","cache":"standard","description":"List curated public surfaces for one subnet.","id":"subnet-surfaces","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/surfaces","public":true,"query_collection":"curated-surfaces","query_filter_names":["kind","provider","id","auth_required","public_safe","rate_limited"],"query_parameters":[{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"auth_required","schema":{"enum":["true","false"],"type":"string"}},{"name":"public_safe","schema":{"enum":["true","false"],"type":"string"}},{"name":"rate_limited","schema":{"enum":["true","false"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["id","kind","name","netuid","provider"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/endpoints.json","cache":"short","description":"List generalized endpoint resources and monitored public surfaces.","id":"endpoints","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/endpoints","public":true,"query_collection":"endpoints","query_filter_names":["known_status","kind","layer","netuid","pool_eligible","provider","publication_state","status"],"query_parameters":[{"description":"Select endpoints with a known served status (ok, degraded or failed), or without one. This does not assert freshness or configured monitoring.","name":"known_status","schema":{"enum":["true","false"],"type":"string"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"layer","schema":{"enum":["bittensor-base","data-provider","docs-provider","subnet-app"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"pool_eligible","schema":{"enum":["true","false"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"publication_state","schema":{"enum":["candidate","verified","monitored","pool-eligible","disabled","rejected"],"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"min_latency_ms","schema":{"type":"number"}},{"name":"max_latency_ms","schema":{"type":"number"}},{"name":"min_score","schema":{"type":"number"}},{"name":"max_score","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["kind","last_checked","latency_ms","layer","netuid","pool_eligible","provider","publication_state","score","status"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/endpoints/{netuid}.json","cache":"short","description":"List generalized endpoint resources for one subnet.","id":"subnet-endpoints","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/endpoints","public":true,"query_collection":"endpoints","query_filter_names":["known_status","kind","layer","pool_eligible","provider","publication_state","status"],"query_parameters":[{"description":"Select endpoints with a known served status (ok, degraded or failed), or without one. This does not assert freshness or configured monitoring.","name":"known_status","schema":{"enum":["true","false"],"type":"string"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"layer","schema":{"enum":["bittensor-base","data-provider","docs-provider","subnet-app"],"type":"string"}},{"name":"pool_eligible","schema":{"enum":["true","false"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"publication_state","schema":{"enum":["candidate","verified","monitored","pool-eligible","disabled","rejected"],"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"min_latency_ms","schema":{"type":"number"}},{"name":"max_latency_ms","schema":{"type":"number"}},{"name":"min_score","schema":{"type":"number"}},{"name":"max_score","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["kind","last_checked","latency_ms","layer","netuid","pool_eligible","provider","publication_state","score","status"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/candidates.json","cache":"standard","description":"List unpromoted candidate surfaces.","id":"candidates","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/candidates","public":true,"query_collection":"candidates","query_filter_names":["netuid","kind","provider","state","id","confidence"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"state","schema":{"enum":["schema-invalid","schema-valid","maintainer-review","verified","stale","rejected"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"confidence","schema":{"enum":["low","medium","high"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["confidence","id","kind","name","netuid","provider","state"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/candidates/{netuid}.json","cache":"standard","description":"List unpromoted candidate surfaces for one subnet.","id":"subnet-candidates","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/candidates","public":true,"query_collection":"candidates","query_filter_names":["kind","provider","state","id","confidence"],"query_parameters":[{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"state","schema":{"enum":["schema-invalid","schema-valid","maintainer-review","verified","stale","rejected"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"confidence","schema":{"enum":["low","medium","high"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["confidence","id","kind","name","netuid","provider","state"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/providers.json","cache":"standard","description":"List providers and sources.","id":"providers","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/providers","public":true,"query_collection":"providers","query_filter_names":["id","kind","authority"],"query_parameters":[{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"kind","schema":{"enum":["data-provider","docs-provider","infrastructure-provider","registry","subnet-team"],"type":"string"}},{"name":"authority","schema":{"enum":["community","official","provider-claimed","registry-observed"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["authority","id","kind","name"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/providers/{slug}.json","cache":"standard","description":"Fetch per-provider detail.","id":"provider-detail","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/providers/{slug}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/providers/{slug}/endpoints.json","cache":"short","description":"List endpoint resources for one provider or operator.","id":"provider-endpoints","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/providers/{slug}/endpoints","public":true,"query_collection":"endpoints","query_filter_names":["known_status","kind","layer","netuid","pool_eligible","publication_state","status"],"query_parameters":[{"description":"Select endpoints with a known served status (ok, degraded or failed), or without one. This does not assert freshness or configured monitoring.","name":"known_status","schema":{"enum":["true","false"],"type":"string"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"layer","schema":{"enum":["bittensor-base","data-provider","docs-provider","subnet-app"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"pool_eligible","schema":{"enum":["true","false"],"type":"string"}},{"name":"publication_state","schema":{"enum":["candidate","verified","monitored","pool-eligible","disabled","rejected"],"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"min_latency_ms","schema":{"type":"number"}},{"name":"max_latency_ms","schema":{"type":"number"}},{"name":"min_score","schema":{"type":"number"}},{"name":"max_score","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["kind","last_checked","latency_ms","layer","netuid","pool_eligible","provider","publication_state","score","status"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/coverage.json","cache":"standard","description":"Fetch registry coverage summary.","id":"coverage","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/coverage","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/coverage-depth.json","cache":"standard","description":"Fetch the machine-usable coverage depth scorecard and ranked enrichment queue.","id":"coverage-depth","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/coverage-depth","public":true,"query_collection":"coverage-depth","query_filter_names":["netuid","tier","agent_status","blocker_level"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"tier","schema":{"enum":["agent-ready","machine-usable","candidate-review","needs-evidence","hard-blocked","missing-interface"],"type":"string"}},{"name":"agent_status","schema":{"enum":["callable","base-layer","candidate","needs-evidence","blocked"],"type":"string"}},{"name":"blocker_level","schema":{"enum":["none","hard-blocked","needs-review","missing-data"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["agent_status","blocker_level","name","netuid","priority_score","score","tier"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/economics.json","cache":"standard","description":"List per-subnet validator and economic metrics (counts, stake, registration cost, alpha price, alpha market-cap proxy, alpha FDV proxy, emission share, and registration block height). Default order is emission share descending — note that `emission_share` is the STAGE-1 PRICE SHARE of the v440 emission pipeline (alpha_price / sum of alpha_price), NOT the share of TAO a subnet receives: spec 440 separates the two by MinerBurned reweighting, the Hill emission gate, the SubnetEmissionEnabled filter, the alpha injection cap, and the liquidity balancer. See /api/v1/network/parameters for the gate parameters and docs/computed-metrics-methodology.md for the eight-stage decomposition. Filter by netuid/registration_allowed, search by name/slug, and sort with `sort=<field>&order=asc|desc` — the two are separate parameters (e.g. `?sort=alpha_market_cap_tao&order=desc` or `?sort=block&order=asc`), NOT a combined `field:desc` token. Per-subnet recipient-class economics (who the emission actually goes to -- validators, miners, the burn sink, in alpha and derived USD per day) are NOT here: /subnets/{netuid}/emission-split/history measures that split per day; never reconstruct it from an assumed constant. Registry screening signals (repo health via github_commits_weekly/github_last_push_at, testnet lineage via also_on, the declared miner hardware floor via gpu_required/min_vram_gb) are also NOT here: /api/v1/subnets serves them in bulk behind its fields= projection, e.g. ?fields=netuid,github_commits_weekly,also_on,gpu_required.","id":"economics","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/economics","public":true,"query_collection":"economics","query_filter_names":["netuid","registration_allowed"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"registration_allowed","schema":{"enum":["true","false"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["alpha_fdv_tao","alpha_market_cap_tao","alpha_price_change_1d","alpha_price_change_1h","alpha_price_change_1m","alpha_price_change_7d","alpha_price_tao","block","emission_share","max_stake_alpha","max_uids","max_validators","miner_count","miner_readiness","name","netuid","open_slots","registration_cost_tao","subnet_volume_tao","total_stake_alpha","validator_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/ai/ask.json","cache":"short","description":"Ask a natural-language question about the registry and get a grounded answer with citations. POST a JSON body `{ question }`; the answer carries inline [n] markers resolved by `citations`, each naming the surface it came from, so every claim is traceable to a registered surface rather than to the model. Use this when the question is exploratory (\"which subnets expose a public inference API?\"); use /api/v1/search/semantic when you want the ranked matches themselves rather than prose. Mirrored by the `ask` MCP tool. Served live (no static file); 503 ai_unavailable where no AI binding is configured.","id":"ask","mainnet_only":true,"method":"POST","networks":["mainnet"],"path":"/api/v1/ask","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/webhooks/subscriptions/{id}.json","cache":"short","description":"Read back one webhook subscription and its recent delivery outcomes. `delivery.status` is the one field to branch on: `ok` means nothing is outstanding, `retrying` means the queue has the event and will try again (not a loss), and `dead_letter` means an event will never arrive. `last_failure` carries the reason, the HTTP `status_code`, the attempt count and the next scheduled attempt, which is what a subscriber debugging a missed event actually needs. The id is a UUID v4 returned once at creation -- there is no listing route, and an id that was not kept cannot be recovered. Mirrored by the `get_webhook_subscription` MCP tool. Served live (no static file).","id":"webhook-subscription","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/webhooks/subscriptions/{id}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/alerts/triggers/{id}.json","cache":"short","description":"Read back one alert trigger: what it watches (`table_filter` plus the four narrowing fields `netuid`, `event_kind`, `account`, `min_amount_tao` -- all nullable, so a trigger that sets none of them matches every event on its table), where it delivers (`channel`, `destination`), whether it is `active`, and its firing record. `last_matched_at` is null until the trigger has fired once, which is NOT the same as `match_count: 0` -- a trigger created and immediately disabled shows the latter too. Requires the owner token issued at creation; it is not recoverable if lost. Mirrored by the `get_alert_trigger` MCP tool. Served live (no static file).","id":"alert-trigger","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/alerts/triggers/{id}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/ai/search-semantic.json","cache":"short","description":"Search the registry by MEANING rather than by keyword: ?q= is embedded and ranked by cosine similarity, so it finds surfaces whose text never contains your terms. The complement to /api/v1/search, which is lexical -- reach for that one when you know the exact name. Each result carries its score, type, netuid/slug, title/subtitle, URL, categories, and service kinds; `model` names the embedding model. ?limit caps the list. Mirrored by the `semantic_search` MCP tool. Served live (no static file); 503 ai_unavailable where no AI binding is configured.","id":"search-semantic","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/search/semantic","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"q","schema":{"maxLength":1000,"type":"string"}},{"name":"limit","schema":{"default":10,"maximum":20,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"type","schema":{"enum":["subnet","surface","provider"],"type":"string"}}]},{"artifact_path":"/metagraph/surfaces/{surface_id}/verify.json","cache":"short","description":"Probe ONE registered surface right now and report whether it is actually callable. Catalog-resolved, not arbitrary URL fetching: name a surface the registry knows and the Worker probes the URL it has on file, echoing the resolved identity (surface_key, netuid, kind, url, provider, auth_required) beside the verdict (status, classification, callable) and its evidence (latency_ms, status_code, error). `from_cache` says whether this was a fresh probe. Use it as the last step before integrating, after list_subnet_apis/get_api_schema. Mirrored by the `verify_integration` MCP tool. Served live (no static file); 404 surface_not_found when no catalogued surface matches.","id":"surface-verify","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/surfaces/{surface_id}/verify","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/emission-pipeline.json","cache":"short","description":"Fetch the v440 emission pipeline decomposed per subnet (#8744): stage 1's price share, MinerBurned, the post-burn weighted share, the post-Hill-gate share, SubnetEmissionEnabled, the final share of block emission actually received, the gate's give-or-take (`gate_delta`), `distance_to_bar` measured against the WEIGHTED share (theta is computed over the post-burn distribution, so comparing stage 1 to it answers a question the gate does not ask), and the TAO split -- `tao_in_emission` (pool liquidity injection) vs `excess_tao` (chain buys), their `tao_total`, and `liquidity_fraction`. Plus the network aggregate and the issuance-derived block emission. EVERY SHARE IS RECONSTRUCTED, NOT READ: the chain publishes the inputs, not the decomposition. `field_sources` gives each field its kind (measured|reconstructed) and, for measurements, the storage item behind it; every value is pinned to `chain_state.block`; and the four pipeline identities are evaluated on the rows being served, so `verification.verified: false` means the response is not defensible and must not be used. `emission_enabled` is published rather than inferred because a deeply gated ENABLED subnet and a disabled one both read `final_share: 0`. The two TAO channels are point samples at that block -- measured across 14 consecutive blocks they move a few rao and `liquidity_fraction` varies by ~1e-5, so no rollup exists or is needed. ?netuid filters the subnet list and deliberately leaves the aggregate network-wide. Served live (no static file); 503 when the capture carries no pinned block, because an unverifiable decomposition is worse than none.","id":"emission-pipeline","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/emission-pipeline","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum.","name":"sort","schema":{"enum":["final_share","emission_share","weighted_share","gated_share","gate_delta","distance_to_bar","tao_in_emission","excess_tao","tao_total","liquidity_fraction","miner_burned","netuid"],"type":"string"}},{"description":"Sort direction for the chosen sort key: `asc` smallest-first, `desc` largest-first.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"name":"limit","schema":{"maximum":512,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}}]},{"artifact_path":"/metagraph/chain/deregistration-ranking.json","cache":"short","description":"Fetch the order in which the chain would deregister subnets to make room for a new registration (#10285) — 'how close is this subnet to being pruned', answered with the pallet's own rule rather than a proxy for it. `Subtensor::get_network_to_prune()` skips root, skips every subnet still inside `NetworkRegisteredAt + NetworkImmunityPeriod`, compares `get_moving_alpha_price`, and breaks a tie on the EARLIER registration. TWO THINGS MAKE THIS NOT A PRICE SORT. First, immunity: measured at block 8,808,300, sixteen of 128 subnets were inside their window, and a price-only order puts netuid 86 at position one — it reads a moving price of exactly 0 but cannot be deregistered at all, while the chain's answer is netuid 70. Second, `get_moving_alpha_price` substitutes a FLAT 1.0 for a Stable subnet (`SubnetMechanism` 0) instead of reading `SubnetMovingPrice`, which moves it from the top of a price order to near the bottom; every mainnet subnet reads mechanism 1 today, so the clause is invisible until one sudo call makes it decisive. `ranked` holds only prunable subnets, rank 1 first. `immune` holds the protected ones ordered by how soon protection lapses — the order in which they join the ranking — carrying `immune_until_block` and `blocks_until_prunable`; ordering them by price would imply a pruning position they do not have. Each entry publishes `comparison_price` (what the pallet compares) beside `moving_price` (the raw read), so the Stable substitution is visible. Served live (no static file); 503 when the capture carries no pinned block or no immunity period, because an ordering computed without the immunity window is not an approximation — it is a different ordering that looks the same and would be believed.","id":"deregistration-ranking","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/deregistration-ranking","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/economics/trends.json","cache":"short","description":"Fetch the network-wide economics time series (#1307): per UTC day across all subnets — total stake, stake-weighted + median alpha price, total validator/miner counts, and mean emission share — aggregated live from the daily subnet_snapshots rollup. `mean_emission_share` averages the stage-1 price share, so it inherits the same caveat: `emission_share` is the STAGE-1 PRICE SHARE of the v440 emission pipeline (alpha_price / sum of alpha_price), NOT the share of TAO a subnet receives: spec 440 separates the two by MinerBurned reweighting, the Hill emission gate, the SubnetEmissionEnabled filter, the alpha injection cap, and the liquidity balancer. See /api/v1/network/parameters for the gate parameters and docs/computed-metrics-methodology.md for the eight-stage decomposition. The rollup is the same source the per-subnet /trajectory reads. ?window=7d|30d|90d|1y|all (default 30d). Pass ?format=csv to download the per-day series as CSV. Served live (no static file); day_count:0 / days:[] when the rollup is cold.","id":"economics-trends","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/economics/trends","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/registry-summary.json","cache":"standard","description":"Fetch the registry-wide summary (completeness, top subnets, level counts, latest changes).","id":"registry-summary","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/registry/summary","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/lineage.json","cache":"standard","description":"Fetch maintainer-approved cross-network subnet lineage (graduated subnets + the deploying-soon testnet pipeline).","id":"lineage","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/lineage","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/fixtures.json","cache":"standard","description":"Fetch the index of captured live request/response fixtures (which surfaces carry a sanitized sample). Fetch one with GET /api/v1/fixtures/{surface_id}, get_fixture, or GET /metagraph/fixtures/{surface_id}.json.","id":"fixtures","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/fixtures","public":true,"query_collection":"fixtures","query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["captured_at","netuid","surface_id"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/fixtures/{surface_id}.json","cache":"standard","description":"Fetch one captured, sanitized live request/response fixture by surface id.","id":"fixture-detail","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/fixtures/{surface_id}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/agent-resources.json","cache":"standard","description":"Fetch the AI-resources index: the copyable agent (/agent.md), the MCP server + its tools, the skill, llms.txt, OpenAPI, and the agent-facing APIs.","id":"agent-resources","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/agent-resources","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/curation.json","cache":"standard","description":"Fetch curation states by subnet.","id":"curation","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/curation","public":true,"query_collection":"curation","query_filter_names":["netuid","coverage_level","curation_level"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"coverage_level","schema":{"enum":["native-only","manifested","probed"],"type":"string"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["coverage_level","curation_level","name","netuid"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/gaps.json","cache":"standard","description":"Fetch interface gap report.","id":"gaps","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/gaps","public":true,"query_collection":"gaps","query_filter_names":["netuid","coverage_level","curation_level"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"coverage_level","schema":{"enum":["native-only","manifested","probed"],"type":"string"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["coverage_level","curation_level","gap_count","name","netuid"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/review/gap-priorities.json","cache":"standard","description":"Fetch contributor-targeted subnet gap priorities.","id":"review-gaps","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/gaps","public":true,"query_collection":"review-gap-priorities","query_filter_names":["netuid","curation_level","missing_kinds","review_state"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"missing_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"review_state","schema":{"maxLength":100,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["candidate_count","curation_level","missing_kinds","name","netuid","priority_score","surface_count","verified_candidate_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/review/gaps/{netuid}.json","cache":"standard","description":"Fetch interface gap priorities and enrichment queue for one subnet.","id":"subnet-gaps","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/gaps","public":true,"query_collection":"review-gap-priorities","query_filter_names":["curation_level","missing_kinds","review_state"],"query_parameters":[{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"missing_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"review_state","schema":{"maxLength":100,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["candidate_count","curation_level","missing_kinds","name","netuid","priority_score","surface_count","verified_candidate_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/review/profile-completeness.json","cache":"standard","description":"Fetch profile completeness gaps for contributor targeting.","id":"review-profile-completeness","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/profile-completeness","public":true,"query_collection":"profile-completeness","query_filter_names":["netuid","profile_level","confidence","identity_level","identity_promotion_kinds","native_name_quality"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"profile_level","schema":{"enum":["directory-only","identity-partial","identity-complete","operational","adapter-backed"],"type":"string"}},{"name":"confidence","schema":{"enum":["low","medium","high"],"type":"string"}},{"name":"identity_level","schema":{"enum":["none","directory","partial","complete"],"type":"string"}},{"name":"identity_promotion_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"native_name_quality","schema":{"enum":["chain","placeholder","empty"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["candidate_count","completeness_score","identity_level","identity_promotion_kind_count","identity_surface_count","live_identity_candidate_kind_count","missing_critical_count","name","native_identity_signal_count","native_name_quality","netuid","priority_score","profile_level","stale_identity_candidate_kind_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/review/adapter-candidates.json","cache":"standard","description":"Fetch subnets worth deeper adapter work.","id":"review-adapter-candidates","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/adapter-candidates","public":true,"query_collection":"adapter-candidates","query_filter_names":["netuid","curation_level","candidate_api_kinds","operational_kinds","reason_codes","recommended_adapter_kind"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"candidate_api_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"operational_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"reason_codes","schema":{"maxLength":100,"type":"string"}},{"name":"recommended_adapter_kind","schema":{"enum":["custom-adapter","data-artifact-adapter","generic-openapi-or-custom","stream-adapter"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["candidate_api_count","candidate_api_kinds","curation_level","name","netuid","operational_kinds","operational_surface_count","priority_score","recommended_adapter_kind"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/review/enrichment-queue.json","cache":"standard","description":"Fetch the prioritized all-subnet enrichment queue.","id":"review-enrichment-queue","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/enrichment-queue","public":true,"query_collection":"enrichment-queue","query_filter_names":["curation_level","direct_submission_kinds","evidence_action","identity_level","lane","missing_kinds","netuid","profile_level","reason_codes","review_state","manual_review_required"],"query_parameters":[{"name":"curation_level","schema":{"enum":["native","candidate-discovered","community-seeded","machine-verified","maintainer-reviewed","adapter-backed"],"type":"string"}},{"name":"direct_submission_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"evidence_action","schema":{"enum":["submit-new-evidence","verify-existing-evidence","replace-stale-evidence","review-existing-evidence","maintainer-review-existing-evidence","monitor"],"type":"string"}},{"name":"identity_level","schema":{"enum":["none","directory","partial","complete"],"type":"string"}},{"name":"lane","schema":{"enum":["direct-submission","maintainer-review","adapter-candidate","monitoring-followup","baseline-monitoring"],"type":"string"}},{"name":"missing_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"profile_level","schema":{"enum":["directory-only","identity-partial","identity-complete","operational","adapter-backed"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"reason_codes","schema":{"maxLength":100,"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"review_state","schema":{"maxLength":100,"type":"string"}},{"name":"manual_review_required","schema":{"enum":["true","false"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["adapter_score","candidate_count","completeness_score","curation_level","endpoint_count","evidence_action","identity_level","identity_surface_count","lane","name","netuid","operational_interface_count","priority_score","profile_level","review_state","stale_candidate_count","surface_count","verified_candidate_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/review/enrichment-evidence.json","cache":"standard","description":"Fetch detailed candidate evidence behind the enrichment queue.","id":"review-enrichment-evidence","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/enrichment-evidence","public":true,"query_collection":"enrichment-evidence","query_filter_names":["direct_submission_kinds","evidence_action","lane","missing_kinds","netuid"],"query_parameters":[{"name":"direct_submission_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"evidence_action","schema":{"enum":["submit-new-evidence","verify-existing-evidence","replace-stale-evidence","review-existing-evidence","maintainer-review-existing-evidence","monitor"],"type":"string"}},{"name":"lane","schema":{"enum":["direct-submission","maintainer-review","adapter-candidate","monitoring-followup","baseline-monitoring"],"type":"string"}},{"name":"missing_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["evidence_action","lane","name","netuid","priority_score"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/review/enrichment-targets.json","cache":"standard","description":"Fetch contributor-ready enrichment targets grouped by missing surface kind and review route.","id":"review-enrichment-targets","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/enrichment-targets","public":true,"query_collection":"enrichment-targets","query_filter_names":["auto_review_candidate","evidence_action","identity_level","kind","lane","manual_review_required","missing_kinds","netuid","profile_level","reason_codes","submission_route","target_action","target_type"],"query_parameters":[{"name":"auto_review_candidate","schema":{"enum":["true","false"],"type":"string"}},{"name":"evidence_action","schema":{"enum":["submit-new-evidence","verify-existing-evidence","replace-stale-evidence","review-existing-evidence","maintainer-review-existing-evidence","monitor"],"type":"string"}},{"name":"identity_level","schema":{"enum":["none","directory","partial","complete"],"type":"string"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"lane","schema":{"enum":["direct-submission","maintainer-review","adapter-candidate","monitoring-followup","baseline-monitoring"],"type":"string"}},{"name":"manual_review_required","schema":{"enum":["true","false"],"type":"string"}},{"name":"missing_kinds","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"profile_level","schema":{"enum":["directory-only","identity-partial","identity-complete","operational","adapter-backed"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"reason_codes","schema":{"maxLength":100,"type":"string"}},{"name":"submission_route","schema":{"enum":["direct-candidate-pr","adapter-request","maintainer-review","status-report"],"type":"string"}},{"name":"target_action","schema":{"enum":["submit-new-candidate","replace-stale-candidate","verify-existing-candidate","review-existing-candidate","adapter-review","maintainer-review","monitoring-followup"],"type":"string"}},{"name":"target_type","schema":{"enum":["surface-candidate","adapter-review","maintainer-review","monitoring-followup"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["auto_review_candidate","evidence_action","identity_level","kind","lane","manual_review_required","name","netuid","priority_score","profile_level","submission_route","target_action","target_type"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/review/attribution-candidates.json","cache":"short","description":"Fetch the attribution sweep's review queue. The attribution sweep's REVIEW QUEUE (#11227). src/attribution-sweep.ts looks at what each subnet publishes and records ss58 strings it finds; #10818 fixed that lane so it actually fetches sources, and the table it writes had no reader at all -- a candidate nobody can see is the same as no candidate. EVERY ROW IS A LEAD, NEVER AN ATTRIBUTION. An address appearing in the text of a page a subnet published does not make the address theirs: the common false positive is a hotkey belonging to a validator, appearing inside an API response that validator publishes -- somebody else's key, on their own page. Clearing docs/nametag-evidence-bar.md -- a public source tying THIS address to THIS entity -- is a human judgement, and this surface exists to put candidates in front of one rather than to skip it. source_url rides on every candidate because the review IS opening it. THE LISTING RULE IS RE-DERIVED AT READ TIME, over the table rather than trusted from the writer: a source yielding more than listing_address_cap distinct addresses is a metagraph dump or a holder list, and every address on it belongs to somebody else. The sweep enforces that cap when a row is WRITTEN, but rows outlive rules -- measured 2026-08-15 the table held 4,913 rows from 87 sources, of which 25 pre-cap sources (/allHolders, /api/miners, /snap/metagraph and their kin) accounted for 4,751 -- and the cap is an explicitly revisable judgement, so deriving it here moves the whole history when it moves. Applying it leaves 162 rows across 49 subnets from 62 sources. THE SUPPRESSION IS PUBLISHED, never silent: suppressed_count, suppressed_source_count and listing_address_cap ride on every response, so a filter a caller cannot see is not a filter they cannot check -- and if the suppressed share stops falling, the sweep's fan-out needs narrowing before a human is asked to read the result. COUNTS ARE UNBOUNDED AND THE LIST IS BOUNDED: reviewable_count is measured over the whole table beside a ?limit=-trimmed candidates array, so counting the array can never be mistaken for the population. ?netuid= narrows to one subnet; ?limit= defaults to 200 (max 500) because the whole queue in one fetch is what a reviewer wants. An EMPTY queue is a measurement -- every candidate adjudicated, every source a listing, or a subnet nobody has swept -- and only a failed read carries degraded.reason: unavailable. Mainnet-only: the sweep reads the registry's surfaces, and the registry is mainnet's.","id":"review-attribution-candidates","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/review/attribution-candidates","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":200,"maximum":500,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/health/summary.json","cache":"short","description":"Fetch global health summary.","id":"health","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/health","public":true,"query_collection":"health-subnets","query_filter_names":["netuid","status"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["avg_latency_ms","degraded_count","failed_count","last_checked","last_ok","name","netuid","ok_count","status","surface_count","unknown_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/health/history/{date}.json","cache":"short","description":"Fetch compact daily health history.","id":"health-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/health/history/{date}","public":true,"query_collection":"health-surfaces","query_filter_names":["netuid","kind","provider","status","classification"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"classification","schema":{"enum":["auth-required","content-mismatch","dead","live","rate-limited","redirected","timeout","transient","unsupported","unsafe","wrong-chain"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["classification","kind","last_checked","last_ok","latency_ms","netuid","provider","status","status_code","surface_id","verified_at"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/health/subnets/{netuid}.json","cache":"short","description":"Fetch health detail for one subnet.","id":"subnet-health","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/health","public":true,"query_collection":"health-surfaces","query_filter_names":["kind","provider","status","classification"],"query_parameters":[{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"classification","schema":{"enum":["auth-required","content-mismatch","dead","live","rate-limited","redirected","timeout","transient","unsupported","unsafe","wrong-chain"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["classification","kind","last_checked","last_ok","latency_ms","netuid","provider","status","status_code","surface_id","verified_at"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/health/trends.json","cache":"short","description":"Fetch compact 7d/30d daily uptime and latency trends for all subnets (computed live from the store). `?window=7d|30d` returns just that window and narrows the underlying scan to it rather than reading the widest one and discarding the rest; `?limit`/`?offset` page the `subnets` array within each window. All three are optional and omitting them returns every window and every subnet, which is what this route served before it had them. `subnet_count` always spans every subnet the window measured, not the page, so a paging caller keeps the denominator it is ranking against.","id":"health-trends-bulk","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/health/trends","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"maximum":512,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"minimum":0,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/health/trends/{netuid}.json","cache":"short","description":"Fetch 7d/30d uptime and success-only latency trends (mean + p50/p95/p99 tail + healthy-sample count) per operational surface for one subnet (computed live from the store).","id":"subnet-health-trends","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/health/trends","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/health/percentiles/{netuid}.json","cache":"short","description":"Fetch latency percentiles (p50/p95/p99) per operational surface for one subnet over a 7d or 30d window (computed live from the store).","id":"subnet-health-percentiles","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/health/percentiles","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/health/incidents/{netuid}.json","cache":"short","description":"Fetch SLA (uptime ratio) and reconstructed downtime incidents per operational surface for one subnet over a 7d or 30d window (computed live from the store).","id":"subnet-health-incidents","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/health/incidents","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/trajectory.json","cache":"short","description":"Fetch the week-over-week structural trajectory (completeness + surface/endpoint counts) for one subnet from daily snapshots (computed live from the store). Pass ?format=csv to download the per-day series as CSV.","id":"subnet-trajectory","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/trajectory","public":true,"query_collection":"subnet-trajectory","query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["date","completeness_score","surface_count","endpoint_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"Response format override. Use `csv` to download the transformed list as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/concentration.json","cache":"short","description":"Fetch stake & emission concentration metrics (Gini, HHI, Nakamoto coefficient, top-percentile shares, entropy) for one subnet across per-UID, per-entity (coldkeys collapsed), and validator-only consensus-power lenses (computed live from the neurons store).","id":"subnet-concentration","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/concentration","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/performance.json","cache":"short","description":"Fetch reward-distribution & score-spread metrics for one subnet: reward concentration (Gini, HHI, Nakamoto coefficient, top-percentile shares, entropy) for incentive across all neurons and dividends across validators, plus the p10–p90 spread of the 0–1 trust, consensus, and validator_trust scores (computed live from the neurons store). The reward-flow companion to /concentration.","id":"subnet-performance","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/performance","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/idle-stake.json","cache":"short","description":"Fetch stake delegated to a hotkey currently earning zero dividends for one subnet — dividends are the only stream delegated stake ever receives in dTAO, so this covers both no-permit and zero-weight-output hotkeys alike (computed live from the neurons store).","id":"subnet-idle-stake","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/idle-stake","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/performance/history.json","cache":"short","description":"Fetch the per-day reward-flow & trust trend for one subnet over a 7d/30d/90d window: the incentive/dividends reward concentration (Gini, Nakamoto coefficient, top-10% share) plus the mean & median of the 0–1 trust, consensus, and validator_trust scores (computed live from the neuron_daily rollup). The reward-flow twin of /concentration/history. Pass ?format=csv to download the per-day series as CSV.","id":"subnet-performance-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/performance/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/concentration/history.json","cache":"short","description":"Fetch the per-day stake & emission concentration trend (Gini, Nakamoto coefficient, top-10% share) for one subnet over a 7d/30d/90d window (computed live from the neuron_daily rollup). Pass ?format=csv to download the per-day series as CSV.","id":"subnet-concentration-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/concentration/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/turnover.json","cache":"short","description":"Fetch validator-set & registration turnover (churn) for one subnet between a window's start and end snapshots — validators entered/exited + retention, UID deregistrations, and a 0-100 stability score. Add ?changes=true to include the entered/exited validator hotkeys and UID reassignment detail (computed live from the neuron_daily rollup).","id":"subnet-turnover","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/turnover","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}},{"name":"changes","schema":{"enum":["true","false"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/weights.json","cache":"short","description":"Fetch validator weight-setting activity for one subnet over a 7d or 30d window: the distinct weight-setting validators, the WeightsSet event count, and the average updates per validator, computed live from the account_events WeightsSet stream. The per-subnet drill-in of GET /api/v1/chain/weights (which ranks only the top-N subnets and cannot be queried by netuid). Schema-stable zeroed card when the subnet has no WeightsSet events in the window.","id":"subnet-weights","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/weights","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/weights/setters.json","cache":"short","description":"Fetch the per-subnet weight-setter leaderboard over a 7d or 30d window: the individual validators behind /weights ranked by activity, each with its WeightsSet count, its share of the subnet's total weight-setting, and when it first and last set weights in the window, computed live from the account_events WeightsSet stream. The setter-level drill-in of GET /api/v1/subnets/{netuid}/weights (which reports only the aggregate and never names the setters). Schema-stable empty leaderboard when the subnet has no WeightsSet events in the window.","id":"subnet-weight-setters","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/weights/setters","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/serving.json","cache":"short","description":"Fetch axon-serving announcement activity for one subnet over a 7d or 30d window: the distinct servers (hotkeys), the AxonServed event count, and the average announcements per server, computed live from the account_events AxonServed stream. The per-subnet drill-in of GET /api/v1/chain/serving (which ranks only the top-N subnets and cannot be queried by netuid). Schema-stable zeroed card when the subnet has no AxonServed events in the window.","id":"subnet-serving","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/serving","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/prometheus.json","cache":"short","description":"Fetch Prometheus-endpoint serving activity for one subnet over a 7d or 30d window: the distinct exporters (hotkeys), the PrometheusServed event count, and the average announcements per exporter, read from the account_events PrometheusServed stream. A successfully read quiet window returns measured zeros; an unavailable source carries `degraded.reason=unavailable`. The per-subnet drill-in of GET /api/v1/chain/prometheus (which ranks only the top-N subnets and cannot be queried by netuid) and the telemetry-endpoint sibling of GET /api/v1/subnets/{netuid}/serving (axon endpoints).","id":"subnet-prometheus","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/prometheus","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/stake-transfers.json","cache":"short","description":"Fetch stake-transfer activity for one subnet over a 7d or 30d window: the distinct senders (accounts), the StakeTransferred event count, and the average transfers per sender, computed live from the account_events StakeTransferred stream. The per-subnet drill-in of GET /api/v1/chain/stake-transfers (which ranks only the top-N subnets and cannot be queried by netuid) and the between-coldkeys sibling of GET /api/v1/subnets/{netuid}/stake-moves (within-account re-delegation churn) — transfer_stake relocates staked alpha from one account to another on the same hotkey (origin leg only), so it moves ownership, not net capital. Schema-stable zeroed card when the subnet has no StakeTransferred events in the window.","id":"subnet-stake-transfers","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/stake-transfers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/stake-moves.json","cache":"short","description":"Fetch stake-movement (re-delegation) activity for one subnet over a 7d or 30d window: the distinct movers (accounts), the StakeMoved event count, and the average movements per mover, computed live from the account_events StakeMoved stream. The per-subnet drill-in of GET /api/v1/chain/stake-moves (which ranks only the top-N subnets and cannot be queried by netuid) and the re-delegation-churn sibling of GET /api/v1/subnets/{netuid}/stake-flow (net capital flow) — move_stake relocates stake between hotkeys/subnets without unstaking, so it is churn, not flow. Schema-stable zeroed card when the subnet has no StakeMoved events in the window.","id":"subnet-stake-moves","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/stake-moves","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/registrations.json","cache":"short","description":"Fetch neuron-registration activity for one subnet over a 7d or 30d window: the distinct registrants (hotkeys), the NeuronRegistered event count, and the average registrations per registrant, computed live from the account_events NeuronRegistered stream. Raw registration demand — the account_events companion to the neuron_daily validator-set churn in GET /api/v1/subnets/{netuid}/turnover (net snapshot change, not raw event volume). Schema-stable zeroed card when the subnet has no NeuronRegistered events in the window.","id":"subnet-registrations","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/registrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/axon-removals.json","cache":"short","description":"Fetch axon-removal activity for one subnet over a 7d or 30d window: the distinct removers (hotkeys), the AxonInfoRemoved event count, and the average removals per remover, read from the account_events AxonInfoRemoved stream, which the runtime has never populated — an empty card is marked `degraded` rather than published as a measured zero. Raw axon-teardown activity — the removal-side companion to the AxonServed announcements in GET /api/v1/subnets/{netuid}/serving (which counts axon announcements, not teardowns). The zeroed card carries a `degraded` block whenever it is empty.","id":"subnet-axon-removals","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/axon-removals","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/deregistrations.json","cache":"short","description":"Fetch neuron-deregistration activity for one subnet over a 7d or 30d window: the distinct deregistered hotkeys, the NeuronDeregistered event count, and the average deregistrations per hotkey, DERIVED from UID reuse in the NeuronRegistered stream (NeuronDeregistered has never been emitted by the runtime). Raw deregistration/eviction activity — the exit-side companion to the NeuronRegistered demand in GET /api/v1/subnets/{netuid}/registrations and the account_events companion to the neuron_daily churn in GET /api/v1/subnets/{netuid}/turnover (net snapshot change, not raw event volume). The card carries a `derivation` block stating how many window registrations had no observable previous holder, and a `degraded` block when nothing derived it.","id":"subnet-deregistrations","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/deregistrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/stake-flow.json","cache":"short","description":"Fetch net stake flow for one subnet over a recent window: total TAO staked (StakeAdded) vs unstaked (StakeRemoved), the net flow, and the stake/unstake event counts, summed live from the account_events stream. ?direction=all|in|out filters to inflow (StakeAdded) or outflow (StakeRemoved) only; omitted defaults to all. Windows (7d/30d/90d) are bounded by the account_events retention.","id":"subnet-stake-flow","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/stake-flow","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Which side of the flow to count, relative to the account or subnet this route is scoped to. Omit to count both. Options are per-route; see this parameter's enum.","name":"direction","schema":{"enum":["all","in","out"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/volume.json","cache":"short","description":"Fetch the rolling 24h buy/sell alpha volume for one subnet: unsigned totals (never netted) in both alpha and TAO for StakeAdded (buy) vs StakeRemoved (sell), plus event counts, summed live from the same account_events stream as GET /api/v1/subnets/{netuid}/stake-flow. Also returns a buy/sell sentiment indicator derived from the alpha totals: net_volume_alpha, a bounded sentiment_ratio, and a bullish/bearish/neutral label. Fixed 24h window, no query params — a canonical market-depth figure, not OHLC/price data.","id":"subnet-alpha-volume","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/volume","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/ohlc.json","cache":"short","description":"Fetch open/high/low/close/volume candles for one subnet's alpha price, bucketed by ?interval= (1h or 1d, default 1h) from the same account_events StakeAdded/StakeRemoved stream as GET /api/v1/subnets/{netuid}/volume — each row is one executed trade, price = amount_tao / alpha_amount. Open/high/low/close are the first/max/min/last trade price in the bucket; volume_alpha/volume_tao are summed amounts. ?days= bounds the lookback window (default 90, max 365). Empty buckets are omitted (a gap, not a synthesized flat candle). The root subnet (netuid 0) has no AMM pool — 1:1 TAO, no price impact — so it returns an empty candle array with root_excluded:true rather than a meaningless flat-line series.","id":"subnet-ohlc","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/ohlc","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"interval","schema":{"default":"1h","enum":["1h","1d"],"type":"string"}},{"name":"days","schema":{"default":90,"maximum":365,"minimum":1,"type":"integer"}},{"name":"limit","schema":{"default":2000,"maximum":2000,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/subnets/{netuid}/stake-quote.json","cache":"short","description":"Fetch a read-only constant-product stake/unstake slippage quote for one subnet: the expected alpha/TAO out, spot vs effective price (TAO per alpha), and price-impact percent for a swap of ?amount= in ?direction=stake|unstake (default stake), computed live from the subnet's economics-tier AMM pool reserves (tao_in_pool_tao, alpha_in_pool). Pure math — no chain write, no custody — mirroring the chain's own constant-product swap and its InsufficientLiquidity guard: an amount over 1000× the relevant reserve is rejected with 422. The root subnet (netuid 0) has no AMM and returns a 1:1, zero-impact quote.","id":"subnet-stake-quote","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/stake-quote","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"amount","schema":{"exclusiveMinimum":0,"type":"number"}},{"description":"Which side of the trade to price: `stake` buys alpha with TAO, `unstake` sells alpha for TAO. Omit for `stake`.","name":"direction","schema":{"default":"stake","enum":["stake","unstake"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/validator-economics.json","cache":"short","description":"Fetch what it costs to become a validator on one subnet and whether a permit there earns: the permit floor and the earning floor (which differ by a median of ~7x — a permit is not income), the TAO to reach each priced against live AMM pool reserves plus the registration burn, how many validator slots are open, the commission (take) distribution across permit-holders, whether the emission gate is open and the daily TAO inflow, and the live StakeThreshold/TaoWeight the floors were computed against. Permitted, active and earning are returned as three separate counts because they are three different sets. Root stake counts toward the threshold on every registered subnet at once, so root_tao_to_clear_threshold is the cross-subnet alternative to the per-subnet alpha costs. Read-only and derived — no chain write, no custody; every derived field is nullable and degrades with a stated reason rather than a confident zero.","id":"subnet-validator-economics","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/validator-economics","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/validator-economics-history.json","cache":"short","description":"Fetch whether validating on one subnet is getting cheaper or more expensive: a daily series of the observed permit floor and earning floor in alpha, the validator set composition as three separate counts, and the emission-gate state with daily TAO inflow, over a 7d/30d/90d window (default 30d), newest first. A floor that has doubled means the subnet is filling up and entering now buys a contested position; a falling earning floor means it is emptying out — the same snapshot value, opposite decisions. Set-composition drift is what usually explains a floor change, which is why both ship together. TAO cost is deliberately excluded: a historical cost needs the pool reserves as they were, and reconstructing one from today's reserves would be wrong.","id":"subnet-validator-economics-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/validator-economics/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/validators/economics.json","cache":"short","description":"Fetch every subnet ranked by what it costs to become an EARNING validator there. One row per subnet with the same fields as /api/v1/subnets/{netuid}/validator-economics: the permit floor and the earning floor (which differ by a median of ~7x — a permit is not income), their TAO cost against live pool reserves, validator set composition as three separate counts, open slots, the take distribution, and the emission-gate state. Sort by earning_floor_cost_tao (default, cheapest first), permit_floor_cost_tao, permit_to_earning_multiple, tao_inflow_per_day or validator_headroom; filter on emission_gate_open or cap_binding, where omitting a filter means BOTH rather than false. limit caps the page (default 50, max 512). Every subnet the ranking drops is returned in `excluded` with a reason. The registration burn is excluded from the ranking — it is a live per-subnet read and immaterial to the order; the per-subnet route reports the true entry cost.","id":"validator-economics-ranking","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators/economics","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to earning_floor_cost_tao.","name":"sort","schema":{"default":"earning_floor_cost_tao","enum":["earning_floor_cost_tao","permit_floor_cost_tao","permit_to_earning_multiple","tao_inflow_per_day","validator_headroom"],"type":"string"}},{"name":"limit","schema":{"default":50,"maximum":512,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"maximum":512,"minimum":0,"type":"integer","x-serving-bound":true}},{"name":"emission_gate_open","schema":{"type":"boolean"}},{"name":"cap_binding","schema":{"type":"boolean"}}]},{"artifact_path":"/metagraph/subnets/movers.json","cache":"short","description":"Fetch the cross-subnet momentum leaderboard: every subnet ranked by its change in stake, emission, validator, and neuron count between the window's start and end neuron_daily snapshots, with start/end values, deltas, percentage changes, and each subnet's share of network stake/emission at the end. A network block totals stake/emission/validators across all subnets with gainer/loser/unchanged counts. Sort by stake (default), emission, validators, or neurons; limit caps the list (default 20, max 100). Computed live from the neuron_daily rollup.","id":"subnet-movers","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/movers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to stake.","name":"sort","schema":{"default":"stake","enum":["stake","emission","validators","neurons"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/validators.json","cache":"short","description":"Fetch the network-wide validator/operator leaderboard: validator-permit identities grouped across all current subnet memberships, with trust metrics, cross-subnet stake/emission totals, stake dominance, and top membership rows. Sort by subnet_count (default), uid_count, avg_validator_trust, max_validator_trust, total_stake, total_emission, or stake_dominance; limit caps the list (default 20, max 2000). Computed live from the neurons store.","id":"global-validators","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to subnet_count.","name":"sort","schema":{"default":"subnet_count","enum":["avg_validator_trust","max_validator_trust","stake_dominance","subnet_count","total_emission","total_stake","uid_count"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":2000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/validators/operators.json","cache":"short","description":"Fetch the compact validator operator directory used by the website: hotkeys sharing one observed owner account form a group, while unknown or conflicting owners remain separate. Stable IDs are scoped to the response network; ownership agreement does not verify a declared brand or organization. Retains the primary key and multi-key expansion. Unique nominator counts are available only for singletons because per-hotkey counts cannot deduplicate accounts across members. Computed from the same complete neuron snapshot as /api/v1/validators without changing that full response.","id":"validator-operator-directory","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators/operators","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts.json","cache":"short","description":"Fetch the site-wide accounts leaderboard: every currently-registered hotkey (miners included, not just validator_permit=1 ones) grouped across all current subnet memberships, with cross-subnet stake/emission totals, stake dominance, a validator/miner UID breakdown, and top membership rows. Sort by total_stake (default), total_emission, subnet_count, uid_count, validator_count, stake_dominance, or last_active; limit caps the list (default 20, max 100). Computed live from the neurons store. No 'Free'/spendable-balance or 'Total' column — no balance-tracking tier exists to source them from account_events/neurons.","id":"accounts-list","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to total_stake.","name":"sort","schema":{"default":"total_stake","enum":["total_stake","total_emission","subnet_count","uid_count","validator_count","stake_dominance","last_active"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/directory.json","cache":"short","description":"Fetch the compact account holder directory used by the website: top stake, emission and subnet-reach rankings derived from one complete neuron-snapshot aggregation. Each bounded row carries the account identifiers, totals, footprint and share of priced registered stake required by the directory. The rich independently sortable /api/v1/accounts response remains unchanged.","id":"account-holder-directory","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/directory","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/top-holders.json","cache":"short","description":"Fetch the balance-based top-holder leaderboard: every account (coldkey) with a nonzero free balance and/or delegated stake position, with free/delegated/total TAO columns matching the taostats-style Account/Free/Delegated/Total benchmark /api/v1/accounts explicitly cannot derive. Sort by total_tao (default), free_tao, delegated_tao, or cross-subnet stake flow over a window (net_flow_7d, net_flow_30d, net_flow_90d, #6886/#6887); limit caps the list (default 20, max 100). free_tao is sourced from a direct System::Account chain-state scan (not event-reconstructed, so it can't drift); delegated_tao is this account's own stake positions across every hotkey/subnet, VALUED IN TAO: every position is non-root and therefore denominated in its subnet's alpha token, so each is multiplied by that netuid's alpha_price_tao from the latest daily subnet_snapshots row before summing (#8803) -- a DAILY cadence, so the price can lag up to ~24h behind the live economics tier, and a netuid with no usable price is excluded from the sum rather than counted as zero. total_tao adds it to free_tao, which is valid because both are TAO; net_flow_* is StakeAdded minus StakeRemoved over the window -- a negative value is a real net outflow, not a missing value -- and null-valued rows sort last on the net_flow_* keys. TWO TIERS, SELECTED BY SORT (#9469/#9502). The net_flow_* sorts are LIVE: the top-holders-flow projection lane recomputes all three windows daily from chain.account_events, so captured_at advances and the ranking is a real one. The same lane composes the three holdings sorts from the store -- free_tao from account_balances, delegated_tao by valuing each nominator_positions row as share_fraction x hotkey_alpha.total_alpha x that netuid's alpha_price_tao (#9502 captured the pool totals; neurons.stake_tao covers only hotkeys holding a UID on that exact subnet, 22.8% of position rows, so recomputing from it would drop real top holders out of the ranking), and total_tao as free + delegated ranked across the FULL tables rather than summed over the other two sorts' capped rows, since the top of a sum is not contained in the union of the tops of its addends. A holdings sort is served live ONLY while its producer's most recent pass is recorded COMPLETE: ranking over a partially-loaded ledger returns the largest values PRESENT rather than the largest that EXIST, which is a well-formed leaderboard quietly missing real top holders, and for the pool ledger a missing total silently UNDERPRICES rather than dropping a row. While an input is unproven that sort DECLINES and answers from a fixed materialization taken 2026-08-02 whose captured_at and last_updated do not advance -- an account that has moved TAO since is misreported and one first funded since is absent, so read that ranking as historical and use GET /api/v1/accounts/{ss58}/balance for the live per-account balance. Which sorts are currently live is a property of the artifact, not a fixed list. On a net_flow_*-sorted page the three holdings columns are null rather than zero, because a zero would assert an empty wallet.","id":"top-holders","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/top-holders","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to total_tao.","name":"sort","schema":{"default":"total_tao","enum":["total_tao","free_tao","delegated_tao","net_flow_7d","net_flow_30d","net_flow_90d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/validators/{hotkey}.json","cache":"short","description":"Fetch cross-subnet detail for one validator identity: its validator_permit=1 rows aggregated across every subnet it operates in — cross-subnet totals (stake, emission, avg/max trust) plus a full per-subnet performance table. Computed live from the neurons store. Cold/absent hotkey (no validator-permit rows) returns a zeroed aggregate with an empty subnets array, never a 404.","id":"validator-detail","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators/{hotkey}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/validators/{hotkey}/nominators.json","cache":"short","description":"Fetch the nominator list for one validator: who has staked to it (across every subnet it operates in) over a 7d/30d/90d window, each with staked/unstaked/net/gross TAO and last activity, ranked by net_staked (default), gross_staked, or last_activity. ?coldkey= narrows to one nominator's own flow (exact match). Summed live from the account_events StakeAdded/StakeRemoved stream. Cold/absent hotkey returns an empty list, never a 404. ?basis= selects WHICH QUESTION is answered (#9617), not how well it is answered. basis=flow (the DEFAULT, and everything above) is TAO MOVED within the window, so it cannot see a nominator who staked before the window and has not touched it since -- a dormant delegator is invisible and a long-standing one reads as smaller than they are. basis=positions instead reads the standing position ledger keyed (coldkey, hotkey, netuid): every coldkey (an ss58 address) currently delegating to this hotkey, and how much ALPHA each holds per subnet, whenever they staked. The two are different units over different time semantics -- TAO moved in a window versus alpha held now -- so they are not comparable and the default does not move. On the positions basis, window and sort are REJECTED rather than ignored, because accepting them would imply the snapshot honoured them; nominator_count is the whole delegator set rather than the returned page; and alpha is reported PER SUBNET with no cross-subnet total, since each subnet's alpha is a different token. Nominators are ranked by how many subnets they hold on, then by their largest single-subnet holding, for the same reason. The positions basis DECLINES with degraded.reason pool_totals_unproven while the hotkey_alpha pool ledger has no complete pass -- a partial ledger underprices a nominator rather than dropping them.","id":"validator-nominators","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators/{hotkey}/nominators","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Which question to answer. `flow` (the default) sums TAO MOVED inside `window`, so a delegator who staked earlier and has not touched it since is absent. `positions` reads the standing ledger instead: every coldkey (an ss58 address) delegating right now and how much alpha each holds per subnet, whenever they staked. Different units over different time semantics, so the two are not comparable. On `positions`, `window` and `sort` are REJECTED rather than ignored.","name":"basis","schema":{"default":"flow","enum":["flow","positions"],"type":"string"}},{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to net_staked.","name":"sort","schema":{"default":"net_staked","enum":["net_staked","gross_staked","last_activity"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":2000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"An SS58 account address (47-48 base58 characters). Coldkey or hotkey depending on the tool — see the tool description for which this expects.","name":"coldkey","schema":{"pattern":"^[1-9A-HJ-NP-Za-km-z]{47,48}$","type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/validators/{hotkey}/history.json","cache":"short","description":"Fetch cross-subnet staked-over-time + rewards-per-1000-TAO history for one validator: one point per day, summed across every subnet it operates in that day (stake/emission totals, subnet count, and a normalized reward rate), computed live from the neuron_daily rollup tier. ?window=7d|30d|90d|1y|all.","id":"validator-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/validators/{hotkey}/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/metagraph.json","cache":"short","description":"Fetch the per-UID metagraph (stake, trust, consensus, incentive, dividends, emission, validator_permit, rank, axon) for one subnet, computed live from the neurons store. Add ?validator_permit=true for validators only. Narrow each row to the columns you need with ?fields=uid,hotkey — a comma-separated list of Neuron field names, validated against the published Neuron schema; an unsupported name is a 400. The full response is 256 rows x 17 fields (~95 KB on subnet 1), and ?fields=uid,hotkey is ~18 KB. CSV keeps its own fixed column set.","id":"subnet-metagraph","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/metagraph","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"validator_permit","schema":{"enum":["true"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/neurons/{uid}.json","cache":"short","description":"Fetch a single neuron's metagraph state by UID, computed live from the neurons store. Narrow the row with ?fields=uid,hotkey — a comma-separated list of Neuron field names, validated against the published Neuron schema; an unsupported name is a 400.","id":"subnet-neuron","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/neurons/{uid}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/hyperparameters.json","cache":"short","description":"Fetch one subnet's consensus, economic, and governance hyperparameters (kappa, weight/activity settings, burn cost, liquid alpha, commit-reveal, yuma version, and more), refreshed daily and computed live from the subnet_hyperparams tier.","id":"subnet-hyperparameters","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/hyperparameters","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/hyperparameters/history.json","cache":"short","description":"Fetch the append-only hyperparameter-change timeline for one subnet (#4309): each entry is a subnet_hyperparams snapshot recorded when any hyperparameter changed. Forward-only (no pre-feature history). Newest first; ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging. Pass ?format=csv to download the page as CSV.","id":"subnet-hyperparameters-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/hyperparameters/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/lifecycle.json","cache":"short","description":"Fetch when one subnet was registered or deregistered (#10263): an append-only timeline, newest first, from the subnet_lifecycle Neon table. Entries where predates_capture is true are older than detection and carry a null block_number — that is a real answer, not a missing one. ?limit (<=1000) / ?offset. Pass ?format=csv to download the page as CSV.","id":"subnet-lifecycle","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/lifecycle","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/subnet-lifecycle.json","cache":"short","description":"Fetch every subnet's registrations and deregistrations across the network (#10263), newest first, from the subnet_lifecycle Neon table. ?window=7d|30d|90d|1y|all (default all — a subnet changes state a handful of times in its lifetime, so a short window is almost always empty). ?limit (<=1000). Pass ?format=csv to download the page as CSV.","id":"chain-subnet-lifecycle","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/subnet-lifecycle","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"all","enum":["7d","30d","90d","1y","all"],"type":"string"}},{"name":"limit","schema":{"default":50,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/validators.json","cache":"short","description":"Fetch the validators (validator_permit) of one subnet ranked by stake, computed live from the neurons store. Narrow each row to the columns you need with ?fields=hotkey,stake_tao — a comma-separated list of Neuron field names, validated against the published Neuron schema; an unsupported name is a 400. CSV keeps its own fixed column set.","id":"subnet-validators","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/validators","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/yield.json","cache":"short","description":"Fetch the per-UID emission yield (emission/stake return rate) for one subnet over the current metagraph snapshot, ranked high to low with a distribution summary (subnet aggregate yield, mean, p25/median/p75/p90 percentiles), a validator/miner split, and a per-UID above/below-median label, computed live from the neurons store. Pass ?format=csv to download the ranked neuron rows as CSV.","id":"subnet-yield","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/yield","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/yield/history.json","cache":"short","description":"Fetch the per-day emission-yield distribution trend for one subnet over a 7d/30d/90d window: the subnet-wide return plus the mean, median, and p25/p75/p90 of the per-UID emission-per-stake yields, one point per day (computed live from the neuron_daily rollup). The time-series companion to /yield and the return-rate twin of /concentration/history. Pass ?format=csv to download the per-day series as CSV.","id":"subnet-yield-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/yield/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/miner-fairness.json","cache":"short","description":"Measure whether a subnet's registered miners actually earn, over a 7d/30d/90d window rather than from a snapshot. Every dashboard publishes a miner count; the median subnet has 99.2% of its non-validator UIDs on zero emission, so that count read as a count of earners is close to fiction. Reports the daily zero rate, how many days each miner UID earned on -- `earned on 0 of 31` and `earned on 3 of 31` are different answers a snapshot collapses -- and emission concentration across controlling ENTITIES (the addresses holding the UIDs) as the headline lens, because a subnet with three operators behind 256 UIDs is not diverse and the per-UID Gini alone hides that. Descriptive only: there is no fairness score, because a high Gini on a subnet whose task genuinely has one best answer is not misconduct. For the subnet's measured validator/miner/burned split -- never assume a split constant -- see /subnets/{netuid}/emission-split/history, which also carries the derived per-day USD legs.","id":"subnet-miner-fairness","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/miner-fairness","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/cost-to-participate.json","cache":"short","description":"Read what one subnet says it takes to participate there, beside what the chain exactly charges to enter. THREE KINDS OF NUMBER, NOT INTERCHANGEABLE. entry_cost is MEASURED on chain and exact -- the registration burn from the burn tier and the validator permit and earning floors from validator-economics, re-served here rather than recomputed. declared_compute is what the subnet's own min_compute file SAYS, which is a declaration and not a measurement of anything: the file is an upstream template and it is filled in inconsistently across the fleet. earnings is what miners on this subnet actually earned, projected from miner-fairness, so a floor-to-run never appears on the page without the distribution that says whether running is worth it. NO COST PER DAY IS PUBLISHED. Of the 18 registered declarations 5 ask for a GPU, so crossing the fleet with a rental rate prices hardware most subnets never asked for. THE GPU ANSWER IS FOUR-VALUED: required, not-required, declared-inconsistently (a declared required:False sitting beside a non-zero minimum VRAM or CUDA-core count -- the shape an unedited template field takes, never coerced to either boolean), and null, which means no declaration has been read and is the state 111 of 129 subnets are in. A declared minimum is the floor to RUN, not the spec to EARN, and what the card does not model is served in the payload rather than left on a docs page.","id":"subnet-cost-to-participate","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/cost-to-participate","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/treasury.json","cache":"short","description":"Read what one subnet's own published source declares it allocates to a treasury, against what the chain shows. Some subnets take a share of miner emission in their own validator code, applied before emission is ever assigned -- that is not a chain event and no indexer in this ecosystem can see it. THIS IS A DISCLOSED BUSINESS MODEL, NOT A DISCOVERY: the publishable signal is declared_matches_observed, and agreement is the expected result. THREE STATES MUST NOT BE COLLAPSED INTO TWO: no reading at all means nobody has read this subnet's repositories and the response makes no claim about it; a reading with found:false means a repo was read at a specific commit and nothing was allocated, which is evidence; and a reading with a share is a reviewed finding. Every reading cites the commit SHA that was HEAD when it was read, so a claim can be re-derived by someone who does not trust us. Readings a machine produced but no maintainer has checked publish their read status only, never their finding.","id":"subnet-treasury","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/treasury","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/owner-capture.json","cache":"short","description":"Measure how much of one subnet's emission reaches its owner, per day over a 7d/30d/90d window. Two chain-visible layers: the protocol owner cut (L1, 18%, the same for every subnet) and emission landing on UIDs held by the declared `owner_coldkey` (L2, which varies enormously -- the network median is far above 18%). Also lists those UIDs, each validator's take, and the measured fraction of stake behind them that is NOT the owner's. THIS IS NOT `what the owner takes`: the identity of those nominators (L3) and any treasury cut inside the subnet's own code (L4) are not observable here, and the response says so in `blind_spots`. Every other stakeholder address is reported `unresolved`, which is the honest default and not a finding against them.","id":"subnet-owner-capture","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/owner-capture","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/emission-split/history.json","cache":"short","description":"Fetch the per-day split of one subnet's emission by recipient class over a 7d/30d/90d window: how much went to the owner, to validators, and to miners, one point per day (computed live from the neuron_daily rollup). The validator/miner split is measured from the per-UID rows and is exact; the owner leg and every absolute alpha/TAO figure are reconstructed, because the owner's cut is paid OUTSIDE the UID set -- summing the rows alone yields 82% of the emission, not all of it. Each point also reports how many validator and miner UIDs actually earned anything. Pass ?format=csv to download the per-day series as CSV.","id":"subnet-emission-split-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/emission-split/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/events.json","cache":"short","description":"Fetch the first-party chain-event stream for one subnet (registrations, stake, weights, axon, delegation, lifecycle, transfers), newest first, from the account_events store filtered by netuid. Optional ?kind= filter and ?block_start/?block_end (block-height range); ?limit (<=1000) / ?offset. Pass ?format=csv to download the page as CSV.","id":"subnet-events","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Restrict the result to this kind, matched exactly against the value the rows carry. Open set, so a value nothing matches yields an empty result rather than an error. Omit for every kind.","name":"kind","schema":{"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/event-summary.json","cache":"short","description":"Fetch a windowed event summary for one subnet: account_events counts by kind and coarse category, distinct hotkey/coldkey counts, TAO/alpha sums where applicable, first/last evidence bounds, plus a newest-first evidence slice. ?window=7d|30d|90d (default 30d); ?limit caps recent_events (default 10, max 50). Computed live from the account_events store.","id":"subnet-event-summary","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/event-summary","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"name":"limit","schema":{"default":10,"maximum":50,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/subnets/{netuid}/neurons/{uid}/history.json","cache":"short","description":"Fetch a UID's per-day metagraph history (stake, trust, consensus, incentive, dividends, emission, rank over time), computed live from the neuron_daily rollup tier. ?window=7d|30d|90d|1y|all.","id":"subnet-neuron-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/neurons/{uid}/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/history.json","cache":"short","description":"Fetch a subnet's per-day aggregate history (neuron/validator counts + stake/emission totals) for sparklines, computed live from the neuron_daily rollup tier. ?window=7d|30d|90d|1y|all.","id":"subnet-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/identity-history.json","cache":"short","description":"Fetch the append-only on-chain identity timeline for one subnet (#1647): each entry is a SubnetIdentitiesV3 snapshot recorded when any tracked field changed. Newest first; ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging. Pass ?format=csv to download the page as CSV. Served from the frozen lakehouse export of subnet_identity_history -- no table backs this route, and the export stops where the capture did, so observed_at on each entry says how current it is.","id":"subnet-identity-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/identity-history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}.json","cache":"short","description":"Fetch a cross-subnet activity summary for one account (hotkey or coldkey): chain-event aggregates joined to its current subnet registrations + stake. Computed live from the account_events lakehouse and the neurons tier -- the same rows /accounts/{ss58}/events and /accounts/{ss58}/subnets serve, so the three cannot disagree. A tier that exists and cannot answer declines with a typed 503 (account_summary_unavailable) rather than an all-zero card, which is indistinguishable from an account with no history.","id":"account-summary","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/entities.json","cache":"short","description":"Fetch one address's community-contributed entity labels plus every subnet-ownership tie it has via the chain_events SubnetOwnerChanged stream (#6737-#6740) — either side of an automatic conviction-contest transfer. Only tracks transfers, not genesis ownership.","id":"account-entities","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/entities","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/events.json","cache":"short","description":"Fetch the paginated first-party chain-event history for one account (hotkey or coldkey), newest first. Optional ?kind= filter, ?netuid= to scope to one subnet, and ?block_start/?block_end (block-height range); ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging (#1851). Pass ?format=csv to download the page as CSV.","id":"account-events","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Restrict the result to this kind, matched exactly against the value the rows carry. Open set, so a value nothing matches yields an empty result rather than an error. Omit for every kind.","name":"kind","schema":{"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/history.json","cache":"short","description":"Fetch the durable per-day activity series for one account, newest day first, from the hotkey-keyed account_events_daily rollup (#1854). An ss58 with no hotkey activity returns zero days, since the rollup is hotkey-attributed (unlike /events, which matches the hotkey or coldkey). ?netuid filters to one subnet; ?from / ?to are YYYY-MM-DD bounds; ?limit (<=1000) / ?offset.","id":"account-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"description":"Inclusive first day of the range to read, as YYYY-MM-DD. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"from","schema":{"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"description":"Inclusive last day of the range to read, as YYYY-MM-DD. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"to","schema":{"format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/extrinsics.json","cache":"short","description":"Fetch the extrinsics this account signed (matched by signer), newest first, computed live from the extrinsics tier. Optional ?block_start/?block_end (block-height range); ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging. Pass ?format=csv to download the page as CSV.","id":"account-extrinsics","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/extrinsics","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/transfers.json","cache":"short","description":"Fetch the native-TAO Balances.Transfer feed for one account, newest first, computed live from the account_events store. ?direction=all|sent|received; optional ?block_start/?block_end (block-height range); ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging. Pass ?format=csv to download the page as CSV.","id":"account-transfers","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/transfers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Which side of the flow to count, relative to the account or subnet this route is scoped to. Omit to count both. Options are per-route; see this parameter's enum.","name":"direction","schema":{"enum":["all","sent","received"],"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/counterparties.json","cache":"short","description":"Fetch the per-counterparty fund-flow rollup for one account — or, with ?counterparty=<ss58>, pair-level native-TAO transfer evidence for one relationship — computed live from the account_events store. ?counterparty switches the route from ranked list mode into relationship drilldown mode; ?limit is 1-100, default 20 in list mode, and default 50 when ?counterparty is present. Pass ?format=csv to download the list-mode leaderboard as CSV; it's rejected alongside ?counterparty since the drilldown returns a single composite object, not rows.","id":"account-counterparties","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/counterparties","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"counterparty","schema":{"description":"Optional second SS58 address: switch from the ranked counterparties list to one relationship drilldown (fund-flow totals plus recent transfer evidence). Must differ from ss58.","pattern":"^[1-9A-HJ-NP-Za-km-z]{47,48}$","type":"string"}},{"name":"limit","schema":{"default":20,"description":"Max counterparties to return in list mode, or max transfer evidence rows in relationship drilldown mode when ?counterparty is present. One page size for both modes.","maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/stake-flow.json","cache":"short","description":"Fetch one account's StakeAdded vs StakeRemoved flow per subnet over a recent window (7d/30d/90d): per-subnet net and gross flow with a direction label (accumulating/exiting/churning/idle), plus account totals, an HHI concentration of where the flow is focused, and the dominant subnet — summed live from the account_events store. ?direction=all|in|out filters to inflow (StakeAdded) or outflow (StakeRemoved) only; omitted defaults to all.","id":"account-stake-flow","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/stake-flow","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"description":"Which side of the flow to count, relative to the account or subnet this route is scoped to. Omit to count both. Options are per-route; see this parameter's enum.","name":"direction","schema":{"enum":["all","in","out"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/stake-moves.json","cache":"short","description":"Fetch one account's stake-movement (re-delegation) footprint per subnet over a recent window (7d/30d/90d): each subnet's StakeMoved count with the first and last movement timestamps and the alpha price on the day of the most recent move (from the daily subnet_snapshots rollup), plus account totals, an HHI concentration of where its re-delegation churn is focused, and the dominant subnet — summed live from the account_events store. The account-level companion to GET /api/v1/chain/stake-moves and GET /api/v1/subnets/{netuid}/stake-moves, distinct from net capital flow in GET /api/v1/accounts/{ss58}/stake-flow.","id":"account-stake-moves","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/stake-moves","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/deregistrations.json","cache":"short","description":"Fetch one account's neuron-deregistration footprint per subnet over a recent window (7d/30d/90d): each subnet's NeuronDeregistered eviction count with the first and last eviction timestamps, plus account totals, an HHI concentration of where its deregistration activity is focused, and the dominant subnet — DERIVED from UID reuse (the slots where this account was the PREVIOUS holder); NeuronDeregistered has never been emitted by the runtime, the payload's `derivation` block states the lower bound, and `degraded` marks an answer nothing derived. The eviction-side complement to GET /api/v1/accounts/{ss58}/registrations and the account-level companion to GET /api/v1/chain/deregistrations, distinct from GET /api/v1/accounts/{ss58}/subnets (current registration state).","id":"account-deregistrations","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/deregistrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/prometheus.json","cache":"short","description":"Fetch one account's Prometheus-endpoint serving footprint per subnet over a recent window (7d/30d/90d): each subnet's PrometheusServed announcement count with the first and last announcement timestamps, plus account totals, an HHI concentration of where its telemetry activity is focused, and the dominant subnet — read from the account_events PrometheusServed stream. A successfully read quiet window returns measured zeros; an unavailable source carries `degraded.reason=unavailable`. Operational activity (announcing a Prometheus telemetry endpoint); the telemetry sibling of GET /api/v1/accounts/{ss58}/serving and the account-level companion to GET /api/v1/chain/prometheus, orthogonal to GET /api/v1/accounts/{ss58}/subnets (registration state).","id":"account-prometheus","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/prometheus","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/axon-removals.json","cache":"short","description":"Fetch one account's axon-removal footprint per subnet over a recent window (7d/30d/90d): each subnet's AxonInfoRemoved count with the first and last removal timestamps, plus account totals, an HHI concentration of where its teardown activity is focused, and the dominant subnet — read from the account_events AxonInfoRemoved stream, which the runtime has never populated; an empty footprint is marked `degraded` rather than published as a measured zero. The teardown-side complement to GET /api/v1/accounts/{ss58}/serving (axon announcements) and the account-level companion to GET /api/v1/chain/axon-removals, orthogonal to GET /api/v1/accounts/{ss58}/subnets (registration state).","id":"account-axon-removals","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/axon-removals","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/serving.json","cache":"short","description":"Fetch one account's axon-serving footprint per subnet over a recent window (7d/30d/90d): each subnet's AxonServed announcement count with the first and last announcement timestamps, plus account totals, an HHI concentration of where its serving activity is focused, and the dominant subnet — summed live from the account_events store. Operational activity (announcing an axon endpoint); the account-level companion to GET /api/v1/chain/serving, orthogonal to GET /api/v1/accounts/{ss58}/subnets (registration state) and GET /api/v1/accounts/{ss58}/registrations (registration events).","id":"account-serving","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/serving","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/weight-setters.json","cache":"short","description":"Fetch one account's (validator's) weight-setting footprint per subnet over a recent window (7d/30d): each subnet's WeightsSet count with the first and last set timestamps, plus account totals, an HHI concentration of where its weight-setting activity is focused, and the dominant subnet — summed live from the account_events store. Keyed on the hotkey (the validator submitting weights); the account-level companion to GET /api/v1/chain/weights/setters and GET /api/v1/subnets/{netuid}/weights/setters.","id":"account-weight-setters","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/weight-setters","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/registrations.json","cache":"short","description":"Fetch one account's neuron-registration footprint per subnet over a recent window (7d/30d/90d): each subnet's NeuronRegistered count with the first and last registration timestamps, plus account totals, an HHI concentration of where its registration activity is focused, and the dominant subnet — summed live from the account_events store. Windowed registration events including re-registrations after a deregistration; the account-level companion to GET /api/v1/chain/registrations, distinct from GET /api/v1/accounts/{ss58}/subnets (current registration state).","id":"account-registrations","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/registrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/subnets.json","cache":"short","description":"Fetch the subnets where an account's hotkey is currently registered (its cross-subnet footprint), computed live from the neurons store.","id":"account-subnets","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/subnets","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/portfolio.json","cache":"short","description":"Fetch a wallet's cross-subnet neuron portfolio: each position's economics (stake, emission, rank, trust, incentive, dividends, role) and yield, plus aggregates (totals, subnet/validator counts, overall return, stake concentration). Richer than /subnets; computed live from the neurons store.","id":"account-portfolio","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/portfolio","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/positions.json","cache":"short","description":"Fetch this account's reconstructed nominator-side positions: what it holds delegated across every hotkey/subnet, distinct from /portfolio's hotkey-scoped view. Computed live from nominator_positions joined against the neurons store. Root (netuid 0) stake is not covered.","id":"account-positions","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/positions","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/subnets/{netuid}/history.json","cache":"short","description":"Fetch one wallet's position on one subnet over time (the 'Alpha Holdings chart'): one point per snapshot_date with the position's economics (stake, emission, rank, trust, incentive, dividends, coldkey, role) and yield, computed live from the account_position_daily rollup tier. ?window=7d|30d|90d|1y|all.","id":"account-subnet-position-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/subnets/{netuid}/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","1y","all"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/identity.json","cache":"short","description":"Fetch the latest-only personal chain identity for one account (epic #4301/5.4), computed live from the account_identity tier. has_identity is false for the common case of an account that never called set_identity.","id":"account-identity","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/identity","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/identity-history.json","cache":"short","description":"Fetch the append-only diff-tracking timeline for one account's personal chain identity (epic #4301/5.2): each entry is a snapshot recorded when any tracked field changed. Newest first; ?limit (<=1000) / ?offset, or ?cursor= for stable keyset paging. Pass ?format=csv to download the page as CSV.","id":"account-identity-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/accounts/{ss58}/identity-history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/accounts/{ss58}/balance.json","cache":"short","description":"Fetch the live TAO balance (free + reserved, in TAO) for one account, queried from the finney RPC at request time with 60s KV cache. Returns 400 on invalid ss58; balance_tao is null on RPC failure (200, consistent with blocks/extrinsics null-on-miss).","id":"account-balance","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/accounts/{ss58}/balance","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/root-claim.json","cache":"short","description":"Read deprecated per-subnet Root-claim state with explicit runtime compatibility. Only audited node-subtensor v440 is supported; v441+ reports unsupported, other runtimes or failed reads unavailable, with claim_type/hotkeys null. Runtime and legacy storage are pinned to a finalized block; the runtime is checked before the 120s KV cache. Returns 400 on invalid ss58. This does not report native basket entitlement or submit a claim.","id":"account-root-claim","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/accounts/{ss58}/root-claim","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/children.json","cache":"short","description":"Fetch the live child-hotkey delegation graph for one account (#6723, part of the child-hotkey delegation epic #6721) — every child hotkey this account currently delegates stake-weight to, per subnet, queried from the chain's own ChildKeys storage map at request time with 120s KV cache. subnets is null on RPC failure, distinct from a confirmed empty graph.","id":"account-children","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/accounts/{ss58}/children","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/accounts/{ss58}/parents.json","cache":"short","description":"Fetch the live parent-hotkey delegation graph for one account (#6723, part of epic #6721) — every hotkey currently delegating stake-weight to this account, per subnet, queried from the chain's own ParentKeys storage map at request time with 120s KV cache. subnets is null on RPC failure, distinct from a confirmed empty graph.","id":"account-parents","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/accounts/{ss58}/parents","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/evm/address/{h160}.json","cache":"short","description":"Fetch the live H160 -> SS58 address mapping for one EVM address (#6725/#6728), via the AddressMapping EVM precompile's addressMapping(address), queried from the finney RPC at request time with 1h KV cache. ss58 is null on RPC failure.","id":"evm-address-mapping","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/evm/address/{h160}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/sudo/key.json","cache":"short","description":"Fetch the current Sudo::Key holder, queried from the finney RPC at request time with 1h KV cache (re-scoped from the original Senate/Council membership framing — subtensor has no such pallet, #4310). hotkey is null on RPC failure or an unset sudo key. `field_sources` marks hotkey measured and names the storage item behind it (Sudo.Key).","id":"sudo-key","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/sudo/key","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/network/tao-usd.json","cache":"short","description":"Fetch the TAO/USD index. The TAO/USD index (#9609) -- the current USD price of one TAO with the derivation that produced it, plus the recent series. There is no TAO/USD pair on chain, so this is COMPOSED per ADR 0025 (src/tao-usd-index.ts): a LIQUIDITY-WEIGHTED median across qualifying wTAO/WETH pools, rejecting any pool more than 2% from the unweighted median, refusing to publish below a two-pool quorum, multiplied through an ETH/USDC anchor leg. Composed rather than read from a wTAO/USDC pool deliberately: measured 2026-07-31 all three such pools traded $81k/day combined against WETH/USDC's $118M, ~1,455x deeper, and the thin pools demonstrably misprice -- two well-priced hops beat one badly-priced one. `latest` carries the whole reading together (price, price_basis, eth_usd, block_number, pool_count and the per-pool breakdown) so the number and its audit trail always describe the same block. A NULL usd_per_tao is a STATED OUTCOME, not a gap: the producer writes price_basis `insufficient_pools` when the quorum was not met, and the schema enforces that pairing as a CHECK constraint -- read it as 'not priceable at that block', never as a zero price. ?window=1h|24h|7d|30d (default 24h), newest first, capped at 2000 points; change_usd/change_pct describe the movement across the RETURNED window over PRICED points only, and are null when there is nothing to compare against. point_count and priced_point_count are reported separately: a gap between them is how a window with unpriceable blocks announces itself. THE SERIES BEGINS 2026-08-02 and accrues about one point per minute, so a 30d window today returns everything that exists rather than a month -- `oldest_observed_at` says exactly how far back the answer reaches. Mainnet-only: wrapped TAO on Ethereum has no testnet counterpart.","id":"tao-usd","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/network/tao-usd","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"24h","enum":["1h","24h","7d","30d"],"type":"string"}},{"name":"include_points","schema":{"type":"boolean"}}]},{"artifact_path":"/metagraph/network/parameters.json","cache":"short","description":"Fetch live global Subtensor protocol/governance parameters (#6343) — TaoWeight, StakeThreshold, PendingChildKeyCooldown — queried from the finney RPC at request time with 300s KV cache. Each field is independently null on its own RPC failure. READ `field_sources` BEFORE CITING ANY VALUE HERE: it labels every field measured (with the storage item behind it) or reconstructed (our arithmetic), and three are reconstructed. `block_emission_tao` and `block_emission_halvings` are derived from TotalIssuance, never read from the `BlockEmission` storage item, which is stale at 1.0 TAO (#8747). `emission_gate_exponent_effective` is the runtime default (3) whenever the storage item is unset, which is its current state on finney — that 3 comes from our source tree, not from chain.","id":"network-parameters","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/network/parameters","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/network/randomness.json","cache":"short","description":"Fetch the live drand randomness-beacon status (#6730/#6731) — LastStoredRound, OldestStoredRound — queried from the finney RPC at request time with 30s KV cache. A current-state snapshot, not a history feed. Each field is independently null on its own RPC failure. `field_sources` marks the two rounds measured (Drand.LastStoredRound / Drand.OldestStoredRound) and `stored_round_span` reconstructed — it is our subtraction of them, not a retention window the beacon publishes.","id":"randomness","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/network/randomness","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/wallets.json","cache":"short","description":"Fetch one subnet's declared wallets: the chain-derived owner keys, plus any treasury, burn, payment-collector or multisig address the team has published and somebody has evidenced. EVERY DECLARED WALLET CARRIES ITS source_urls HERE -- reporting an attribution without the evidence is an unsourced allegation, so the proof travels with the claim. `owner` is flagged chain_derived so a consumer can tell a chain read from a human attribution without knowing our schema. Activity is per denomination and never summed across TAO and alpha. An empty list means nothing has been attributed, not that nothing exists.","id":"subnet-wallets","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/wallets","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/owner-cut.json","cache":"short","description":"Fetch one subnet's owner-cut accrual and its disposition. The share is 18% (SubnetOwnerCut is 11796/65535, not one sixth) and is echoed on the response so nobody has to assume it. READ disposition.buckets.unresolved AND disposition.reconciles BEFORE citing any of this: the cut is paid as stake rather than as a liquid balance, so where it went is frequently not determinable from what we index, and `unresolved` is a first-class answer rather than a failure. The buckets are not balanced to tie -- residual_alpha reports what is unaccounted for, and a negative residual means the parts exceed the whole. Never 404s.","id":"subnet-owner-cut","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/owner-cut","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/revenue.json","cache":"short","description":"Fetch one subnet's external revenue against the TAO the network emits to it: the measured tao_total denominator with its alternates, the observed revenue, and the two ratios. coverage_ratio and subsidy_multiple are NULL whenever revenue is not observed -- the normal case for 126 of 128 subnets -- and a client must render null as 'not observed', never as 0%. Only chain-verified and probe-derived contribute to the headline; every declared surface is listed in `sources` with its own provenance. verification.verified false means the response is not defensible.","id":"subnet-revenue","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/revenue","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"1d","enum":["1d","7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/revenue-coverage.json","cache":"short","description":"Fetch every subnet's revenue coverage in one response. observed_count against subnet_count states how much of the network has a readable revenue figure at all. Subnets with no observed revenue are included with null ratios rather than dropped.","id":"chain-revenue-coverage","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/revenue-coverage","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"1d","enum":["1d","7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/recycled.json","cache":"short","description":"Fetch the live cumulative TAO recycled for registration on one subnet, queried from the chain's own RAORecycledForRegistration storage map at request time with 600s KV cache. recycled_tao is null on RPC failure; a subnet with zero registrations reads back a real 0.","id":"subnet-recycled","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/subnets/{netuid}/recycled","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/burn.json","cache":"short","description":"Fetch the live current registration/burn cost for one subnet (#6321) — the dynamic price between the static min_burn_tao/max_burn_tao bounds already in /subnets/{netuid}/hyperparameters, queried from the chain's own Burn storage map at request time with 120s KV cache. burn_tao is null on RPC failure; a subnet with a genuinely zero burn cost reads back a real 0.","id":"subnet-burn","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/subnets/{netuid}/burn","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/burn-history.json","cache":"short","description":"Fetch one subnet's registration-cost series. One subnet's registration-cost series (#9402) — how SubtensorModule.Burn has moved, captured every 15 minutes into the store from the same single-call chain read /chain/burn uses. The live routes answer 'what does it cost'; this answers 'is it getting more expensive', which is the question an operator deciding where and WHEN to register actually has. ?window=24h|7d|30d|90d (default 7d), newest first, bounded. change_tao/change_pct describe the movement across the RETURNED window and are null when there is nothing to compare against — a single point has no change, and a change from a zero base has no percentage. A subnet with no recorded prices returns an empty series, never a 404.","id":"subnet-burn-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/burn/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["24h","7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/holders.json","cache":"short","description":"Fetch who owns one subnet's alpha (#9557) — the top coldkeys by alpha held on that netuid, with each holder's share of the subnet total, how many hotkeys they hold it through, and whole-subnet aggregates (distinct holder count, total measured alpha, top5/top10/top20 concentration). The reverse index of /accounts/{ss58}/positions, which reads the same ledger one coldkey (one account) at a time. Distinct from /subnets/{netuid}/concentration, which computes its scalars off neurons.stake_tao and therefore sees REGISTERED UIDs only: this reads nominator_positions, keyed on (coldkey, hotkey, netuid) whether or not the hotkey holds a UID on the subnet, so alpha staked to UNREGISTERED hotkeys is included — on netuid 74, 92 hotkeys carry positions and 10 are registered there, which is the part no other public source reaches without a full-chain map scan. Valued as share_fraction x hotkey_alpha.total_alpha against ONE proven pool pass, and ranked in ALPHA rather than TAO: within a single subnet alpha is already a common unit, so there is no subnet_snapshots price join and none of its up-to-24h staleness — multiply by the subnet's alpha_price_tao for TAO. limit caps the returned rows (default 20, max 100); holder_count, total_alpha and the three concentration shares are computed across the FULL holder set and then sliced, never over the capped rows, because the top of a sum is not contained in the union of the tops of its addends. TWO STATES DECLINE rather than answer, both with holders:[] plus a degraded.reason and NULL counts: pool_totals_unproven while no hotkey_alpha pass is recorded complete (a partially loaded pool ledger silently UNDERPRICES holders rather than visibly dropping them, so the ranking would be plausible and wrong), and root_not_in_alpha_map for netuid 0, which SubtensorModule::Alpha does not cover at all. A zero in any count is therefore a measured zero, never a decline. Mainnet-only: neither source table carries a network dimension.","id":"subnet-holders","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/holders","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/subnets/{netuid}/surface-history.json","cache":"short","description":"Fetch one subnet's surface audit trail. When one subnet's public surfaces were added, changed or removed, and in which commit (#9612). The registry publishes what a subnet exposes TODAY; this answers when that became true -- the question behind 'did this API move?' and 'when did this subnet stop publishing an OpenAPI spec?'. Each entry names the surface (id, kind, url, name lifted from the recorded overlay), the action (insert, update or delete), the source_commit that produced it, and when it was recorded. A DELETE entry is the only evidence a surface ever existed -- the registry itself carries no trace of a removed surface, which is what makes this trail rather than the surface list the place to ask. IDENTITY IS COALESCED: the upsert path omitted surface_id from its INSERT column list, so 8,831 of the table's 8,892 rows carried a NULL and only the 61 deletes recorded one. Migration 0024 backfilled the column from the overlay's own id -- present on every row -- and the writer now records it, but this route still falls back to the overlay because migrations here are applied by hand and a fresh or restored database will have the nulls back. The overlay itself is READ, not republished: only the fields identifying WHAT changed are lifted out, and a caller wanting the full surface record reads /subnets/{netuid}/surfaces, which is that document's home. surface_count counts distinct surfaces with a recorded mutation, which is NOT the subnet's current surface count -- a deleted surface appears here and not there, and that difference is the point. limit caps the entries (default 50, max 200), newest first. A subnet whose surfaces have never changed returns an empty trail, never a 404 -- stability is the common case. Mainnet-only: the registry sync that writes this table is mainnet's.","id":"subnet-surface-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/surface-history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/chain/governance/emission-changes.json","cache":"short","description":"Fetch the emission-gate change log. Every recorded change to the emission gate (#9615) -- its governance parameters, the per-subnet emission switches, and the dormant TAO-flow path, in one chronological feed. Three append-on-change tables written only when a value actually MOVED, so the tables ARE the change log. /network/parameters serves these as CURRENT state; this answers when they became that and what they were before, which is the question behind 'did governance move the gate before that emission shift?'. ONE FEED, THREE SHAPES: each entry declares its kind (param, subnet or flow) and carries ONLY the fields that kind has -- a param entry has no netuid, a subnet entry has no numeric value -- with the rest ABSENT rather than null, because an absent field says 'this kind has no such thing' where a null would say 'it has one and we do not know it'. predates_capture IS PUBLISHED ON EVERY ENTRY and matters: the sampler records a row the first time it OBSERVES a value, not the first time that value changed, so on such a row previous_value is null and the flag is true -- it is NOT a governance event. predates_capture_count reports how many of the returned entries are first observations, because a reader counting governance events must subtract them. source separates a value governance SET from one the runtime RECOMPUTED, two different events a bare value cannot tell apart. ?kind= filters to one of the three; ?limit= caps the feed (default 50, max 200), newest first ACROSS all three tables -- the union is taken in SQL so the cap means 'the newest N changes' rather than the newest N of each. An empty feed is the steady state, never a 404: these tables only gain rows when something moves. Mainnet-only: the sampler that writes them reads finney.","id":"emission-gate-changes","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/governance/emission-changes","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Restrict the result to this kind. Options are per-tool; see this parameter's enum.","name":"kind","schema":{"enum":["param","subnet","flow"],"type":"string"}},{"name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/chain/holders.json","cache":"short","description":"Fetch every subnet ranked by alpha-ownership concentration. Every subnet ranked by how concentrated its alpha OWNERSHIP is (#9607) — per subnet: the distinct holder count, the measured alpha total, top1/top5/top10/top20 shares, and the largest holder's coldkey (an ss58 address). The cross-subnet companion to /subnets/{netuid}/holders, which answers this one subnet at a time and so costs 129 requests to compare the network. DISTINCT FROM /chain/concentration, which computes Gini/HHI/Nakamoto off neurons.stake_tao and therefore sees REGISTERED UIDs only — on netuid 74 that is 10 of the 92 hotkeys actually carrying positions. This reads the position ledger, so alpha parked on hotkeys holding no UID is measured rather than invisible, and the two routes disagree by design. ALPHA IS NEVER SUMMED ACROSS SUBNETS: each subnet's alpha is a different token, so total_alpha is reported per subnet and the network rollup carries only dimension-free facts — subnets measured, how many have a single account holding a majority, how many have exactly one holder, and the MEDIAN of the top-1 shares. A cross-subnet total requires pricing each subnet's alpha through its own alpha_price_tao first, which is what /accounts/top-holders does. ?sort=top1_share (default), top5_share, top10_share, top20_share, holder_count or total_alpha; a subnet whose share could not be computed sorts LAST rather than reading as the least concentrated. limit caps the returned subnets (default 20, max 512) and the max sits above the subnet count so ranking the whole network is one request. DECLINES rather than answering while the hotkey_alpha pool ledger has no complete pass — an empty subnets array with degraded.reason pool_totals_unproven and a NULL subnet_count, never a zero one. Mainnet-only: neither source table carries a network dimension.","id":"chain-holders","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/holders","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to top1_share.","name":"sort","schema":{"default":"top1_share","enum":["top1_share","top5_share","top10_share","top20_share","holder_count","total_alpha"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":512,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/health/failure-reasons.json","cache":"short","description":"Fetch the probe failure-reason mix. WHY surfaces fail, and whether the mix is changing (#9622). surface_checks.classification is the only record of why a probe failed -- live, redirected, transient, rate-limited, timeout, dead, content-mismatch, unsupported, auth-required, across 1,263,089 checks measured 2026-08-06 -- and nothing served that distribution. /health/history/{date} accepts ?classification= as a FILTER over a dated snapshot ('which surfaces were dead on day D'), which is a different question from 'why are surfaces failing'. THIS READS A ROLLUP, NOT THE RAW TABLE, and that is the point: the raw checks are pruned at 30 days, and the pre-existing daily rollup keeps samples/ok_count/uptime_ratio with NO classification -- it records the RATE of failure and discards the REASON, so every day the answer to 'why did this fail' was expiring. Migration 0025 adds surface_failure_daily, backfills it from everything the raw table still held, and the hourly rollup keeps it current under the same rolled-before-prune contract, so this route is both cheap (7,312 rows for 26 days, against a 7-day raw GROUP BY reading 955,783 rows in 1.14s) and no longer capped at the retention window. SUCCESSFUL PROBES ARE COUNTED TOO, because a rate needs its denominator: 400 timeouts is a different story against 500 checks than against 500,000. share is of every probe in the window and failure_share is of the failing ones only, so neither has to be reconstructed from the other, and failure_share is NULL on a succeeding classification rather than zero. redirected is NOT counted as a failure -- a surface answering from a new location is serving, and the probe's own status says so. THE DEPTH IS PUBLISHED: days_covered is counted from the ROWS rather than from the requested window, so a day the prober did not run is absent rather than reported as a day of perfect health, and oldest_day/newest_day say what was actually covered. ?window= is 7d, 30d (default), 90d or 180d -- windows rather than a free hour count, because the source is a DAILY rollup and an arbitrary hour would imply a resolution it does not have; ?netuid= scopes to one subnet and ?kind= to one surface kind, both applied in SQL. An EMPTY window is a measurement, not a decline: it means the prober recorded nothing in that range. Mainnet-only: the registry whose surfaces are probed is mainnet's.","id":"failure-reasons","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/health/failure-reasons","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","180d"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"description":"Restrict the result to this kind, matched exactly against the value the rows carry. Open set, so a value nothing matches yields an empty result rather than an error. Omit for every kind.","name":"kind","schema":{"type":"string"}}]},{"artifact_path":"/metagraph/search/resolve.json","cache":"short","description":"Resolve a pasted query to the chain entities it could name (metagraphed-infra#362). A block explorer's most common search is an IDENTIFIER, not a question -- an account, a block hash, an extrinsic hash, a netuid -- and every one is recognisable from its shape with no index lookup and no inference. Use this BEFORE /api/v1/search or /api/v1/search/semantic: it answers instantly when the query is an identifier, and returns an empty `matches` when it is not, which is the signal to fall through to corpus search. AMBIGUITY IS RETURNED, NOT GUESSED. `matches` is a list because two inputs have more than one correct reading: a 64-hex string is a block hash OR an extrinsic hash, and a small integer is a netuid AND a block height. Each candidate carries `exact`; `false` means another kind shares the shape, so present the alternatives rather than redirecting. `exact` is NOT an existence claim -- this route looks nothing up. `unambiguous` is true only for a single exact candidate, and is the one field a UI needs to decide between navigating and rendering a choice. An ss58 is checksum-verified, so a one-character typo resolves to NOTHING rather than to an empty account page that reads as 'no activity'. `?q=` is the query; whitespace is trimmed, hex is normalised to lowercase with an 0x prefix. Served live on every network.","id":"search-resolve","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/search/resolve","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"q","schema":{"type":"string"}}]},{"artifact_path":"/metagraph/chain/indexer-lag.json","cache":"short","description":"Fetch the block-indexing latency card. How long after a block is produced it becomes queryable here (#9620). chain_detail_blocks has carried two clocks since migration 0010 -- observed_at, the chain's own timestamp as the firehose poller read it, and synced_at, the wall clock of the sync handler that wrote the row -- and nothing had ever selected the second: the writer binds it on every row and no route, watchdog or artifact read it back. Their difference is the end-to-end age of a block at the moment it became answerable, which is the headline latency question for an API over a chain. TWO DIFFERENT NUMBERS, NAMED SEPARATELY: write_latency_ms is the distribution of synced_at - observed_at -- how long each block took to land, as min/p50/p95/p99/max/mean over the retained window (nearest-rank percentiles). head_age_ms is now - the newest observed_at: how far behind the lane is RIGHT NOW. They diverge exactly when it matters, because a stalled lane keeps a perfect write-latency distribution -- every block it did write, it wrote promptly -- while its head age climbs without bound, so serving either under the other's name would report a dead lane as healthy. THE WINDOW IS PUBLISHED because the table is pruned on a rolling basis (1,862 contiguous blocks, about 6.2 hours, measured 2026-08-05): the block range and the observed_at bounds ride on every response, so this reads as the RECENT distribution it is rather than a lifetime one. A NEGATIVE LATENCY IS SERVED AS MEASURED, never clamped to zero -- the two timestamps come from two clocks, so under block-author clock skew a block can appear to have been written before it was produced, and clamping would suppress that evidence on the one route whose whole subject is the difference between those clocks. DECLINES rather than answering on an empty table: degraded.reason no_retained_blocks with NULL measurements, because a zero-millisecond lag is the most flattering thing this route could say about a dead pipeline. Mainnet-only: the hot tier is written by the mainnet firehose poller and carries no network column, the same reason every off-mainnet block ref resolves against the lakehouse instead.","id":"indexer-lag","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/indexer-lag","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/concentration/history.json","cache":"short","description":"Fetch the network-wide concentration series. Is the NETWORK getting more concentrated (#9628) -- the network-wide concentration card as a per-day series. /subnets/{netuid}/concentration/history has answered that one subnet at a time since it shipped; /chain/concentration had no series at all, so 'is subnet 74 concentrating?' was one request and 'is Bittensor concentrating?' was unanswerable. Each point carries the same five lenses the live card does -- stake, emission, entity_stake, entity_emission, validator_stake, each with holders/total/gini/hhi/hhi_normalized/nakamoto_coefficient/top-K shares/entropy -- plus uids_per_entity and the shape of the day it was computed over (neuron_count, subnet_count, entity_count). THIS READS A ROLLUP, AND THE ROLLUP RAN THE SERVING BUILDER. The per-subnet route computes Gini/HHI/Nakamoto in JS from raw per-UID rows, which works because a netuid slice is about 256 of them; network-wide it is not a slice -- neuron_daily holds 816,803 rows across 27 days, ~30,100 a day (measured 2026-08-06), so a 30-day series computed that way would pull ~900,000 rows into one request. An hourly cron instead computes each COMPLETE day once with buildChainConcentration, the same function /chain/concentration serves, so a historical point and the live card are the same computation by construction rather than a SQL reimplementation that agrees until it quietly does not. The rollup BACKFILLS ITSELF, bounded to a few days a tick, so the history that already exists fills in without a separate recovery path. A STORED COMPUTATION FREEZES THE CODE THAT PRODUCED IT, and that is published rather than hidden: if the builder changes, points computed before and after disagree BY CONSTRUCTION, not because the network moved. Every point carries the builder_version it was computed under and the series reports builder_versions -- more than one means the series changes DEFINITION partway along, and a trend drawn across that boundary is not a trend. THE DEPTH IS THE ROLLUP'S, NOT THE WINDOW'S. neuron_daily is itself only ~27 days deep and the rollup cannot predate it, so a 90d window returns what EXISTS; oldest_day/newest_day and point_count come from the rows, and a day the capture did not run is ABSENT rather than a zero-concentration point, which would read as a perfectly distributed network on a day nothing was measured. Today is never rolled up: neuron_daily gains rows as the capture proceeds, so a mid-day card would be computed over a partial network and then never revisited. A NULL scorecard means no measurable distribution, not a missing one -- computeConcentration returns null when a distribution has no positive values, and substituting zeros would invent a perfectly equal one. ?window= is 7d, 30d (default) or 90d. An EMPTY window is a measurement, not an error. Mainnet-only: neuron_daily carries no network dimension.","id":"chain-concentration-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/concentration/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/emission-pipeline/history.json","cache":"short","description":"Fetch one subnet's emission-pipeline series. One subnet's emission-pipeline decomposition OVER TIME (#9625). /chain/emission-pipeline decomposes the v440 pipeline for every subnet as of ONE BLOCK; subnet_snapshots has persisted that decomposition daily since 2026-08-02 -- emission_share, tao_in_pool_tao, the TAO split (tao_in_emission_tao pool-liquidity injection vs excess_tao chain buys), alpha_in/out_emission, miner_burned_fraction, emission_enabled, first_emission_block, alpha_price_tao, each pinned by pipeline_block/pipeline_block_hash -- and no route read the series, so 'was this subnet's miner burn climbing before its emission dropped?' was unanswerable from data already in the table. THE DEPTH IS FIVE DAYS AND THE ROUTE SAYS SO. subnet_snapshots holds 50,762 rows across 409 days; the PIPELINE columns hold 645 across 5 (measured 2026-08-06, 129 subnets a day, no gaps). oldest_day/newest_day and point_count come from the ROWS, not the window requested, and first_captured_day rides on every response so a caller receiving 5 points for a 90d window reads it as 'the series begins here' rather than '85 days were dropped'. A DAY CAN REPEAT THE PREVIOUS DAY'S OBSERVATION, AND THAT IS PUBLISHED. The daily snapshot writer carries the last pipeline capture forward when a fresh one has not landed for that day -- measured 2026-08-06, that day's row was captured at 05:00 UTC carrying block 8777280, yesterday's, while the chain was at 8782513. So two consecutive points can be THE SAME OBSERVATION, and a consumer reading them as two daily samples would conclude a value was flat when it was simply not re-measured. pipeline_block rides on every point, each point declares repeats_previous_observation, and distinct_observations is reported beside point_count -- the number of times the pipeline was actually READ, which is the honest denominator for any claim about how it moved. ?window= is 7d, 30d (default), 90d or 180d -- windows rather than a free day count, because the source is a daily snapshot. An EMPTY series is a measurement, not an error: a subnet registered after the capture began, or a window narrower than the days that exist, both return one legitimately. Mainnet-only: subnet_snapshots carries no network dimension.","id":"subnet-emission-pipeline-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/emission-pipeline/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","180d"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/deregistration-ranking/history.json","cache":"short","description":"Fetch one subnet's deregistration-rank trajectory. One subnet's trajectory toward or away from the deregistration bar (#10296). /chain/deregistration-ranking answers the pallet's pruning order AS OF ONE BLOCK; #10285's own argument is that 'a single day's rank is noise, a trend is a warning' -- a subnet owner reading rank 94 learns almost nothing, and reading '94, was 71 a month ago, and the price gap to rank 1 has halved' learns exactly what to act on. THE RANK IS NOT STORED AND MUST NOT BE. subnet_deregistration_daily persists the four MEASURED inputs (moving_price, registered_at_block, subnet_mechanism, network_immunity_period) plus the block they were pinned at, never the derived rank, so a later correction to the pallet rule reaches the whole series instead of leaving a record of the old rule's answers. The ranking is REPLAYED from those inputs on read. SO A ONE-SUBNET SERIES READS EVERY SUBNET'S ROWS: rank is RELATIVE and does not exist in one netuid's row, so each day is loaded whole, ranked, and only then narrowed -- 129 rows a day, ~23,000 at the widest window. rank is NULL while immune (an immune subnet holds no position in the prunable order and reporting one would invent a standing it does not have) with `immune` beside it to tell that from an unreadable rank; ranked_count rides with every rank because 94 means different things in a field of 100 and a field of 128; comparison_price is what the pallet compares -- a FLAT 1.0 for a Stable (SubnetMechanism 0) subnet -- published beside the raw moving_price so the substitution is visible rather than inferred. A DAY CAN REPEAT THE PREVIOUS DAY'S OBSERVATION, AND THAT IS PUBLISHED: pinned_block rides on every point, each point declares repeats_previous_observation, and distinct_observations is reported beside point_count -- the honest denominator for any claim that a rank MOVED, because a rank that was not re-measured must not read as a rank that held steady. WHAT THE SERIES ALREADY SHOWS, replayed against production 2026-08-15 with six days written: netuid 70 sat at rank 1 on 2026-08-10 and 2026-08-11 with registered_at_block 7,787,562; on 2026-08-12 its registered_at_block is 8,825,571 -- 130 blocks before that day's pin -- its moving price is 4.0e-8 and it is immune for another 863,870 blocks. It was deregistered and re-registered, exactly as the ranking had it two days earlier, and its price has climbed back every day since. Netuid 36 inherited rank 1 and has fallen on every one of the six days. Neither fact is visible in a single day's answer. ?window= is 7d, 30d (default), 90d or 180d -- windows rather than a free day count, because the source is a daily lane. oldest_day/newest_day and point_count come from the ROWS, not the window requested, and first_captured_day (2026-08-10) rides on every response so a caller receiving six points for a 90d window reads it as 'the series begins here' rather than '84 days were dropped'. An EMPTY series is a measurement, not an error: a subnet registered after the lane began returns one legitimately. Mainnet-only: subnet_deregistration_daily carries no network dimension.","id":"subnet-deregistration-ranking-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/deregistration-ranking/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d","180d"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/burn.json","cache":"short","description":"Fetch every subnet's live registration/burn cost in one response, ranked cheapest-first (#9399). Every subnet's live registration/burn cost in ONE response, ranked cheapest-first (#9399). The cross-subnet companion to /subnets/{netuid}/burn, which answers the same question one subnet at a time — 129 requests to compare them all. Served from a single chain read: Burn is an Identity-hashed map, so every key is derivable from its netuid and state_queryStorageAt returns them together. 120s KV cache, matching the per-subnet route (burn moves within minutes during registration bursts). REGISTRATION ECONOMICS, NOT A TEAM BURN (#10482): this is what it costs to register a UID, and nothing here measures a team destroying tokens it said it would destroy. That separate concept is named `token_burn` and is carried by the entity `burn` role (schemas/entity.schema.json), which requires an `unspendable_proof`. The two share a word and nothing else. A subnet whose burn is a genuine 0 is included, not dropped. subnet_count is what the chain reports exists (TotalNetworks) and read_count is how many were actually read — a gap between them means the read was partial. NOTE: there is no separate validator-permit price; permits are granted by the StakeThreshold, not purchased.","id":"chain-burn","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/burn","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/ownership-history.json","cache":"short","description":"Fetch every ownership transfer one subnet has undergone (#6637, part of the conviction/ownership-contest tracker epic #4302) — see docs/conviction-lock-mechanism.md for the on-chain mechanism: a permissionless, conviction-weighted contest that runs continuously for every subnet, where ownership transfers automatically once a challenger's rolled conviction overtakes the incumbent owner's (no vote, no owner cooperation required). Two sources, labelled per record by `source`: `chain-event` records are decoded from the chain_events SubnetOwnerChanged stream and carry the block that emitted them, while `owner-observation` records are inferred from two consecutive owner captures, so their observed_at is when the change was NOTICED and block_number is null. Both are needed because a subnet's owning account can change without that event ever being emitted. observed_through reports how far the observation source covers this subnet at all. Served live from the all-events tier (ADR 0013), falling to the R2 lakehouse reader when that tier cannot answer, no static file. A subnet that has never changed hands returns an empty ownership_changes array, not an error — that's the common case.","id":"subnet-ownership-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/ownership-history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/conviction.json","cache":"short","description":"Fetch the live per-subnet conviction leaderboard (#6638, part of the conviction/ownership-contest tracker epic #4302) — who currently holds the most rolled conviction, i.e. how close the subnet is to an automatic ownership flip. Companion to /ownership-history (that's the event log of past flips; this is the current standings). Rolls the current lock state forward using the CURRENT live-queried unlock_rate/maturity_rate — never a hardcoded figure, both are independently governance-adjustable and confirmed to differ from each other. Read from chain storage at request time, no static file. A subnet with no active challengers/owner lock returns an empty leaderboard, not an error — that's the common case.","id":"subnet-conviction","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/conviction","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/lease.json","cache":"short","description":"Fetch the live subnet-lease state (#6719, part of the subnet-leasing/crowdloan-tracking epic #6717) — whether a subnet is currently under a lease and, if so, its terms + accumulated-but-undistributed alpha dividends, queried from the chain's own SubnetUidToLeaseId/SubnetLeases/AccumulatedLeaseDividends storage maps at request time with 120s KV cache. leased is null (not false) on RPC failure, distinct from a confirmed no-lease (leased:false).","id":"subnet-lease","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/subnets/{netuid}/lease","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/crowdloans.json","cache":"short","description":"List every crowdloan the chain has ever opened (#8696), with its terms and how much it raised, queried from the Crowdloan pallet's own NextCrowdloanId/Crowdloans storage at request time with 120s KV cache. Not paginated: the collection is bounded by NextCrowdloanId and fetched in one batched storage read. A dissolved crowdloan is omitted, so crowdloan_count can be lower than next_crowdloan_id; a failed chain read yields crowdloan_count null plus a `degraded` block rather than 0 (#9898). Every crowdloan on finney today is finalized, so this is a record of completed raises rather than a feed of open ones — read `finalized` and `end` rather than assuming liveness.","id":"crowdloans","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/crowdloans","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/crowdloans/{crowdloan_id}.json","cache":"short","description":"Fetch one crowdloan's live state (#8696) from the Crowdloan pallet's Crowdloans storage map at request time with 120s KV cache. exists is null (not false) on RPC failure, distinct from a confirmed-absent id (exists:false) — an id can be legitimately absent because dissolve removes the record while NextCrowdloanId keeps counting.","id":"crowdloan-detail","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/crowdloans/{crowdloan_id}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/subnets/{netuid}/lease/history.json","cache":"short","description":"Fetch every SubnetLeaseCreated/SubnetLeaseTerminated event one subnet has had (#6719, part of epic #6717), decoded from the account_events stream #6718 started capturing. Served live from the chain_events lakehouse table, no static file. A subnet that has never been leased returns an empty lease_events array, not an error — that's the common case.","id":"subnet-lease-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/lease/history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/blocks.json","cache":"short","description":"Fetch the recent-block feed (newest first) for the block explorer; ?limit (<=100) / ?offset, or ?cursor= for stable keyset paging under head-of-chain inserts (#1851). A conjunctive (AND-ed) filter set (#1991) narrows the feed: ?author=<ss58>, ?spec_version=<n>, ?from / ?to (observed_at epoch-ms), ?block_start / ?block_end (height range), ?min_extrinsics / ?min_events (non-empty blocks). Pass ?format=csv to download the filtered block rows as CSV. Computed live from the first-party blocks tier (#1345).","id":"blocks-feed","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"name":"author","schema":{"type":"string"}},{"name":"spec_version","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive first `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be later than the range's upper bound.","name":"from","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"to","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"name":"min_extrinsics","schema":{"minimum":0,"type":"integer"}},{"name":"min_events","schema":{"minimum":0,"type":"integer"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/blocks/summary.json","cache":"short","description":"Fetch block-production analytics over recent blocks: inter-block time distribution, extrinsic/event throughput, block-author decentralization (concentration over each author's block count), and the spec-version spread. Precomputed by a cron from that network's decoded blocks; schema-stable zeroed card when the projection is cold.","id":"blocks-summary","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks/summary","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/blocks/{ref}.json","cache":"short","description":"Fetch per-block detail by numeric block_number or 0x block_hash. Computed live from the first-party blocks tier (#1345); 200 with block:null when cold/unknown.","id":"block-detail","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks/{ref}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/blocks/{ref}/extrinsics.json","cache":"short","description":"Fetch the extrinsics in one block (by numeric block_number or 0x block_hash), in natural order; ?limit (<=100) / ?offset. Computed live from the first-party extrinsics tier (#1845); 200 with extrinsics:[] when cold/unknown.","id":"block-extrinsics","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks/{ref}/extrinsics","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/blocks/{ref}/events.json","cache":"short","description":"Fetch the ACCOUNT-ATTRIBUTED events in one block (by numeric block_number or 0x block_hash), in natural order; ?limit (<=1000) / ?offset. This is the curated account_events projection -- a deliberate SUBSET of /api/v1/blocks/{ref}/chain-events (the complete pallet-level stream the block header's event_count counts), narrower by design rather than by loss. 200 with events:[] when cold/unknown.","id":"block-events","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks/{ref}/events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":100,"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/export/chain-events.json","cache":"short","description":"Fetch up to 25,000 chain events in one call -- the same rows, filters and ordering as /api/v1/chain-events, without the 100-row page ceiling or the cursor bookkeeping that comes with it. ?pallet / ?method narrow by event id; ?before reads down from a block number, which is how a caller walks a large range in deliberate chunks; ?limit caps the call (<=25000, default 5000). REQUIRES PAYMENT: this route answers 402 with an x402 quote when no payment is presented, on Base or Solana -- see /.well-known/x402. It is the one family that does; every other route on this API serves an unpaid caller normally. Served live, no static file.","id":"export-chain-events","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/export/chain-events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"pallet","schema":{"maxLength":64,"type":"string"}},{"name":"method","schema":{"maxLength":64,"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"before","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":5000,"maximum":25000,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/chain-events.json","cache":"short","description":"Fetch the recent all-events feed (newest first) from the chain_events lakehouse table — every raw pallet.method event, distinct from the curated account-attributed stream. ?pallet / ?method narrow by event id (1-64 ASCII identifier chars); ?block (+ optional ?extrinsic) scopes to one block or extrinsic; ?cursor is the lossless block_number.event_index keyset cursor and ?before is the legacy block_number-only cursor; ?limit caps the page (<=200, default 50). Pass ?format=csv to download the page as CSV. Each page reads one bounded block window below its ceiling, so a short page still carries a continuation rather than ending the feed. Served live, no static file.","id":"chain-events-feed","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain-events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"pallet","schema":{"maxLength":64,"type":"string"}},{"name":"method","schema":{"maxLength":64,"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block","schema":{"minimum":0,"type":"integer"}},{"name":"extrinsic","schema":{"minimum":0,"type":"integer"}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"description":"Opaque block_number.event_index cursor returned as next_cursor; both parts are non-negative safe integers.","type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"before","schema":{"minimum":0,"type":"integer"}},{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain-events/stats.json","cache":"short","description":"Fetch the chain-activity aggregate — the pallet.method event distribution over the most recent N blocks the decode lane has published — from the chain_events lakehouse table. ?blocks sets the window (default 1000, capped 5000); activity is ordered by count descending (top 100). Backs the get_chain_activity MCP tool. Served live, no static file.","id":"chain-events-stats","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain-events/stats","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"blocks","schema":{"maximum":5000,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/blocks/{ref}/chain-events.json","cache":"short","description":"Fetch EVERY raw pallet-level event in one block (by numeric block_number; event_index ascending), served live from the live-follow hot tier above the decode seam and the chain_events lakehouse at or below it (no static file). This is the complete stream, so its count matches the block header's own event_count; /api/v1/blocks/{ref}/events is deliberately a SUBSET of it -- the curated account-attributed projection, which is smaller by design and not a loss. A block neither tier can read declines with a typed 503 (block_detail_unavailable) rather than an empty list, because count:0 is indistinguishable from a block that emitted nothing.","id":"block-chain-events","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/blocks/{ref}/chain-events","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/extrinsics.json","cache":"short","description":"Fetch the recent-extrinsic feed (newest first) for the block explorer; ?limit (<=100) / ?offset (or ?cursor= for stable keyset paging, #1851) and a conjunctive filter set (#1846): ?block=<n>, ?signer=, ?call_module=, ?call_function=, ?call_hash= (0x-prefixed 64-hex-char decoded call hash, requires ?call_module= to keep the JSON scan scoped — matches a Multisig approval chain's linked calls, #4322), ?success=true|false, ?block_start/?block_end (block range), ?from/?to (observed_at epoch-ms range). Pass ?format=csv to download the filtered extrinsic rows as CSV. Computed live from the first-party extrinsics tier (#1345).","id":"extrinsics-feed","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/extrinsics","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block","schema":{"minimum":0,"type":"integer"}},{"name":"signer","schema":{"type":"string"}},{"name":"call_module","schema":{"maxLength":100,"type":"string"}},{"name":"call_function","schema":{"type":"string"}},{"description":"Requires call_module so the decoded call-args JSON scan stays scoped.","name":"call_hash","schema":{"pattern":"^0x[0-9a-fA-F]{64}$","type":"string"}},{"name":"success","schema":{"enum":["true","false"],"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive first `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be later than the range's upper bound.","name":"from","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"to","schema":{"minimum":0,"type":"integer"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/extrinsics/{hash}.json","cache":"short","description":"Fetch per-extrinsic detail by 0x extrinsic_hash OR the composite <block_number>-<extrinsic_index> id (the guaranteed-present identifier, since the hash is best-effort/nullable). Computed live from the first-party extrinsics tier (#1345/#1848); 200 with extrinsic:null when cold/unknown/malformed.","id":"extrinsic-detail","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/extrinsics/{hash}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/sudo.json","cache":"short","description":"Fetch the root-origin (Sudo pallet) call table, newest first — subtensor has no Council/Senate, so this is the extrinsics feed hardcoded to call_module='Sudo'. ?limit (<=100) / ?offset (or ?cursor= for stable keyset paging) and a conjunctive filter set: ?block=<n>, ?call_function=, ?success=true|false, ?block_start/?block_end (block range), ?from/?to (observed_at epoch-ms range). Pass ?format=csv to download the filtered rows as CSV. Computed live from the first-party extrinsics tier (#4310/2.2).","id":"sudo-calls","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/sudo","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block","schema":{"minimum":0,"type":"integer"}},{"name":"call_function","schema":{"type":"string"}},{"name":"success","schema":{"enum":["true","false"],"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive first `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be later than the range's upper bound.","name":"from","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"to","schema":{"minimum":0,"type":"integer"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/governance/config-changes.json","cache":"short","description":"Fetch subtensor's own root-origin hyperparameter/network-config change feed, newest first — the extrinsics feed hardcoded to call_module='AdminUtils' (re-scoped from the original Council/Senate framing; subtensor has no such pallet). ?limit (<=100) / ?offset (or ?cursor= for stable keyset paging) and a conjunctive filter set: ?block=<n>, ?call_function= (e.g. sudo_set_tempo), ?success=true|false, ?block_start/?block_end (block range), ?from/?to (observed_at epoch-ms range). Pass ?format=csv to download the filtered rows as CSV. Computed live from the first-party extrinsics tier (#4310/2.3).","id":"governance-config-changes","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/governance/config-changes","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"offset","schema":{"default":0,"maximum":1000000,"minimum":0,"type":"integer","x-serving-bound":true}},{"description":"Opaque pagination token: pass back the `next_cursor` from the previous response verbatim. Its contents are not stable and must not be parsed or constructed. Stable across inserts, unlike a row offset.","name":"cursor","schema":{"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block","schema":{"minimum":0,"type":"integer"}},{"name":"call_function","schema":{"type":"string"}},{"name":"success","schema":{"enum":["true","false"],"type":"string"}},{"description":"Inclusive first block height of the range to read. Omit for an unbounded end. Must not be later than the range's upper bound.","name":"block_start","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last block height of the range to read. Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"block_end","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive first `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be later than the range's upper bound.","name":"from","schema":{"minimum":0,"type":"integer"}},{"description":"Inclusive last `observed_at` bound, as epoch MILLISECONDS -- not a block height (use block_start/block_end for that). Omit for an unbounded end. Must not be earlier than the range's lower bound.","name":"to","schema":{"minimum":0,"type":"integer"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/networks.json","cache":"short","description":"List every addressable network and what it actually serves. For each network: its canonical id, chain name, every accepted alias, and the route families it serves, does not serve, or serves partially. Answers \"can I get chain data on testnet?\" without making a request that fails. Reachable under every network prefix (/api/v1/networks, /api/v1/testnet/networks, /api/v1/local/networks) and identical on all of them — it is the one route that never 404s on any network, because it is how you find out what does.","id":"network-capabilities","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/networks","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/runtime.json","cache":"short","description":"Fetch the spec-version transition timeline — the earliest known block at each distinct runtime spec_version, ascending by block_number. A single aggregate over the whole retained blocks window, nothing to filter or paginate. Every block from genesis to head carries a spec_version reading, so coverage_from_block/coverage_from_at and coverage_gaps describe a complete timeline rather than bounding a partial one. Computed live from the first-party blocks tier (#4316/3.1, #9265). The `current` block (#8702) adds the forward-looking half: live mainnet/testnet spec versions, the latest subtensor release, and a derived pending_upgrade state of none / testnet_soaking / released_undeployed / unknown. Every field is independently null on its own upstream failure, and a missing reading yields \"unknown\" rather than \"none\" — the two are opposite answers. No deploy date is predicted anywhere in the payload: the foundation publishes no schedule. Pass ?format=csv to download the transition timeline as CSV (the current_spec_version + coverage_from_* rollup and the `current` block stay JSON-only).","id":"runtime-versions","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/runtime","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Response format override. Use `csv` to download the transition timeline as text/csv; `json` (default) keeps the response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/activity.json","cache":"short","description":"Fetch daily network-activity aggregates (extrinsic/event/block counts, success rate, unique signers) over a 7d or 30d window, newest day first. Computed live from the first-party chain tiers (#1987); schema-stable day_count:0/days:[] when the store is cold.","id":"chain-activity","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/activity","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"description":"Response format override. Use `csv` to download the daily activity series as text/csv; `json` (default) keeps the response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/calls.json","cache":"short","description":"Fetch the extrinsic call-mix breakdown (count + share per call_module, or call_module/call_function with group_by=module_function) over a 7d or 30d window, optionally scoped to one pallet with ?call_module=. When scoped, total_extrinsics and share use the scoped module denominator. Computed live from the first-party extrinsics tier (#1989); schema-stable call_count:0/calls:[] when cold.","id":"chain-calls","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/calls","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"group_by","schema":{"enum":["module","module_function"],"type":"string"}},{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"call_module","schema":{"maxLength":100,"type":"string"}},{"description":"Response format override. Use `csv` to download the call-mix rows as text/csv; `json` (default) keeps the response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/signers.json","cache":"short","description":"Fetch the windowed most-active-account leaderboard (signers ranked by ?sort=tx_count or ?sort=total_fee_tao, with total fees/tips + newest signed block) over a 7d or 30d window, optionally scoped to one pallet with ?call_module=. Computed live from the first-party extrinsics tier (#1990); schema-stable signer_count:0/signers:[] when cold.","id":"chain-signers","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/signers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to tx_count.","name":"sort","schema":{"default":"tx_count","enum":["tx_count","total_fee_tao"],"type":"string"}},{"name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"call_module","schema":{"maxLength":100,"type":"string"}},{"description":"Response format override. Use `csv` to download the signer leaderboard as text/csv; `json` (default) keeps the response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/transfers.json","cache":"short","description":"Fetch network-wide native-TAO transfer analytics over a 7d or 30d window: total Balances.Transfer volume + count, distinct senders/receivers, the top senders and receivers ranked by volume (?limit, <=100), and the top senders' share of total volume. Computed live from the account_events Transfer feed; schema-stable zeros + empty leaderboards when cold. Pass ?format=csv to download the top senders and receivers as one CSV tagged by a `direction` column (the totals + top_sender_share stay JSON-only).","id":"chain-transfers","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/transfers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":25,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/transfer-pairs.json","cache":"short","description":"Fetch network-wide directed native-TAO transfer-pair analytics over a 7d or 30d window: total pairable Balances.Transfer volume + count, unique sender/receiver pairs, returned pair count, top-pair share, and top sender -> receiver pairs ranked by ?sort=volume or ?sort=count (?limit, <=100). Computed live from the account_events Transfer feed; schema-stable zeros + an empty pairs list when cold. Pass ?format=csv to download the ranked pairs as CSV (the totals + top_pair_share stay JSON-only).","id":"chain-transfer-pairs","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/transfer-pairs","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":25,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to volume.","name":"sort","schema":{"default":"volume","enum":["volume","count"],"type":"string"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/stake-flow.json","cache":"short","description":"Fetch network-wide cross-subnet capital flow over a 7d or 30d window: every subnet that moved stake in the window ranked by net StakeAdded minus StakeRemoved TAO (subnets with no stake events in the window are excluded) (biggest net inflow first, ?limit <=100), with per-subnet staked/unstaked/net/gross totals and a direction label, a network rollup, and a distribution (count, mean, min, p25, median, p75, p90, max) of the per-subnet net flow. Computed live from the account_events stake stream; schema-stable zeros + empty leaderboard when cold.","id":"chain-stake-flow","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/stake-flow","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the per-subnet capital-flow leaderboard as text/csv; `json` (default) keeps the response envelope (which also carries the network rollup + net-flow distribution).","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/alpha-volume.json","cache":"short","description":"Fetch the network-wide rolling 24h buy/sell alpha-volume leaderboard: every subnet that had StakeAdded (buy) or StakeRemoved (sell) volume in the last 24h (subnets with no volume are excluded) ranked by total_volume_tao (biggest market activity first, ?limit <=100), each with the same buy/sell/total volume + sentiment scorecard as GET /api/v1/subnets/{netuid}/volume, plus a network rollup (with its own net/gross sentiment reading) and a distribution (count, mean, min, p25, median, p75, p90, max) of the per-subnet total volume. Computed live from the account_events stream; schema-stable zeros + empty leaderboard when cold. Fixed 24h window (no ?window= param), matching the per-subnet route's own framing.","id":"chain-alpha-volume","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/alpha-volume","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/weights.json","cache":"short","description":"Fetch network-wide validator weight-setting activity over a 7d or 30d window across the subnets with observed weight-setting activity (subnets with no WeightsSet events are absent): a per-subnet leaderboard (distinct weight-setting validators, WeightsSet event count, and average updates per validator) ranked by total events, a network rollup with the true distinct setter count (a validator setting weights on several subnets counts once) and total events, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet update intensity. `limit` caps the leaderboard (default 20, max 100). Computed live from the account_events WeightsSet stream; schema-stable empty block when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-weights","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/weights","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/weights/setters.json","cache":"short","description":"Fetch the network-wide weight-setter leaderboard over a 7d or 30d window: the individual validators driving consensus across every subnet ranked by activity, each with its total WeightsSet count (summed across every subnet it operates on), its share of the network total, and its first/last set time. `limit` caps the returned page (default 20, max 100); `distinct_setters` always reports the true network-wide total regardless of `limit`. The network-wide companion to GET /api/v1/subnets/{netuid}/weights/setters. Computed live from the account_events WeightsSet stream; schema-stable empty leaderboard when cold. Pass ?format=csv to download the leaderboard as CSV.","id":"chain-weight-setters","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/weights/setters","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/serving.json","cache":"short","description":"Fetch network-wide axon-serving announcement activity over a 7d or 30d window across the subnets with observed serving activity (subnets with no AxonServed events are absent): a per-subnet leaderboard (AxonServed event count, distinct servers, and average announcements per server) ranked by total announcements, a network rollup with the true distinct server count (a hotkey announcing on several subnets counts once) and total announcements, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-announcement intensity. `limit` caps the leaderboard (default 20, max 100). Computed live from the account_events AxonServed stream; schema-stable empty block when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-serving","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/serving","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/axon-removals.json","cache":"short","description":"Fetch network-wide axon-removal activity over a 7d or 30d window across the subnets with observed removal activity (subnets with no AxonInfoRemoved events are absent): a per-subnet leaderboard (AxonInfoRemoved event count, distinct removers, and average removals per remover) ranked by total removals, a network rollup with the true distinct remover count (a hotkey removing an axon on several subnets counts once) and total removals, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-teardown intensity. `limit` caps the leaderboard (default 20, max 100). The teardown-side companion to the axon-announcement GET /api/v1/chain/serving and the network-wide companion to GET /api/v1/subnets/{netuid}/axon-removals. Read from the account_events AxonInfoRemoved stream, which the runtime has never populated; an empty block is marked `degraded` rather than published as a measured zero. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-axon-removals","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/axon-removals","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/prometheus.json","cache":"short","description":"Fetch network-wide Prometheus-endpoint serving activity over a 7d or 30d window across the subnets with observed telemetry activity (subnets with no PrometheusServed events are absent): a per-subnet leaderboard (PrometheusServed event count, distinct exporters, and average announcements per exporter) ranked by total announcements, a network rollup with the true distinct exporter count (a hotkey announcing on several subnets counts once) and total announcements, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-announcement intensity. `limit` caps the leaderboard (default 20, max 100). The telemetry-endpoint companion to the axon-endpoint GET /api/v1/chain/serving — which subnets run observability infrastructure. Read from the account_events PrometheusServed stream. A successfully read quiet window returns measured zeros; an unavailable source carries `degraded.reason=unavailable`. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-prometheus","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/prometheus","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/registrations.json","cache":"short","description":"Fetch network-wide neuron-registration activity over a 7d or 30d window across the subnets with observed registration activity (subnets with no NeuronRegistered events are absent): a per-subnet leaderboard (NeuronRegistered event count, distinct registrants, and average registrations per registrant) ranked by total registrations, a network rollup with the true distinct registrant count (a hotkey registering on several subnets counts once) and total registrations, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-registration intensity. `limit` caps the leaderboard (default 20, max 100). Raw registration demand — the account_events companion to the neuron_daily validator-set churn in GET /api/v1/chain/turnover. Computed live from the account_events NeuronRegistered stream; schema-stable empty block when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-registrations","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/registrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/deregistrations.json","cache":"short","description":"Fetch network-wide neuron-deregistration activity over a 7d or 30d window across the subnets with observed deregistration activity (subnets with no NeuronDeregistered events are absent): a per-subnet leaderboard (NeuronDeregistered event count, distinct deregistered hotkeys, and average deregistrations per hotkey) ranked by total deregistrations, a network rollup with the true distinct hotkey count (a hotkey deregistered on several subnets counts once) and total deregistrations, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-deregistration intensity. `limit` caps the leaderboard (default 20, max 100). Raw deregistration/eviction activity — the exit-side companion to GET /api/v1/chain/registrations and the account_events companion to the neuron_daily validator-set churn in GET /api/v1/chain/turnover. DERIVED from UID reuse in the NeuronRegistered stream by a scheduled projection (NeuronDeregistered has never been emitted by the runtime); the payload's `derivation` block states how many window registrations had no observable previous holder, and `degraded` marks an answer nothing derived. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-deregistrations","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/deregistrations","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/stake-transfers.json","cache":"short","description":"Fetch network-wide stake-transfer activity over a 7d or 30d window across the subnets with observed transfer activity (subnets with no StakeTransferred events are absent): a per-subnet leaderboard (StakeTransferred event count, distinct senders, and average transfers per sender) ranked by total transfers, a network rollup with the true distinct sender count (an account transferring stake out of several subnets counts once) and total transfers, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet transfer intensity. `limit` caps the leaderboard (default 20, max 100). The between-coldkeys companion to the within-account re-delegation churn of GET /api/v1/chain/stake-moves — transfer_stake relocates staked alpha from one account to another on the same hotkey (origin leg only), so it moves ownership, not net capital. Computed live from the account_events StakeTransferred stream; schema-stable empty block when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-stake-transfers","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/stake-transfers","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/stake-moves.json","cache":"short","description":"Fetch network-wide stake-movement (re-delegation) activity over a 7d or 30d window across the subnets with observed movement activity (subnets with no StakeMoved events are absent): a per-subnet leaderboard (StakeMoved event count, distinct movers, and average movements per mover) ranked by total movements, a network rollup with the true distinct mover count (an account moving stake out of several subnets counts once) and total movements, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet re-move intensity. `limit` caps the leaderboard (default 20, max 100). The re-delegation-churn companion to the net-capital-flow GET /api/v1/chain/stake-flow — move_stake relocates stake between hotkeys/subnets without unstaking, so it is churn, not flow. Computed live from the account_events StakeMoved stream; schema-stable empty block when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + intensity distribution stay JSON-only).","id":"chain-stake-moves","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/stake-moves","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/fees.json","cache":"short","description":"Fetch fee/tip market analytics — a per-UTC-day fee series (totals, plus averages and exact ordered-offset medians computed over signed extrinsics only) plus a windowed top-fee-payer list — over a 7d or 30d window, optionally scoped to one pallet with ?call_module=. extrinsic_count counts every extrinsic including unsigned inherents; signed_extrinsic_count is the denominator for the averages/medians. Computed live from the first-party extrinsics tier (#1988); schema-stable day_count:0 + empty lists when cold.","id":"chain-fees","mainnet_only":false,"method":"GET","networks":["finney","mainnet","test","testnet"],"path":"/api/v1/chain/fees","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"limit","schema":{"default":25,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"name":"call_module","schema":{"maxLength":100,"type":"string"}},{"description":"Response format override. Use `csv` to download the daily fee series as text/csv; `json` (default) keeps the response envelope (which also carries top_fee_payers).","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/chain/concentration.json","cache":"short","description":"Fetch network-wide stake and emission concentration metrics (Gini, HHI, Nakamoto coefficient, top-percentile shares, entropy) aggregated across all subnets' neurons over three lenses (per-UID, per-entity with coldkeys collapsed across subnets into the network control distribution, and validator-only consensus power), computed live from the neurons store; schema-stable nulls when cold.","id":"chain-concentration","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/concentration","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/concentration/subnets.json","cache":"short","description":"Fetch every subnet ranked by distribution spread. Every subnet ranked by how widely one lens of its distribution is SPREAD (#9717) — the screening question a prospective miner actually asks, and the one that used to cost 129 requests. Per subnet: holders, the measured total, gini, hhi, hhi_normalized, nakamoto_coefficient, top1/top5/top10/top20 shares, entropy, plus neuron_count/entity_count/uids_per_entity. THE SAME COMPUTATION /subnets/{netuid}/concentration SERVES: this groups the neurons read by netuid and runs buildConcentration on each group, so a subnet's row here and its own detail route agree BY CONSTRUCTION rather than by two implementations staying in step — a SQL reimplementation of gini/nakamoto would agree until it quietly did not. DISTINCT FROM /chain/concentration, which performs this same read and then collapses every subnet into ONE network aggregate, discarding the per-subnet structure. DISTINCT FROM /chain/holders, which ranks alpha OWNERSHIP off the position ledger: who owns the token is a different question from who receives the emissions, and for \"should I work here\" it is the wrong one. ?lens= is emission, stake, entity_emission, entity_stake, validator_stake (default emission, the reward question) — ONE lens per response, because five scorecards across ~129 subnets is a payload nobody asked for and a flat row is what a sort can act on. ?sort= is nakamoto_coefficient, gini, holders, top_1pct_share, total, netuid (default nakamoto_coefficient). EACH SORT KEY HAS ITS OWN \"WIDEST FIRST\" DIRECTION and that is the default, because getting it wrong inverts the answer: a HIGH nakamoto coefficient means widely shared while a HIGH gini means the opposite. ?order= overrides. A subnet whose lens has no positive distribution sorts LAST in EITHER direction and is flagged unmeasured — riding its nulls up an ascending gini ranking would read as the most perfectly equal subnet on the network when in fact nothing was measured. limit caps the returned subnets (default 20, max 512) and the max sits above the subnet count on purpose, so ranking the whole network is one request. The network rollup carries dimension-free facts only — MEDIAN gini/nakamoto/top-1 share and how many subnets have a single holder taking the lens — because each subnet's alpha is a different token and a cross-subnet sum of it means nothing. Mainnet-only: the neurons tier carries no network dimension.","id":"chain-concentration-subnets","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/concentration/subnets","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"lens","schema":{"enum":["emission","stake","entity_emission","entity_stake","validator_stake"],"type":"string"}},{"description":"Column to rank the result by; pair with `order` for direction. Options are per-tool; see this parameter's enum. Defaults to nakamoto_coefficient.","name":"sort","schema":{"default":"nakamoto_coefficient","enum":["nakamoto_coefficient","gini","holders","top_1pct_share","total","netuid"],"type":"string"}},{"description":"Sort direction for the chosen sort key: `asc` smallest-first, `desc` largest-first. Defaults to desc.","name":"order","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":512,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/chain/performance.json","cache":"short","description":"Fetch network-wide reward-distribution & score-spread metrics aggregated across all subnets' neurons: reward concentration (Gini, HHI, Nakamoto coefficient, top-percentile shares, entropy) for incentive across all neurons and dividends across validators, plus the p10–p90 spread of the 0–1 trust, consensus, and validator_trust scores, computed live from the neurons store; schema-stable nulls when cold.","id":"chain-performance","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/performance","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/idle-stake.json","cache":"short","description":"Fetch the network-wide idle-stake rollup: every subnet's own idle-stake scorecard (stake delegated to a currently-zero-dividends hotkey) ranked by idle_stake_alpha descending, plus the network total, computed live from the neurons store; schema-stable empty ranking when cold.","id":"chain-idle-stake","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/idle-stake","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/identity-history.json","cache":"short","description":"Fetch the network-wide recent subnet-identity-change feed (newest first) aggregated across all subnets: the most-recent SubnetIdentitiesV3 changes, each carrying the netuid it belongs to plus the same tracked identity fields as the per-subnet identity-history route, capped to ?limit (default 50, max 200) and reporting the distinct subnet_count the feed spans, computed from the frozen lakehouse export of subnet_identity_history; schema-stable empty feed when cold.","id":"chain-identity-history","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/identity-history","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"limit","schema":{"default":50,"maximum":200,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/self-health.json","cache":"short","description":"metagraphed's OWN uptime: a verdict scoped strictly to our own components (api / site / publish) plus each one's trailing-90-day daily uptime ratios and latest probe state, served from the self_health_daily lakehouse rollup at /api/v1/self-health (no static file). Days with no probe rows are ABSENT, never zero-filled -- a gap means we weren't measuring, not that we were down. Never mixes in third-party subnet-surface health, which is what /api/v1/health covers. The per-component current_ok/http_status/latency_ms/checked_at/note fields are NULL for now, and null here means UNMEASURED, not down: the per-check ticks were written by the indexer box's self-health poller, the box is decommissioned, and only the daily rollup survived it. Synthesizing a current reading from the last frozen tick would state a probe we did not take.","id":"self-health","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/self-health","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/yield.json","cache":"short","description":"Fetch network-wide emission-yield (return rate) aggregated across all subnets' neurons: the aggregate network return (total emission / total stake), the same split by validator vs miner role, and the count/mean/median/min/max plus p10–p90 spread of the per-neuron emission/stake return, computed live from the neurons store; schema-stable nulls when cold.","id":"chain-yield","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/yield","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/chain/turnover.json","cache":"short","description":"Fetch network-wide validator-set turnover across all subnets between the window's start and end neuron_daily snapshots: a per-subnet leaderboard (validators entered, exited, Jaccard retention, and a 0-100 stability score) ranked by gross churn, a network rollup over the union of every subnet's validator hotkeys, and a distribution summary (count, mean, min, p25, median, p75, p90, max) of the per-subnet stability scores. Sort is fixed to most-volatile-first; limit caps the leaderboard (default 20, max 100). Computed live from the neuron_daily rollup; schema-stable zeros when cold. Pass ?format=csv to download the per-subnet leaderboard as CSV (the network rollup + stability distribution stay JSON-only).","id":"chain-turnover","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/chain/turnover","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"30d","enum":["7d","30d","90d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/subnets/{netuid}/uptime.json","cache":"short","description":"Fetch long-term daily uptime history per operational surface for one subnet over a 90d or 1y window (computed live from the surface_uptime_daily rollup). Pass `min_samples` to drop low-sample day rows (daily probe count below the threshold, including zero-sample 'unknown' days) from the history.","id":"subnet-uptime","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/uptime","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"90d","enum":["90d","1y"],"type":"string"}},{"name":"min_samples","schema":{"minimum":0,"type":"integer"}},{"description":"Response format override. Use `csv` to download the route rows as text/csv; `json` keeps the default response envelope.","name":"format","schema":{"default":"json","enum":["json","csv"],"type":"string"}}]},{"artifact_path":"/metagraph/registry/leaderboards.json","cache":"standard","description":"Fetch registry leaderboards computed live from the store + registry projections + the economics tier. Operational boards: healthiest, fastest-rpc, most-complete, most-enriched, fastest-growing, most-reliable. Economic opportunity boards (for miners/validators): open-slots, cheapest-registration, highest-emission, validator-headroom, biggest-alpha-gain-1d, biggest-alpha-gain-7d. Omit `board` for all boards.","id":"registry-leaderboards","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/registry/leaderboards","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"board","schema":{"enum":["healthiest","fastest-rpc","most-complete","most-enriched","fastest-growing","most-reliable","open-slots","cheapest-registration","highest-emission","validator-headroom","biggest-alpha-gain-1d","biggest-alpha-gain-7d"],"type":"string"}},{"name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer","x-serving-bound":true}}]},{"artifact_path":"/metagraph/compare.json","cache":"standard","description":"Compare several subnets side by side across the registry structure (completeness + surface counts), the live economics tier, and the live per-subnet health rollup — one call, requested order. `netuids` is a required comma-separated list of 1-128 subnet ids; `dimensions` selects a subset of structure,economics,health (default all). Composed live (no static file); for choosing between subnets without N separate detail/economics/health fetches.","id":"compare","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/compare","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"description":"Comma-separated subnet ids to restrict the result to, e.g. `1,7,64`. At most 128 ids, each 0-65535. Unknown ids match nothing rather than erroring.","name":"netuids","schema":{"maxLength":767,"pattern":"^\\d{1,5}(,\\d{1,5}){0,127}$","type":"string"}},{"name":"dimensions","schema":{"type":"string"}}]},{"artifact_path":"/metagraph/compare/validators.json","cache":"standard","description":"Place several validators side by side for a stake/delegate decision: each hotkey's take rate, estimated APY, nominator count, on-chain identity, and cross-subnet stake/emission/trust aggregates. `hotkeys` is a required comma-separated list of 1-16 distinct SS58 validator addresses. `netuid` is an optional subnet context — when set, each validator also carries its membership row in that subnet (or null with no permit there). Composed live (no static file); the validator equivalent of /api/v1/compare.","id":"compare-validators","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/compare/validators","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"hotkeys","schema":{"maxLength":783,"pattern":"^[1-9A-HJ-NP-Za-km-z]{47,48}(,[1-9A-HJ-NP-Za-km-z]{47,48}){0,15}$","type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}}]},{"artifact_path":"/metagraph/domains.json","cache":"standard","description":"Fetch the per-domain rollup overview: every domain/capability tag in the existing 14-tag taxonomy, each with its member subnet count, total stake, total emission share (the sum of the stage-1 price shares, not TAO received), and within-domain emission concentration. Computed live from the subnets index + economics tier (no static file). The aggregation layer over the existing ?domain= filter on /api/v1/subnets.","id":"domains","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/domains","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/domains/{tag}/summary.json","cache":"standard","description":"Fetch one domain/capability tag's own rollup: member subnet count, total stake, total emission share (the sum of the stage-1 price shares, not TAO received), and within-domain emission concentration. `tag` must be one of the 14 fixed domain tags (the same enum ?domain= validates on /api/v1/subnets). Computed live from the subnets index + economics tier (no static file).","id":"domain-summary","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/domains/{tag}/summary","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/rpc/usage.json","cache":"short","description":"Fetch RPC reverse-proxy usage analytics — request volume, latency p50/p95, failover + error rate, cache-hit rate, per-endpoint distribution, and bounded time buckets for heatmaps — over a 7d or 30d window (computed live from the store telemetry).","id":"rpc-usage","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/rpc/usage","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}}]},{"artifact_path":"/metagraph/freshness.json","cache":"short","description":"Fetch freshness and staleness state.","id":"freshness","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/freshness","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/source-health.json","cache":"short","description":"Fetch upstream source health.","id":"source-health","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/source-health","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/evidence-ledger.json","cache":"standard","description":"Fetch public evidence ledger.","id":"evidence","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/evidence","public":true,"query_collection":"claims","query_filter_names":[],"query_parameters":[{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["claim","source_url","subject","verified_at"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/evidence/{netuid}.json","cache":"standard","description":"Fetch public evidence ledger claims for one subnet.","id":"subnet-evidence","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/subnets/{netuid}/evidence","public":true,"query_collection":"claims","query_filter_names":[],"query_parameters":[{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["claim","source_url","subject","verified_at"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/changelog.json","cache":"short","description":"Fetch latest generated change summary.","id":"changelog","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/changelog","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/source-snapshots.json","cache":"standard","description":"Fetch source input hashes and counts.","id":"source-snapshots","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/source-snapshots","public":true,"query_collection":"sources","query_filter_names":[],"query_parameters":[{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["id","kind","path","record_count"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/rpc-endpoints.json","cache":"short","description":"Fetch Bittensor RPC endpoint status.","id":"rpc-endpoints","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/rpc/endpoints","public":true,"query_collection":"endpoints","query_filter_names":["known_status","kind","layer","netuid","pool_eligible","provider","publication_state","status"],"query_parameters":[{"description":"Select endpoints with a known served status (ok, degraded or failed), or without one. This does not assert freshness or configured monitoring.","name":"known_status","schema":{"enum":["true","false"],"type":"string"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"name":"layer","schema":{"enum":["bittensor-base","data-provider","docs-provider","subnet-app"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"pool_eligible","schema":{"enum":["true","false"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"publication_state","schema":{"enum":["candidate","verified","monitored","pool-eligible","disabled","rejected"],"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"min_latency_ms","schema":{"type":"number"}},{"name":"max_latency_ms","schema":{"type":"number"}},{"name":"min_score","schema":{"type":"number"}},{"name":"max_score","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["kind","last_checked","latency_ms","layer","netuid","pool_eligible","provider","publication_state","score","status"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/rpc/pools.json","cache":"short","description":"Fetch endpoint pool scores.","id":"rpc-pools","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/rpc/pools","public":true,"query_collection":"rpc-pools","query_filter_names":["id","kind"],"query_parameters":[{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"kind","schema":{"enum":["subtensor-rpc","subtensor-wss","archive"],"type":"string"}},{"name":"min_eligible_count","schema":{"type":"number"}},{"name":"max_eligible_count","schema":{"type":"number"}},{"name":"min_endpoint_count","schema":{"type":"number"}},{"name":"max_endpoint_count","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["eligible_count","endpoint_count","id","kind"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/endpoint-pools.json","cache":"short","description":"Fetch generalized endpoint pool scores.","id":"endpoint-pools","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/endpoint-pools","public":true,"query_collection":"endpoint-pools","query_filter_names":["id","kind"],"query_parameters":[{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"id","schema":{"maxLength":100,"type":"string"}},{"name":"kind","schema":{"enum":["subtensor-rpc","subtensor-wss","archive"],"type":"string"}},{"name":"min_eligible_count","schema":{"type":"number"}},{"name":"max_eligible_count","schema":{"type":"number"}},{"name":"min_endpoint_count","schema":{"type":"number"}},{"name":"max_endpoint_count","schema":{"type":"number"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["eligible_count","endpoint_count","id","kind"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/endpoint-incidents.json","cache":"short","description":"Fetch probe-derived endpoint incidents.","id":"endpoint-incidents","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/endpoint-incidents","public":true,"query_collection":"endpoint-incidents","query_filter_names":["netuid","kind","provider","status","severity","state"],"query_parameters":[{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"kind","schema":{"enum":["archive","dashboard","data-artifact","docs","example","openapi","repo-registry","sdk","source-repo","sse","subnet-api","subtensor-rpc","subtensor-wss","website"],"type":"string"}},{"description":"Restrict the result to rows whose field equals this value. Matched exactly (case-insensitively), not searched for as a substring — an unmatched value yields an empty result rather than an error.","name":"provider","schema":{"maxLength":100,"type":"string"}},{"name":"status","schema":{"enum":["ok","degraded","failed","unknown"],"type":"string"}},{"name":"severity","schema":{"enum":["critical","warning","info"],"type":"string"}},{"name":"state","schema":{"enum":["active","resolved"],"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["detected_at","endpoint_id","kind","last_checked","netuid","provider","severity","state","status"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/incidents.json","cache":"short","description":"Fetch recent cross-subnet downtime incidents reconstructed from probe history over a 7d or 30d window (computed live from the store). Pair with /api/v1/health for the overall status summary.","id":"incidents","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/incidents","public":true,"query_collection":"incidents","query_filter_names":["netuid"],"query_parameters":[{"name":"window","schema":{"default":"7d","enum":["7d","30d"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["downtime_ms","incident_count","netuid","surface_id"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/schemas/index.json","cache":"standard","description":"Fetch captured schema index.","id":"schemas","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/schemas","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/adapters/{slug}.json","cache":"short","description":"Fetch adapter-backed public metrics.","id":"adapter","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/adapters/{slug}","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/search.json","cache":"standard","description":"Fetch compact search index.","id":"search","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/search","public":true,"query_collection":"documents","query_filter_names":["type","netuid"],"query_parameters":[{"name":"type","schema":{"enum":["subnet","surface","provider"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["netuid","slug","title","type"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/search-index.json","cache":"standard","description":"Fetch the slim search index — the same documents as /search without the per-document token blobs, for fast browser typeahead and listing.","id":"search-index","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/search-index","public":true,"query_collection":"documents","query_filter_names":["type","netuid"],"query_parameters":[{"name":"type","schema":{"enum":["subnet","surface","provider"],"type":"string"}},{"name":"netuid","schema":{"maximum":65535,"minimum":0,"type":"integer"}},{"name":"q","schema":{"maxLength":200,"type":"string"}},{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["netuid","slug","title","type"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/contracts.json","cache":"standard","description":"Fetch artifact contract metadata.","id":"contracts","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/contracts","public":true,"query_collection":"contracts","query_filter_names":[],"query_parameters":[{"name":"fields","schema":{"pattern":"^[\\s,]*[A-Za-z_][A-Za-z0-9_]*(\\s*,[\\s,]*[A-Za-z_][A-Za-z0-9_]*)*[\\s,]*$","type":"string"}},{"name":"limit","schema":{"maximum":1000,"minimum":1,"type":"integer","x-serving-bound":true}},{"description":"Row offset to resume from — the numeric position of the first row to return, not an opaque token. Rows inserted since the previous page shift it, so prefer the keyset cursor where a tool offers one.","name":"cursor","schema":{"minimum":0,"type":"integer"}},{"description":"Field to sort by — the bare field name only (e.g. `sort=total_stake_alpha`). Pair with the separate `order` parameter to choose direction; a combined `field:desc` token is NOT supported.","name":"sort","schema":{"enum":["id","path","contract_version"],"type":"string"}},{"description":"Sort direction for `sort`: `asc` or `desc` (default `desc`). This is a separate parameter from `sort` — e.g. `?sort=emission_share&order=desc`.","name":"order","schema":{"enum":["asc","desc"],"type":"string"}}]},{"artifact_path":"/metagraph/openapi.json","cache":"standard","description":"Fetch OpenAPI 3.1 contract.","id":"openapi","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/openapi.json","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]},{"artifact_path":"/metagraph/build-summary.json","cache":"short","description":"Fetch generated build summary.","id":"build","mainnet_only":true,"method":"GET","networks":["mainnet"],"path":"/api/v1/build","public":true,"query_collection":null,"query_filter_names":[],"query_parameters":[]}],"schema_version":1,"type_definitions_url":"/metagraph/types.d.ts"},"meta":{"artifact_path":"/metagraph/api-index.json","cache":"standard","contract_version":"2026-07-03.2","generated_at":"2026-09-20T12:26:49.169Z","published_at":"2026-09-20T12:26:49.169Z","source":"static-assets"}}