How to Build a Helium Network (HNT/MOBILE) DePIN Tracker with CoinMarketCap API

How to Build a Helium Network (HNT/MOBILE) DePIN Tracker with CoinMarketCap API

Table of Contents

Create a Helium Network DePIN tracker using CoinMarketCap API for HNT/mobile monitoring, DePIN detection, Solana DEX liquidity checks, macro filters, and Python best practices.

introduction

Helium is the world’s largest decentralized wireless network.

Node operators deploy physical hotspots that provide wireless coverage – LoRaWAN for IoT devices and 5G for mobile connectivity. They receive symbolic rewards proportional to the coverage they provide and the data they transmit. Helium moved from its Tier 1 to Solana in 2023, significantly reducing operating costs and integrating with the Solana DeFi ecosystem.

Helium operates two subnetworks with separate tokens: HNT is the root governance token and the token for the entire Helium network. MOBILE is the subtoken for 5G coverage network – operators earn MOBILE for deploying 5G hotspots, which can be burned to mint HNT. IOT is the subcode for LoRaWAN IoT network.

By early 2026, Helium will have over 400,000 active nodes and become the benchmark for DePIN infrastructure protocols. The demand for real-world data transfer directly drives token economics.

In this guide, you will build DePIN tracker for Helium Network with CoinMarketCap APIwhere:

  • The CoinMarketCap API powers the market signals engine
  • The official Helium API and on-chain contracts handle realtime coverage metrics, number of touchpoints, and data transfer revenue

Illustration of architecture

The CoinMarketCap API strictly acts as an off-chain signaling layer to monitor HNT and MOBILE token prices, detect DePIN narrative trend, and filter the overall system. It’s not a hotspot screen, oracle coverage, or data transfer revenue feed.

The number of real nodes, coverage maps, data transfer volume, and reward distributions must be validated via the official Helium API or Solana on-chain contracts.

Project preparation

Import operating system
Import time
Import date
Import requests

CMC_API_KEY = os.getenv(“CMC_API_KEY”)
CMC_BASE_URL = “https://pro-api.coinmarketcap.com”

vertices = {
“accept”: “application/json”,
“X-CMC_PRO_API_KEY”: CMC_API_KEY,
}

# Helium ecosystem assets
HELIUM_ASSETS= [“HNT”, “MOBILE”, “IOT”]

# DePIN sector for comparison
DEPIN_ASSETS= [“HNT”, “RENDER”, “AKT”, “FIL”]

# DePIN tags for local filtering
DEPIN_TAGS = {“depin”,”Distributed Computing”,”Helium Ecosystem”,”AI Big Data”}

# HNT Solana SPL mint – encrypted, not dependent on CMC map address
HNT_SOLANA_MINT = “hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux”

Step 1: Asset map

Definition of Map_assets(symbols=”HNT,MOBILE,IOT,RENDER,AKT,FIL”):
url = f”{CMC_BASE_URL}/v1/cryptocurrency/map”
parameters = {“symbol”:symbols}
r = request.get(url, headers=HEADERS, params=params)
r.raise_for_status()
returns r.json()[“data”]

Definition of Resolve_hnt_id(map_data):
For assets in Map_data:
if assets.get(“symbol”) == “HNT” and “helium” in (asset.get(“slug”) or “”).lower():
Return of assets[“id”]
Next return ((a[“id”] to get Map_data if a.get(“symbol”) == “HNT”), None)

HNT is the post-migration Solana SPL token. The platform name will be “Solana”. MOBILE and IOT are also Solana SPL tokens. CMC map may return incorrect address for DEX calls – use HNT_SOLANA_MINT for all Solana DEX operations.

Step 2: Fetch quotes

Uncheck fetch_quotes(ids):
url = f”{CMC_BASE_URL}/v3/cryptocurrency/quotes/latest”
Parameters = {“id”: “,”.join(str(i) for i in ids)}
r = request.get(url, headers=HEADERS, params=params)
r.raise_for_status()
returns r.json()[“data”]

native parse_quote(assets):
$ = next(
(F for F in the origins.get(“Quote”, []) if q.get(“symbol”) == “USD”),
{}
)
returns {
“id”: assets.get(“id”),
“symbol”: assets.get(“symbol”),
“Price”: usd.get(“Price”),
“volume_24h”: usd.get(“volume_24h”),
“market_cap”: usd.get(“market_cap”),
“fdv”: usd.get(“full_diluted_market_cap”),
“pct_change_1h”: usd.get(“percent_change_1h”),
“pct_change_24h”: usd.get(“percent_change_24h”),
“pct_change_7d”: usd.get(“percent_change_7d”),
“tvl”: usd.get(“tvl”),
“num_market_pairs”: assets.get(“num_market_pairs”),
}

quotes = {str(a[“id”]): parse_quote(a) for raw_quotes}

Step 3: Register HNT

Definition of compute_hnt_score (quote):
Result = 0
pct_1h = quote.get(“pct_change_1h”) or 0
pct_24h = quote.get(“pct_change_24h”) or 0
pct_7d = quote.get(“pct_change_7d”) or 0

If pct_24h > 10: result += 30
Elif pct_24h > 5: result += 20
Elif pct_24h > 2: score += 10
elif pct_24h < -15: result -= 25
If pct_7d > 20: result += 20
elif pct_7d > 10: result += 10
If pct_1h > 2: result += 15
elif pct_1h > 0.5: score += 8

Volume = quote.get(“volume_24h”) or 0
If folder > 20_000_000: result += 20
elif folder > 5_000_000: result += 10

