Changelog
Jede Änderung an der Data API und ihrem Vertrag, neueste zuerst. Versionsnummern folgen der Versionierungs- und Abkündigungsrichtlinie.
POST /webhooks und POST /webhooks/{id}/test teilen sich jetzt ein Limit von 5 Requests pro Minute und Konto, zusätzlich zum Burst-Limit des Plans. Requests darüber erhalten 429 rate_limited mit Retry-After. Ein Testereignis wird jetzt einmal gesendet, ohne Wiederholungen; andere Zustellungen werden weiterhin bis zu 3-mal versucht, mit Backoff zwischen den Versuchen. Dies ist ein Limit gegen Missbrauch und lässt Monatskontingent und Burst-Limit jedes Plans unverändert. Die Versionierungs- und Abkündigungsrichtlinie wurde am selben Tag geändert, damit solche Limits sofort gelten können; bis dahin folgte jede Senkung eines Rate-Limits, das ein Plan hatte, dem sechsmonatigen Abkündigungszeitplan. Auf diesen beiden Endpunkten melden die Header X-RateLimit-* dasjenige der beiden Limits, bei dem weniger Requests übrig sind.
POST /webhooks löst den Hostnamen der URL nicht mehr auf. Der Aufruf liefert weiterhin 422, wenn die URL kein https verwendet, Zugangsdaten enthält oder eine nicht öffentliche IP-Adresse als Host hat. Ein Hostname, der sich nicht auflösen lässt oder auf eine nicht öffentliche Adresse auflöst, erhielt bisher 422; er wird jetzt mit 201 angenommen und zählt zum Limit von 5 Endpunkten pro Konto. Jede Zustellung an einen solchen Endpunkt schlägt dann ohne Wiederholung fehl, error bei GET /webhooks/{id}/deliveries nennt den Grund, und nach 10 fehlgeschlagenen Zustellungen in Folge wird der Endpunkt deaktiviert. Senden Sie nach dem Erstellen eines Endpunkts mit POST /webhooks/{id}/test ein Testereignis und prüfen Sie im Zustellprotokoll, ob er erreichbar ist.
endpoints[].endpoint bei GET /usage nennt jetzt die Routenvorlage statt des aufgerufenen Pfads, also api/v1/coins/{slug} statt api/v1/coins/bitcoin. Jeder Endpunkt hat damit eine Zeile statt einer pro Slug oder ID. Requests, die früher im laufenden Abrechnungszeitraum erfasst wurden, behalten ihren Pfad, daher können bis zum Ende des Zeitraums beide Formen erscheinen.
GET /exchanges/{slug} und GET /exchanges/{slug}/trust-score schlugen seit dem Start der Data API bei jeder Börse mit 500 fehl. Beide antworten jetzt; Parameter und Antwortfelder bleiben unverändert, und eine Börse ohne Rang liefert score und breakdown als null.
Der veröffentlichte OpenAPI-Vertrag kennzeichnet jetzt jedes Feld, das null sein kann, als nullbar und typisiert Werte mit Nachkommastellen als Zahlen (zum Beispiel invested bei GET /calculators/dca und Indikatorwerte); die gemeinsamen Felder logo und last_updated sowie die Paginierungsfelder from/to sind bei jedem Endpunkt nullbar, ebenso die Coin-Felder name und price bei jedem Endpunkt für Coin-Listen und Kurse. Außerdem typisiert er die DCA-series als Array, dokumentiert die Antworten von GET /coins/{slug}/markets, GET /coins/losers, GET /global/history/{metric} und GET /sentiment/altseason, dokumentiert days bei GET /sentiment/altseason als 1–365 (0 wurde schon immer abgelehnt; für den aktuellen Wert lässt du den Parameter weg) und führt im Fehlerschema die Codes endpoint_unavailable (503) und http_error auf. Kein Request und keine Response hat sich geändert - nur, wie sie beschrieben werden.
Fehlgeschlagene Authentifizierungsversuche waren bisher auf 30 pro Minute und IP begrenzt; danach erhielt jeder Key hinter dieser IP 429. Jetzt darf ein Key von einer IP aus 30-mal pro Minute scheitern und eine IP 300-mal, Keys, die sich in etwa den letzten 15 Minuten erfolgreich authentifiziert haben, werden von der IP-Grenze nicht blockiert, und ein Request ohne Key erhält 401, ohne gezählt zu werden. Blockierte Requests erhalten 429 rate_limited mit Retry-After.
GET- und HEAD-Requests, deren Pfad einen abschließenden Slash, einen doppelten Slash oder ein führendes /index.php enthält, erhalten jetzt ein 301 auf die bereinigte URL, statt ausgeliefert zu werden - zum Beispiel von /api/v1/coins/ auf /api/v1/coins. Andere Methoden sind nicht betroffen.
GET /calculators/compound-interest rundete die Laufzeit auf ganze Zinsperioden, sodass eine Laufzeit, die mitten in einer Periode endete, zu lang oder zu kurz simuliert wurde: 6 Monate mit annually-Verzinsung liefen ein ganzes Jahr (12 Einzahlungen und ein volles Jahr Zinsen), 5 Monate dagegen keine einzige Periode (keine Einzahlungen, keine Zinsen). Ganze Perioden laufen jetzt wie bisher, die letzte angebrochene Periode wird anteilig verzinst (einfache Zinsen für den Bruchteil), und jede Einzahlung innerhalb der Laufzeit wird gezählt. Entspricht die Laufzeit einer ganzen Zahl von Zinsperioden, bleiben die Ergebnisse unverändert; Parameter und Antwortfelder bleiben unverändert.
Die API und ihre Dokumentation behandelten rate als Zinssatz pro Zinsperiode, während der Rechner auf der Website und seine Anleitung einen Jahreszins verwendeten. GET /calculators/compound-interest wandte rate in voller Höhe auf jede Zinsperiode an, sodass 5 % bei monatlicher Verzinsung wie 5 % pro Monat wuchsen. rate ist jetzt der nominale Jahreszins: Jede Periode bringt rate geteilt durch die Anzahl der Perioden pro Jahr (5 % bei monatlicher Verzinsung ergeben 5/12 % pro Monat), wie meta.note jetzt angibt. Parameter und Antwortfelder bleiben unverändert; die Ergebnisse ändern sich bei jeder Verzinsungshäufigkeit außer annually. Unabhängig davon werden Einzahlungen, wenn contribution_frequency und compound_frequency beide daily oder beide weekly sind, nicht mehr durch Gleitkomma-Rundungsfehler verzögert oder ausgelassen, sodass total_contributions bei duration_unit=months um eine Einzahlung höher ausfallen kann. Damit ändert sich die Bedeutung eines bestehenden Parameters: Um frühere Ergebnisse zu reproduzieren, multiplizieren Sie Ihren rate mit der Anzahl der Zinsperioden pro Jahr.
Jeder Fear-&-Greed-Wert enthält jetzt index neben score: den Fear-&-Greed-Index von 0–100 genau so, wie Bitculator ihn anzeigt (0–19 extreme Angst, 20–39 Angst, 40–59 neutral, 60–79 Gier, 80–100 extreme Gier) — verwenden Sie ihn für die Anzeige. score bleibt unverändert: der rohe Gesamtwert von −100…+100, aus dem index abgeleitet wird. Gilt für GET /sentiment/fear-greed (den Hauptwert und jeden Eintrag in intervals), fear_greed bei GET /global und meta.fear_greed bei GET /global/heatmap. Rein additiv; kein bestehendes Feld wurde geändert.
GET /coins/{slug} lieferte fully_diluted_valuation als 0 für Coins ohne maximales Angebot (zum Beispiel Solana und Ethereum, deren Angebot nicht begrenzt ist). Jetzt wird auf das Gesamtangebot zurückgegriffen, und der Wert ist null, wenn keines von beiden bekannt ist, wie es der OpenAPI-Vertrag bereits dokumentierte.
Ein Fear-&-Greed-Wert, für den noch kein Score vorlag, wurde als score: 0 gemeldet. Er ist jetzt null bei GET /sentiment/fear-greed, ebenso fear_greed bei GET /global und meta.fear_greed bei GET /global/heatmap.
marketcap und dominance können für einen Coin ohne zirkulierendes Angebot null sein, und score und breakdown des Trust-Scores sind für eine Börse ohne Rang null. POST /alarms antwortet mit 422, wenn der Coin für die gewählte Metrik keinen aktuellen Wert hat. /coins/recently-added und /wallets/timeline berücksichtigen jetzt sort. /coins/gainers und /coins/losers sind nach der Veränderung selbst sortiert (bisher faktisch nach Marktkapitalisierung), und die Losers schließen Coins bei 0.00 aus. Aufsteigende Sortierungen liefern Null-Werte zuletzt. /prices löst ein mehrdeutiges Symbol zum höchstplatzierten aktiven Coin auf. Der OpenAPI-Vertrag kennzeichnet die nullbaren Marktfelder und typisiert das 24h-Volumen als Zahl.
Jeder Einblick bei GET /insights, GET /insights/{id} und GET /coins/{slug}/insights trägt jetzt generated_by: "ai" und das model, das ihn geschrieben hat. Rein additiv; kein bestehendes Feld wurde geändert.
Die Börse Huobi wurde in HTX umbenannt, und ihr Slug änderte sich von huobi zu htx; die API folgt keinen Slug-Weiterleitungen, daher liefert /exchanges/huobi jetzt 404. CoinEx wurde auf inaktiv gesetzt und wird nicht mehr zurückgegeben.
change_24h und change_7d sind jetzt null, wenn die Veränderungen eines Coins seit 15 Minuten nicht neu berechnet wurden, statt eine veraltete Bewegung zu zeigen. Seit dem 18. September gilt dasselbe für change_rank_24h und change_rank_7d.
Der veröffentlichte Vertrag enthält jetzt Beispiele auf Media-Type-Ebene, ein gemeinsames Fehlerschema, auf das jede 4xx/5xx-Antwort verweist, die Antworten 401, 429 und 500, die jeder Aufruf mit Key zurückgeben kann, die Header X-RateLimit-* und X-Quota-* auf jeder Erfolgsantwort, die alarm.triggered-Zustellung als Callback auf POST /webhooks sowie Metadaten zu Kontakt, Lizenz und Nutzungsbedingungen. Kein Request und keine Response hat sich geändert - nur, wie sie beschrieben werden.
Neu: /apis.json, /.well-known/api-catalog (RFC 9727), /.well-known/security.txt (RFC 9116), ein JSON-Schema-Bundle der gemeinsamen Antwortformen, eine öffentliche Statusseite mit JSON-Zwilling, dieses Changelog sowie die Versionierungs- und Abkündigungsrichtlinie.
MCP-Tool-Aufrufe zählen nicht mehr gegen das Monatskontingent und das Burst-Limit des Data-API-Plans; der MCP-Server hat seit diesem Tag eigene Keys und Pläne. tokens[].kind bei GET /usage kann jetzt mcp sein, und die 429-Meldung bei überschrittenem Kontingent lautet „Your Data API plan has reached its monthly request limit.“ (früher war dort vom Embed-Plan die Rede).
Das Erstellen oder Rotieren eines Data-API-Keys in der Entwicklerkonsole erfordert jetzt eine verifizierte E-Mail-Adresse; Konten ohne E-Mail-Adresse, etwa Wallet-Anmeldungen, sind ausgenommen. Die Key-Erstellung ist auf 10 pro Minute begrenzt. Bestehende Keys funktionieren weiter.
volume_usd bei GET /tickers, GET /pairs, GET /pairs/{id}, GET /coins/{slug}/markets und GET /exchanges/{slug}/tickers wurde als ganze Zahl gespeichert, sodass Cents verloren gingen und Märkte unter $0,50 0 zeigten. Volumen behalten jetzt zwei Nachkommastellen, und die daraus gebildeten Summen übernehmen die Rundung nicht mehr.
change bei GET /coins/{slug}/sparkline und GET /exchanges/{slug}/sparkline war für 30d bis 365d ein Bruchteil (0,05 bedeutete +5 %), für 24h und 7d aber ein Prozentwert. Jetzt ist es für jeden Zeitraum ein Prozentwert (1.25 bedeutet +1,25 %), sodass die Werte für die längeren Zeiträume 100-mal größer sind als zuvor und Bewegungen unter 0,5 % nicht mehr auf 0 gerundet werden.
Bei beiden Sparkline-Endpunkten stammten low und high aus einer Zusammenfassung über ein anderes Zeitfenster und konnten points widersprechen - zum Beispiel ein low über Kursen in der Reihe. Sie sind jetzt die echten Extremwerte des Zeitraums, aus dem points gesampelt wird.
GET /wallets, /wallets/timeline, /wallets/compare, /wallets/{slug} und /wallets/{slug}/assets liefern jetzt auch Wallets mit dem Status Vaporware, sodass status diesen Wert tragen kann.
title und excerpt der Quellen in Einblicken enthalten keine rohen HTML-Entities wie í mehr.
Bei einem nie bearbeiteten Artikel zeigte updated_at bei GET /articles und GET /articles/{slug} den letzten Zeitpunkt, zu dem sich der Datensatz aus irgendeinem Grund geändert hatte, etwa durch einen Aufrufzähler oder eine Abstimmung. Jetzt zeigt es die letzte redaktionelle Bearbeitung, mit Rückfall auf das Veröffentlichungsdatum, und POST /articles/{slug}/feedback verschiebt es nicht mehr.
Einblicke enthalten jetzt sentiment: bullish, bearish, sheepish oder null, wenn nicht klassifiziert.
Clients für TypeScript, Python, PHP, Go, Rust, Java, C# und C++, jeder deckt jeden Endpunkt ab und sitzt auf demselben Transportkern: Bearer-Auth, Entpacken des Envelopes, Erfassung von X-Quota-*, Retries bei 429 und 5xx, typisierte Fehler und Paging.
Endpunkte können jetzt einen Plan erfordern. Bei der Einführung erforderte GET /sentiment/indicators Pro, und GET /sentiment/bull-bear, GET /sentiment/altseason, GET /global, GET /global/heatmap und GET /global/history/{metric} erforderten Starter. Ein Aufruf außerhalb deines Plans liefert 403 plan_required, wobei details.required_plan den Plan nennt, der ihn freischaltet, und verbraucht kein Kontingent.
Die sechs /liquidations-Endpunkte wurden in jedem Plan abgeschaltet: Sie liefern 503 endpoint_unavailable („This endpoint is temporarily unavailable.“) und verbrauchen kein Kontingent.
Das Monatskontingent des Pro-Plans sank von 500.000 auf 250.000 Anfragen.
Der generische Endpunkt GET /coins/{slug}/indicators/{family} wurde zu 13 separat dokumentierten Endpunkten unter denselben Pfaden: rsi, stoch-rsi, sma, cci, mfi, williams-r, price-volatility, volume-volatility, macd, obv, adx, vwap und cmf. Bestehende Aufrufe bleiben unverändert; ein unbekannter Indikatorname erhält jetzt ein schlichtes 404 ohne die Liste gültiger Namen.
Zum Start schöpften Data-API-Aufrufe und Embed-Widget-Anfragen aus einem gemeinsamen monatlichen Pool, der an den Embed-Plan gebunden war. Die Data API hat jetzt eigene Pläne Free, Starter und Pro, ein eigenes Abonnement und ein eigenes Monatskontingent mit eigenem Abrechnungszeitraum: dem Kalendermonat in UTC bei Free, verankert am Verlängerungstag bei kostenpflichtigen Plänen. GET /ping und GET /usage melden den Data-API-Plan, und /usage zählt nur Data-API-Aufrufe. Die Limits blieben bei der Trennung unverändert.
Die Referenz ist von /{locale}/documentation nach /{locale}/documentation/api/v1 umgezogen, die Postman-Collection und das OpenAPI-YAML von /documentation.postman und /documentation.openapi nach /documentation/api/v1.postman und /documentation/api/v1.openapi. Die alten Pfade wurden ohne Weiterleitungen entfernt; /api/v1/openapi.json bleibt unverändert.
Launch: 73 Operationen in 15 Gruppen - Coins, Kurse, Märkte, Börsen, Wallets, Global, Sentiment, Indikatoren, Liquidationen, Umrechnung, Rechner, Redaktionelles, Alarme, Webhooks und Meta. Bearer-Keys mit der data-api-Berechtigung, der { data, meta }-Envelope, Dezimal-String-Präzision, X-Quota-*-Header und signierte Webhooks. Data-API-Aufrufe und Embed-Widget-Anfragen teilten sich ein Monatskontingent unter dem Embed-Plan, und längere Indikator-Zeitfenster erforderten Starter.
Abkündigungen werden hier und per E-Mail an jeden Key-Inhaber mindestens sechs Monate vor der Entfernung angekündigt - siehe die Abkündigungsrichtlinie. Der maschinenlesbare Index unter /apis.json trägt das Datum des neuesten Eintrags als modified-Stempel.