Dziennik zmian
Każda zmiana w Data API i jego kontrakcie, od najnowszych. Numery wersji podlegają polityce wersjonowania i wycofywania.
POST /webhooks i POST /webhooks/{id}/test mają teraz wspólny limit 5 żądań na minutę na konto, oprócz limitu burst planu. Żądania ponad ten limit otrzymują 429 rate_limited z Retry-After. Zdarzenie testowe jest teraz wysyłane tylko raz, bez ponowień; dla pozostałych dostarczeń nadal podejmowane są maksymalnie 3 próby, z odczekiwaniem między nimi. To limit chroniący przed nadużyciami, który nie zmienia miesięcznego limitu ani limitu burst żadnego planu. Polityka wersjonowania i wycofywania została zmieniona tego samego dnia, aby takie limity mogły obowiązywać od razu; do tego czasu obniżenie dowolnego limitu żądań, który miał plan, podlegało sześciomiesięcznemu harmonogramowi wycofywania. Na tych dwóch endpointach nagłówki X-RateLimit-* pokazują ten z dwóch limitów, w którym zostało mniej żądań.
POST /webhooks nie rozwiązuje już nazwy hosta z adresu URL. Nadal zwraca 422, gdy URL nie używa https, zawiera dane logowania lub ma jako host niepubliczny adres IP. Nazwa hosta, której nie da się rozwiązać albo która wskazuje na niepubliczny adres, dotąd otrzymywała 422; teraz jest przyjmowana z 201 i wlicza się do limitu 5 endpointów na konto. Każde dostarczenie do takiego endpointu kończy się wtedy błędem bez ponowień, pole error w GET /webhooks/{id}/deliveries podaje przyczynę, a 10 nieudanych dostarczeń z rzędu wyłącza endpoint. Po utworzeniu endpointu wyślij do niego zdarzenie testowe przez POST /webhooks/{id}/test i sprawdź dziennik dostarczeń, aby upewnić się, że jest osiągalny.
endpoints[].endpoint w GET /usage podaje teraz szablon trasy zamiast żądanej ścieżki - api/v1/coins/{slug} zamiast api/v1/coins/bitcoin - dzięki czemu każdy endpoint ma jeden wiersz zamiast jednego na każdy slug lub id. Żądania zarejestrowane wcześniej w bieżącym okresie rozliczeniowym zachowują swoją ścieżkę, więc do końca okresu mogą pojawiać się obie formy.
GET /exchanges/{slug} i GET /exchanges/{slug}/trust-score od startu Data API kończyły się błędem 500 dla każdej giełdy. Teraz oba odpowiadają; parametry i pola odpowiedzi pozostają bez zmian, a dla giełdy bez rankingu score i breakdown są zwracane jako null.
Opublikowany kontrakt OpenAPI oznacza teraz jako nullable każde pole, które może mieć wartość null, i typuje wartości ułamkowe jako liczby (na przykład invested w GET /calculators/dca i wartości wskaźników); wspólne pola logo, last_updated oraz pola stronicowania from/to są oznaczone jako nullable we wszystkich endpointach, a name i price monety - we wszystkich endpointach list monet i cen. Typuje też series w DCA jako tablicę, dokumentuje odpowiedzi GET /coins/{slug}/markets, GET /coins/losers, GET /global/history/{metric} i GET /sentiment/altseason, dokumentuje dla days w GET /sentiment/altseason zakres 1–365 (wartość 0 zawsze była odrzucana; aby uzyskać bieżący odczyt, pomiń ten parametr) oraz wymienia w schemacie błędu kody endpoint_unavailable (503) i http_error. Żadne żądanie ani odpowiedź nie uległy zmianie - tylko sposób ich opisu.
Nieudane uwierzytelnienie było wcześniej ograniczone do 30 prób na minutę na IP, po czym każdy klucz za tym IP otrzymywał 429. Teraz jeden klucz może zawieść 30 razy na minutę z jednego IP, a jedno IP - 300 razy; klucze, które uwierzytelniły się mniej więcej w ciągu ostatnich 15 minut, nie są blokowane przez limit IP, a żądanie bez klucza zwraca 401 i nie jest liczone. Zablokowane żądania otrzymują 429 rate_limited z Retry-After.
Żądania GET i HEAD, których ścieżka ma końcowy ukośnik, podwójny ukośnik lub początkowe /index.php, otrzymują teraz 301 na czysty URL zamiast obsłużenia w obecnej postaci - na przykład z /api/v1/coins/ na /api/v1/coins. Inne metody pozostają bez zmian.
GET /calculators/compound-interest zaokrąglał czas trwania do pełnych okresów kapitalizacji, więc czas trwania kończący się w połowie okresu był symulowany jako zbyt długi lub zbyt krótki: 6 miesięcy przy kapitalizacji annually obejmowało cały rok (12 wpłat i odsetki za pełny rok), a 5 miesięcy nie obejmowało żadnego okresu (brak wpłat i odsetek). Pełne okresy są teraz liczone jak dotąd, ostatni niepełny okres przynosi odsetki proporcjonalnie (odsetki proste za jego część), a każda wpłata w czasie trwania jest uwzględniana. Wyniki się nie zmieniają, gdy czas trwania jest całkowitą liczbą okresów kapitalizacji; parametry i pola odpowiedzi pozostają bez zmian.
API i jego dokumentacja traktowały rate jako stopę na okres kapitalizacji, podczas gdy kalkulator na stronie i jego instrukcja używały stopy rocznej. GET /calculators/compound-interest stosował pełną wartość rate do każdego okresu kapitalizacji, więc 5% przy kapitalizacji miesięcznej rosło jak 5% miesięcznie. rate to teraz nominalna roczna stopa procentowa: każdy okres nalicza rate podzieloną przez liczbę okresów w roku (5% przy kapitalizacji miesięcznej daje 5/12% miesięcznie), co podaje teraz także meta.note. Parametry i pola odpowiedzi się nie zmieniają; wyniki zmieniają się dla każdej częstotliwości kapitalizacji z wyjątkiem annually. Niezależnie od tego, gdy contribution_frequency i compound_frequency mają tę samą wartość daily lub weekly, wpłaty nie są już opóźniane ani pomijane z powodu zaokrągleń zmiennoprzecinkowych, więc total_contributions może przy duration_unit=months obejmować o jedną wpłatę więcej. Zmienia to znaczenie istniejącego parametru: aby odtworzyć wcześniejsze wyniki, pomnóż rate przez liczbę okresów kapitalizacji w roku.
Każdy odczyt Fear & Greed zawiera teraz index obok score: indeks Fear & Greed w skali 0–100 dokładnie taki, jak pokazuje Bitculator (0–19 skrajny strach, 20–39 strach, 40–59 neutralnie, 60–79 chciwość, 80–100 skrajna chciwość) — używaj go do wyświetlania. score się nie zmienia: to surowa wartość złożona −100…+100, z której wyprowadzany jest index. Dotyczy GET /sentiment/fear-greed (odczyt główny i każdy wpis w intervals), fear_greed w GET /global oraz meta.fear_greed w GET /global/heatmap. Wyłącznie dodanie; żadne istniejące pole się nie zmieniło.
GET /coins/{slug} zwracał fully_diluted_valuation jako 0 dla kryptowalut bez maksymalnej podaży (na przykład Solana i Ethereum, których podaż nie ma limitu). Teraz używana jest całkowita podaż, a wartość to null, gdy żadna nie jest znana, jak kontrakt OpenAPI już dokumentował.
Odczyt Fear & Greed, który nie miał jeszcze wyniku, był zwracany jako score: 0. Teraz w GET /sentiment/fear-greed jest to null, podobnie jak fear_greed w GET /global i meta.fear_greed w GET /global/heatmap.
marketcap i dominance mogą mieć wartość null dla monety bez podaży w obiegu, a score i breakdown oceny zaufania mają wartość null dla giełdy bez rankingu. POST /alarms zwraca 422, gdy moneta nie ma bieżącej wartości dla wybranej metryki. /coins/recently-added i /wallets/timeline uwzględniają teraz sort. /coins/gainers i /coins/losers są sortowane według samej zmiany (wcześniej w praktyce według kapitalizacji rynkowej), a losers pomijają monety na poziomie 0.00. Sortowanie rosnące zwraca wartości null na końcu. /prices rozwiązuje niejednoznaczny symbol na aktywną monetę o najwyższym rankingu. Kontrakt OpenAPI oznacza pola rynkowe, które mogą mieć wartość null, i typuje wolumen 24h jako liczbę.
Każda analiza w GET /insights, GET /insights/{id} i GET /coins/{slug}/insights zawiera teraz generated_by: "ai" oraz model, który ją napisał. Tylko dodanie; żadne istniejące pole nie uległo zmianie.
Giełda Huobi zmieniła nazwę na HTX, a jej slug zmienił się z huobi na htx; API nie podąża za przekierowaniami slugów, więc /exchanges/huobi zwraca teraz 404. CoinEx została oznaczona jako nieaktywna i nie jest już zwracana.
change_24h i change_7d mają teraz wartość null, gdy zmiany monety nie były przeliczane od 15 minut, zamiast pokazywać nieaktualny ruch. Od 18 września to samo dotyczy change_rank_24h i change_rank_7d.
Opublikowany kontrakt zawiera teraz przykłady na poziomie typu mediów, jeden wspólny schemat błędu, do którego odwołuje się każda odpowiedź 4xx/5xx, odpowiedzi 401, 429 i 500, które może zwrócić każde wywołanie z kluczem, nagłówki X-RateLimit-* i X-Quota-* w każdej odpowiedzi sukcesu, dostawę alarm.triggered jako callback na POST /webhooks oraz metadane kontaktu, licencji i warunków. Żadne żądanie ani odpowiedź nie uległy zmianie - tylko sposób ich opisu.
Nowość: /apis.json, /.well-known/api-catalog (RFC 9727), /.well-known/security.txt (RFC 9116), pakiet JSON Schema ze wspólnymi kształtami odpowiedzi, publiczna strona statusu z bliźniaczym JSON-em, ten dziennik zmian oraz polityka wersjonowania i wycofywania.
Wywołania narzędzi MCP przestały zużywać miesięczny limit i limit burst planu Data API; od tego dnia serwer MCP ma własne klucze i plany. tokens[].kind w GET /usage może teraz mieć wartość mcp, a komunikat 429 o przekroczeniu limitu brzmi „Your Data API plan has reached its monthly request limit.” (wcześniej mówił o planie embed).
Utworzenie lub rotacja klucza Data API w konsoli deweloperskiej wymaga teraz zweryfikowanego adresu e-mail; konta bez adresu e-mail, na przykład zakładane przez logowanie portfelem, są z tego zwolnione. Tworzenie kluczy jest ograniczone do 10 na minutę. Istniejące klucze nadal działają.
volume_usd w GET /tickers, GET /pairs, GET /pairs/{id}, GET /coins/{slug}/markets i GET /exchanges/{slug}/tickers był przechowywany jako liczba całkowita, więc centy przepadały, a rynki poniżej $0,50 pokazywały 0. Wolumeny zachowują teraz dwa miejsca po przecinku, a budowane z nich sumy nie dziedziczą już zaokrąglenia.
change w GET /coins/{slug}/sparkline i GET /exchanges/{slug}/sparkline był ułamkiem dla okresów od 30d do 365d (0,05 oznaczało +5%), ale procentem dla 24h i 7d. Teraz jest procentem dla każdego okresu (1.25 oznacza +1,25%), więc wartości dla dłuższych okresów są 100 razy większe niż wcześniej, a ruchy poniżej 0,5% nie są już zaokrąglane do 0.
W obu endpointach sparkline low i high pochodziły z podsumowania zbudowanego dla innego okna i mogły być sprzeczne z points - na przykład low powyżej cen w serii. Teraz są to rzeczywiste ekstrema okresu, z którego próbkowane są points.
GET /wallets, /wallets/timeline, /wallets/compare, /wallets/{slug} i /wallets/{slug}/assets zwracają teraz także portfele o statusie vaporware, więc status może przyjmować tę wartość.
title i excerpt źródeł w analizach nie zawierają już surowych encji HTML, takich jak í.
W przypadku artykułu, który nigdy nie był edytowany, updated_at w GET /articles i GET /articles/{slug} pokazywał ostatnią zmianę rekordu z dowolnego powodu, na przykład licznika wyświetleń lub głosu. Teraz pokazuje ostatnią edycję redakcyjną, a gdy jej nie ma - datę publikacji, a POST /articles/{slug}/feedback już go nie przesuwa.
Analizy zawierają teraz sentiment: bullish, bearish, sheepish lub null, gdy sentyment nie został sklasyfikowany.
Klienty dla TypeScript, Python, PHP, Go, Rust, Java, C# i C++, każdy obejmujący wszystkie endpointy na tym samym rdzeniu transportowym: uwierzytelnianie Bearer, rozpakowywanie koperty, przechwytywanie X-Quota-*, ponawianie przy 429 i 5xx, typowane błędy i stronicowanie.
Endpointy mogą teraz wymagać określonego planu. W chwili wprowadzenia GET /sentiment/indicators wymagał planu Pro, a GET /sentiment/bull-bear, GET /sentiment/altseason, GET /global, GET /global/heatmap i GET /global/history/{metric} - planu Starter. Wywołanie spoza Twojego planu zwraca 403 plan_required, a details.required_plan wskazuje plan, który je odblokowuje - i nie zużywa limitu.
Sześć endpointów /liquidations zostało wyłączonych we wszystkich planach: zwracają 503 endpoint_unavailable („This endpoint is temporarily unavailable.”) i nie zużywają limitu.
Miesięczny limit planu Pro spadł z 500 000 do 250 000 żądań.
Ogólny GET /coins/{slug}/indicators/{family} stał się 13 osobno udokumentowanymi endpointami pod tymi samymi ścieżkami: rsi, stoch-rsi, sma, cci, mfi, williams-r, price-volatility, volume-volatility, macd, obv, adx, vwap i cmf. Istniejące wywołania pozostają bez zmian; nieznana nazwa wskaźnika otrzymuje teraz zwykłe 404 bez listy prawidłowych nazw.
Przy starcie wywołania Data API i żądania widżetów korzystały z jednej miesięcznej puli powiązanej z planem embed. Teraz Data API ma własne plany Free, Starter i Pro, subskrypcję i miesięczny limit z własnym okresem rozliczeniowym: miesiącem kalendarzowym w UTC w planie Free i okresem liczonym od dnia odnowienia w planach płatnych. GET /ping i GET /usage raportują plan Data API, a /usage liczy tylko wywołania Data API. Przy rozdzieleniu limity się nie zmieniły.
Dokumentacja referencyjna została przeniesiona z /{locale}/documentation do /{locale}/documentation/api/v1, a kolekcja Postman i OpenAPI YAML - z /documentation.postman i /documentation.openapi do /documentation/api/v1.postman i /documentation/api/v1.openapi. Stare ścieżki usunięto bez przekierowań; /api/v1/openapi.json pozostaje bez zmian.
Start: 73 operacje w 15 grupach - monety, ceny, rynki, giełdy, portfele, dane globalne, sentyment, wskaźniki, likwidacje, konwersja, kalkulatory, treści redakcyjne, alarmy, webhooki i meta. Klucze Bearer z uprawnieniem data-api, koperta { data, meta }, precyzja ciągów dziesiętnych, nagłówki X-Quota-* i podpisane webhooki. Wywołania Data API i żądania widżetów dzieliły jeden miesięczny limit w ramach planu embed, a dłuższe okna wskaźników wymagały planu Starter.
Wycofania są ogłaszane tutaj oraz e-mailem do każdego właściciela klucza co najmniej sześć miesięcy przed usunięciem - zobacz politykę wycofywania. Indeks do odczytu maszynowego pod /apis.json niesie datę najnowszego wpisu jako swój znacznik modified.