Bittensor - taostats
Access Bittensor blockchain data via TaoStats API for subnets, validators, miners, staking, emissions, and market metrics.
技能说明
TaoStats Skill
Purpose: Interact with TaoStats API for Bittensor blockchain data - subnets, validators, miners, staking, emissions, and more.
API Documentation: https://docs.taostats.io/
Base URL: https://api.taostats.io
Rate Limit: 5 calls/minute (free tier)
Setup
1. Set API Key
Get a free API key from taostats.io and export it as an environment variable:
export TAOSTATS_API_KEY="tao-xxxxx:yyyyy"
2. Source Helper Functions
source ~/.openclaw/workspace/skills/taostats/taostats.sh
Complete Endpoint Reference
dTAO Pool Endpoints
GET /api/dtao/pool/latest/v1?netuid={N}
CRITICAL: This endpoint has EVERYTHING for trading decisions.
Key Fields:
price- Current alpha price in TAOroot_prop- % of price from root TAO injection (CRITICAL for entry validation)fear_and_greed_index/fear_and_greed_sentiment- Market sentimentseven_day_prices- Historical price array (42 data points)price_change_1_hour,price_change_1_day,price_change_1_week,price_change_1_monthmarket_cap,liquidity,total_tao,total_alphatao_volume_24_hr,alpha_volume_24_hr,buys_24_hr,sells_24_hrhighest_price_24_hr,lowest_price_24_hr
Example:
curl -s "https://api.taostats.io/api/dtao/pool/latest/v1?netuid=33" \
-H "Authorization: $TAOSTATS_API_KEY" | jq '.data[0].root_prop'
# Returns: "0.2104087259347016725" (21% - GOOD entry)
GET /api/dtao/pool/history/v1?netuid={N}&limit={L}
Historical pool snapshots for backtesting.
GET /api/dtao/validator/yield/latest/v1?netuid={N}
Validator APYs with multiple timeframes.
Key Fields:
seven_day_apy- Primary metric for staking decisionsone_day_apy,one_hour_apy,thirty_day_apyseven_day_epoch_participation- Validator reliabilityname,hotkey.ss58,stake,take
Example:
curl -s "https://api.taostats.io/api/dtao/validator/yield/latest/v1?netuid=33" \
-H "Authorization: $TAOSTATS_API_KEY" | \
jq -r '.data | sort_by(-.seven_day_apy) | .[0] |
"\(.name // .hotkey.ss58): \(.seven_day_apy * 100)% APY"'
GET /api/dtao/stake_balance/latest/v1?coldkey={COLDKEY}
All stake positions across all subnets.
Key Fields:
netuid,hotkey.ss58,hotkey_namebalance_as_tao- ⚠️ IN RAO (divide by 1e9)price,price_change_1_dayroot_prop- Per-position root proportion
Subnet Endpoints
GET /api/subnet/latest/v1 or ?netuid={N}
Complete subnet parameters and economics.
Key Fields:
netuid,emission,projected_emissionnet_flow_1_day,net_flow_7_days,net_flow_30_days- Capital flow trackingrecycled_24_hours,recycled_lifetime- Registration economicstao_flow,excess_tao- dTAO mechanicsimmune_owner_uids_limit,immunity_period- Risk assessmentmax_validators,active_validatorsdifficulty,adjustment_alpha- Mining economics
GET /api/subnet/registration/v1?netuid={N}
Subnet registration details.
Key Fields:
owner.ss58- Subnet ownerregistration_cost- Current registration costtimestamp- When registered
Validator Endpoints
GET /api/validator/latest/v1?netuid={N}
Current validator state.
Key Fields:
apr,apr_7_day_average,apr_30_day_averagenominator_return_per_k- Staker yield per 1000 TAOnominators,nominators_24_hr_change- Capital inflows/outflowsstake,stake_24_hr_change,validator_stake,system_staketake- Commission ratename,coldkey.ss58,hotkey.ss58permits- Subnet permissions
GET /api/validator/history/v1?netuid={N}&hotkey={H}&limit={L}
Historical validator performance.
Key Fields:
- All APR metrics with daily granularity
nominators_24_hr_change- Track capital movementsdominance,subnet_dominance- Market share
Transaction Endpoints
GET /api/delegation/v1?nominator={COLDKEY}&action={all|stake|unstake}&limit={L}
Complete transaction history (stakes, unstakes, transfers).
Key Fields:
action("add" = stake, "remove" = unstake)amount,rate(price),tao_amount,alpha_amountfee,slippageblock_number,timestamphotkey.ss58,coldkey.ss58
GET /api/transfer/v1?from={COLDKEY}&limit={L}
TAO transfer history (not staking).
Key Fields:
from.ss58,to.ss58,amount,feeblock_number,timestamp
Metagraph Endpoints
GET /api/metagraph/latest/v1?netuid={N}&limit={L}
Complete subnet state for every neuron.
Key Fields:
uid,hotkey.ss58,coldkey.ss58rank,trust,consensus,incentive,dividends,emissionalpha_stake,root_stake,total_alpha_stakedaily_mining_alpha,daily_validating_alpha,daily_rewardvalidator_permit,is_immunity_period,in_dangerdaily_burned_alpha,daily_owner_alpha
GET /api/neuron/latest/v1?netuid={N}&limit={L}
Simplified neuron view with pruning risk.
Key Fields:
uid,name,hotkey.ss58,coldkey.ss58pruning_score,in_danger,is_immuneminer_rank,validator_rank
Quick Reference
Get Subnet Pool Data
taostats_pool 33
# Returns: price, root_prop, fear_and_greed_index, 7-day price history, volume
Get Validator APYs
taostats_validator_yield 33
# Returns: All validators with 1h/1d/7d/30d APYs
Get Stake Balances
taostats_stake_balance "YOUR_COLDKEY_HERE"
# Returns: All positions with root_prop per subnet
Get Transaction History
taostats_delegation_history "YOUR_COLDKEY_HERE"
# Returns: All stake/unstake transactions with slippage
Get Subnet Parameters
taostats_subnet_info 33
# Returns: Emissions, net flows, registration cost, immunity params
Get Metagraph
taostats_metagraph 33
# Returns: All neurons with stakes, ranks, emissions
Common Patterns
Check Entry Quality (root_prop < 0.30)
NETUID=33
ROOT_PROP=$(curl -s "https://api.taostats.io/api/dtao/pool/latest/v1?netuid=$NETUID" \
-H "Authorization: $TAOSTATS_API_KEY" | jq -r '.data[0].root_prop')
if (( $(echo "$ROOT_PROP < 0.30" | bc -l) )); then
echo "SN$NETUID: GOOD entry (root_prop: $ROOT_PROP)"
else
echo "SN$NETUID: AVOID (root_prop: $ROOT_PROP - artificial price)"
fi
Find Best Validator for Subnet
NETUID=33
curl -s "https://api.taostats.io/api/dtao/validator/yield/latest/v1?netuid=$NETUID" \
-H "Authorization: $TAOSTATS_API_KEY" | \
jq -r '.data | sort_by(-.seven_day_apy) | .[0] |
"\(.name // .hotkey.ss58) | APY: \(.seven_day_apy * 100)% | Commission: \(.take * 100)%"'
Check Portfolio with root_prop per Position
COLDKEY="YOUR_COLDKEY_HERE"
curl -s "https://api.taostats.io/api/dtao/stake_balance/latest/v1?coldkey=$COLDKEY" \
-H "Authorization: $TAOSTATS_API_KEY" | \
jq -r '.data[] |
"SN\(.netuid): \((.balance_as_tao | tonumber) / 1000000000) TAO | root_prop: \(.root_prop)"'
Scan for High APY Opportunities (S-tier only)
for NETUID in 33 64 51 13 3 1 100; do
MAX_APY=$(curl -s "https://api.taostats.io/api/dtao/validator/yield/latest/v1?netuid=$NETUID" \
-H "Authorization: $TAOSTATS_API_KEY" | jq -r '.data | max_by(.seven_day_apy) | .seven_day_apy')
echo "$NETUID|$MAX_APY"
sleep 0.3
done | sort -t'|' -k2 -rn | while IFS='|' read netuid apy; do
printf "SN%-3s: %6.1f%%\n" "$netuid" "$(echo "$apy * 100" | bc -l)"
done
Monitor Capital Flows (net_flow indicates momentum)
curl -s "https://api.taostats.io/api/subnet/latest/v1" \
-H "Authorization: $TAOSTATS_API_KEY" | \
jq -r '.data[] | select(.netuid != 0) |
"SN\(.netuid): net_flow_7d=\(.net_flow_7_days) | emission=\(.emission)"' | \
sort -t'=' -k2 -rn | head -10
Python Tools
taostats_client.py
Robust API client with automatic retry logic.
from taostats_client import TaostatsAPI
api = TaostatsAPI("your-api-key")
# Single call with retry
result = api.get_json("dtao/pool/latest/v1?netuid=33")
# Paginated (handles all pages automatically)
all_data = api.get_paginated("dtao/stake_balance/latest/v1?coldkey=XYZ")
# Balance history
history = api.get_balance_history(coldkey, start_timestamp, end_timestamp)
balance_history.py
Track daily portfolio changes over time.
# View last 30 days
python3 skills/taostats/balance_history.py --days 30
# Export to CSV
python3 skills/taostats/balance_history.py --days 90 --export
Output:
📊 Portfolio History (30 records):
--------------------------------------------------------------------------------
Date Free τ Staked τ Total τ Daily Δ
--------------------------------------------------------------------------------
2026-01-07 0.0234 1.9567 1.9801
2026-01-08 0.0256 1.9789 2.0045 +0.0244
...
Overall Change: +0.5399 τ (+27.27%)
Bash Functions (taostats.sh)
Core Trading Functions
taostats_pool <netuid>
Get full pool data including root_prop and fear & greed.
- Returns: price, root_prop, fear_and_greed_index, seven_day_prices, volume
- Use for: Entry validation, sentiment analysis, price history
taostats_pool_history <netuid> [limit]
Historical pool snapshots.
- Returns: Time-series of pool state
- Use for: Backtesting, trend analysis
taostats_validator_yield <netuid>
All validators with APYs.
- Returns: 1h/1d/7d/30d APYs, participation rates
- Use for: Validator selection
taostats_stake_balance <coldkey>
All positions with per-subnet root_prop.
- Returns: Balance, price, root_prop per position
- Use for: Portfolio monitoring, risk assessment
taostats_delegation_history <coldkey> [limit]
Transaction history with slippage.
- Returns: Stakes, unstakes, fees, slippage
- Use for: Performance tracking, tax records
Subnet Analysis Functions
taostats_subnet_info [netuid]
Subnet parameters and economics.
- Returns: Emissions, net flows, registration costs
- Use for: Fundamental analysis
taostats_subnet_registration <netuid>
Subnet ownership and registration details.
- Returns: Owner, registration cost, timestamp
- Use for: Due diligence
Validator Analysis Functions
taostats_validator_info <netuid>
Current validator state.
- Returns: APR, nominator returns, stake changes
- Use for: Deep validator research
taostats_validator_history <netuid> <hotkey> [limit]
Historical validator performance.
- Returns: Daily APR trends
- Use for: Validator reliability assessment
Metagraph Functions
taostats_metagraph <netuid>
Complete subnet state.
- Returns: All neurons with stakes, emissions, ranks
- Use for: Ecosystem analysis
taostats_neurons <netuid>
Simplified neuron view.
- Returns: Pruning scores, immunity status
- Use for: Risk monitoring
Rate Limit Handling
Free tier: 5 calls per minute
Best practices:
- Cache pool data (changes slowly)
- Use
sleep 0.3between calls (20 calls/min safe) - Batch where possible
- Monitor for 429 errors
Example rate-limited loop:
for NETUID in {1..50}; do
taostats_pool $NETUID | jq -r '.data[0] | "SN\(.netuid): root_prop=\(.root_prop)"'
sleep 0.3
done
Error Handling
| Code | Cause | Fix |
|---|---|---|
| 401 | Invalid API key | Check .taostats format, no "Bearer" prefix |
| 404 | Wallet not indexed | Wait 1-2 hours for new wallets |
| 429 | Rate limit | Add sleep delays between calls |
| Empty | Inactive subnet | Check if subnet exists first |
Critical Fields for Trading
Entry Validation
root_prop< 0.30 = Good (organic price)root_prop> 0.70 = Bad (artificially pumped)
Momentum Signals
net_flow_7_days> 0 = Capital inflownominators_24_hr_change> 0 = Growing validator stake
Risk Metrics
in_danger= true → Pruning riskis_immunity_period= true → Protected from deregpruning_score→ Lower is safer
Sentiment
fear_and_greed_index< 30 = Fear (potential buy)fear_and_greed_index> 70 = Greed (potential wait)
Known Issues
balance_as_tao Field Bug
Issue: Returns value in rao (raw units), not TAO.
Workaround: Always divide by 1,000,000,000
balance_tao=$(echo "$balance_as_tao / 1000000000" | bc -l)
Affected endpoints:
/api/dtao/stake_balance/latest/v1
Integration Examples
Entry Scanner (root_prop + APY + flow)
#!/bin/bash
source ~/.openclaw/workspace/skills/taostats/taostats.sh
echo "=== High-Quality Entry Opportunities ==="
for NETUID in 33 64 51 13 3 1 100 117 12 120; do
POOL=$(taostats_pool $NETUID)
ROOT_PROP=$(echo "$POOL" | jq -r '.data[0].root_prop')
PRICE=$(echo "$POOL" | jq -r '.data[0].price')
FEAR_GREED=$(echo "$POOL" | jq -r '.data[0].fear_and_greed_sentiment')
MAX_APY=$(taostats_validator_yield $NETUID | jq -r '.data | max_by(.seven_day_apy) | .seven_day_apy')
if (( $(echo "$ROOT_PROP < 0.30" | bc -l) )); then
printf "SN%-3s | root_prop: %.2f | APY: %5.1f%% | Sentiment: %s\n" \
"$NETUID" "$ROOT_PROP" "$(echo "$MAX_APY * 100" | bc -l)" "$FEAR_GREED"
fi
sleep 0.3
done
Portfolio Risk Monitor
#!/bin/bash
source ~/.openclaw/workspace/skills/taostats/taostats.sh
COLDKEY="YOUR_COLDKEY"
echo "=== Portfolio Risk Assessment ==="
taostats_stake_balance $COLDKEY | jq -r '.data[] |
"\(.netuid)|\(.balance_as_tao)|\(.root_prop)"' | while IFS='|' read netuid balance root_prop; do
BALANCE_TAO=$(echo "$balance / 1000000000" | bc -l)
if (( $(echo "$root_prop > 0.50" | bc -l) )); then
printf "⚠️ SN%-3s: %6.3f TAO | HIGH root_prop: %.2f - Consider exit\n" "$netuid" "$BALANCE_TAO" "$root_prop"
else
printf "✅ SN%-3s: %6.3f TAO | OK root_prop: %.2f\n" "$netuid" "$BALANCE_TAO" "$root_prop"
fi
done
Python Wrapper
import requests
import os
class TaoStatsAPI:
def __init__(self):
self.base_url = "https://api.taostats.io"
self.api_key = os.getenv("TAOSTATS_API_KEY")
def _get(self, endpoint):
headers = {"Authorization": self.api_key, "accept": "application/json"}
r = requests.get(f"{self.base_url}{endpoint}", headers=headers)
return r.json()
def pool(self, netuid):
"""Get pool data with root_prop and fear & greed"""
return self._get(f"/api/dtao/pool/latest/v1?netuid={netuid}")
def validator_yield(self, netuid):
"""Get all validators with APYs"""
return self._get(f"/api/dtao/validator/yield/latest/v1?netuid={netuid}")
def stake_balance(self, coldkey):
"""Get all positions with root_prop per subnet"""
return self._get(f"/api/dtao/stake_balance/latest/v1?coldkey={coldkey}")
def subnet_info(self, netuid=None):
"""Get subnet parameters and net flows"""
if netuid:
return self._get(f"/api/subnet/latest/v1?netuid={netuid}")
return self._get("/api/subnet/latest/v1")
# Usage
api = TaoStatsAPI()
pool = api.pool(33)
print(f"SN33 root_prop: {pool['data'][0]['root_prop']}")
Skill Maintenance
Last Updated: 2026-02-06
Author: vanlabs-dev
Dependencies: curl, jq, bc
Changelog:
- 2026-02-06: COMPLETE OVERHAUL - Discovered root_prop, fear_and_greed, 7-day history in pool endpoint
- 2026-02-06: Added all working endpoints from discovery testing
- 2026-02-06: Added entry validation patterns using root_prop
- 2026-02-03: Initial version
TODO:
- Add caching layer for pool data
- Build retry logic with exponential backoff
- Create real-time monitoring dashboard
- Add root_prop alerts for portfolio positions
如何使用「Bittensor - taostats」?
- 打开小龙虾AI(Web 或 iOS App)
- 点击上方「立即使用」按钮,或在对话框中输入任务描述
- 小龙虾AI 会自动匹配并调用「Bittensor - taostats」技能完成任务
- 结果即时呈现,支持继续对话优化