/api/sd/quality
GETAvailable

Data-quality matrix (collector view)

Self-data layer: data-quality matrix (exchange × data family)

GET/api/sd/quality

Request

This endpoint takes no parameters.

Example request

curl -s "https://www.coinboss.com/api/sd/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.

FieldTypeUnitDescription
successboolean—true when the request succeeded. On failure the body is `{ success: false, code, error, request_id }`.
nownumbermsServer time when the response was built.
familiesarray—Data families checked for every exchange, in display order.
families[]string—Family id: `ticker`, `oi`, `funding`, `funding_settle`, `liquidation`, `ls`, `spot` or `sd_contracts`.
exchangesarray—Exchanges.
exchanges[]string—Exchanges.
matrixobject—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.{*}.tickerobject—Freshness of the exchange's futures tickers: `status`, row counts, `age_s` and the fresh / usable windows. Map keys are exchange ids. may be absent
matrix.{*}.ticker.statusstring—Status. may be absent
matrix.{*}.ticker.rowsnumber—Result rows. may be absent
matrix.{*}.ticker.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.ticker.rows_usablenumber—Rows inside the usable window. may be absent
matrix.{*}.ticker.rows_orphannumber—Rows whose contract is no longer listed. may be absent
matrix.{*}.ticker.rows_invalidnumber—Rows rejected by validation. may be absent
matrix.{*}.ticker.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.ticker.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.ticker.usable_within_snumbersData older than this is not used at all. may be absent
matrix.{*}.oiobject—Open interest. may be absent
matrix.{*}.oi.statusstring—Status. may be absent
matrix.{*}.oi.rowsnumber—Result rows. may be absent
matrix.{*}.oi.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.oi.rows_usablenumber—Rows inside the usable window. may be absent
matrix.{*}.oi.rows_orphannumber—Rows whose contract is no longer listed. may be absent
matrix.{*}.oi.rows_invalidnumber—Rows rejected by validation. may be absent
matrix.{*}.oi.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.oi.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.oi.usable_within_snumbersData older than this is not used at all. may be absent
matrix.{*}.fundingobject—Funding rate block or value. may be absent
matrix.{*}.funding.statusstring—Status. may be absent
matrix.{*}.funding.rowsnumber—Result rows. may be absent
matrix.{*}.funding.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.funding.rows_usablenumber—Rows inside the usable window. may be absent
matrix.{*}.funding.rows_orphannumber—Rows whose contract is no longer listed. may be absent
matrix.{*}.funding.rows_invalidnumber—Rows rejected by validation. may be absent
matrix.{*}.funding.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.funding.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.funding.usable_within_snumbersData older than this is not used at all. may be absent
matrix.{*}.funding.rows_unknown_intervalnumbercountFunding rows updated in the last 4 hours whose settlement interval is unknown, so they cannot be normalised to 8 hours; any such row makes the cell `partial`. may be absent
matrix.{*}.funding.rows_no_next_timenumbermsTimestamp. may be absent
matrix.{*}.funding.rows_no_livenessnumbercountRecently updated funding rows on contracts with no evidence of live trading (delisted or no volume); left out of the freshness count. may be absent
matrix.{*}.funding_settleobject—Freshness of the exchange's funding settlement history: `status`, `age_s` of the newest settlement, `symbols` and `history_from`. may be absent
matrix.{*}.funding_settle.statusstring—Status. may be absent
matrix.{*}.funding_settle.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.funding_settle.symbolsnumber—Symbols. may be absent
matrix.{*}.funding_settle.history_fromnumbermsEarliest record held. may be absent
matrix.{*}.funding_settle.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.liquidationobject—Liquidation block. may be absent
matrix.{*}.liquidation.statusstring—Status. may be absent
matrix.{*}.liquidation.viastring—Collection path. may be absent
matrix.{*}.liquidation.last_event_age_snumber|nullsSeconds since the event. may be absent
matrix.{*}.liquidation.events_1hnumbercountLiquidation orders stored from this exchange in the last hour; minimum order sizes differ by exchange, so counts are not comparable. may be absent
matrix.{*}.liquidation.events_24hnumbercountLiquidation orders stored from this exchange in the last 24 hours; minimum order sizes differ by exchange, so counts are not comparable. may be absent
matrix.{*}.liquidation.ws_heartbeat_age_snumber|nullsSeconds since the event. may be absent
matrix.{*}.liquidation.judged_bystring—Which timestamp the status was judged from. may be absent
matrix.{*}.liquidation.idle_ok_snumbersLongest gap without a liquidation that still counts as normal for this exchange; a longer gap marks the feed `stale`. may be absent
matrix.{*}.lsobject—Freshness of the exchange's long/short ratio rows: `status`, row counts, `age_s` and the fresh / usable windows. may be absent
matrix.{*}.ls.statusstring—Status. may be absent
matrix.{*}.ls.reasonstring—Reason code. may be absent
matrix.{*}.spotobject—Spot market block or value. may be absent
matrix.{*}.spot.statusstring—Status. may be absent
matrix.{*}.spot.reasonstring—Reason code. may be absent
matrix.{*}.sd_contractsobject—Freshness of the exchange's coin-margined, USDC-margined and delivery contract rows: `status`, row counts and `age_s`. may be absent
matrix.{*}.sd_contracts.statusstring—Status. may be absent
matrix.{*}.sd_contracts.reasonstring—Reason code. may be absent
matrix.{*}.funding_settle.reasonstring—Reason code. may be absent
matrix.{*}.liquidation.reasonstring—Reason code. may be absent
matrix.{*}.liquidation.notestring—Note. may be absent
matrix.{*}.ls.rowsnumber—Result rows. may be absent
matrix.{*}.ls.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.ls.rows_usablenumber—Rows inside the usable window. may be absent
matrix.{*}.ls.rows_orphannumber—Rows whose contract is no longer listed. may be absent
matrix.{*}.ls.rows_invalidnumber—Rows rejected by validation. may be absent
matrix.{*}.ls.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.ls.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.ls.usable_within_snumbersData older than this is not used at all. may be absent
matrix.{*}.spot.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.spot.coinsnumber—Coins. may be absent
matrix.{*}.spot.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.spot.notestring—Note. may be absent
matrix.{*}.sd_contracts.rowsnumber—Result rows. may be absent
matrix.{*}.sd_contracts.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.sd_contracts.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.sd_contracts.rows_without_oinumbercountContract rows that carry no open interest value in USD. may be absent
matrix.{*}.sd_contracts.rows_oi_promotednumbercountContract rows whose open interest is also counted in the site-wide open interest totals. may be absent
matrix.{*}.sd_contracts.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.{*}object—Matrix keyed by row and column.
matrix.{*}.{*}.statusstring—Status.
matrix.{*}.{*}.reasonstring—Reason code. may be absent
matrix.{*}.{*}.age_snumbersSeconds since this row was last updated. may be absent
matrix.{*}.{*}.coinsnumber—Coins. may be absent
matrix.{*}.{*}.fresh_within_snumbersFreshness window: data newer than this counts as fresh. may be absent
matrix.{*}.{*}.notestring—Note. may be absent
matrix.{*}.oi.reasonstring—Reason code. may be absent
matrix.{*}.{*}.rowsnumber—Result rows. may be absent
matrix.{*}.{*}.rows_freshnumber—Rows updated inside the freshness window. may be absent
matrix.{*}.{*}.rows_usablenumber—Rows inside the usable window. may be absent
matrix.{*}.{*}.rows_orphannumber—Rows whose contract is no longer listed. may be absent
matrix.{*}.{*}.rows_invalidnumber—Rows rejected by validation. may be absent
matrix.{*}.{*}.usable_within_snumbersData older than this is not used at all. may be absent
matrix.{*}.ticker.deadboolean—Present only when `status` is `stale`: true when no row is inside the usable window either, so the exchange is excluded from aggregates. may be absent
matrix.{*}.funding.reasonstring—Reason code. may be absent
matrix.{*}.liquidation.pipeline_last_event_age_snumbersSeconds since the event. may be absent
matrix.{*}.liquidation.node_heartbeat_age_snumbersSeconds since the event. may be absent
summaryobject—Summary block.
summary.freshnumbercountNumber of exchange × family cells with status `fresh`.
summary.partialnumber—true when only part of the expected data is present.
summary.stalenumber—Rows or flag for data older than the freshness window.
summary.invalidnumbercountNumber of exchange × family cells with status `invalid`.
summary.unavailablenumber—Items for which no data is available, with reasons. Never reported as 0.
sourcesarray—Data sources.
sources[]object—Data sources.
sources[].exchangestring—Exchange id, lower case (for example `binance`).
sources[].familystring—Data family of the collector job the health record belongs to, for example `oi`, `funding`, `ticker`.
sources[].endpointstring—Label of the upstream call being tracked: host and path of the public API that is polled, or the name of an internal check.
sources[].okboolean—false when the most recent attempt failed, i.e. the last error is newer than the last success.
sources[].last_ok_age_snumber|nullsSeconds since the event.
sources[].last_err_age_snumber|nullsSeconds since the event.
sources[].last_statusnumber—HTTP status of the most recent call.
sources[].last_errorstring|null—Error text of the last failure, cut to 160 characters; null when none is recorded.
sources[].last_msnumbermsDuration of the most recent call; null when it was not measured.
sources[].fail_streaknumbercountConsecutive failed calls up to now; 0 after a success.
sources[].ok_countnumbercountSuccessful calls recorded in the health log.
sources[].err_countnumbercountFailed calls recorded in the health log.
sources[].http_429numbercountFailed calls answered with HTTP 429 (rate limited).
sources[].http_403numbercountFailed calls answered with HTTP 403 (forbidden).
sources[].http_5xxnumbercountFailed calls answered with an HTTP 5xx status.
sources[].timeoutsnumbercountFailed calls that timed out.
errorsobject—Map of family id to error message for families whose check itself failed; empty when every check ran.
alertsarray—Alerts of the data-quality patrol that are open or were resolved in the last 24 hours, open ones first (at most 200).
alerts[]object—One alert: `level`, `exchange`, `family`, `code`, `detail`, open / last-seen / resolved times, `hits` and `open`.
alerts[].levelstring—Level.
alerts[].exchangestring—Exchange id, lower case (for example `binance`).
alerts[].familystring—Data family the alert is about.
alerts[].codestring—Code.
alerts[].detailstring—Detail.
alerts[].opened_atnumbermsTimestamp.
alerts[].last_seen_atnumbermsTimestamp.
alerts[].resolved_atnumber|nullmsTimestamp.
alerts[].hitsnumbercountNumber of patrol runs (one every 5 minutes) that observed the condition since the alert opened.
alerts[].openboolean—Open price of the period.
monitorobject—Health of the monitoring itself: age of the last patrol run, age of the collector heartbeat and `patrol_ok`.
monitor.alert_job_age_snumbersSeconds since the event.
monitor.collector_heartbeat_age_snumbersSeconds since the event.
monitor.patrol_okboolean—true when the patrol ran within the last 15 minutes; when false the `alerts` list may be outdated.
legendobject—Plain-text definition of each cell status.
legend.freshstring—Definition of status `fresh`.
legend.partialstring—true when only part of the expected data is present.
legend.stalestring—Rows or flag for data older than the freshness window.
legend.invalidstring—Definition of status `invalid`.
legend.unavailablestring—Items for which no data is available, with reasons. Never reported as 0.

