Data-quality matrix
Exchange × data-family matrix with FRESH / PARTIAL / STALE / BROKEN / UNAVAILABLE, source and fetch timestamps, lag, coverage and the reason for every gap.
/api/meta/qualityRequest
Query parameters
| Name | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
| exchange | string | Optional | — | — | Return only this exchange (lower-case id, for example `binance`). |
| family | string | Optional | — | — | Return only this data family (for example `oi`, `funding`, `liquidation`). |
Example request
curl -s "https://www.coinboss.com/api/meta/quality"Response fields
The field table is generated from real responses, so it lists exactly what the endpoint returns. Paths use a[] for array items and {*} for objects keyed by a dynamic name such as a coin or an exchange.
| Field | Type | Unit | Description |
|---|---|---|---|
| success | boolean | — | true when the request succeeded. On failure the body is `{ success: false, code, error, request_id }`. |
| schema | string | — | Schema id of this response (`coinboss.meta.quality/1`). |
| now | number | ms | Server time when the response was built. |
| families | array | — | Data families judged per exchange (tickers, open interest, funding, liquidations, order books, options and others). |
| families[] | object | — | One family: `id`, `scope`, `title`, `what`, `table`, `cadence` and `fresh_within_s`. |
| families[].id | string | — | Identifier. |
| families[].scope | string | — | `exchange` for families judged per exchange in `matrix`. |
| families[].title | string | — | Display title of the family. |
| families[].what | string | — | Short description of the data the family covers. |
| families[].table | string | — | Name of the internal dataset the family is judged from; informational only. |
| families[].cadence | string | — | Plain-text collection schedule of the family; null when not stated. |
| families[].fresh_within_s | number | s | Freshness window: data newer than this counts as fresh. |
| exchanges | array | — | Exchanges. |
| exchanges[] | string | — | Exchanges. |
| matrix | object | — | Matrix keyed by row and column. dynamic keys: aster,backpack,binance,bingx,bitfinex,bitget |
| matrix.{*} | object | — | Matrix keyed by row and column. dynamic keys: ticker,oi,funding,funding_settle,liquidation,ls |
| matrix.{*}.{*} | object | — | Matrix keyed by row and column. |
| matrix.{*}.{*}.status | string | — | Status. |
| matrix.{*}.{*}.lag_s | number|null | s | Now minus the newest stored data timestamp of that exchange (first key) and family (second key); null when the family is unavailable there. |
| matrix.{*}.{*}.source_at | number|null | ms | Timestamp. |
| matrix.{*}.{*}.fetched_at | number|null | ms | When CoinBoss fetched the data from the source. |
| matrix.{*}.{*}.fresh_within_s | number|null | s | Freshness window: data newer than this counts as fresh. |
| matrix.{*}.{*}.coverage | object|null | — | What is included and what is missing. |
| matrix.{*}.{*}.coverage.rows | number | — | Result rows. may be absent |
| matrix.{*}.{*}.coverage.rows_fresh | number | — | Rows updated inside the freshness window. may be absent |
| matrix.{*}.{*}.coverage.rows_usable | number | — | Rows inside the usable window. may be absent |
| matrix.{*}.{*}.coverage.rows_orphan | number | — | Rows whose contract is no longer listed. may be absent |
| matrix.{*}.{*}.coverage.rows_invalid | number | — | Rows rejected by validation. may be absent |
| matrix.{*}.{*}.reason | string|null | — | Reason code. |
| matrix.{*}.{*}.coverage.rows_no_liveness | number | count | Funding rows on contracts with no evidence of live trading (delisted or no volume); left out of the freshness count. may be absent |
| matrix.{*}.{*}.coverage.rows_unknown_interval | number | count | Recently updated funding rows whose settlement interval is unknown, so they cannot be normalised to 8 hours. may be absent |
| matrix.{*}.{*}.coverage.symbols | number | — | Symbols. may be absent |
| matrix.{*}.{*}.coverage.events_1h | number | count | Liquidation orders stored from the exchange in the last hour; minimum order sizes differ by exchange. may be absent |
| matrix.{*}.{*}.coverage.events_24h | number | count | Liquidation orders stored from the exchange in the last 24 hours; minimum order sizes differ by exchange. may be absent |
| matrix.{*}.{*}.via | string | — | Collection path. may be absent |
| matrix.{*}.{*}.coverage.books | number | count | Number of order books tracked. may be absent |
| matrix.{*}.{*}.coverage.books_fresh | number | count | Number of order books updated within the freshness window. may be absent |
| matrix.{*}.{*}.coverage.books_reaching_2pct | number | count | Number of order books deep enough to cover ±2 % around mid. may be absent |
| matrix.{*}.{*}.coverage.contracts | number | — | Per-contract rows. may be absent |
| matrix.{*}.{*}.coverage.contracts_fresh | number | count | Number of contracts updated within the freshness window. may be absent |
| matrix.{*}.{*}.coverage.with_mark_and_index | number | count | Number of contracts that have both a mark price and an index price. may be absent |
| matrix.{*}.{*}.coverage.delivery_contracts | number | count | Number of delivery (dated) contracts. may be absent |
| matrix.{*}.{*}.note | string | — | Note. may be absent |
| matrix.{*}.{*}.coverage.coins | number | — | Coins. may be absent |
| matrix.{*}.{*}.coverage.rows_without_oi | number | count | Coin-margined, USDC-margined or delivery contract rows that carry no open interest value in USD. may be absent |
| matrix.{*}.{*}.coverage.with_mark_iv | number | count | Number of option contracts that have a mark implied volatility. may be absent |
| matrix.{*}.{*}.coverage.with_greeks | number | count | Number of option contracts that have greeks. may be absent |
| datasets | array | — | Quality checks of datasets that are not per exchange (for example spot ETF and CME daily data), each with status, lag, coverage and reason. |
| datasets[] | object | — | One market-wide dataset that is not tied to a single exchange (options, spot ETFs, CME, order books, basis). |
| datasets[].family | string | — | Dataset id, for example `etf` or `cme`. |
| datasets[].id | string | — | Identifier. |
| datasets[].title | string | — | Display name of the dataset. |
| datasets[].source | string | — | Where the value comes from. |
| datasets[].endpoint | string | — | Public endpoint that serves the dataset. |
| datasets[].status | string | — | Status. |
| datasets[].lag_s | number | s | Age of the newest data point when the response was built. |
| datasets[].source_at | number | ms | Timestamp. |
| datasets[].fetched_at | number | ms | When CoinBoss fetched the data from the source. |
| datasets[].fresh_within_s | number | s | Freshness window: data newer than this counts as fresh. |
| datasets[].coverage | object | — | What is included and what is missing. |
| datasets[].coverage.funds_total | number | count | Number of funds tracked. may be absent |
| datasets[].coverage.funds_covered | number | count | Number of funds with a usable disclosure. may be absent |
| datasets[].coverage.funds_unavailable | number | count | Number of funds whose issuer publishes no machine-readable disclosure. may be absent |
| datasets[].coverage.funds_failing | number | count | Number of funds whose disclosure could not be read in the last collection round. may be absent |
| datasets[].coverage.as_of | string | — | Newest disclosure date among covered funds (YYYY-MM-DD). may be absent |
| datasets[].coverage.as_of_min | string | — | Oldest disclosure date among covered funds (YYYY-MM-DD). may be absent |
| datasets[].reason | string|null | — | Reason code. |
| datasets[].coverage.contracts | number | — | Per-contract rows. may be absent |
| datasets[].coverage.report_date | string | — | Date of the newest CFTC Commitments of Traders report (YYYY-MM-DD). may be absent |
| datasets[].coverage.products | number | count | Number of CME products covered. may be absent |
| datasets[].coverage.trade_date | string | — | Trade date of the newest CME daily report (YYYY-MM-DD). may be absent |
| summary | object | — | Summary block. dynamic keys: FRESH,PARTIAL,STALE,BROKEN,UNAVAILABLE |
| summary.{*} | number | — | Summary block. |
| by_family | object | — | Number of exchanges in each status, per family. Outer keys are family ids. dynamic keys: ticker,oi,funding,funding_settle,liquidation,ls |
| by_family.{*} | object | — | Status counts of one family, keyed by status (`FRESH`, `PARTIAL`, `STALE`, `BROKEN`, `UNAVAILABLE`). dynamic keys: FRESH,PARTIAL,STALE,BROKEN,UNAVAILABLE |
| by_family.{*}.{*} | number | count | Number of exchanges with that status for that family. |
| alerts | array | — | Alerts of the data-quality patrol that are open or were resolved in the last 7 days, open ones first; filtered by the request parameters. |
| alerts[] | object | — | One alert: `level`, `exchange`, `family`, `code`, `detail`, open / last-seen / resolved times, `hits` and `open`. |
| alerts[].level | string | — | Level. |
| alerts[].exchange | string | — | Exchange id, lower case (for example `binance`). |
| alerts[].family | string | — | Data family the alert is about. |
| alerts[].code | string | — | Code. |
| alerts[].detail | string | — | Detail. |
| alerts[].opened_at | number | ms | Timestamp. |
| alerts[].last_seen_at | number | ms | Timestamp. |
| alerts[].resolved_at | number|null | ms | Timestamp. |
| alerts[].hits | number | count | Number of patrol runs (one every 5 minutes) that observed the condition since the alert opened. |
| alerts[].open | boolean | — | Open price of the period. |
| monitor | object | — | Health of the monitoring itself: time and age of the last patrol run, `patrol_ok` and the age of the collector heartbeat. |
| monitor.patrol_last_run_at | number | ms | Timestamp. |
| monitor.patrol_age_s | number | s | Seconds since the event. |
| monitor.patrol_ok | boolean | — | true when the patrol ran within the last 15 minutes; when false the `alerts` list may be outdated while the matrix stays live. |
| monitor.collector_heartbeat_age_s | number | s | Seconds since the event. |
| errors | null | — | Map of family id to an error code for families whose quality check itself failed; null when every check ran. |
| legend | object | — | Plain-text definition of each cell status. dynamic keys: FRESH,PARTIAL,STALE,BROKEN,UNAVAILABLE |
| legend.{*} | string | — | Definition of the status named by the key (`FRESH`, `PARTIAL`, `STALE`, `BROKEN`, `UNAVAILABLE`). |
| method | object | — | Formula / method notes. |
| method.status | string | — | Status. |
| method.lag_s | string | — | Plain-text statement of how `lag_s` is computed. |
| method.source_at | string | — | Date-time string. |
| method.fetched_at | string | — | Date-time string. |
| meta | object | — | Envelope of this response: schema id, producing system, timestamps, cache lifetime and freshness. |
| meta.schema | string | — | Schema id of this response; same value as the top-level `schema`. |
| meta.source | array | — | Where the value comes from. |
| meta.source[] | object | — | Where the value comes from. |
| meta.source[].system | string | — | System that produced the data; always `coinboss` for the developer-center endpoints. |
| meta.source[].component | string | — | Component behind the data: the endpoint probe and the data-quality patrol. |
| meta.observed_at | null | — | Timestamp. |
| meta.received_at | number | ms | Timestamp. |
| meta.fetched_at | number | ms | When CoinBoss fetched the data from the source. |
| meta.window | string | — | Window. |
| meta.cache_ttl_s | number | s | Server-side cache lifetime of this response. |
| meta.quality | string | — | `FRESH` normally; `PARTIAL` when the quality patrol has not run within 15 minutes (only the alerts list is affected). |
| meta.is_stale | boolean | — | true when the row is older than the freshness window; stale rows are not used in totals. |
| meta.fallback | string | — | Plain-text note on what this endpoint returns when its inputs are stale or missing. |
Generated 2026-11-11 23:01 UTC from 3 real responses.
Example response
/api/meta/quality · Real response captured 2026-11-13 03:53:46 UTC. Long arrays and maps are shortened for display: alerts had 11 items; legend had 5 items; matrix had 30 items; summary had 5 items; datasets had 12 items; families had 12 items.
- "success"true
- "schema""coinboss.meta.quality/1"
- "now"1794542026126
- "families"
- "exchanges"
- "aster"
- "backpack"
- "binance"
- "bingx"
- "bitfinex"
- "bitget"
- "bitstamp"
- "bitunix"
- "matrix"
- "aster"
- "backpack"
- "datasets"
- "summary"
- "FRESH"161
- "PARTIAL"7
- "by_family"
- "ticker"
- "oi"
- "alerts"
- "monitor"
- "patrol_last_run_at"1794541745827
- "patrol_age_s"281
- "patrol_ok"true
- "collector_heartbeat_age_s"36
- "errors"null
- "legend"
- "FRESH""newest stored data point is inside the fresh window for this family"
- "PARTIAL""some contracts / rows are outside the fresh window or miss a required field"
- "method"
- "status""judged from data timestamps in CoinBoss storage every request (30 s in-process cache); a running collector process is not treated as evidence"
- "lag_s""now − newest stored data timestamp for the exchange / family"
- "source_at""newest stored data timestamp (exchange timestamp when the exchange provides one, otherwise collector receive time)"
- "fetched_at""last successful upstream call recorded by the collector health log; null for WebSocket feeds and collectors that do not log per-call health"
- "meta"
- "schema""coinboss.meta.quality/1"
- "source"
- "observed_at"null
- "received_at"1794542026978
- "fetched_at"1794542026126
- "window""latest"
- "cache_ttl_s"20
- "quality""FRESH"
- "is_stale"false
- "fallback""matrix is always computed from storage; when the 5-minute patrol itself stops (monitor.patrol_ok=false) only the alerts list may be outdated"
Verified samples
Besides the example above, the probe calls this endpoint with these parameters and checks the schema each time.
| Parameters | HTTP | Latency | Result |
|---|---|---|---|
| exchange=binance | 200 | 1 ms | Pass FRESH |
| family=funding | 200 | 1 ms | Pass FRESH |
Checked 2026-11-13 03:29:27 UTC
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 20s
- Edge micro-cache
- 10s
- Update frequency
- Evaluated on request from the newest data timestamp of every exchange × family pair.
- Data sources
- CoinBoss raw tables (latest-row timestamps), collector health log. A running process is never counted as healthy data.
- Timestamps
- Unix epoch milliseconds (UTC) unless the field description says otherwise
- Response format
- json
- Stability
- Stable
- Available since
- 2026-11-11
Live status
Availability, last 30 days
100% of 407 checks passed
Errors
Failed calls share one shape on every endpoint. The full list is on the errors page. Errors and rate limits →
| Code | HTTP | Meaning | What to do |
|---|---|---|---|
| INVALID_PARAM | 400 | A required parameter is missing or a value is not accepted. `param` names the parameter when it is known. | Do not retry unchanged; fix the request. |
| UNAUTHORIZED | 401 | The `CB-API-KEY` header was sent but the key is unknown or revoked. Public data needs no key — drop the header or use a valid key. | Do not retry unchanged. |
| FORBIDDEN | 403 | The route is not part of the public API (internal or account-only). | Do not retry. |
| NOT_FOUND | 404 | Unknown route, or the requested coin / exchange / fund does not exist. | Do not retry; check the path and identifiers against the catalog. |
| RATE_LIMITED | 429 | More requests than the per-minute limit. `Retry-After` gives the seconds to wait. | Wait for `Retry-After`, then retry with backoff. |
| INTERNAL | 500 | Unexpected server error. The message is generic by design; quote `request_id` when reporting it. | Retry once after a few seconds; report it with the request id if it persists. |
| UPSTREAM_FAILED | 503 | The data source behind this endpoint did not answer in time. No stale or substitute numbers are returned in its place. | Retry with backoff; check the status page. |
| UNAVAILABLE | 501 / 503 | The dataset is temporarily not ready (cache warming) or the endpoint has no lawful public source yet. | Retry later; the catalog marks endpoints that are unavailable by design. |
| REQUEST_FAILED | 200 | Some older endpoints answer HTTP 200 with `success: false`. Always check `success`, not only the HTTP status. | Depends on the message; treat as a failed request. |
Try it
/api/meta/qualityAvailablestring — Return only this exchange (lower-case id, for example `binance`).
string — Return only this data family (for example `oi`, `funding`, `liquidation`).
https://www.coinboss.com/api/meta/qualityMore in this category
- Data-quality matrix (collector view) /api/sd/quality
- API catalog /api/meta/catalog
- Changelog and versioning policy /api/meta/changelog
- Endpoint documentation /api/meta/endpoint
- OpenAPI document /api/meta/openapi
- Data-quality matrix /api/meta/quality
- Service status /api/meta/status
- Checks whether a coin symbol is known to the platform /api/coin-exists
- Map of coin symbol to locally hosted icon path /api/coin-icons
- Coin-page aggregated summary /api/content/coin
- Site-wide section summary /api/content/summary
- Fiat FX rate table /api/currency/fx
- Map of exchange id to locally hosted icon path /api/exchange-icons
- Liveness check /api/health
- Research-page statistics /api/research/stats