Endpoint documentation
Full documentation of one endpoint: parameters, field table generated from real responses, a captured example response, verified samples, 30-day probe history, errors and limits.
/api/meta/endpointRequest
Query parameters
| Name | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
| id | string | Required | — | — | Endpoint id from the catalog (for example `sd-oi`). Unknown ids return 404. Example: sd-oi |
Example request
curl -s "https://www.coinboss.com/api/meta/endpoint?id=sd-oi"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.endpoint/1`). |
| now | number | ms | Server time when the response was built. |
| endpoint | object | — | Catalog record of the endpoint. Map keys are attribute names such as `id`, `path`, `status`, `params`, `category`, `sources`, `units`, `formula`. dynamic keys: id,cat,kind,method,path,title |
| endpoint.{*} | array|number|object|string|null | — | Value of one attribute: text, a number, a list (`params`, `required`, `ts_fields`) or an object (`probe`, `category`, `example_query`); null when not set. |
| endpoint.{*}[] | object|string | — | Element of a list attribute: a parameter definition in `params`, or a name in `required` / `ts_fields`. may be absent |
| endpoint.{*}[].name | string | — | Name. may be absent |
| endpoint.{*}[].in | string | — | Where the parameter is sent: `query` or `path`. may be absent |
| endpoint.{*}[].type | string | — | Type. may be absent |
| endpoint.{*}[].required | boolean | — | true when the parameter must be sent. may be absent |
| endpoint.{*}[].default | null | — | Value used when the parameter is omitted; null when there is no default. may be absent |
| endpoint.{*}[].enum | null | — | List of accepted values; null when the parameter is not restricted to a list. may be absent |
| endpoint.{*}[].min | null | — | Minimum. may be absent |
| endpoint.{*}[].max | null | — | Maximum. may be absent |
| endpoint.{*}[].example | string | — | Example value of the parameter; null when none is given. may be absent |
| endpoint.{*}[].desc | string | — | Description of the parameter. may be absent |
| endpoint.{*}.checked_at | number | ms | Timestamp. may be absent |
| endpoint.{*}.http | number | — | HTTP status of the most recent probe request. may be absent |
| endpoint.{*}.ok | boolean | — | `true` when the most recent probe request returned HTTP 200 with a valid JSON body. may be absent |
| endpoint.{*}.schema_ok | boolean | — | `true` when the probed response matched the documented field table; `null` when no field table exists. may be absent |
| endpoint.{*}.latency_ms | number | ms | Response time of the most recent probe request. may be absent |
| endpoint.{*}.bytes | number | bytes | Size of the probed response body. may be absent |
| endpoint.{*}.quality | null | — | `meta.quality` reported by the probed response (FRESH / PARTIAL / STALE …); `null` when the endpoint does not report it. may be absent |
| endpoint.{*}.data_age_s | number|null | s | Seconds since the event. may be absent |
| endpoint.{*}.last_ok_at | number | ms | Timestamp. may be absent |
| endpoint.{*}.fail_streak | number | count | Number of consecutive failed probes; 0 when the last probe succeeded. may be absent |
| endpoint.{*}.id | string | — | Identifier. may be absent |
| endpoint.{*}.title | string | — | Display title of the endpoint's category (inside `category`). may be absent |
| endpoint.{*}.coin | string | — | Coin symbol, upper case (for example BTC). may be absent |
| fields | array | — | Field table of the response, inferred from real responses; null when no table has been generated. |
| fields[] | object | — | One response field: `path`, `type`, `unit`, `desc` and flags. |
| fields[].path | string | — | Path of the field in the response: `a.b` for nesting, `[]` for array items, `{*}` for the values of a map. |
| fields[].type | string | — | Type. |
| fields[].unit | string|null | — | Unit of the values in this object. |
| fields[].desc | string | — | Description of the field; null when none has been written. |
| fields[].optional | boolean | — | Present and true when the field was missing in at least one sampled response. may be absent |
| fields[].map | boolean | — | Present and true when the object is a map with data-dependent keys (coins, exchanges, dates) rather than fixed fields. may be absent |
| fields[].keys | array | — | Sample of keys seen in the map; only on fields with `map` true. may be absent |
| fields[].keys[] | string | — | One sample key. may be absent |
| fields_generated_at | number | ms | Timestamp. |
| fields_generated_from | array | — | Request URLs whose real responses the field table was inferred from; null when there is no table. |
| fields_generated_from[] | string | — | One sampled request path with query string. |
| example | object | — | Last successful real response captured by the probe: `request`, `captured_at`, `truncated` (original lengths of shortened arrays) and `body`; null when none. |
| example.request | string | — | Request that produced the captured example (path and query string). |
| example.captured_at | number | ms | Timestamp. |
| example.truncated | object | — | What was shortened in the captured example: for each array or map, the number of items left out. Its keys depend on the documented endpoint. |
| example.body | object | — | Captured response of the documented endpoint, shortened. Its structure is the one described by `fields`. |
| verified_samples | object|null | — | Results of the probe's extra sample requests (`at`, `samples` with query, HTTP status, latency, schema check); null when none ran. |
| verified_samples.at | number | ms | Time the extra samples were last checked. |
| verified_samples.samples | array | — | Number of samples. |
| verified_samples.samples[] | object | — | Number of samples. |
| verified_samples.samples[].query | object | — | Query parameters of the sample request. |
| verified_samples.samples[].query.coin | string | — | Coin symbol, upper case (for example BTC). may be absent |
| verified_samples.samples[].http | number | — | HTTP status returned. |
| verified_samples.samples[].ok | boolean | — | `true` when the sample returned what was expected (HTTP 200 with valid JSON, or the expected error status). |
| verified_samples.samples[].latency_ms | number | ms | Response time of the sample request. |
| verified_samples.samples[].schema_ok | boolean|null | — | `true` when the sample response matched the documented field table; `null` when not checked. |
| verified_samples.samples[].quality | null | — | `meta.quality` reported by the sample response; `null` when not reported. |
| verified_samples.samples[].note | string|null | — | Note. |
| probe_detail | null | — | Schema differences found by the last probe: `missing`, `mismatched` and `undocumented` field paths; null when there are none. |
| uptime_30d | object | — | Probe checks of this endpoint over the last 30 days: totals, success percentage and a per-day breakdown. |
| uptime_30d.checks | number | count | Number of probe checks of the endpoint in the last 30 days (fewer days when tracking started later). |
| uptime_30d.ok | number | count | Number of those checks that succeeded. |
| uptime_30d.pct | number | % | Percentage. |
| uptime_30d.days | array | — | Daily values or number of days. |
| uptime_30d.days[] | object | — | Daily values or number of days. |
| uptime_30d.days[].day | string | — | Calendar day (UTC). |
| uptime_30d.days[].checks | number | count | Number of probe requests that day. |
| uptime_30d.days[].ok | number | count | Number of successful probe requests that day. |
| uptime_30d.days[].pct | number | % | Percentage. |
| uptime_30d.days[].avg_ms | number | ms | Average response time that day; `null` without checks. |
| uptime_30d.days[].max_ms | number | ms | Slowest response that day. |
| errors | array | — | Error codes the API can return, each with HTTP status, meaning and retry advice. |
| errors[] | object | — | One error code. |
| errors[].code | string | — | Code. |
| errors[].http | number|string | — | HTTP status sent with this code; a string such as `501 / 503` when more than one applies. |
| errors[].meaning | string | — | What the error means. |
| errors[].retry | string | — | Advice on whether and how to retry. |
| errors[].legacy | boolean | — | Present and true only for the code used by older endpoints that answer HTTP 200 with `success: false`. may be absent |
| rate_limit | object | — | Rate-limit rules of the public API. |
| rate_limit.window_s | number | s | Length of the counting window (60). |
| rate_limit.anonymous_per_min | number | count | Requests per minute allowed per client IP when no API key is sent. |
| rate_limit.scope | string | — | Text stating how requests are counted: per client IP when anonymous, per key when a `CB-API-KEY` header is sent. |
| rate_limit.key_tiers_per_min | object | — | Requests per minute allowed for each API-key tier, keyed by tier name. |
| rate_limit.key_tiers_per_min.hobbyist | number | count | Requests per minute for keys of the `hobbyist` tier. |
| rate_limit.key_tiers_per_min.startup | number | count | Requests per minute for keys of the `startup` tier. |
| rate_limit.key_tiers_per_min.standard | number | count | Requests per minute for keys of the `standard` tier. |
| rate_limit.key_tiers_per_min.professional | number | count | Requests per minute for keys of the `professional` tier. |
| rate_limit.exempt | array | — | Path patterns that are not counted against the limit. |
| rate_limit.exempt[] | string | — | One exempt path pattern, for example `/api/coin-icon/*`. |
| rate_limit.headers | array | — | Names of the response headers that report the rate-limit state. |
| rate_limit.headers[] | string | — | One header name, for example `X-RateLimit-Remaining`. |
| rate_limit.on_exceed | object | — | What is returned when the limit is exceeded: `http` status and error `code`. |
| rate_limit.on_exceed.http | number | — | HTTP status returned when the limit is exceeded (429). |
| rate_limit.on_exceed.code | string | — | Code. |
| related | array | — | All endpoints of the same category, this one included. |
| related[] | object | — | One endpoint: `id`, `path` and `title`. |
| related[].id | string | — | Identifier. |
| related[].path | string | — | Request path of the endpoint. |
| related[].title | string | — | Short display title of the endpoint. |
| probe | object | — | State of the endpoint probe behind the live statuses: last run time, its age, the interval and whether it is fresh. |
| probe.last_run_at | number | ms | Timestamp. |
| probe.age_s | number | s | Seconds since this row was last updated. |
| probe.interval_s | number | s | Planned interval between two probe runs (300). |
| probe.fresh | boolean | — | true when the last probe run is less than 20 minutes old; when false, endpoint statuses are reported as `unknown`. |
| probe.error | null | — | Error message (present only on failure). |
| 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` when this endpoint was probed within the last 20 minutes, otherwise `STALE`. |
| 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:03 UTC from 3 real responses.
Example response
/api/meta/endpoint?id=sd-oi · Real response captured 2026-11-13 03:53:45 UTC. Long arrays and maps are shortened for display: errors had 9 items; fields had 103 items; related had 6 items; endpoint had 35 items; uptime_30d.days had 3 items; verified_samples.samples had 4 items.
- "success"true
- "schema""coinboss.meta.endpoint/1"
- "now"1794542025825
- "endpoint"
- "id""sd-oi"
- "cat""open-interest"
- "fields"
- "fields_generated_at"1794438008862
- "fields_generated_from"
- "/api/sd/oi?coin=BTC"
- "/api/sd/oi?coin=ETH"
- "/api/sd/oi?coin=SOL"
- "/api/sd/oi?coin=ARKM"
- "example"
- "request""/api/sd/oi?coin=BTC"
- "captured_at"1794541954384
- "truncated"
- "body"
- "verified_samples"
- "at"1794540459506
- "samples"
- "probe_detail"
- "missing"
- "mismatched"
- "undocumented"
- "uptime_30d"
- "checks"410
- "ok"410
- "pct"100
- "days"
- "errors"
- "rate_limit"
- "window_s"60
- "anonymous_per_min"1200
- "scope""per client IP for anonymous requests; per key when a CB-API-KEY header is sent"
- "key_tiers_per_min"
- "exempt"
- "headers"
- "on_exceed"
- "related"
- "probe"
- "last_run_at"1794541726312
- "age_s"300
- "interval_s"300
- "fresh"true
- "error"null
- "meta"
- "schema""coinboss.meta.endpoint/1"
- "source"
- "observed_at"null
- "received_at"1794541954384
- "fetched_at"1794542025825
- "window""latest"
- "cache_ttl_s"30
- "quality""FRESH"
- "is_stale"false
- "fallback""field table comes from the last schema generation; example is the last successful real response"
Verified samples
Besides the example above, the probe calls this endpoint with these parameters and checks the schema each time.
| Parameters | HTTP | Latency | Result |
|---|---|---|---|
| id=sd-funding | 200 | 2 ms | Pass FRESH |
| id=liquidations-overview | 200 | 2 ms | Pass FRESH |
| — | 400 | 2 ms | Pass returns the expected error |
Checked 2026-11-13 03:29:26 UTC
Details
- Authentication
- None. Public endpoint.
- Rate limit
- 1200 requests per minute per IP
- Server cache
- 30s
- Edge micro-cache
- 10s
- Data sources
- CoinBoss endpoint catalog, schemas generated by the API probe, sd_api_probe.
- 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
99.75% of 407 checks passed
- Returned but not documented: probe_detail.missing, probe_detail.mismatched, probe_detail.undocumented, probe_detail.undocumented[]
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/endpointAvailablestring — Endpoint id from the catalog (for example `sd-oi`). Unknown ids return 404.
https://www.coinboss.com/api/meta/endpoint?id=sd-oiMore 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