discovery_health
Report the freshness and health of the cross-chain program/token discovery pipeline: when the hourly cron last ran, how many programs/tokens each chain scan produced, and which scans failed. Use this to check whether discover_programs / search_tokens data is current before relying on it.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | plain-language reading of status | |
| counts | No | per-chain program counts from the last scan | |
| status | Yes | healthy | stale | degraded | |
| history | No | per-chain counts over the last <=24 cron runs, oldest first | |
| emptyScans | No | chains whose last scan returned zero (omitted when none) | |
| failedScans | No | chains whose last scan errored (omitted when none) | |
| lastRunUnix | No | ||
| sourceErrors | No | per-chain list of what each live source ACTUALLY answered when it failed, e.g. "robinhood/ERC-20: blockscout /api/v2/tokens → 403". Says WHY a census is thin where seedsOnlyScans only says THAT it is. Capped at 4 entries per chain; when more were recorded the list carries a final "… +N more (T total)" string, so the count survives the truncation rather than the list silently reading as complete. Omitted when every source succeeded | |
| lastRunAgeMin | No | ||
| seedsOnlyScans | No | chains whose last scan returned ONLY hardcoded canonical seeds — every live source returned nothing while the fallback held, so the count is non-zero and emptyScans does NOT list them. Sets status=degraded. Omitted when none | |
| censusLiveRecords | No | per-census count of records the LIVE source returned, before any merge, cap or spam filter — the evidence behind seedsOnlyScans. 0 means the live source supplied nothing (the census is its fallback); -1 means this census was last written by a build that did not record the field, which is NOT the same as zero. Published even when healthy, so a reader can distinguish "source is fine" from "nothing was measured" without inferring it from a verdict. Never omitted: built over the census keys in counts, so every census always carries a value and -1 covers the pre-field case — the earlier exemption for records predating the field was retired when the conditional spread was removed | |
| censusRecordsBeforeCap | No | per-census record count BEFORE the fungible (170) and NFT (50) caps. A count sitting exactly on its cap cannot say whether it is a finding or a ceiling — hyperevm_census reads 170 because 170 IS the cap. Compare against counts: a value here greater than the published count means that census was TRUNCATED, equal means it was not. -1 means the build that last wrote this census did not record the field. Never omitted, same construction as censusLiveRecords |