Журнал змін
Кожна зміна Data API та його контракту, спершу найновіші. Номери версій відповідають політиці версіонування та застарівання.
POST /webhooks і POST /webhooks/{id}/test тепер мають спільний ліміт 5 запитів на хвилину на обліковий запис - на додачу до хвилинного ліміту тарифу. Запити понад нього отримують 429 rate_limited із Retry-After. Тестова подія тепер надсилається один раз, без повторів; для інших доставок, як і раніше, робиться до 3 спроб, з експоненційною затримкою між спробами. Це ліміт проти зловживань, і він не змінює місячну квоту та хвилинний ліміт жодного тарифу. Політика версіонування та застарівання була змінена того самого дня, щоб такі ліміти могли набирати чинності одразу; до того часу зниження будь-якого ліміту запитів, який мав тариф, відбувалося за шестимісячним графіком застарівання. На цих двох ендпоінтах заголовки X-RateLimit-* показують той із двох лімітів, за яким залишилося менше запитів.
POST /webhooks більше не шукає ім'я хоста з URL у DNS. Він і далі повертає 422, якщо URL не використовує https, містить облікові дані або має хостом непублічну IP-адресу. Ім'я хоста, яке не вдається знайти в DNS або яке вказує на непублічну адресу, раніше отримувало 422; тепер його приймають із 201, і воно зараховується до ліміту 5 ендпоінтів на обліковий запис. Кожна доставка на такий ендпоінт тоді завершується помилкою без повторів, поле error у GET /webhooks/{id}/deliveries називає причину, а 10 невдалих доставок поспіль вимикають ендпоінт. Після створення ендпоінта надішліть на нього тестову подію через POST /webhooks/{id}/test і перевірте в журналі доставок, що він доступний.
endpoints[].endpoint у GET /usage тепер містить шаблон маршруту замість запитаного шляху: api/v1/coins/{slug} замість api/v1/coins/bitcoin. Тож кожен ендпоінт має один рядок, а не по одному на кожен slug чи id. Запити, враховані раніше в поточному розрахунковому періоді, зберігають свій шлях, тому до кінця періоду можуть траплятися обидві форми.
GET /exchanges/{slug} і GET /exchanges/{slug}/trust-score від запуску Data API завершувалися помилкою 500 для кожної біржі. Тепер обидва відповідають; параметри та поля відповіді не змінилися, а для біржі без рангу score і breakdown повертаються як null.
Опублікований контракт OpenAPI тепер позначає як nullable кожне поле, яке може бути null, і типізує дробові значення як числа (наприклад, invested у GET /calculators/dca та значення індикаторів); спільні поля logo, last_updated і поля пагінації from/to позначено як nullable у всіх ендпоінтах, а name і price монети - у всіх ендпоінтах списків монет і цін. Крім того, він типізує series у DCA як масив, документує відповіді GET /coins/{slug}/markets, GET /coins/losers, GET /global/history/{metric} та GET /sentiment/altseason, документує для days у GET /sentiment/altseason діапазон 1–365 (0 завжди відхилявся; щоб отримати поточне значення, не передавайте цей параметр) і перелічує у схемі помилки коди endpoint_unavailable (503) та http_error. Жоден запит чи відповідь не змінилися - лише те, як їх описано.
Раніше невдала автентифікація обмежувалася 30 спробами на хвилину з однієї IP-адреси, після чого кожен ключ за цією IP-адресою отримував 429. Тепер один ключ може помилитися 30 разів на хвилину з однієї IP-адреси, а одна IP-адреса - 300 разів; ключі, що успішно пройшли автентифікацію приблизно за останні 15 хвилин, не блокуються лімітом за IP-адресою, а запит без ключа повертає 401 і не враховується. Заблоковані запити отримують 429 rate_limited із Retry-After.
Запити GET і HEAD, шлях яких містить кінцевий слеш, подвійний слеш або початковий /index.php, тепер отримують 301 на чистий URL замість обслуговування як є - наприклад, з /api/v1/coins/ на /api/v1/coins. Інших методів це не стосується.
GET /calculators/compound-interest округлював строк до цілої кількості періодів капіталізації, тому строк, що закінчувався посеред періоду, моделювався задовгим або закоротким: 6 місяців із капіталізацією annually вважалися цілим роком (12 внесків і відсотки за весь рік), а 5 місяців не давали жодного періоду (ні внесків, ні відсотків). Тепер цілі періоди розраховуються як раніше, останній неповний період приносить відсотки пропорційно (прості відсотки за його частку), а кожен внесок у межах строку враховується. Якщо строк дорівнює цілій кількості періодів капіталізації, результати не змінюються; параметри та поля відповіді не змінилися.
API та його документація трактували rate як ставку за період нарахування, тоді як калькулятор на сайті та інструкція до нього використовували річну ставку. GET /calculators/compound-interest застосовував rate повністю до кожного періоду нарахування, тож 5% при щомісячному нарахуванні зростали як 5% на місяць. Тепер rate - номінальна річна ставка: кожен період приносить rate, поділену на кількість періодів на рік (5% при щомісячному нарахуванні дають 5/12% на місяць), про що тепер повідомляє meta.note. Параметри й поля відповіді не змінюються; результати змінюються для всіх частот нарахування, крім annually. Крім того, якщо contribution_frequency і compound_frequency обидві дорівнюють daily або обидві дорівнюють weekly, внески більше не затримуються й не губляться через округлення чисел з рухомою комою, тож total_contributions за duration_unit=months може містити на один внесок більше. Це змінює зміст наявного параметра: щоб відтворити попередні результати, помножте rate на кількість періодів капіталізації на рік.
Кожне значення Fear & Greed тепер містить index поруч із score: індекс Fear & Greed від 0 до 100 точно так, як його показує Bitculator (0–19 екстремальний страх, 20–39 страх, 40–59 нейтрально, 60–79 жадібність, 80–100 екстремальна жадібність) — використовуйте його для відображення. score не змінився: це сирий складений показник −100…+100, з якого виводиться index. Стосується GET /sentiment/fear-greed (основне значення та кожен запис у intervals), fear_greed у GET /global та meta.fear_greed у GET /global/heatmap. Лише додавання; жодне наявне поле не змінено.
GET /coins/{slug} повертав fully_diluted_valuation рівним 0 для монет без максимальної пропозиції (наприклад, Solana та Ethereum, пропозиція яких не обмежена). Тепер використовується загальна пропозиція, а якщо жодна не відома, значення дорівнює null, як уже було описано в контракті OpenAPI.
Значення Fear & Greed, яке ще не мало оцінки, поверталося як score: 0. Тепер у GET /sentiment/fear-greed це null, як і fear_greed у GET /global та meta.fear_greed у GET /global/heatmap.
marketcap і dominance можуть бути null для монети без обігової пропозиції, а score і breakdown оцінки довіри дорівнюють null для біржі без рангу. POST /alarms повертає 422, якщо монета не має поточного значення для обраної метрики. /coins/recently-added і /wallets/timeline тепер враховують sort. /coins/gainers і /coins/losers сортуються за самою зміною (раніше фактично за ринковою капіталізацією), а losers виключають монети зі значенням 0.00. Сортування за зростанням повертає null-значення останніми. /prices зіставляє неоднозначний символ з активною монетою з найвищим рейтингом. Контракт OpenAPI позначає ринкові поля, що можуть бути null, і типізує обсяг за 24 год як число.
Кожен інсайт у GET /insights, GET /insights/{id} і GET /coins/{slug}/insights тепер містить generated_by: "ai" та model, яка його написала. Лише додавання; жодне наявне поле не змінено.
Біржу Huobi перейменовано на HTX, і її slug змінився з huobi на htx; API не виконує перенаправлень slug, тож /exchanges/huobi тепер повертає 404. CoinEx переведено в неактивні, і вона більше не повертається.
change_24h і change_7d тепер дорівнюють null, якщо зміни монети не перераховувалися 15 хвилин, замість того щоб показувати застарілий рух. Із 18 вересня те саме стосується change_rank_24h і change_rank_7d.
Опублікований контракт тепер містить приклади на рівні media-type, одну спільну схему помилки, на яку посилається кожна відповідь 4xx/5xx, відповіді 401, 429 та 500, які може повернути будь-який виклик із ключем, заголовки X-RateLimit-* і X-Quota-* у кожній успішній відповіді, доставку alarm.triggered як callback на POST /webhooks, а також метадані контакту, ліцензії та умов. Жоден запит чи відповідь не змінилися - лише те, як їх описано.
Нове: /apis.json, /.well-known/api-catalog (RFC 9727), /.well-known/security.txt (RFC 9116), бандл JSON Schema зі спільними формами відповідей, публічна сторінка статусу з JSON-двійником, цей журнал змін і політика версіонування та застарівання.
Виклики MCP-інструментів перестали витрачати місячну квоту та хвилинний ліміт тарифу Data API; від цього дня MCP-сервер має власні ключі й тарифи. tokens[].kind у GET /usage тепер може бути mcp, а повідомлення 429 про перевищення квоти звучить «Your Data API plan has reached its monthly request limit.» (раніше в ньому згадувався тариф вбудовування).
Створення або ротація ключа Data API в консолі розробника тепер вимагає підтвердженої адреси електронної пошти; облікові записи без email, як-от створені через вхід із гаманцем, звільнено від цієї вимоги. Створення ключів обмежено 10 на хвилину. Наявні ключі продовжують працювати.
volume_usd у GET /tickers, GET /pairs, GET /pairs/{id}, GET /coins/{slug}/markets і GET /exchanges/{slug}/tickers зберігався як ціле число, тож центи губилися, а ринки з обсягом менше ніж $0,50 показували 0. Тепер обсяги зберігають два знаки після коми, і підсумки, побудовані з них, більше не успадковують округлення.
change у GET /coins/{slug}/sparkline і GET /exchanges/{slug}/sparkline був часткою для періодів від 30d до 365d (0,05 означало +5%), але відсотком для 24h і 7d. Тепер це відсоток для кожного періоду (1.25 означає +1,25%), тож значення для довших періодів у 100 разів більші, ніж раніше, а рухи менше ніж 0,5% більше не округлюються до 0.
В обох ендпоінтах спарклайнів low і high бралися зі зведення, побудованого за іншим вікном, і могли суперечити points - наприклад, low вище за ціни в ряду. Тепер це справжні екстремуми періоду, з якого вибираються points.
GET /wallets, /wallets/timeline, /wallets/compare, /wallets/{slug} і /wallets/{slug}/assets тепер також повертають гаманці зі статусом vaporware, тож status може мати це значення.
title і excerpt джерел усередині інсайтів більше не містять необроблених HTML-сутностей, як-от í.
Для статті, яку жодного разу не редагували, updated_at у GET /articles і GET /articles/{slug} показував час останньої зміни запису з будь-якої причини, наприклад через лічильник переглядів чи голос. Тепер він показує останнє редакційне редагування, а якщо його не було - дату публікації, і POST /articles/{slug}/feedback його більше не зсуває.
Інсайти тепер містять sentiment: bullish, bearish, sheepish або null, якщо настрій не класифіковано.
Клієнти для TypeScript, Python, PHP, Go, Rust, Java, C# і C++, кожен покриває всі ендпоінти на спільному транспортному ядрі: Bearer-автентифікація, розпакування оболонки, захоплення X-Quota-*, повтори при 429 та 5xx, типізовані помилки та посторінкова навігація.
Ендпоінти тепер можуть вимагати певного тарифу. На момент запровадження GET /sentiment/indicators вимагав Pro, а GET /sentiment/bull-bear, GET /sentiment/altseason, GET /global, GET /global/heatmap і GET /global/history/{metric} - Starter. Виклик поза вашим тарифом повертає 403 plan_required, де details.required_plan називає тариф, який його відкриває, і не витрачає квоту.
Шість ендпоінтів /liquidations вимкнено на всіх тарифах: вони повертають 503 endpoint_unavailable («This endpoint is temporarily unavailable.») і не витрачають квоту.
Місячну квоту тарифу Pro знижено з 500 000 до 250 000 запитів.
Загальний GET /coins/{slug}/indicators/{family} перетворився на 13 окремо задокументованих ендпоінтів за тими самими шляхами: rsi, stoch-rsi, sma, cci, mfi, williams-r, price-volatility, volume-volatility, macd, obv, adx, vwap і cmf. Наявні виклики не змінилися; на невідому назву індикатора тепер повертається простий 404 без списку допустимих назв.
На момент запуску виклики Data API та запити віджетів витрачали один місячний пул, прив'язаний до тарифу вбудовування. Тепер Data API має власні тарифи Free, Starter і Pro, підписку та місячну квоту з власним розрахунковим періодом: календарний місяць за UTC на Free і період із прив'язкою до дня продовження на платних тарифах. GET /ping і GET /usage повідомляють тариф Data API, а /usage рахує лише виклики Data API. Під час розділення ліміти не змінилися.
Довідник переїхав із /{locale}/documentation на /{locale}/documentation/api/v1, а колекція Postman і OpenAPI YAML - із /documentation.postman і /documentation.openapi на /documentation/api/v1.postman і /documentation/api/v1.openapi. Старі шляхи видалено без перенаправлень; /api/v1/openapi.json не змінився.
Запуск: 73 операції в 15 групах - монети, ціни, ринки, біржі, гаманці, глобальні дані, настрої, індикатори, ліквідації, конвертація, калькулятори, редакційні матеріали, сповіщення, вебхуки та мета. Bearer-ключі з дозволом data-api, оболонка { data, meta }, точність десяткових рядків, заголовки X-Quota-* і підписані вебхуки. Виклики Data API та запити віджетів ділили одну місячну квоту в межах тарифу вбудовування, а довші вікна індикаторів вимагали Starter.
Про застарівання оголошується тут і електронною поштою кожному власнику ключа щонайменше за шість місяців до видалення - див. політику застарівання. Машинозчитуваний індекс /apis.json несе дату найновішого запису у своїй позначці modified.