mcap = quote.get(“market_cap”) or 0
If mcap > 500_000_000: result += 15
Elif Makab > 100_000_000: result += 8

degree of return

Step 4: Validate HNT DEX liquidity on Solana

def fetch_hnt_pools():
url = f”{CMC_BASE_URL}/v1/dex/token/pools”
parameters = {“title”: HNT_SOLANA_MINT, “platform”: “Solana”}
r = request.get(url, headers=HEADERS, params=params)
r.raise_for_status()
returns r.json()[“data”]

def get_best_pool(pools, min_liquidity=50_000):
Saleh = [p for p in pools if float(p.get(“liqUsd”) or 0) >= min_liquidity]
return max(valid, key=lambda p: float(p.get(“liqUsd”) or 0)) if valid otherwise nil

def fetch_hnt_candles(interval=”1h”):
url = f”{CMC_BASE_URL}/v1/k-line/candles”
parameters = {“platform”: “Solana”, “title”: HNT_SOLANA_MINT, “interval”: interval}
r = request.get(url, headers=HEADERS, params=params)
r.raise_for_status()
returns r.json()[“data”]

def parse_candle (c):
returns {
“Open”: c[0]”high”: c[1]”low”: c[2]”close”: c[3],
“Size”: c[4]”time stamp”: c[5]”Merchants”: c[6] or 0,
“Date&Time”: datetime.datetime.fromtimestamp(c[5] /1000),
}

dex_slug is required along with network_slug for /v4/dex/spot-pairs/latest. liqUsd is a string – it is always sent to float. C[5] is UNIX milliseconds – divisible by 1000. c[6] It could be nothing.

Step 5: DePIN combo and macro

def fetch_depin_listings():
url = f”{CMC_BASE_URL}/v3/cryptocurrency/listings/latest”
Parameters = {“sort”: “volume_24h”, “sort_dir”: “desc”, “limit”: 500, “volume_24h_min”: 500_000}
r = request.get(url, headers=HEADERS, params=params)
r.raise_for_status()
returns r.json()[“data”]

Definition of filter_depin_assets(assets):
Results = []
For assets in assets:
tags = array(asset.get(“tags”) or [])
If tags & DEPIN_TAGS or assets.get(“symbol”) in DEPIN_ASSETS:
results.append(origins)
Return results

def fetch_macro_regime():
fg_url = f”{CMC_BASE_URL}/v3/fear-and-greed/latest”
as_url = f”{CMC_BASE_URL}/v1/altcoin-season-index/latest”
fg = request.get(fg_url, headers=HEADERS).json()[“data”]
tries:
as_idx = request.get(as_url, headers=HEADERS).json()[“data”]
altcoin_index = as_idx.get(“altcoin_index”) or 0
Except for the exception:
altcoin_index = 0
Return {“fear_greed_value”: fg.get(“value”), “altcoin_index”: altcoin_index}

Definition of is_regime_favorable(regime):
return (regime.get(“fear_greed_value”) or 0) > 50 and (regime.get(“altcoin_index”) or 0) >= 50

Step 6: Mass Flow

Definition of run_helium_tracker(asset_ids):
system = fetch_macro_regime()

Raw_quotes = fetch_quotes(list(asset_ids.values()))
quotes = {str(a[“id”]): parse_quote(a) for raw_quotes}

hnt_id = assets_ids.get(“HNT”)
mobile_id = assets_ids.get(“MOBILE”)
hnt_quote = quote.get(str(hnt_id), {})
mobile_quote = quote.get(str(mobile_id), {})

hnt_score = compute_hnt_score(hnt_quote)
If not then it is_regime_favorable(system):
hnt_score -= 15

Pool_liq = None
tries:
pools = fetch_hnt_pools()
best = get_best_pool(pools)
pool_liq = (best or {}).get(“liqUsd”)
Except for the exception:
passes

tries:
lists = fetch_depin_listings()
depin_assets = filter_depin_assets(listings)
Except for the exception:
depin_assets = []

depin_trending = [
{“symbol”: a.get(“symbol”), “pct_24h”: (a.get(“quote”) or [{}])[0].get(“percent_change_24h”)}
To get depin_assets[:10]
]

returns {
“hnt_signal”: {
“score”: hnt_score, “price”: hnt_quote.get(“price”),
“pct_24h”: hnt_quote.get(“pct_change_24h”), “volume_24h”: hnt_quote.get(“volume_24h”),
“dex_pool_liq”:pool_liq, “regime_favorable”:is_regime_favorable(regime),
},
“mobile_signal”: {
“price”: mobile_quote.get(“price”), “pct_24h”: mobile_quote.get(“pct_change_24h”),
“market_cap”: mobile_quote.get(“market_cap”),
},
“depin_trending”: depin_trending,
“System”: the system,
}

Common mistakes

Using CMC map address for HNT Solana DEX calls

CMC may return an incorrect address or Ethereum address for HNT. Always use SPL mint hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux for all Solana DEX calls.

Citation analysis as a dictation in version 3

The quote is a list. Use the following((q for q in assets.get(“quote”, []) if q.get(“symbol”) == “USD”), {}).

Do not pour the liquid dollar to float

liqUsd is a string. Always send: float(p.get(“liqUsd”) or 0).

Treating CMC as an oracle to cover hotspots

CMC tracks market prices, not numbers of hotspots or data transfer revenues. Use Helium’s official API to get real network metrics.

Final thoughts

Key separation:

  • CoinMarketCap determines market conditions and narrative momentum for DePIN
  • The official Helium API validates realtime coverage metrics and reward distributions