Generated 2026-11-11 23:01 UTC from 1 real responses.

Example response

/api/sd/quality · Real response captured 2026-11-13 03:53:45 UTC. Long arrays and maps are shortened for display: alerts had 3 items; matrix had 29 items; sources had 262 items; exchanges had 29 items.

  • {
    • "success": true,
    • "now": 1794542017525,
    • "families": [
      • "ticker",
      • "oi",
      • "funding",
      • "funding_settle",
      • "liquidation",
      • "ls",
      • "spot",
      • "sd_contracts"
      ],
    • "exchanges": [
      • "aster",
      • "backpack",
      • "binance",
      • "bingx",
      • "bitfinex",
      • "bitget",
      • "bitstamp",
      • "bitunix"
      ],
    • "matrix": {
      • "aster": { … 8 },
      • "backpack": { … 8 }
      },
    • "summary": {
      • "fresh": 123,
      • "partial": 7,
      • "stale": 1,
      • "invalid": 0,
      • "unavailable": 101
      },
    • "sources": [
      • { … 16 },
      • { … 16 }
      ],
    • "errors": {},
    • "alerts": [
      • { … 10 },
      • { … 10 }
      ],
    • "monitor": {
      • "alert_job_age_s": 280,
      • "collector_heartbeat_age_s": 35,
      • "patrol_ok": true
      },
    • "legend": {
      • "fresh": "data timestamps within the fresh window",
      • "partial": "some rows outside the fresh window or missing a required field",
      • "stale": "no row within the fresh window (dead=true: also outside the usable window, excluded from aggregates)",
      • "invalid": "more than half of usable rows fail sanity checks",
      • "unavailable": "no public source or not collected; shown as —, never 0"
      }
    }

