Provenance you can check yourself

Our DePIN dataset is built to be irresistible because it is checkable. Every value names the source it was read from and links straight to it. Batch verification depends on retained rows and a verified OpenTimestamps proof. You do not have to trust us — you can verify.

372Networks with live data
18,824Live data series
MethodMerkle-root and OpenTimestamps verification
731Catalog entries

Live-coverage figures are separate from dated batch membership and do not describe the historical batch below.

Provenance on every field

The atom of our dataset is not a number — it is a number with its paperwork. Every value we serve carries the same seven-field shape.

Row shape JSON
{
  "symbol":     "AKT",
  "metric":     "price_usd",
  "value":      0.506855,
  "unit":       "usd",
  "source":     "CoinGecko /coins/markets",
  "verify_url": "https://www.coingecko.com/en/coins/akash-network",
  "as_of":      "2026-08-09T17:15:20Z"
}
What each field is for contract
symbol / metric — what this measures, keyed so agents can join it.
value / unit — the measured number and its unit. Never rounded up past source.
source — the exact upstream feed the value was read from.
verify_url — a link you can open right now to check the value at that source.
as_of — the timestamp the value was true. Stale is shown, never hidden.

Row-shape example. Its as_of timestamp is historical; the source link is not a batch-inclusion proof.

Where each number comes from

We do not pretend everything is first-party. Each series is labelled with the tier it came from. The largest tier is read directly from the network's own API or chain; the rest are named market and protocol aggregators.

Provenance tiers — live series by source measured 2026-10-05
Source tier Live series What it is
CoinGecko /coins/markets8,499Market facts: price, market cap, circulating & total supply.
subtensor_rpc4,526Bittensor subnet economics read from a subtensor RPC node.
geckoterminal_dex1,362First-party telemetry read from the source's own public endpoint.
dexscreener_pairs1,294First-party telemetry read from the source's own public endpoint.
github936Public development activity: stars, forks, issues, days-since-push.
first_party_api803Read straight from the network's own API — verify_url points at the network itself.
evm_blockscout701Token supply read from EVM chain explorers.
cosmos_lcd238Cosmos-SDK chain state read from a public LCD endpoint.
solana_rpc220Solana account and supply state read from a public RPC node.
akash_console193Akash provider capacity and utilisation from its own console API.
DefiLlama /overview/fees139Protocol fees, revenue and TVL from DefiLlama's public API.
CoinGecko /coins/{id} community+developer126Market facts: price, market cap, circulating & total supply.
dexscreener_tokens114First-party telemetry read from the source's own public endpoint.
bsc_rpc64BNB-chain token supply read from a public RPC node.
166 further sources1,274The long tail — each one a named public endpoint carried on every value it produces.

Every value keeps its tier label all the way to your query, so an integration always knows whether a number came from the network itself or from an aggregator.

verify_url: check it at the source

Most data vendors ask you to trust a dashboard. We do the opposite: each value hands you the upstream link it was read from, so you can confirm it without us in the loop.

First-party tier
verify_url → the network's own API / block explorer
For the 7,427 first-party series, the link points at the network itself — a provider endpoint, a station API, a chain explorer. The number originated where the link goes.
Market & protocol tiers
verify_url → the named aggregator's page for that coin
For market and fees data, the link points at the exact CoinGecko or DefiLlama page we read. You see the same value at the same source — no repackaging in the dark.
Point-in-time
as_of = when the value was true
Live sources move. The as_of timestamp pins each value to the moment it was read, so a check is a like-for-like comparison — and staleness is surfaced, not buried.
Why it is the moat
checkable ⇒ credible ⇒ reusable
A number you can independently confirm is a number an autonomous agent can act on. Verifiability is the product, not a footnote.

The daily Bitcoin anchor

verify_url proves a value is real at its source. The method is to take a batch, build a Merkle tree, and submit its root through OpenTimestamps — free, no token, no spend. Submission is not Bitcoin confirmation. The stages below describe the method, not current status.

01 · Row

Each value

symbol · metric · value · unit · source · verify_url · as_of

→
02 · Leaf

SHA-256

Each row is hashed into a Merkle leaf.

→
03 · Root

Merkle root

All leaves fold into one 32-byte root for the day.

→
04 · OTS

Calendars

