Freshness
Data reaches you through three kinds of path: direct database reads, in-memory poller state, and cached calls to public sources. This page lists how old a response can be on each endpoint.
#By endpoint
| Endpoint | Source of the values | Service cache | Typical maximum age |
|---|---|---|---|
GET /health | Process state | None | Current |
GET /status | Poller state | None | One poll cycle |
GET /status/history | Stored samples | None | 5 minutes, per sample |
GET /chains, GET /chains/{chain} | Poller state | None | One poll cycle |
GET /chains/{chain}/blocks | In-memory list of 25 | None | One poll cycle |
GET /gas | Poller state and price | None | One poll cycle, price 60 s |
GET /prices | CoinGecko | 60 s | About 60 s, more if the source fails |
GET /transfers | Database | None | One poll cycle after the block |
GET /transfers/stats | Database | None | One poll cycle |
GET /wallets/{address} | RPC | 30 s | 30 s |
GET /wallets/{address}/activity on EVM | RPC logs | 60 s | 60 s |
GET /wallets/{address}/activity on Solana | RPC | None | Current |
GET /tokens/{chain}/{address} | Mixed | See the next table | Up to 24 hours for metadata |
GET /tx/{chain}/{hash} | RPC | None, except token metadata | Current |
GET /labels, GET /labels/{address} | Built-in list | Fixed in the code | Changes with a release |
GET /markets/chains | DefiLlama | 10 min | 10 min |
GET /markets/stablecoins | DefiLlama | 10 min | 10 min |
GET /markets/dexs | DefiLlama | 15 min | 15 min |
GET /markets/pools | GeckoTerminal | 5 min, per chain | 5 min |
POST /rules/validate | Database, last 2,000 rows | None | One poll cycle |
GET /api/live | Poller events | None | Sent as each row is stored |
#Inside a token report
A report combines calls with different cache times. The sources[] array shows each call, and a ms near 0 usually means a cache hit.
| Part | Source | Cache |
|---|---|---|
| Market and pools | DexScreener | 60 s |
| Symbol, name, decimals, supply on EVM | Chain RPC | 24 hours |
| Security fields on EVM | GoPlus | 5 min |
| Mint info, supply and largest accounts on Solana | Solana RPC | 5 min |
| Security fields on Solana | GoPlus | 5 min |
| RugCheck summary on Solana | RugCheck | 5 min |
total_supply on EVM can therefore be up to 24 hours old. Do not use it for a live market cap.
#How the cache behaves
- It is in process memory. A restart empties it.
- Concurrent requests for the same key share one upstream call.
- A failed call is not cached, so the next request tries again.
- An empty GoPlus result is not cached. It counts as a failed source, and the next read tries again.
- Expired values are not served. If the source then fails, you get 502 or
unknown, not old data. GET /pricesis the exception. The poller keeps the last good prices when a refresh fails, so valuation continues with an older price.
#Poll cycle by chain
A poll cycle is the wait in indexing plus the RPC time. These figures come from the spacing of real blocks read on 2026-11-04 UTC.
| Chain | Average seconds between reads |
|---|---|
| Ethereum | 13.5 |
| Base | 17.3 |
| BNB Chain | 17.3 |
| Arbitrum One | 16.8 |
| Solana | 31.9 |
These figures are a measurement and not a promise. Farbeam publishes no latency target.
#Measuring age yourself
#Stale copies
If every source fails, four endpoints answer with the last saved copy: Wallet overview, Token report, Stablecoin supply and DEX volume. Each of those answers holds data.stale and data.as_of.
| Field | On a fresh answer | On a saved copy |
|---|---|---|
data.stale | false | true |
data.as_of | The time of the answer | The time the copy was saved |
Saved copies are kept for 7 days. With no copy, the answer is 502 upstream_unavailable. Read data.stale before you act on a value.
#Comparing times
For a stored transfer, compare ts with meta.as_of. For the head of a chain, read head_age_seconds from /status.
curl -s "https://farbeamlabs.com/api/v1/status" | jq '.data.chains[] | {chain, status, head_age_seconds, last_ok}'const res = await fetch("https://farbeamlabs.com/api/v1/status");
const { data } = await res.json();
for (const c of data.chains) console.log(c.chain, c.status, c.head_age_seconds, c.last_ok);import requests
data = requests.get("https://farbeamlabs.com/api/v1/status", timeout=30).json()["data"]
for c in data["chains"]:
print(c["chain"], c["status"], c["head_age_seconds"], c["last_ok"])#Polling advice
Polling faster than the cache time returns the same values and still costs units. Poll token reports no more than once per minute for market fields, and once per 5 minutes for checks. For new transfers, use the stream or a webhook.