Skip to content
Changelog

Public Updates

Release notes, methodology adjustments, and transparency announcements from the ByKaranteli ops team. Only reports flagged public land here; the full internal ops log stays on the admin console.

Follow changes: RSS · JSON Feed

API

A brake for clients that keep calling after 429

An address that takes 1,000 answers of 429 on /api/ in ten minutes, or 10,000 in a day with at least one in the last ten minutes, is now paused at the origin for an hour: every /api/ request from it answers 429 with retry-after 3600 and the usual key gate shape (code rate_limited, reason hammer_brake). The quota, rate and fair-use rules are unchanged, and a client that stops at the first 429 and waits for retry-after never meets the brake. On 21 October one key past its monthly quota sent 129,000 requests in a day and received 115,000 answers of 429.

API

Every key gate reads the same credential parser

The 17 October reason field now reaches every surface that takes an account key. The member routes (alert recipes, watchlists, Hyperliquid addresses), /api/v1/usage, /api/v1/me/watchlist and the stream handshake answer a key header that is present but carries no usable key with 401 and the same reason values (empty_authorization, empty_x_api_key, malformed_authorization, malformed_x_api_key, non_bearer_scheme), and a Bearer header whose value is not a key no longer reads as an unknown key. The hosted MCP names what it saw instead of "sent none": an empty or malformed credential header, or a prepaid bk_live key, which pays per call and does not open the MCP. On /api/x402/ the 402 payment terms are unchanged for a call with no key header; when a key header was present but unusable, the 402 body also carries credential_reason and credential_hint (for example a prepaid key placed in Authorization instead of x-api-key), and a malformed key value answers 401 key_required with its reason. A request with no key header at all answers with the same status as before on every route (on /api/x402/ the same payment terms); the new fields are additive. A review on 19 October tightened the edges: the stream handshake reads a ticket only when no credential came at all (a header that carries something unusable is refused with its reason), the prepaid balance route reads x-api-key as the paid routes do, the hosted MCP names an OAuth token of the wrong shape as a token to re-issue, openapi.json describes the 401 on every keyed route, and the stream and x402 error tables on the developers page carry the new fields.

APIBreaking

Alert rules say when they cannot reach you, identical rules are refused, and the real-time path keeps the plan limit

The alerts page and the app now show, per rule, whether one of its channels is set up on the account (Telegram, member email, browser or phone push, webhook) and warn when none is: a matched alert used to be dropped without a word. Creating or editing a rule into an exact copy of another (same scope, symbols, conditions and channels) answers 409 duplicate_recipe with the id of the existing one, on the site, in the app and through the MCP tools; a client that treated every 409 as the plan limit should read the code. The real-time path now applies the plan's recipe count the way the twenty minute run does, every fired alert records which path fired it (fields._source: fast or cron), and the mobile API's recipe objects carry reachable while the list carries channels_available.

API

401 answers say what arrived, with a reason field

A program that calls a keyed route without a usable key now learns what the gate saw: the 401 key_required body carries a reason field (none, empty_authorization, empty_x_api_key, malformed_authorization, malformed_x_api_key or non_bearer_scheme) and a sentence that names it. An empty header, a placeholder such as bk_..., the prefix copied from the key list, an unexpanded shell variable, or a Bearer value that a template turned into undefined are refused before any lookup, whatever the caller class; a key in the other header still counts. The developers error table, the connect guide and the public manifest describe the field. Every example on the developers page, the dashboard, the Playground, the connect guide and the agent card reads the key from the same BYKARANTELI_API_KEY variable, and a new key's panel shows the export line and a first call ready to run.

API

x402 account answers: tier_required names the ways to pay, included_from in the catalog, versions in force

With an account key, tier_required now names the two ways to pay a call (a prepaid key in x-api-key with the account key in Authorization: Bearer, or a wallet without the account key) and links the plans, like the other refusals; an account whose catalog ByKaranteli switched off keeps its own sentence on every route. /api/x402 entries carry included_from (builder, business, or null for the prepaid key store, which is always bought) next to raw_records, and openapi.json lists the answers of each route kind (400 where a route has one, 402, 403 and the 200 headers) with x-raw-records and x-included-from. networks-history and leverage-tiers-history apply a plan's window to validity: a version that started before the window and is still in force, or ended inside it, is returned. x-quota-used now counts the call it answers, on the slow lane too and with the full weight of an included catalog call, so it equals /api/v1/usage.

API

Funding history route: exchange=binance returns rows, other venues answer 400

The table /api/x402/funding-history reads holds Binance USDT-M settlements only. Until today its exchange filter compared the value with an internal source name, so exchange=binance answered an empty result. exchange=binance (any case) now reads every row, any other venue answers 400 before the query and is not charged, and a call without the parameter is unchanged. The route and the bulk-derivatives file now say what they carry: complete for the TradFi perpetuals and the symbols our pages read every day, with possible gaps on rarely read contracts. Plan pages: bulk exports follow each plan's history window, Business the last 365 days and Scale the whole archive, as monthly files with the current month refreshed every day; the Scale line no longer lists daily raw exports, which the plan did not carry.