The root is submitted to OpenTimestamps calendars; submission alone is not Bitcoin confirmation.

→
05 · Bitcoin

Block timestamp

A verified Bitcoin timestamp is needed before claiming confirmation.

Historical batch date
2026-08-09
manifest generated 20:38 UTC
Batch membership
Not re-derived
The row payload is not retained locally; rolling coverage does not establish this batch's members.
Calendars listed
4
historical manifest
Recorded manifest status
PENDING
Historical record; current Bitcoin confirmation not checked here
Recorded merkle_root 9cd92fde048419f2187e38d82c46797d19e8dd3909791a370a1646b6987318b7
How the root is built deterministic
leaf   = sha256( "symbol\tmetric\tvalue\tunit\tsource\tverify_url\tas_of" )
root   = merkle( sort(all rows) )   // odd node duplicates last
stamp  = ots stamp root             // calendar submission; not Bitcoin confirmation
How to verify a retained batch zero trust in us
1. pull the batch you were served.
2. sha256 each row, Merkle-root them.
3. confirm it equals the published root.
4. ots verify batch.root.ots   // checks the root against Bitcoin
🔎

Three mechanisms, three different jobs

These are often conflated, so to be exact about which question each one answers:

verify_url answers “is this what the upstream says?” — and it answers it now. An upstream URL is mutable; on its own it cannot establish what that upstream published at 14:03 UTC six months ago. We do not claim it can.

The ed25519 response receipt answers “what did Kairos actually serve me, and when?” Every /v1/ GET returns X-Kairos-Signature, X-Kairos-Timestamp and a link to the public key. That puts us on the record for our own bytes — it says nothing about the upstream.

A verified Bitcoin timestamp bounds when committed data existed; it is not automatically the batch's own date. Record-level verification also requires membership evidence.

Honest scope — what the anchor proves, and what it does not

Verification requires retained batch rows, a matching Merkle root and a verified OpenTimestamps proof. The /attestations/batch_<YYYYMMDD>.root file contains the root, not a row count. Recomputing a retained batch and running ots verify can check the commitment and its timestamp. A verified Bitcoin timestamp bounds existence by that time, which may be later than the batch date.

It does not prove that a source value is correct — that is what the per-value verify_url is for, upstream — and it says nothing about trading performance, returns, or signal accuracy. This is a data-integrity guarantee on a data product, not a track-record claim.

The historical record above is not a current confirmation report. Per-value inclusion queries use /v1/attest?symbol=&metric=&date=; a query can return an honest miss. An implemented query route does not establish that a particular row is retained, included or Bitcoin-confirmed. Historical verification requires the retained batch and separately verified timestamp evidence. With verified inclusion and timestamp evidence, the commitment is bounded by the verified confirmation time — it does not establish that an upstream measurement or any analytical conclusion is correct.

The not-covered map is a feature

When a network has no free or first-party feed, we do not invent a number to fill the gap. We keep the network in the catalog and mark the gap, so you always know the difference between "we measured this" and "no public feed exists".

🗺️

731 catalog entries

The catalog holds 731 rows (superseded rows and Bittensor subnet rows included) across compute, storage, sensor, wireless, AI, energy and mobility — the map of the territory, not just the covered part.

🔌

Public feed, flagged

Each catalog entry records whether a public stats API exists and its URL. As of today 30 entries carry a public stats-API URL; the rest are cataloged with the gap shown, not hidden.

🚫

No invented fills

Provenance-or-silence. If we cannot read a value from a real source, the field stays empty and labelled — never back-filled with a guess.

Built for machines and humans

The dataset is delivered through a structured API with the same provenance shape on every field — designed for AI agents, MCP clients, and analysts who need to cite their sources.

Endpoints
/v1/networks /v1/network/<SYM> /v1/supply /v1/market /v1/revenue /v1/provenance
Every response row carries symbol, metric, value, unit, source, verify_url and as_of. API access is self-serve: register and your key works immediately.
Status — straight talk
public endpoint: live, keyless per-value inclusion proof: live at /v1/attest
The public query endpoint is live and keyless, and per-value inclusion proofs are served at /v1/attest?symbol=&metric=&date= — no account is needed to check a value. A proof establishes commitment to the anchor, not the truth of the measurement.

See the coverage and depth, or read how we verify a single number end to end.

Explore the data product How we verify a number Get API key