Changelog
What changed in the contract of the API, newest first, and the notice we commit to before a breaking change. Current contract: v1, OpenAPI version 1.1.0.
#Versioning and deprecation
The contract is v1. Not breaking, and shipped without notice: a new route, a new field in a response, a new optional parameter, a new error.code, a new value in an informative text. Write clients that ignore unknown fields.
Breaking: removing or renaming a route, a field, a parameter or an error.code, changing a unit or the meaning of a field. A breaking change is announced on this page, and only takes effect for your plan once its notice has run:
| Plan | Notice before a breaking change |
|---|---|
| Free | No guaranteed notice (announced on this page) |
| Traders | 30 days |
| Financial | 60 days |
| Startup | 90 days |
| Enterprise | Set in the contract |
#Changes
2026-10-01 · One error format, a generated reference
- Every error has one shape:
status: "error",timestamp,error{code, message, param}anddetail.error.codeis stable and machine-readable; branch on it.detailis kept and repeats the message; on a validation error it is now a string instead of a list. - Error messages are in English (they were in French). A client that matched the French text must switch to
error.code. /v1/snapshotaccepts=trueas a depth of 1 (funding_rate_8h=true). Called with onlysymbol, it now also returnsavailable_multi_tf_fields,timeframesandmax_depth.timePeriod=1moon the Bitcoin histories, an unambiguous spelling of one month;1mstill works there and still means one month.POST /v1/indicatorsalso accepts the parameters nested in aparametersobject./v1/trades/futureon a stablecoin answersunavailable: "not_applicable"(it saidno_data).- Responses are compressed (gzip) when the client asks for it;
GET https://api.bytnode.com/answers a JSON index of the links. - The OpenAPI contract now carries a schema, the unit of every field and a real example for every route, the error responses and code samples. New:
llms-full.txt, a Postman collection and the interactive reference. - The texts of
/v1/macro/correlations(method) and/v1/macro/risk(condition) are in English.
2026-09-30 · Data quality
- Combined trade candles (
/v1/trades) are built from the spot and futures candles of the same bucket. - New field
volume_estimatedon candles:truewhen the aggregated volume of an older candle was reconstructed. - Funding is aligned on the period actually covered;
/v1/funding/rate?live=1serves the window in progress. - Price change of the USDC pair is computed on spot candles.
- WebSocket: every
book.*message carriesmid_avgandspread_bps_avg.
2026-09-29 · Time alias, empty answers, published contract
- Every timestamped object under
dataalso carriestime, a copy of itsbucket,timestamp,date… so a generic client reads one key. - Every REST route whose
datais empty carriesunavailable(not_applicable,no_api_key,no_data), like the snapshot. - The OpenAPI contract with the unit of each numeric field is served without a key at
/openapi.json. - OHLC candles come from one reference spot market per symbol; volumes stay aggregated across venues.
- An unknown
timeframeis a422, no longer a403.
2026-09-28 · Strict parameters and one scale per suffix
- Strict parameters: a parameter a route does not declare, or a repeated one, is a
422with a suggestion (it was silently ignored). since_ms/until_msin seconds, micro- or nanoseconds, or before 2009-01-03 are a422.- Units by suffix:
*_pctis a percent,*_ratioa fraction,*_bpsbasis points.aprbecameapr_pct;basis_pctis served ×100. - Every timestamp is ISO 8601 UTC with fixed milliseconds (
2026-09-28T14:00:00.000Z). - The envelope repeats the effective
symbolandtimeframeof the request. is_closedis immutable: a closed bucket is final and never rewritten.- Rate-limit headers in the IETF format (
RateLimit-Policy,RateLimit), with the monthly quota left. - Every error generated at the edge is JSON, never an HTML page.
/v1/statushas one row per public feed, with a threshold of 1.5 × its expected interval.
2026-09-26 · MCP server
- The MCP server exposes three tools covering the whole API (73 fields), with the client’s own key and plan.
- A history is never cut silently: a period without
timeframegets the finest step that fits, and every series carries its real coverage (ranges).
2026-09-16 · WebSocket capacity
- The WebSocket stream runs on dedicated infrastructure and announces its capacity: a
503at the handshake means the service is full, not that your plan refused. - Sequence numbers (
seq) are global per channel.
2026-09-12 · Ten new pairs
- XMR, LINK, ADA, LTC, UNI, GRAM (ex-TON), AVAX, HBAR, NEAR and TAO join the catalogue: 22 pairs.