APIBreaking

x402 catalog on the paid plans: monthly ceilings again, a history window per plan, raw records from Business

An account key reads the /api/x402 catalog on its plan within a monthly ceiling, a history window and a row cap. Builder: 1,000 included catalog calls a month over the last 90 days, up to 5,000 rows a call, summary series only (the raw record routes are paid per call). Business: 10,000 a month over the last 365 days, up to 20,000 rows a call, raw records included. Scale and Enterprise: no ceiling, the whole archive, raw records included. The window counts from 00:00 UTC, and each included call still counts as 10 requests of the plan's monthly fair use. Raw records are the individual liquidation events and the largest-print ranking, whale prints, Hyperliquid position events and hourly position records, order book snapshots, minute bars and per-venue market snapshots. Two new answers, both pay per call: 403 history_window (a from, to or days before the plan's window) and 403 raw_tier_required (a raw record route below Business); x402_allowance_used (HTTP 402) is back for the plan ceiling. To pay per call with an account key in the request, send the account key as Authorization: Bearer with a prepaid key in x-api-key, or send the call without the account key and pay with a wallet. Included answers carry x-history-window-days and x-history-row-cap (neither on liqmap-levels, options-flow and flow-vpin; the latter not on bulk exports), plus x-x402-allowance-limit and x-x402-allowance-used where a ceiling applies; /api/v1/usage adds history_days, rows_per_call and raw_records_included. Wallet and prepaid calls are unchanged: the whole archive at each route's own row cap, $0.10 a call. Plans, API docs.

APIBreaking

/api/liqmap/v3 asks programs for an account key

/api/liqmap/v3 is the LiqMap page's own read. A request without a member session that does not come from a browser (no Fetch Metadata, as with curl or a script) now gets the same 401 key_required answer as /api/liqmap/public, with Cache-Control: no-store. The page itself and other browsers read it as before, and a request with an account key is served and counted like any other keyed call. Programs should use GET /api/liqmap/public or GET /api/public/liqmap with a free account key.

API

LiqMap API: meta.inputs_present names the inputs a map was built from

GET /api/public/liqmap and every LiqMap payload now carry meta.inputs_present (ticker, orderbook, long_short, open_interest, funding, liquidity_snapshots; true when that input reached the model) and meta.degraded, true when one of the market inputs (ticker, order book, long/short, open interest, funding) was missing and a neutral default stood in; liquidity_snapshots is informational, the depth collector covers part of the universe. A thin map reads as a thin map instead of passing for a full one.

API

Tokenized stocks board on the WebSocket stream

The stream at wss://bykaranteli.com/ws/v1 has a new snapshot channel, tokenized: the tokenized stocks board with the same payload as GET /api/public/tokenized-stocks (each wrapper's issuer, chain or venue, price, reference price, premium and supply, stamped with as_of), pushed when it changes. Subscribe with {"op":"subscribe","channel":"tokenized"}; every plan that opens all stream channels opens it. The channel table on /developers lists it.

API

x402 catalog on the paid plans: no monthly ceiling, each call counts as 10 requests of fair use

Builder and Business keys carried a ceiling of included catalog calls a month and got a 402 past it. The ceiling is gone: a Builder key or above runs every /api/x402 route on its plan, and each successful catalog call counts as 10 requests of the plan's monthly fair use, the same figure the x-quota headers and /api/v1/usage carry. Past fair use the key is slowed to the Free rate, never stopped. Free and Terminal keys, wallets and prepaid keys pay per call as before. Plans, API docs.

API

/api/public/macro carries every macro series with groups and the composite; /api/public/events adds CPI and jobs report blocks

/api/public/macro serves every macro series with groups, the composite's formula and inputs, and per series label, unit, cadence, transform, source and first date; latest is the newest row per series whatever the window. /api/public/events adds cpi and nfp blocks next to FOMC: measured reactions, the size against a normal half hour, the up share and the next scheduled release, plus the dated event rows the chart marks read. API docs.

API

Hyperliquid positions API, address filters, paid position history and the member address routes

GET /api/public/hyperliquid-positions?coin=BTC returns the liquidation price map with an hourly archive (24 hours for everyone, 720 with member depth); ?address= filters /api/public/hyperliquid-whales and /api/x402/hl-whale-events; the paid /api/x402/hl-positions-history serves the hourly archive rows and the free hl-position-levels dataset the current levels; member routes /api/member/hl-addresses take a session or an account key. MCP: get_hl_positions, list_tracked_addresses, add_tracked_address, remove_tracked_address. API docs.

API

Options chain endpoint, flow 2.0 fields, an hourly chain dataset and a paid chain history

GET /api/public/options/chain?currency=BTC serves open interest and IV per expiry and strike with the change over the last hour and the last 24 hours and the front expiry's ATM IV hour by hour (the largest strikes for everyone, every strike with member depth through ?strikes=all). /api/public/options-flow and the paid /api/x402/options-flow add signed 1h, 4h and 24h bought, sold and net premium per option type, the expiry, strike and venue breakdowns and the latest multi-leg structures named from their legs. Dataset options-chain-hourly; paid /api/x402/options-chain-history. MCP: get_options_chain. API docs.

