Changelog
Elke wijziging aan de Data API en zijn contract, nieuwste eerst. Versienummers volgen het versionerings- en uitfaseringsbeleid.
POST /webhooks en POST /webhooks/{id}/test delen nu een limiet van 5 requests per minuut per account, bovenop de burst-limiet van het plan. Requests daarboven krijgen 429 rate_limited met Retry-After. Een testevent wordt nu één keer verstuurd, zonder nieuwe pogingen; andere deliveries worden nog steeds maximaal 3 keer geprobeerd, met backoff tussen de pogingen. Dit is een limiet tegen misbruik en laat het maandelijkse quotum en de burst-limiet van elk plan ongewijzigd. Het versionerings- en uitfaseringsbeleid is op dezelfde dag gewijzigd, zodat zulke limieten direct kunnen ingaan; tot dan volgde het verlagen van een rate limit van een plan altijd de uitfaseringstijdlijn van zes maanden. Op deze twee endpoints tonen de X-RateLimit-*-headers de limiet van de twee waarbij de minste requests over zijn.
POST /webhooks zoekt de hostnaam in de URL niet meer op. De call geeft nog steeds 422 als de URL geen https gebruikt, inloggegevens bevat of een niet-publiek IP-adres als host heeft. Een hostnaam die niet kan worden opgezocht, of die naar een niet-publiek adres verwijst, kreeg tot nu toe 422; die wordt nu geaccepteerd met 201 en telt mee voor de limiet van 5 endpoints per account. Elke delivery naar zo'n endpoint mislukt dan zonder nieuwe poging, error op GET /webhooks/{id}/deliveries geeft de reden, en na 10 mislukte deliveries op rij wordt het endpoint uitgeschakeld. Stuur na het aanmaken van een endpoint een testevent met POST /webhooks/{id}/test en controleer in het deliverylog of het endpoint bereikbaar is.
endpoints[].endpoint op GET /usage noemt nu de route-template in plaats van het opgevraagde pad - api/v1/coins/{slug} in plaats van api/v1/coins/bitcoin - zodat elk endpoint één rij heeft in plaats van één per slug of id. Requests die eerder in de huidige factuurperiode zijn vastgelegd, houden hun pad, dus beide vormen kunnen verschijnen tot het einde van de periode.
GET /exchanges/{slug} en GET /exchanges/{slug}/trust-score mislukten al sinds de lancering van de Data API voor elke exchange met 500. Beide reageren nu; parameters en responsvelden blijven ongewijzigd, en een exchange zonder rang geeft score en breakdown terug als null.
Het gepubliceerde OpenAPI-contract markeert nu elk veld dat null kan zijn als nullable en typeert niet-gehele waarden als getallen (bijvoorbeeld invested op GET /calculators/dca en indicatorwaarden); de gedeelde velden logo, last_updated en from/to van de paginatie zijn op elk endpoint nullable, net als de velden name en price van coins op elk endpoint voor coinlijsten en prijzen. Het typeert ook de DCA-series als array, documenteert de responses van GET /coins/{slug}/markets, GET /coins/losers, GET /global/history/{metric} en GET /sentiment/altseason, documenteert days op GET /sentiment/altseason als 1–365 (0 werd altijd al afgewezen; laat de parameter weg voor de huidige meting) en vermeldt de codes endpoint_unavailable (503) en http_error in het foutschema. Er is geen request of response veranderd - alleen hoe ze beschreven worden.
Mislukte authenticatie was eerder begrensd op 30 pogingen per minuut per IP, waarna elke key achter dat IP 429 kreeg. Nu mag één key 30 keer per minuut mislukken vanaf één IP en één IP 300 keer, keys die zich in ongeveer de laatste 15 minuten hebben geauthenticeerd, worden niet door de IP-limiet geblokkeerd, en een request zonder key krijgt 401 zonder te worden meegeteld. Geblokkeerde requests krijgen 429 rate_limited met Retry-After.
GET- en HEAD-requests waarvan het pad een afsluitende slash, een dubbele slash of een /index.php aan het begin bevat, krijgen nu een 301 naar de schone URL in plaats van te worden uitgeserveerd - bijvoorbeeld van /api/v1/coins/ naar /api/v1/coins. Andere methodes worden niet beïnvloed.
GET /calculators/compound-interest rondde de looptijd af op hele renteperiodes, waardoor een looptijd die halverwege een periode eindigde te lang of te kort werd gesimuleerd: 6 maanden met annually-rentebijschrijving besloegen een heel jaar (12 stortingen en een volledig jaar rente) en 5 maanden besloegen geen enkele periode (geen stortingen, geen rente). Hele periodes lopen nu zoals voorheen, de laatste gedeeltelijke periode levert naar rato rente op (enkelvoudige rente over het deel) en elke storting binnen de looptijd wordt meegeteld. De resultaten blijven gelijk wanneer de looptijd een geheel aantal renteperiodes is; parameters en responsvelden blijven ongewijzigd.
De API en de documentatie behandelden rate als de rente per samengestelde periode, terwijl de calculator op de website en de bijbehorende handleiding een jaarrente gebruikten. GET /calculators/compound-interest paste rate volledig toe op elke samengestelde periode, waardoor 5% met maandelijkse rente-op-rente groeide als 5% per maand. rate is nu de nominale jaarrente: elke periode levert rate gedeeld door het aantal perioden per jaar op (5% met maandelijkse rente-op-rente levert 5/12% per maand op), zoals meta.note nu vermeldt. Parameters en responsvelden blijven ongewijzigd; de resultaten veranderen bij elke frequentie behalve annually. Daarnaast worden stortingen, wanneer contribution_frequency en compound_frequency allebei daily of allebei weekly zijn, niet langer door afronding van drijvendekommagetallen uitgesteld of overgeslagen, zodat total_contributions bij duration_unit=months één storting hoger kan uitvallen. Hiermee verandert de betekenis van een bestaande parameter: vermenigvuldig uw rate met het aantal renteperiodes per jaar om eerdere resultaten te reproduceren.
Elke Fear & Greed-stand bevat nu index naast score: de Fear & Greed-index van 0–100 precies zoals Bitculator hem toont (0–19 extreme angst, 20–39 angst, 40–59 neutraal, 60–79 hebzucht, 80–100 extreme hebzucht) — gebruik deze voor weergave. score is ongewijzigd: de ruwe samengestelde waarde van −100…+100 waarvan index is afgeleid. Geldt voor GET /sentiment/fear-greed (de hoofdstand en elk item in intervals), fear_greed op GET /global en meta.fear_greed op GET /global/heatmap. Alleen toegevoegd; geen bestaand veld gewijzigd.
GET /coins/{slug} gaf fully_diluted_valuation terug als 0 voor coins zonder maximaal aanbod (bijvoorbeeld Solana en Ethereum, waarvan het aanbod niet begrensd is). Nu wordt teruggevallen op het totale aanbod en is de waarde null als geen van beide bekend is, zoals het OpenAPI-contract al documenteerde.
Een Fear & Greed-stand die nog geen score had, werd gemeld als score: 0. Die is nu null op GET /sentiment/fear-greed, net als fear_greed op GET /global en meta.fear_greed op GET /global/heatmap.
marketcap en dominance kunnen null zijn voor een coin zonder circulerend aanbod, en de score en breakdown van de trust score zijn null voor een exchange zonder rang. POST /alarms geeft 422 terug wanneer de coin geen huidige waarde heeft voor de gekozen metric. /coins/recently-added en /wallets/timeline respecteren nu sort. /coins/gainers en /coins/losers zijn gesorteerd op de verandering zelf (voorheen feitelijk op marketcap), en losers sluiten coins op 0.00 uit. Oplopende sorteringen geven null-waarden als laatste terug. /prices koppelt een dubbelzinnig symbool aan de actieve coin met de hoogste rang. Het OpenAPI-contract markeert de marktvelden die null kunnen zijn en typeert het 24h-volume als getal.
Elk inzicht op GET /insights, GET /insights/{id} en GET /coins/{slug}/insights bevat nu generated_by: "ai" en het model dat het heeft geschreven. Alleen toegevoegd; geen bestaand veld gewijzigd.
De exchange Huobi is hernoemd naar HTX en de slug is veranderd van huobi naar htx; de API volgt geen slug-redirects, dus /exchanges/huobi geeft nu 404 terug. CoinEx is op inactief gezet en wordt niet meer teruggegeven.
change_24h en change_7d zijn nu null wanneer de veranderingen van een coin 15 minuten lang niet opnieuw zijn berekend, in plaats van een verouderde beweging te tonen. Sinds 18 september geldt hetzelfde voor change_rank_24h en change_rank_7d.
Het gepubliceerde contract bevat nu voorbeelden op media-type-niveau, één gedeeld foutschema waarnaar elke 4xx/5xx-response verwijst, de 401-, 429- en 500-responses die elke call met een key kan teruggeven, de X-RateLimit-*- en X-Quota-*-headers op elke geslaagde response, de alarm.triggered-levering als callback op POST /webhooks, en metadata over contact, licentie en voorwaarden. Er is geen request of response veranderd - alleen hoe ze beschreven worden.
Nieuw: /apis.json, /.well-known/api-catalog (RFC 9727), /.well-known/security.txt (RFC 9116), een JSON Schema-bundel van de gedeelde responsevormen, een publieke statuspagina met een JSON-tegenhanger, deze changelog en het versionerings- en uitfaseringsbeleid.
MCP-tool-calls tellen niet meer mee voor het maandquotum en de burst-limiet van het Data API-plan; de MCP-server heeft sinds die dag eigen keys en plannen. tokens[].kind op GET /usage kan nu mcp zijn, en de 429-melding bij een overschreden quotum luidt “Your Data API plan has reached its monthly request limit.” (vroeger stond er embed plan).
Een Data API-key aanmaken of roteren in de developerconsole vereist nu een geverifieerd e-mailadres; accounts zonder e-mailadres, zoals wallet-logins, zijn uitgezonderd. Het aanmaken van keys is beperkt tot 10 per minuut. Bestaande keys blijven werken.
volume_usd op GET /tickers, GET /pairs, GET /pairs/{id}, GET /coins/{slug}/markets en GET /exchanges/{slug}/tickers werd opgeslagen als geheel getal, waardoor centen verloren gingen en markten onder $0,50 0 toonden. Volumes behouden nu twee decimalen, en de totalen die ermee worden opgebouwd, erven de afronding niet langer.
change op GET /coins/{slug}/sparkline en GET /exchanges/{slug}/sparkline was een fractie voor 30d tot en met 365d (0,05 betekende +5%) maar een percentage voor 24h en 7d. Het is nu voor elke periode een percentage (1.25 betekent +1,25%), dus waarden voor de langere periodes zijn 100 keer groter dan voorheen, en bewegingen onder 0,5% worden niet meer afgerond naar 0.
Op beide sparkline-endpoints kwamen low en high uit een samenvatting over een ander venster en konden ze points tegenspreken - bijvoorbeeld een low boven prijzen in de reeks. Ze zijn nu de werkelijke uitersten van de periode waaruit points wordt bemonsterd.
GET /wallets, /wallets/timeline, /wallets/compare, /wallets/{slug} en /wallets/{slug}/assets geven nu ook wallets met de status vaporware terug, dus status kan die waarde bevatten.
title en excerpt van bronnen in inzichten bevatten geen ruwe HTML-entiteiten zoals í meer.
Voor een artikel dat nooit was bewerkt, toonde updated_at op GET /articles en GET /articles/{slug} het laatste moment waarop het record om welke reden dan ook veranderde, zoals een weergaveteller of een stem. Het toont nu de laatste redactionele bewerking, met de publicatiedatum als terugval, en POST /articles/{slug}/feedback verschuift het niet meer.
Inzichten bevatten nu sentiment: bullish, bearish, sheepish of null als het niet is geclassificeerd.
TypeScript-, Python-, PHP-, Go-, Rust-, Java-, C#- en C++-clients, die elk ieder endpoint dekken op dezelfde transportkern: Bearer-auth, envelope-unwrapping, X-Quota-*-capture, retries bij 429 en 5xx, getypeerde fouten en paging.
Endpoints kunnen nu een plan vereisen. Bij de invoering vereiste GET /sentiment/indicators Pro, en vereisten GET /sentiment/bull-bear, GET /sentiment/altseason, GET /global, GET /global/heatmap en GET /global/history/{metric} Starter. Een call buiten je plan geeft 403 plan_required terug, waarbij details.required_plan het plan noemt dat hem ontgrendelt, en verbruikt geen quotum.
De zes /liquidations-endpoints zijn op elk plan uitgeschakeld: ze geven 503 endpoint_unavailable terug (“This endpoint is temporarily unavailable.”) en verbruiken geen quotum.
Het maandquotum van het Pro-plan ging van 500.000 naar 250.000 requests.
Het generieke GET /coins/{slug}/indicators/{family} werd 13 afzonderlijk gedocumenteerde endpoints op dezelfde paden: rsi, stoch-rsi, sma, cci, mfi, williams-r, price-volatility, volume-volatility, macd, obv, adx, vwap en cmf. Bestaande calls blijven ongewijzigd; een onbekende indicatornaam krijgt nu een kale 404 zonder de lijst met geldige namen.
Bij de lancering putten Data API-calls en embed-widget-requests uit één maandelijkse pool die aan het embed-plan was gekoppeld. De Data API heeft nu eigen Free-, Starter- en Pro-plannen, een eigen abonnement en een eigen maandquotum, met een eigen factuurperiode: de kalendermaand in UTC op Free, verankerd aan de verlengingsdag op betaalde plannen. GET /ping en GET /usage melden het Data API-plan, en /usage telt alleen Data API-calls. De limieten bleven bij de splitsing ongewijzigd.
De referentie is verhuisd van /{locale}/documentation naar /{locale}/documentation/api/v1, en de Postman-collectie en de OpenAPI-YAML van /documentation.postman en /documentation.openapi naar /documentation/api/v1.postman en /documentation/api/v1.openapi. De oude paden zijn zonder redirects verwijderd; /api/v1/openapi.json is ongewijzigd.
Lancering: 73 operaties verdeeld over 15 groepen - coins, prijzen, markten, exchanges, wallets, global, sentiment, indicatoren, liquidaties, conversie, calculators, redactioneel, alarmen, webhooks en meta. Bearer-keys met de data-api-ability, de { data, meta }-envelope, decimal-string-precisie, X-Quota-*-headers en ondertekende webhooks. Data API-calls en embed-widget-requests deelden één maandquotum onder het embed-plan, en langere indicatorvensters vereisten Starter.
Uitfaseringen worden hier en per e-mail aan elke key-eigenaar aangekondigd, minstens zes maanden vóór verwijdering - zie het uitfaseringsbeleid. De machineleesbare index op /apis.json draagt de datum van de nieuwste vermelding als zijn modified-stempel.