Coverage
Every number Bitcompare publishes about the size and depth of its yield dataset is computed here, from the live database, in one place. Read it before you buy, and read it again before you cite: the data-room figures, the marketing pages, and this endpoint cannot disagree because they are the same query.
This endpoint is anonymous and free. It exists so you can verify our claims yourself — the numbers below were captured from production on 2026-09-16 and will have moved by the time you read this. Provider attestation is activating: providers.attesting and earnGraph.providerConfirmedVariants report 0 until the first providers complete it.
Access and caching
No key is needed. Every plan, including anonymous, gets the same body.
| Plan | Access |
|---|---|
| Anonymous (no key) | Full |
| Free / Starter / Growth | Full |
| Pro / Enterprise | Full |
The aggregate queries touch several tables, so the response is computed at most once an hour and served with Cache-Control: public, max-age=3600, s-maxage=3600. generatedAt tells you when the figures were last computed. Anonymous calls count against the per-IP Free rate limit (30 req/min); with a key they count against your plan's budget.
How to read it
The report is built around a few honesty rules; knowing them stops you mis-quoting it.
- Yield is the headline, price ticks are context.
providers.servingYieldandrates.servableYieldcount lending, borrowing, and staking only. Spot price ticks are reported separately inrates.servablePriceTicksand never folded into a headline figure. - Observed is not the same as reconstructed.
observations.observedare rows written by live collection sinceobservedFirstAt; they are append-only from that point.observations.reconstructedwere rebuilt from daily history back toreconstructedBackToand are labelledbackfillin the rate-change feed. Quote the observed figure when you mean "history begins". - Substantive, not schema capacity.
earnGraph.variantsWithSubstantiveTermscounts variants with at least two real term fields (a lockup, a tier, a minimum, a notice period); a flexible-only variant with nothing else known is not counted as "terms coverage". - Live prints versus backfilled prints.
benchmark.livePrintDaysis the number of days the Stablecoin Earn Benchmark has been computed by the daily job;backfilledPrintDayswere reconstructed and are flagged as such on every print.
Get coverage
No parameters. Returns { data: report }.
Request
curl https://api.bitcompare.net/api/v1/coverage
Response (captured 2026-09-16)
{
"data": {
"generatedAt": "2026-09-16T02:37:55.971Z",
"providers": {
"registered": 108,
"enabled": 99,
"servingYield": 35,
"servingPriceOnly": 33,
"attesting": 0,
"byPlatformType": {
"cefi": 63,
"defi": 35,
"hybrid": 1
}
},
"rates": {
"servableYield": 864,
"servableYieldByCategory": {
"borrowing": 194,
"lending": 554,
"staking": 116
},
"distinctYieldAssets": 364,
"servablePriceTicks": 28489,
"distinctPriceAssets": 18475
},
"observations": {
"total": 424928,
"observed": 277942,
"observedFirstAt": "2026-07-21T00:57:15.412Z",
"reconstructed": 146986,
"reconstructedBackTo": "2025-12-18T23:59:59.000Z",
"perDay30dObserved": 5267,
"byCollectionMethod": {
"pull_api": 271310,
"backfill": 146986,
"onchain": 6604,
"multi_source": 27,
"manual": 1
}
},
"history": {
"dailyRollupSince": "2025-12-18",
"retentionYears": 5
},
"earnGraph": {
"products": 1102,
"productsWithServableRate": 863,
"variants": 862,
"providerConfirmedVariants": 0,
"variantsWithSubstantiveTerms": 121,
"variantsWithTvl": 487,
"promotionalVariants": 0,
"variantsByConfidenceBand": {
"high": 862
},
"variantsBySourceMethod": {
"pull_api": 854,
"manual": 8
}
},
"benchmark": {
"series": "bei-stable",
"firstPrintDay": "2025-12-18",
"latestPrintDay": "2026-09-15",
"livePrintDays": 30,
"backfilledPrintDays": 235
}
}
}
Properties
providers
- Name
registered- Type
- integer
- Description
Providers in the registry, whether or not currently collected.
- Name
enabled- Type
- integer
- Description
Providers with collection switched on.
- Name
servingYield- Type
- integer
- Description
Distinct providers with at least one fresh lending, borrowing, or staking rate right now. This is the headline provider count.
- Name
servingPriceOnly- Type
- integer
- Description
Distinct providers serving only spot prices. Context, not part of the yield headline.
- Name
attesting- Type
- integer
- Description
Distinct providers with at least one
provider_confirmed(attested) variant.
- Name
byPlatformType- Type
- object
- Description
Registered providers by
cefi/defi/hybrid.
rates
- Name
servableYield- Type
- integer
- Description
Yield rates currently servable through
/rates.
- Name
servableYieldByCategory- Type
- object
- Description
The same, split by
lending/borrowing/staking.
- Name
distinctYieldAssets- Type
- integer
- Description
Distinct asset symbols with a servable yield rate.
- Name
servablePriceTicks- Type
- integer
- Description
Servable spot price ticks. Context only.
- Name
distinctPriceAssets- Type
- integer
- Description
Distinct assets with a spot price. Context only.
observations
- Name
total- Type
- integer
- Description
All rows in the observation log.
- Name
observed- Type
- integer
- Description
Rows written by live collection — the append-only, tamper-evident part.
- Name
observedFirstAt- Type
- string | null
- Description
ISO 8601 instant of the first live observation.
- Name
reconstructed- Type
- integer
- Description
Rows rebuilt from daily history and labelled
backfill.
- Name
reconstructedBackTo- Type
- string | null
- Description
ISO 8601 instant the reconstruction reaches back to.
- Name
perDay30dObserved- Type
- integer
- Description
Average live observations per day over the last 30 days, backfill excluded.
- Name
byCollectionMethod- Type
- object
- Description
Row counts by collection method.
history
- Name
dailyRollupSince- Type
- string | null
- Description
YYYY-MM-DDthe daily history rollup begins.
- Name
retentionYears- Type
- integer
- Description
How many years of observation history are retained.
earnGraph
- Name
products- Type
- integer
- Description
Products in the earn product graph.
- Name
productsWithServableRate- Type
- integer
- Description
Products with a servable rate behind them right now (versus ever created).
- Name
variants- Type
- integer
- Description
Active variants.
- Name
providerConfirmedVariants- Type
- integer
- Description
Variants whose terms the provider has attested.
- Name
variantsWithSubstantiveTerms- Type
- integer
- Description
Variants with at least two real term fields populated.
- Name
variantsWithTvl- Type
- integer
- Description
Variants carrying on-chain TVL.
- Name
promotionalVariants- Type
- integer
- Description
Variants flagged as time-limited promotions.
- Name
variantsByConfidenceBand- Type
- object
- Description
Active variants by
high/medium/low/unknown.
- Name
variantsBySourceMethod- Type
- object
- Description
Active variants by baseline collection method.
benchmark
- Name
series- Type
- string
- Description
Always
"bei-stable".
- Name
firstPrintDay- Type
- string | null
- Description
YYYY-MM-DDof the earliest print, backfill included.
- Name
latestPrintDay- Type
- string | null
- Description
YYYY-MM-DDof the most recent print.
- Name
livePrintDays- Type
- integer
- Description
Days with a print computed by the live daily job.
- Name
backfilledPrintDays- Type
- integer
- Description
Days whose print was reconstructed.
Errors
- Name
429 RATE_LIMIT_EXCEEDED- Description
Anonymous calls share the per-IP Free budget (30 req/min). Pass a key to use your plan's budget. See Rate Limiting.
No plan gating applies; there is no 403 on this endpoint. The full error envelope is described on the Errors page.
See also
- Rate Changes — the observation log these counts describe
- Earn Products — the product and variant graph
- Stablecoin Earn Benchmark — the
bei-stableseries - Rates — the current-rate endpoints