API

Gap and venue share APIs, two datasets and a paid venue share history

/api/public/tradfi-gaps (window, symbol) and /api/public/venue-share (days); datasets tradfi-gaps and venue-share-daily; the paid /api/x402/venue-share-history with hourly rows per counted venue, the hour total and the share. MCP: get_tradfi_gaps, get_venue_share. API docs.

API

Usage endpoint: /api/v1/usage reports your key's plan, limits and consumption

A GET on /api/v1/usage with your key returns the calling key's plan, its rate limit, the monthly quota used and when it resets, today's calls, the keys on the account and the x402 allowance. The rate and quota response headers and an error table are documented on /developers.

API

Developers page: every REST example sends the key and runs

Every REST example on /developers carries the account key header and runs as written. The counts in the manifest and the OpenAPI document are read from code, so they match what the API serves, and the ru and ko editions list every endpoint.

APIBreaking

Plans: a hobby API allowance on Terminal, fair-use ceilings on the paid API plans

Plans: Terminal carries a hobby API allowance (60 a minute, 150,000 a month); Builder, Business and Scale carry fair-use ceilings of 1, 3 and 10 million calls a month and are slowed to the Free rate past them, never stopped; the x402 catalog is included up to 1,000 calls a month on Builder and 10,000 on Business, uncapped on Scale. Prices unchanged.

APIBreaking

x402: every pay-per-call route now costs $0.10, nothing under that

Every paid route under /api/x402 costs $0.10 in USDC per call (Solana or Base), up from $0.002 to $0.01. The prepaid key is unchanged at $10 and now covers 100 calls. The catalog, /openapi.json, the .well-known/x402 document and the developer docs read the price from one place, so they moved together.

API

Stream: a WebSocket for liquidations, whales, Hyperliquid whales, your alerts and on-change snapshots

wss://bykaranteli.com/ws/v1 with the same account key on the handshake. Event channels push liquidation prints from nine venues, $1M+ whale prints, Hyperliquid whale position events and your own alert firings as they happen, each with a seq you can resume from; snapshot channels push pressure, open interest, funding and LiqMap only when the payload changes, in the same shape as the REST routes. Paid plans only: Builder gets one connection with liquidations for three named symbols, Business opens all nine channels with five connections and 15 minutes of replay, Scale and Enterprise raise every limit. Protocol, examples and error codes on /developers; connection, frame and time usage on /dashboard/api.

APIBreaking

Pricing rewritten around two products · monthly quota on free keys · programs must identify themselves

/pricing now says plainly what it sells: Terminal for people ($29 a month, 1 to 12 month terms) and the API plans for programs (free key, Builder $49, Business $149, Scale $399), with one table that lists every feature side by side. Free and Terminal keys carry a quota of 15,000 requests per calendar month (UTC): every keyed response reports it in x-quota-limit, x-quota-used and x-quota-reset, and from 2026-10-01 a key over the quota answers 429 until the month resets; Builder and above have no monthly cap. Two enforcement fixes: a program that sends browser headers but names itself in the User-Agent is treated as a program and needs a key, and 5-minute SuperChart bars with 5,000 bars of history are a Terminal feature again for signed-in accounts (a free account sees the public depth). The hosted MCP endpoint caps keyless clients at 600 tool calls a day per client; a key lifts that. /dashboard/api shows the month's calls against the quota.

APIBreaking

API keys for programs, plans for your code, a data licence

The public JSON API now takes an account key from programs: a free key comes with any verified account (/dashboard/api, 30 requests a minute) and is required for scripts, bots and agents from 2026-09-10; pages on the site keep working without one. New plans for code on /pricing: Builder $49, Business $149 and Scale $399 a month buy rate, member depth on the API (LiqMap on seven timeframes, 5-minute series) and, from Business, a commercial licence and bulk exports; every paid API plan includes the Terminal membership, and members active today keep Builder rights for the rest of their period. Datasets served from this site are now under the ByKaranteli Data Licence (personal and research use with attribution, see /data); files published earlier on the GitHub, Kaggle, Hugging Face and Zenodo mirrors stay CC0 and stop updating. The MCP package 0.26.0 reads BYKARANTELI_API_KEY.

APIBreaking

Signal engine retired: ByKaranteli is a data platform only

The rule-based signal engine, its receipts, strategy pages and performance APIs were removed. The former hub pages redirect to the data they were built on (/data, /symbols, /methodology) and individual receipt URLs answer 410 Gone. The symbol pages now show recorded price, funding, open interest and the derivatives pressure score; the MCP server serves 45 data tools. Nothing about the recording network changed.

API

x402 pay-per-call live on Coinbase Bazaar

13 dataset routes are listed in the Coinbase Bazaar directory with live CDP settlement. Agents can pay per call with USDC; the free snapshots stay free. Details at /developers.