Details

Authentication
None. Public endpoint.
Rate limit
1200 requests per minute per IP
Server cache
20s
Edge micro-cache
10s
Update frequency
matrix computed on request (20 s in-process memo); alert job every 5 min
Window
latest state; alerts open or resolved within the last 24 h
Data sources
Data-freshness matrix (exchange x data family) computed in-house from the timestamps of CoinBoss's own collected tables.
Exchange coverage
all venues present in any collected family; missing sources reported as unavailable with a reason
Pagination
alerts limited to 200
Units
status per cell: fresh | partial | stale | invalid | unavailable; ages in seconds
Method
fresh = >= 90% of live rows inside the family's freshness window (tickers 5 min, OI 15 min / cme 36 h, funding 15 min, long/short 90 min); liquidation feeds judged by WebSocket heartbeat or time since last event; funding settlements fresh within 9 h; spot snapshots within 30 min
Timestamps
Unix epoch milliseconds (UTC) unless the field description says otherwise
Response format
json
Stability
Stable
Available since
2026-11-11

Live status

AvailableChecked 2026-11-13 03:53:45 UTCHTTP 2004 msSchema matchesNewest data point 5m old

Availability, last 30 days

100% of 407 checks passed

Schema drift detected by the last probe
  • Returned but not documented: matrix.{*}.{*}.rows_unknown_interval, matrix.{*}.{*}.rows_no_next_time, matrix.{*}.{*}.rows_no_liveness, matrix.{*}.{*}.symbols, matrix.{*}.{*}.history_from, matrix.{*}.{*}.via, matrix.{*}.{*}.last_event_age_s, matrix.{*}.{*}.events_1h, matrix.{*}.{*}.events_24h, matrix.{*}.{*}.ws_heartbeat_age_s, matrix.{*}.{*}.judged_by, matrix.{*}.{*}.idle_ok_s

Errors

Failed calls share one shape on every endpoint. The full list is on the errors page. Errors and rate limits →

CodeHTTPMeaningWhat to do
INVALID_PARAM400A 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.
UNAUTHORIZED401The `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.
FORBIDDEN403The route is not part of the public API (internal or account-only).Do not retry.
NOT_FOUND404Unknown route, or the requested coin / exchange / fund does not exist.Do not retry; check the path and identifiers against the catalog.
RATE_LIMITED429More requests than the per-minute limit. `Retry-After` gives the seconds to wait.Wait for `Retry-After`, then retry with backoff.
INTERNAL500Unexpected 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_FAILED503The 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.
UNAVAILABLE501 / 503The 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_FAILED200Some 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

GET/api/sd/qualityAvailable
Parameters

No parameters.

Request URLhttps://www.coinboss.com/api/sd/quality
Choose an endpoint and press “Send request”. The response, headers and timing will appear here.