{"openapi":"3.0.3","info":{"title":"Bitculator Data API","description":"Programmatic access to Bitculator market data: coins, prices, history, exchanges, trust scores, tickers, pairs, wallets, sentiment, technical indicators, liquidations, editorial content, and calculators.","version":"1.0.0"},"servers":[{"url":"https://bitculator.com"}],"tags":[{"name":"Coins","description":"\nRanked coin and token market data: paginated listings, single-coin detail, movers\n(gainers/losers), recently-added, trending, and per-coin time series. Prices,\nmarketcap and supply are decimal STRINGS (floats can't carry market precision);\npercentage changes, ranks and counts are numbers."},{"name":"Prices","description":"\nThe lightweight price hot path — current price, marketcap, 24h volume and recent\nchanges for a requested set of coins. `/prices` requires a selector (ids, slugs or\nsymbols); `/prices/{slug}` targets one coin. Optionally `convert` into a fiat\ncurrency (crypto prices refresh ~every minute, fiat FX ~twice daily). Prices and\nmarketcap are decimal strings."},{"name":"Markets","description":"\nTickers (per-exchange markets) and pairs (venue-aggregated markets), plus a coin's\nmarkets and raw per-exchange trading symbols. All of it is snapshot data — no\nper-ticker/pair history exists. USD volumes are numbers; prices are decimal strings."},{"name":"Exchanges","description":"\nExchange rankings, detail, trust scores, time series and per-exchange market/coin\nlistings. Volumes are USD. There is no CEX/DEX column — `type` is derived from the\nexchange taxonomy, so it can be \"cex\", \"dex\" or null."},{"name":"Wallets","description":"\nCrypto wallet reviews — review `score`, supported-asset count, pros/cons counts,\nprice model and release date, plus a grouped tag taxonomy on detail/compare\nresponses. `meta.top_score` is the highest score across all wallets (use it to\nnormalize scores into a 0–1 range)."},{"name":"Global Market","description":"\nMarket-wide aggregates — total marketcap and volume, asset/exchange/pair/market\ncounts, BTC/ETH dominance with a rank-based top-3, the market Fear & Greed reading,\nplus a top-100 heatmap and marketcap/volume history."},{"name":"Sentiment","description":"\nMarket and per-coin sentiment indices. Fear & Greed and Bull/Bear are\n15-minute-refresh SNAPSHOTS — only the current reading exists, there is no time\nseries for them. Altseason carries full daily history. `indicators` is the\nmarket-wide technical tally."},{"name":"Indicators","description":"\nPer-coin technical indicators. Each indicator is its own dedicated endpoint —\nmomentum oscillators (RSI, Stoch-RSI, CCI, MFI, Williams %R), trend and price\nbaselines (SMA, MACD, VWAP), volume flow (OBV, CMF), trend strength (ADX) and\nvolatility — plus a single multi-indicator snapshot. Every family is a DAILY\nseries computed from daily candles (full retention; young assets return leading\nwarm-up `null`s until enough history exists). Price-scale families (SMA, VWAP,\nMACD, OBV) emit decimal strings; bounded oscillators emit numbers. A few\nlong-window periods require a paid plan — noted on each endpoint."},{"name":"Liquidations","description":"\nDerivatives liquidations. Source coverage is currently OKX swap markets only\n(stated in every `meta.note`). The RAW feed (the `/liquidations` list and the\nhourly breakdown) is pruned after ~48 hours; daily rollups are kept forever.\nToday's aggregates are partial and update every ~15 minutes."},{"name":"Conversion","description":"\nConvert between any two active assets (crypto AND fiat), and list the currencies\nusable as conversion legs. Values are decimal strings. Fiat FX rates refresh\n~twice daily; crypto rates ~every minute."},{"name":"Calculators","description":"\nServer-side financial calculators mirroring the web tools: DCA, profit/loss and\nloan (which read cached market data), plus stateless compound-interest and staking\nmath."},{"name":"Editorial","description":"\nEditorial articles — published (ACTIVE) only. `locale` picks the content language\nwith per-field English fallback (the payload reports which `locale` actually won).\nArticles can be filtered by tag or by a related coin/exchange/wallet slug. API\nreads deliberately do NOT increment view counts."},{"name":"Alarms","description":"\nPrice-alarm CRUD — the same alarms the web app manages. Alarms consume the key\nowner's alarm inventory balance, are TARGET-type on coins only, and an above/below\nvs current-value guard blocks alarms that would self-trigger instantly. Key-scoped\n(the API key sets the owner) and never response-cached."},{"name":"Webhooks","description":"\nBitculator POSTs each event as JSON with an HMAC signature header:\n\n    X-Bitculator-Signature: t=<unix-ts>,v1=<hex hmac_sha256(\"<ts>.<raw-body>\", secret)>\n    X-Bitculator-Event: alarm.triggered\n\nVerify it by recomputing the HMAC over \"<t>.<raw request body>\" with your\nendpoint secret and comparing in constant time; reject if `t` is older than a\nfew minutes (replay guard). Example (PHP):\n\n    [$t, $v1] = sscanf($_SERVER['HTTP_X_BITCULATOR_SIGNATURE'], 't=%d,v1=%s');\n    $expected = hash_hmac('sha256', $t.'.'.file_get_contents('php://input'), $secret);\n    abort_unless(hash_equals($expected, $v1) && abs(time() - $t) < 300, 403);\n\nSupported events: `alarm.triggered`. Deliveries retry 3× with backoff; an\nendpoint auto-disables after 10 consecutive failed deliveries."},{"name":"Meta","description":"\nAPI meta and introspection: an authenticated ping to verify a key and the\nmiddleware stack, current-key usage/quota, and the machine-readable OpenAPI spec."}],"components":{"securitySchemes":{"default":{"type":"http","scheme":"bearer","description":"Create a Data API key in your <a href=\"/user/developer/api\">developer console</a> — keys are Bearer-only and carry the <code>data-api</code> ability. Keep them server-side; they are never meant for client-side embedding."}}},"security":[{"default":[]}],"paths":{"/api/v1/coins":{"get":{"summary":"List coins","operationId":"listCoins","description":"Ranked coins with prices, filters and selectors, paginated with Laravel's\n`links` + `meta` envelope. Prices, marketcap and circulating_supply are decimal\nstrings; changes and ranks are numbers.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"circulating_supply":"19909179","logo":"https://bitculator.com/storage/media/logo/bitcoin.png","listed_at":"2025-03-15T17:00:43+00:00","last_updated":"2026-06-27T10:34:17+00:00"}],"links":{"first":"https://bitculator.com/api/v1/coins?page=1","last":"https://bitculator.com/api/v1/coins?page=3","prev":null,"next":"https://bitculator.com/api/v1/coins?page=2"},"meta":{"current_page":1,"from":1,"last_page":3,"per_page":50,"to":50,"total":134}},"properties":{"data":{"type":"array","example":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"circulating_supply":"19909179","logo":"https://bitculator.com/storage/media/logo/bitcoin.png","listed_at":"2025-03-15T17:00:43+00:00","last_updated":"2026-06-27T10:34:17+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"name":{"type":"string","example":"Bitcoin"},"symbol":{"type":"string","example":"BTC"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"volume_24h":{"type":"integer","example":5345161962},"change_24h":{"type":"number","example":1.35},"change_7d":{"type":"number","example":4.98},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"circulating_supply":{"type":"string","example":"19909179"},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/bitcoin.png"},"listed_at":{"type":"string","example":"2025-03-15T17:00:43+00:00"},"last_updated":{"type":"string","example":"2026-06-27T10:34:17+00:00"}}}},"links":{"type":"object","properties":{"first":{"type":"string","example":"https://bitculator.com/api/v1/coins?page=1"},"last":{"type":"string","example":"https://bitculator.com/api/v1/coins?page=3"},"prev":{"type":"string","example":null,"nullable":true},"next":{"type":"string","example":"https://bitculator.com/api/v1/coins?page=2"}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"from":{"type":"integer","example":1},"last_page":{"type":"integer","example":3},"per_page":{"type":"integer","example":50},"to":{"type":"integer","example":50},"total":{"type":"integer","example":134}}}}}}}},"422":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"validation","message":"The request parameters are invalid.","details":{"errors":{"per_page":["The per page must not be greater than 250."]}}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"validation"},"message":{"type":"string","example":"The request parameters are invalid."},"details":{"type":"object","properties":{"errors":{"type":"object","properties":{"per_page":{"type":"array","example":["The per page must not be greater than 250."],"items":{"type":"string"}}}}}}}}}}}}}},"tags":["Coins"]}},"/api/v1/coins/recently-added":{"get":{"summary":"Recently added coins","operationId":"recentlyAddedCoins","description":"Newest listings — sorted by status_updated_at (the went-active timestamp;\ncreated_at is the crawl date, which predates listing by arbitrary amounts).\nSame row shape and pagination envelope as `List coins`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":[],"tags":["Coins"]}},"/api/v1/coins/gainers":{"get":{"summary":"Top gainers","operationId":"topGainers","description":"Biggest positive movers over the `interval` window (24h default, or 7d). Same row\nshape and pagination envelope as `List coins`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"circulating_supply":"19909179","logo":"https://bitculator.com/storage/media/logo/bitcoin.png","listed_at":"2025-03-15T17:00:43+00:00","last_updated":"2026-06-27T10:34:17+00:00"}],"links":{"first":"https://bitculator.com/api/v1/coins/gainers?page=1","last":"https://bitculator.com/api/v1/coins/gainers?page=2","prev":null,"next":"https://bitculator.com/api/v1/coins/gainers?page=2"},"meta":{"current_page":1,"from":1,"last_page":2,"per_page":50,"to":50,"total":89}},"properties":{"data":{"type":"array","example":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"circulating_supply":"19909179","logo":"https://bitculator.com/storage/media/logo/bitcoin.png","listed_at":"2025-03-15T17:00:43+00:00","last_updated":"2026-06-27T10:34:17+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"name":{"type":"string","example":"Bitcoin"},"symbol":{"type":"string","example":"BTC"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"volume_24h":{"type":"integer","example":5345161962},"change_24h":{"type":"number","example":1.35},"change_7d":{"type":"number","example":4.98},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"circulating_supply":{"type":"string","example":"19909179"},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/bitcoin.png"},"listed_at":{"type":"string","example":"2025-03-15T17:00:43+00:00"},"last_updated":{"type":"string","example":"2026-06-27T10:34:17+00:00"}}}},"links":{"type":"object","properties":{"first":{"type":"string","example":"https://bitculator.com/api/v1/coins/gainers?page=1"},"last":{"type":"string","example":"https://bitculator.com/api/v1/coins/gainers?page=2"},"prev":{"type":"string","example":null,"nullable":true},"next":{"type":"string","example":"https://bitculator.com/api/v1/coins/gainers?page=2"}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"from":{"type":"integer","example":1},"last_page":{"type":"integer","example":2},"per_page":{"type":"integer","example":50},"to":{"type":"integer","example":50},"total":{"type":"integer","example":89}}}}}}}}},"tags":["Coins"]}},"/api/v1/coins/losers":{"get":{"summary":"Top losers","operationId":"topLosers","description":"Biggest negative movers over the `interval` window (24h default, or 7d). Same row\nshape and pagination envelope as `List coins`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":[],"tags":["Coins"]}},"/api/v1/coins/trending":{"get":{"summary":"Trending coins","operationId":"trendingCoins","description":"The most-viewed coins right now, ranked by view `score`. A compact projection\n(no pagination): id, slug, name, symbol, rank, price (decimal string), marketcap,\nlogo and score.","parameters":[{"in":"query","name":"limit","description":"How many trending coins to return (1–20, default 10).","example":10,"required":false,"schema":{"type":"integer","description":"How many trending coins to return (1–20, default 10).","example":10,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"logo":"https://bitculator.com/storage/media/logo/bitcoin.png","score":2}]},"properties":{"data":{"type":"array","example":[{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"logo":"https://bitculator.com/storage/media/logo/bitcoin.png","score":2}],"items":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"name":{"type":"string","example":"Bitcoin"},"symbol":{"type":"string","example":"BTC"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/bitcoin.png"},"score":{"type":"integer","example":2}}}}}}}}}},"tags":["Coins"]}},"/api/v1/coins/{slug}":{"get":{"summary":"Get coin detail","operationId":"getCoinDetail","description":"Full single-coin profile. Beyond the list fields it adds: `supply`\n(circulating/total/max), `today` OHLC, `all_time_high` / `all_time_low` (price,\ndate and percent_from the current price), `fully_diluted_valuation`, market\n`counts` (exchanges/pairs/tickers/wallets), `decimals`, `genesis_date`, official\n`links` (typed url list), token `contracts`, and a localized HTML `description`\n(falls back to English when the requested locale is missing). All price/supply\nfields are decimal strings.","parameters":[{"in":"query","name":"locale","description":"Content language for the description (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language for the description (falls back to English).","example":"en","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":38,"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","type":"coin","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"fully_diluted_valuation":1333936396042.2,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"supply":{"circulating":"19909179","total":"19970852","max":"21000000"},"today":{"open":"63408.100996475","high":"63640.608639825","low":"62798.732107749","close":"63520.780763913"},"all_time_high":{"price":"125881.21309073","date":"2025-10-06","percent_from":-49.54},"all_time_low":{"price":"0.099","date":"2010-10-12","percent_from":64162304.81},"counts":{"exchanges":11,"pairs":92,"tickers":211,"wallets":206},"decimals":8,"genesis_date":"2009-01-03","description":"<p>Bitcoin is a decentralized digital currency…</p>","links":[{"type":"website","url":"https://bitcoin.org/en/"},{"type":"whitepaper","url":"https://bitcoin.org/bitcoin.pdf"}],"contracts":[],"logo":"https://bitculator.com/storage/media/logo/bitcoin.png","last_updated":"2026-06-27T10:34:17+00:00"}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"name":{"type":"string","example":"Bitcoin"},"symbol":{"type":"string","example":"BTC"},"type":{"type":"string","example":"coin"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"fully_diluted_valuation":{"type":"number","example":1333936396042.2},"volume_24h":{"type":"integer","example":5345161962},"change_24h":{"type":"number","example":1.35},"change_7d":{"type":"number","example":4.98},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"supply":{"type":"object","properties":{"circulating":{"type":"string","example":"19909179"},"total":{"type":"string","example":"19970852"},"max":{"type":"string","example":"21000000"}}},"today":{"type":"object","properties":{"open":{"type":"string","example":"63408.100996475"},"high":{"type":"string","example":"63640.608639825"},"low":{"type":"string","example":"62798.732107749"},"close":{"type":"string","example":"63520.780763913"}}},"all_time_high":{"type":"object","properties":{"price":{"type":"string","example":"125881.21309073"},"date":{"type":"string","example":"2025-10-06"},"percent_from":{"type":"number","example":-49.54}}},"all_time_low":{"type":"object","properties":{"price":{"type":"string","example":"0.099"},"date":{"type":"string","example":"2010-10-12"},"percent_from":{"type":"number","example":64162304.81}}},"counts":{"type":"object","properties":{"exchanges":{"type":"integer","example":11},"pairs":{"type":"integer","example":92},"tickers":{"type":"integer","example":211},"wallets":{"type":"integer","example":206}}},"decimals":{"type":"integer","example":8},"genesis_date":{"type":"string","example":"2009-01-03"},"description":{"type":"string","example":"<p>Bitcoin is a decentralized digital currency…</p>"},"links":{"type":"array","example":[{"type":"website","url":"https://bitcoin.org/en/"},{"type":"whitepaper","url":"https://bitcoin.org/bitcoin.pdf"}],"items":{"type":"object","properties":{"type":{"type":"string","example":"website"},"url":{"type":"string","example":"https://bitcoin.org/en/"}}}},"contracts":{"type":"array","example":[]},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/bitcoin.png"},"last_updated":{"type":"string","example":"2026-06-27T10:34:17+00:00"}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Coin not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Coin not found."}}}}}}}}},"tags":["Coins"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/history":{"get":{"summary":"Candle history","operationId":"candleHistory","description":"Per-coin OHLC + volume + marketcap time series. Pick `interval`: minutely,\nhalf-hourly, hourly or daily. Retention is a hard property of the rollup\npipeline — minutely 8 days, half-hourly 3 months, hourly 6 months, daily forever;\nrequests beyond a window return what exists. When a `limit` is set you get the\nMOST RECENT N rows in the window, emitted oldest-first. Prices are decimal\nstrings.","parameters":[{"in":"query","name":"interval","description":"minutely, half-hourly, hourly or daily (default daily).","example":"daily","required":false,"schema":{"type":"string","description":"minutely, half-hourly, hourly or daily (default daily).","example":"daily"}},{"in":"query","name":"start","description":"ISO date/time lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date/time lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date/time upper bound (a date-only value means through that day).","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date/time upper bound (a date-only value means through that day).","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–2000, default 1000).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–2000, default 1000).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"time":"2026-06-14T23:01:01+00:00","price":"65481.259006434","open":"64193.294621057","high":"65513.599862059","low":"63528.138075558","close":"65481.259006434","volume_24h":3795657715,"marketcap":1303678106704.5}],"meta":{"coin":"bitcoin","interval":"daily","count":1,"retention":"full history"}},"properties":{"data":{"type":"array","example":[{"time":"2026-06-14T23:01:01+00:00","price":"65481.259006434","open":"64193.294621057","high":"65513.599862059","low":"63528.138075558","close":"65481.259006434","volume_24h":3795657715,"marketcap":1303678106704.5}],"items":{"type":"object","properties":{"time":{"type":"string","example":"2026-06-14T23:01:01+00:00"},"price":{"type":"string","example":"65481.259006434"},"open":{"type":"string","example":"64193.294621057"},"high":{"type":"string","example":"65513.599862059"},"low":{"type":"string","example":"63528.138075558"},"close":{"type":"string","example":"65481.259006434"},"volume_24h":{"type":"integer","example":3795657715},"marketcap":{"type":"number","example":1303678106704.5}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"interval":{"type":"string","example":"daily"},"count":{"type":"integer","example":1},"retention":{"type":"string","example":"full history"}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Coin not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Coin not found."}}}}}}}}},"tags":["Coins"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/marketcap-history":{"get":{"summary":"Marketcap history","operationId":"marketcapHistory","description":"The same per-coin rollups as `Candle history`, projected to `{time, marketcap}`\nonly. Same `interval` choices and retention windows (minutely 8 days,\nhalf-hourly 3 months, hourly 6 months, daily forever), most-recent-N when a\n`limit` is set.","parameters":[{"in":"query","name":"interval","description":"minutely, half-hourly, hourly or daily (default daily).","example":"daily","required":false,"schema":{"type":"string","description":"minutely, half-hourly, hourly or daily (default daily).","example":"daily"}},{"in":"query","name":"start","description":"ISO date/time lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date/time lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date/time upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date/time upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–2000, default 1000).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–2000, default 1000).","example":30}}],"responses":[],"tags":["Coins"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/sparkline":{"get":{"summary":"Coin sparkline","operationId":"coinSparkline","description":"A compact price series for the coin over the chosen `period`, for drawing\nsparklines.\n\n`points` is a sample of at most 480 readings, oldest first, each a decimal-string\n`price` at an ISO-8601 `time`. `low` and `high` are the true extremes of the whole\nperiod — they bound every point, but need not appear among the sampled ones.\n`change` is the move across the period in PERCENT (`1.25` means +1.25%).","parameters":[{"in":"query","name":"period","description":"24h, 7d, 30d, 60d, 90d, 180d or 365d (default 7d).","example":"7d","required":false,"schema":{"type":"string","description":"24h, 7d, 30d, 60d, 90d, 180d or 365d (default 7d).","example":"7d","nullable":true}}],"responses":[],"tags":["Coins"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/prices":{"get":{"summary":"Get prices","operationId":"getPrices","description":"Prices for a requested set of coins. Pass at least one selector — `ids`, `slugs`\nor `symbols` (up to 100 combined). `meta.currency` echoes the conversion target\n(USD unless `convert` is set).","parameters":[{"in":"query","name":"ids","description":"Coin ids to price (CSV). At least one of ids, slugs or symbols is required; the three lists cap at 100 selectors combined. This field is required when none of <code>slugs</code> and <code>symbols</code> are present. Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Coin ids to price (CSV). At least one of ids, slugs or symbols is required; the three lists cap at 100 selectors combined. This field is required when none of <code>slugs</code> and <code>symbols</code> are present. Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Coin slugs to price (CSV). At least one of ids, slugs or symbols is required. This field is required when none of <code>ids</code> and <code>symbols</code> are present. Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Coin slugs to price (CSV). At least one of ids, slugs or symbols is required. This field is required when none of <code>ids</code> and <code>symbols</code> are present. Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Coin symbols to price (CSV, case-insensitive). At least one of ids, slugs or symbols is required. This field is required when none of <code>ids</code> and <code>slugs</code> are present. Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Coin symbols to price (CSV, case-insensitive). At least one of ids, slugs or symbols is required. This field is required when none of <code>ids</code> and <code>slugs</code> are present. Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"convert","description":"Convert prices/marketcap into an active fiat currency by symbol (default USD). FX rates refresh ~twice daily.","example":"EUR","required":false,"schema":{"type":"string","description":"Convert prices/marketcap into an active fiat currency by symbol (default USD). FX rates refresh ~twice daily.","example":"EUR","enum":["USD","EUR","JPY","BGN","CZK","DKK","GBP","HUF","PLN","RON","SEK","CHF","ISK","NOK","HRK","RUB","TRY","AUD","BRL","CAD","CNY","HKD","IDR","ILS","INR","KRW","MXN","MYR","NZD","PHP","SGD","THB","ZAR","ARS","DZD","MAD","TWD"],"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":38,"slug":"bitcoin","symbol":"BTC","name":"Bitcoin","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"last_updated":"2026-06-27T10:34:17+00:00"},{"id":39,"slug":"ethereum","symbol":"ETH","name":"Ethereum","rank":2,"price":"1672.4623100248","marketcap":203243220990.49,"volume_24h":69585141532,"change_24h":1.42,"change_7d":7.56,"change_rank_24h":0,"change_rank_7d":0,"last_updated":"2026-06-12T09:32:14+00:00"}],"meta":{"currency":"USD","count":2}},"properties":{"data":{"type":"array","example":[{"id":38,"slug":"bitcoin","symbol":"BTC","name":"Bitcoin","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"last_updated":"2026-06-27T10:34:17+00:00"},{"id":39,"slug":"ethereum","symbol":"ETH","name":"Ethereum","rank":2,"price":"1672.4623100248","marketcap":203243220990.49,"volume_24h":69585141532,"change_24h":1.42,"change_7d":7.56,"change_rank_24h":0,"change_rank_7d":0,"last_updated":"2026-06-12T09:32:14+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"},"name":{"type":"string","example":"Bitcoin"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"volume_24h":{"type":"integer","example":5345161962},"change_24h":{"type":"number","example":1.35},"change_7d":{"type":"number","example":4.98},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"last_updated":{"type":"string","example":"2026-06-27T10:34:17+00:00"}}}},"meta":{"type":"object","properties":{"currency":{"type":"string","example":"USD"},"count":{"type":"integer","example":2}}}}}}}},"422":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"validation","message":"The request parameters are invalid.","details":{"errors":{"ids":["Pass at least one selector: ids, slugs or symbols."]}}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"validation"},"message":{"type":"string","example":"The request parameters are invalid."},"details":{"type":"object","properties":{"errors":{"type":"object","properties":{"ids":{"type":"array","example":["Pass at least one selector: ids, slugs or symbols."],"items":{"type":"string"}}}}}}}}}}}}}},"tags":["Prices"]}},"/api/v1/prices/{slug}":{"get":{"summary":"Get a coin price","operationId":"getACoinPrice","description":"Single-coin price snapshot. Optionally `convert` into an active fiat currency by\nsymbol (default USD).","parameters":[{"in":"query","name":"convert","description":"Active fiat currency symbol to price in (default USD).","example":"EUR","required":false,"schema":{"type":"string","description":"Active fiat currency symbol to price in (default USD).","example":"EUR","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":38,"slug":"bitcoin","symbol":"BTC","name":"Bitcoin","rank":1,"price":"63520.780763913","marketcap":1264646594448.5,"volume_24h":5345161962,"change_24h":1.35,"change_7d":4.98,"change_rank_24h":0,"change_rank_7d":0,"last_updated":"2026-06-27T10:34:17+00:00"},"meta":{"currency":"USD","count":1}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":38},"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"},"name":{"type":"string","example":"Bitcoin"},"rank":{"type":"integer","example":1},"price":{"type":"string","example":"63520.780763913"},"marketcap":{"type":"number","example":1264646594448.5},"volume_24h":{"type":"integer","example":5345161962},"change_24h":{"type":"number","example":1.35},"change_7d":{"type":"number","example":4.98},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"last_updated":{"type":"string","example":"2026-06-27T10:34:17+00:00"}}},"meta":{"type":"object","properties":{"currency":{"type":"string","example":"USD"},"count":{"type":"integer","example":1}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Coin not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Coin not found."}}}}}}}}},"tags":["Prices"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/historical-price":{"get":{"summary":"Historical price","operationId":"historicalPrice","description":"The coin's USD price on a given date, read from the daily history (exact day,\n±3-day fallback — the same resolver the portfolio uses). Crypto only: fiat rows\nhave no daily history.","parameters":[{"in":"query","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string","description":"The coin's slug identifier.","example":"bitcoin"}},{"in":"query","name":"date","description":"date The lookup date (after 2008-12-31, not in the future).","example":"2021-04-14","required":true,"schema":{"type":"string","description":"date The lookup date (after 2008-12-31, not in the future).","example":"2021-04-14"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"slug":"bitcoin","symbol":"BTC","date":"2021-04-14","price":"63109.7","currency":"USD"}},"properties":{"data":{"type":"object","properties":{"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"},"date":{"type":"string","example":"2021-04-14"},"price":{"type":"string","example":"63109.7"},"currency":{"type":"string","example":"USD"}}}}}}}}},"tags":["Prices"]}},"/api/v1/coins/{slug}/markets":{"get":{"summary":"Coin markets","operationId":"coinMarkets","description":"All markets for a coin — the tickers whose pair has the coin as base OR quote.\nSame row shape and filters as `List tickers`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"exchange","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","required":false,"schema":{"type":"string","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","nullable":true}},{"in":"query","name":"pair","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"instrument","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","required":false,"schema":{"type":"string","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","enum":["future","option","swap","spot","margin"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","required":false,"schema":{"type":"string","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","nullable":true}},{"in":"query","name":"min_volume","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"min_change","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"nullable":true}},{"in":"query","name":"max_change","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"nullable":true}},{"in":"query","name":"sort","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","required":false,"schema":{"type":"string","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","nullable":true}}],"responses":[],"tags":["Markets"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/symbols":{"get":{"summary":"Coin trading symbols","operationId":"coinTradingSymbols","description":"The coin's raw per-exchange trading symbols — sparsely populated reference data\n(coverage is best-effort).","parameters":[],"responses":[],"tags":["Markets"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/tickers":{"get":{"summary":"List tickers","operationId":"listTickers","description":"Individual per-exchange markets (tickers), paginated. Filter by exchange, pair,\ninstrument and volume/change ranges. USD volumes are numbers; prices are decimal\nstrings.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"exchange","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","required":false,"schema":{"type":"string","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","nullable":true}},{"in":"query","name":"pair","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"instrument","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","required":false,"schema":{"type":"string","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","enum":["future","option","swap","spot","margin"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","required":false,"schema":{"type":"string","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","nullable":true}},{"in":"query","name":"min_volume","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"min_change","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"nullable":true}},{"in":"query","name":"max_change","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"nullable":true}},{"in":"query","name":"sort","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","required":false,"schema":{"type":"string","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","nullable":true}}],"responses":[],"tags":["Markets"]}},"/api/v1/pairs":{"get":{"summary":"List pairs","operationId":"listPairs","description":"Venue-aggregated trading pairs, ranked by 24h USD volume. Filter by a coin slug\n(base or quote) and volume range.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"search","description":"Free-text match on the pair symbol. Must not be greater than 50 characters.","example":"BTC","required":false,"schema":{"type":"string","description":"Free-text match on the pair symbol. Must not be greater than 50 characters.","example":"BTC","nullable":true}},{"in":"query","name":"coin","description":"Restrict to pairs where this coin slug is the base or quote asset. Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Restrict to pairs where this coin slug is the base or quote asset. Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_volume","description":"Only pairs with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only pairs with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only pairs with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only pairs with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"sort","description":"Sort field: volume_usd or updated (prefix with - for descending). Defaults to -volume_usd.","example":"-volume_usd","required":false,"schema":{"type":"string","description":"Sort field: volume_usd or updated (prefix with - for descending). Defaults to -volume_usd.","example":"-volume_usd","enum":["volume_usd","-volume_usd","updated","-updated"],"nullable":true}}],"responses":[],"tags":["Markets"]}},"/api/v1/pairs/{id}":{"get":{"summary":"Get pair detail","operationId":"getPairDetail","description":"One pair plus every exchange ticker listing it, ordered by volume.","parameters":[],"responses":{"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Pair not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Pair not found."}}}}}}}}},"tags":["Markets"]},"parameters":[{"in":"path","name":"id","description":"The pair id.","example":1,"required":true,"schema":{"type":"integer"}}]},"/api/v1/exchanges":{"get":{"summary":"List exchanges","operationId":"listExchanges","description":"Ranked exchanges with 24h volume, dominance, pair/asset counts and recent\nchanges. Paginated with Laravel's `links` + `meta` envelope.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a venue type: cex or dex (resolved via the exchange taxonomy).","example":"cex","required":false,"schema":{"type":"string","description":"Restrict to a venue type: cex or dex (resolved via the exchange taxonomy).","example":"cex","enum":["cex","dex"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on exchange name. Must not be greater than 100 characters.","example":"binance","required":false,"schema":{"type":"string","description":"Free-text match on exchange name. Must not be greater than 100 characters.","example":"binance","nullable":true}},{"in":"query","name":"min_pairs","description":"Only exchanges listing at least this many pairs. Must be at least 0.","example":100,"required":false,"schema":{"type":"integer","description":"Only exchanges listing at least this many pairs. Must be at least 0.","example":100,"nullable":true}},{"in":"query","name":"max_pairs","description":"Only exchanges listing at most this many pairs. Must be at least 0.","example":2000,"required":false,"schema":{"type":"integer","description":"Only exchanges listing at most this many pairs. Must be at least 0.","example":2000,"nullable":true}},{"in":"query","name":"min_assets","description":"Only exchanges listing at least this many assets. Must be at least 0.","example":50,"required":false,"schema":{"type":"integer","description":"Only exchanges listing at least this many assets. Must be at least 0.","example":50,"nullable":true}},{"in":"query","name":"max_assets","description":"Only exchanges listing at most this many assets. Must be at least 0.","example":1000,"required":false,"schema":{"type":"integer","description":"Only exchanges listing at most this many assets. Must be at least 0.","example":1000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only exchanges with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only exchanges with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only exchanges with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only exchanges with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific exchange ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"1,12","required":false,"schema":{"type":"string","description":"Filter to specific exchange ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"1,12","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific exchange slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"binance-exchange,gateio","required":false,"schema":{"type":"string","description":"Filter to specific exchange slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"binance-exchange,gateio","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: volume, rank, volume_dominance, change_24h, change_7d, pairs, assets. Must not be greater than 100 characters.","example":"-volume","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: volume, rank, volume_dominance, change_24h, change_7d, pairs, assets. Must not be greater than 100 characters.","example":"-volume","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":1,"slug":"binance-exchange","name":"Binance","rank":1,"volume_24h":6152385798,"volume_dominance":36.98,"change_24h":200.09,"change_7d":22.87,"change_rank_24h":0,"change_rank_7d":0,"pairs":1115,"assets":100,"logo":"https://bitculator.com/storage/media/logo/binance.png","last_updated":"2026-06-15T16:59:21+00:00"}],"links":{"first":"https://bitculator.com/api/v1/exchanges?page=1","last":"https://bitculator.com/api/v1/exchanges?page=1","prev":null,"next":null},"meta":{"current_page":1,"from":1,"last_page":1,"per_page":50,"to":10,"total":10}},"properties":{"data":{"type":"array","example":[{"id":1,"slug":"binance-exchange","name":"Binance","rank":1,"volume_24h":6152385798,"volume_dominance":36.98,"change_24h":200.09,"change_7d":22.87,"change_rank_24h":0,"change_rank_7d":0,"pairs":1115,"assets":100,"logo":"https://bitculator.com/storage/media/logo/binance.png","last_updated":"2026-06-15T16:59:21+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":1},"slug":{"type":"string","example":"binance-exchange"},"name":{"type":"string","example":"Binance"},"rank":{"type":"integer","example":1},"volume_24h":{"type":"integer","example":6152385798},"volume_dominance":{"type":"number","example":36.98},"change_24h":{"type":"number","example":200.09},"change_7d":{"type":"number","example":22.87},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"pairs":{"type":"integer","example":1115},"assets":{"type":"integer","example":100},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/binance.png"},"last_updated":{"type":"string","example":"2026-06-15T16:59:21+00:00"}}}},"links":{"type":"object","properties":{"first":{"type":"string","example":"https://bitculator.com/api/v1/exchanges?page=1"},"last":{"type":"string","example":"https://bitculator.com/api/v1/exchanges?page=1"},"prev":{"type":"string","example":null,"nullable":true},"next":{"type":"string","example":null,"nullable":true}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"from":{"type":"integer","example":1},"last_page":{"type":"integer","example":1},"per_page":{"type":"integer","example":50},"to":{"type":"integer","example":10},"total":{"type":"integer","example":10}}}}}}}}},"tags":["Exchanges"]}},"/api/v1/exchanges/{slug}":{"get":{"summary":"Get exchange detail","operationId":"getExchangeDetail","description":"Full single-exchange profile: ranking, volume/dominance, pair and asset counts,\n`established` date, `location`, referral `website`, and the derived `type`\n(cex/dex/null).","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":1,"slug":"binance-exchange","name":"Binance","type":"cex","rank":1,"volume_24h":6152385798,"volume_dominance":36.98,"change_24h":200.09,"change_7d":22.87,"change_rank_24h":0,"change_rank_7d":0,"pairs":1115,"assets":100,"established":"2017-07-14","location":"Cayman Islands","website":"https://accounts.binance.com/register","logo":"https://bitculator.com/storage/media/logo/binance.png","last_updated":"2026-06-15T16:59:21+00:00"}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":1},"slug":{"type":"string","example":"binance-exchange"},"name":{"type":"string","example":"Binance"},"type":{"type":"string","example":"cex"},"rank":{"type":"integer","example":1},"volume_24h":{"type":"integer","example":6152385798},"volume_dominance":{"type":"number","example":36.98},"change_24h":{"type":"number","example":200.09},"change_7d":{"type":"number","example":22.87},"change_rank_24h":{"type":"integer","example":0},"change_rank_7d":{"type":"integer","example":0},"pairs":{"type":"integer","example":1115},"assets":{"type":"integer","example":100},"established":{"type":"string","example":"2017-07-14"},"location":{"type":"string","example":"Cayman Islands"},"website":{"type":"string","example":"https://accounts.binance.com/register"},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/binance.png"},"last_updated":{"type":"string","example":"2026-06-15T16:59:21+00:00"}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Exchange not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Exchange not found."}}}}}}}}},"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/exchanges/{slug}/trust-score":{"get":{"summary":"Get exchange trust score","operationId":"getExchangeTrustScore","description":"An aggregate 0–10 trust `score` plus its 13-factor `breakdown` (rank, volume,\nage, volume_trend, stability, rank_stability, ticker_health, pairs, community,\nassets, dominance, market_breadth, transparency). Computed per exchange and\ncached 24h.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"exchange":"binance-exchange","score":8.3,"breakdown":{"rank":10,"volume":10,"age":10,"volume_trend":7,"stability":3,"rank_stability":10,"ticker_health":8.6,"pairs":9.6,"community":6,"assets":6.6,"dominance":9.4,"market_breadth":8,"transparency":8.5}}},"properties":{"data":{"type":"object","properties":{"exchange":{"type":"string","example":"binance-exchange"},"score":{"type":"number","example":8.3},"breakdown":{"type":"object","properties":{"rank":{"type":"integer","example":10},"volume":{"type":"integer","example":10},"age":{"type":"integer","example":10},"volume_trend":{"type":"integer","example":7},"stability":{"type":"integer","example":3},"rank_stability":{"type":"integer","example":10},"ticker_health":{"type":"number","example":8.6},"pairs":{"type":"number","example":9.6},"community":{"type":"integer","example":6},"assets":{"type":"number","example":6.6},"dominance":{"type":"number","example":9.4},"market_breadth":{"type":"integer","example":8},"transparency":{"type":"number","example":8.5}}}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Exchange not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Exchange not found."}}}}}}}}},"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/exchanges/{slug}/history":{"get":{"summary":"Exchange history","operationId":"exchangeHistory","description":"Volume / dominance / pairs / assets time series (the exchange rollups carry no\nOHLC). Pick `interval`: minutely, hourly or daily. Retention is a hard property\nof the rollup pipeline — minutely 8 days, hourly 6 months, daily forever; when a\n`limit` is set you get the most-recent N rows in the window, oldest-first.","parameters":[{"in":"query","name":"interval","description":"minutely, hourly or daily (default daily).","example":"daily","required":false,"schema":{"type":"string","description":"minutely, hourly or daily (default daily).","example":"daily","nullable":true}},{"in":"query","name":"start","description":"ISO date/time lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date/time lower bound.","example":"2026-06-01","nullable":true}},{"in":"query","name":"end","description":"ISO date/time upper bound (a date-only value means through that day).","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date/time upper bound (a date-only value means through that day).","example":"2026-06-30","nullable":true}},{"in":"query","name":"limit","description":"Max rows (1–2000, default 1000).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–2000, default 1000).","example":30,"nullable":true}}],"responses":[],"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/exchanges/{slug}/sparkline":{"get":{"summary":"Exchange sparkline","operationId":"exchangeSparkline","description":"The exchange's volume sparkline series for a period (defaults to 7d) — the same\nseries the web's exchange rows render.\n\n`points` is a sample of at most 480 readings, oldest first, each a `volume` at an\nISO-8601 `time`. `low` and `high` are the true extremes of the whole period — they\nbound every point, but need not appear among the sampled ones. `change` is the move\nacross the period in PERCENT (`1.25` means +1.25%).","parameters":[{"in":"query","name":"period","description":"One of `24h`, `7d` (default), `30d`, `60d`, `90d`, `180d`, `365d`.","example":"7d","required":false,"schema":{"type":"string","description":"One of `24h`, `7d` (default), `30d`, `60d`, `90d`, `180d`, `365d`.","example":"7d","nullable":true}}],"responses":[],"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/exchanges/{slug}/tickers":{"get":{"summary":"Exchange markets","operationId":"exchangeMarkets","description":"The exchange's ticker listings (its markets), paginated. Already scoped to the\nexchange — do not pass an `exchange` parameter here.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"exchange","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","required":false,"schema":{"type":"string","description":"Restrict to a single exchange by slug (omit on the per-exchange listing, which is already scoped). Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"binance-exchange","nullable":true}},{"in":"query","name":"pair","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Restrict to a single pair by id. Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"instrument","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","required":false,"schema":{"type":"string","description":"Instrument type: future, option, swap, spot or margin (plurals accepted).","example":"spot","enum":["future","option","swap","spot","margin"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","required":false,"schema":{"type":"string","description":"Free-text match on the ticker symbol. Must not be greater than 50 characters.","example":"BTC","nullable":true}},{"in":"query","name":"min_volume","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only tickers with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"min_change","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or above this value.","example":-50,"nullable":true}},{"in":"query","name":"max_change","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"required":false,"schema":{"type":"number","description":"Only tickers with a 24h percentage change at or below this value.","example":50,"nullable":true}},{"in":"query","name":"sort","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","required":false,"schema":{"type":"string","description":"A single sort field (prefix with - for descending). Sortable: volume_usd, change_24h, price_usd, updated. Defaults to -volume_usd. Must not be greater than 100 characters.","example":"-volume_usd","nullable":true}}],"responses":[],"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/exchanges/{slug}/assets":{"get":{"summary":"Exchange coins","operationId":"exchangeCoins","description":"Coins listed on the exchange, returned in the same shape as `List coins` and\naccepting the same filters/sort.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":[],"tags":["Exchanges"]},"parameters":[{"in":"path","name":"slug","description":"The exchange slug.","example":"binance-exchange","required":true,"schema":{"type":"string"}}]},"/api/v1/wallets":{"get":{"summary":"List wallets","operationId":"listWallets","description":"Reviewed wallets with score, asset count, pros/cons counts, price model, status\nand release date. Paginated with Laravel's `links` + `meta` envelope, plus\n`meta.top_score`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"search","description":"Free-text match on wallet name. Must not be greater than 100 characters.","example":"ledger","required":false,"schema":{"type":"string","description":"Free-text match on wallet name. Must not be greater than 100 characters.","example":"ledger","nullable":true}},{"in":"query","name":"min_score","description":"Only wallets with a review score at or above this value. Must be at least 0.","example":50,"required":false,"schema":{"type":"integer","description":"Only wallets with a review score at or above this value. Must be at least 0.","example":50,"nullable":true}},{"in":"query","name":"max_score","description":"Only wallets with a review score at or below this value. Must be at least 0.","example":214,"required":false,"schema":{"type":"integer","description":"Only wallets with a review score at or below this value. Must be at least 0.","example":214,"nullable":true}},{"in":"query","name":"tags","description":"Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.","example":"12,34","required":false,"schema":{"type":"string","description":"Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.","example":"12,34","nullable":true}},{"in":"query","name":"ids","description":"Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"175,317","required":false,"schema":{"type":"string","description":"Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"175,317","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"frostsnap,coin98-fusion-card","required":false,"schema":{"type":"string","description":"Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"frostsnap,coin98-fusion-card","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.","example":"-score","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.","example":"-score","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":317,"slug":"frostsnap","name":"Frostsnap","score":125,"assets":1,"pros":18,"cons":0,"price_model":"paid","status":"Active","released_at":null,"logo":"https://bitculator.com/storage/media/logo/frostsnap.png"}],"links":{"first":"https://bitculator.com/api/v1/wallets?page=1","last":"https://bitculator.com/api/v1/wallets?page=7","prev":null,"next":"https://bitculator.com/api/v1/wallets?page=2"},"meta":{"current_page":1,"from":1,"last_page":7,"per_page":50,"to":50,"total":321,"top_score":214}},"properties":{"data":{"type":"array","example":[{"id":317,"slug":"frostsnap","name":"Frostsnap","score":125,"assets":1,"pros":18,"cons":0,"price_model":"paid","status":"Active","released_at":null,"logo":"https://bitculator.com/storage/media/logo/frostsnap.png"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":317},"slug":{"type":"string","example":"frostsnap"},"name":{"type":"string","example":"Frostsnap"},"score":{"type":"integer","example":125},"assets":{"type":"integer","example":1},"pros":{"type":"integer","example":18},"cons":{"type":"integer","example":0},"price_model":{"type":"string","example":"paid"},"status":{"type":"string","example":"Active"},"released_at":{"type":"string","example":null,"nullable":true},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/frostsnap.png"}}}},"links":{"type":"object","properties":{"first":{"type":"string","example":"https://bitculator.com/api/v1/wallets?page=1"},"last":{"type":"string","example":"https://bitculator.com/api/v1/wallets?page=7"},"prev":{"type":"string","example":null,"nullable":true},"next":{"type":"string","example":"https://bitculator.com/api/v1/wallets?page=2"}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"from":{"type":"integer","example":1},"last_page":{"type":"integer","example":7},"per_page":{"type":"integer","example":50},"to":{"type":"integer","example":50},"total":{"type":"integer","example":321},"top_score":{"type":"integer","example":214}}}}}}}}},"tags":["Wallets"]}},"/api/v1/wallets/timeline":{"get":{"summary":"Wallet release timeline","operationId":"walletReleaseTimeline","description":"The wallet list pinned to `released_at` descending (undated wallets last). Same\nrow shape and pagination envelope as `List wallets`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"search","description":"Free-text match on wallet name. Must not be greater than 100 characters.","example":"ledger","required":false,"schema":{"type":"string","description":"Free-text match on wallet name. Must not be greater than 100 characters.","example":"ledger","nullable":true}},{"in":"query","name":"min_score","description":"Only wallets with a review score at or above this value. Must be at least 0.","example":50,"required":false,"schema":{"type":"integer","description":"Only wallets with a review score at or above this value. Must be at least 0.","example":50,"nullable":true}},{"in":"query","name":"max_score","description":"Only wallets with a review score at or below this value. Must be at least 0.","example":214,"required":false,"schema":{"type":"integer","description":"Only wallets with a review score at or below this value. Must be at least 0.","example":214,"nullable":true}},{"in":"query","name":"tags","description":"Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.","example":"12,34","required":false,"schema":{"type":"string","description":"Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.","example":"12,34","nullable":true}},{"in":"query","name":"ids","description":"Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"175,317","required":false,"schema":{"type":"string","description":"Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.","example":"175,317","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"frostsnap,coin98-fusion-card","required":false,"schema":{"type":"string","description":"Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.","example":"frostsnap,coin98-fusion-card","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.","example":"-score","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.","example":"-score","nullable":true}}],"responses":[],"tags":["Wallets"]}},"/api/v1/wallets/compare":{"get":{"summary":"Compare wallets","operationId":"compareWallets","description":"Side-by-side comparison of 2–4 wallets with their full grouped tag taxonomy.\n`data[]` preserves the requested slug order so consumers can render columns\npositionally.","parameters":[{"in":"query","name":"slugs","description":"2–4 distinct wallet slugs, comma-separated.","example":"frostsnap,coin98-fusion-card","required":true,"schema":{"type":"string","description":"2–4 distinct wallet slugs, comma-separated.","example":"frostsnap,coin98-fusion-card"}}],"responses":[],"tags":["Wallets"]}},"/api/v1/wallets/{slug}":{"get":{"summary":"Get wallet detail","operationId":"getWalletDetail","description":"Full single-wallet profile including the grouped tag taxonomy: `categories` is a\nlist of `{group, tags[]}` where each tag has a slug, name and optional value.\n`meta.top_score` is the highest score across all wallets.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":317,"slug":"frostsnap","name":"Frostsnap","score":125,"assets":1,"pros":18,"cons":0,"price_model":"paid","status":"Active","released_at":null,"logo":"https://bitculator.com/storage/media/logo/frostsnap.png","website":"https://frostsnap.com","categories":[{"group":"type","tags":[{"slug":"hardware","name":"Hardware","value":null}]},{"group":"storage","tags":[{"slug":"cold","name":"Cold","value":null}]}]},"meta":{"top_score":214}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":317},"slug":{"type":"string","example":"frostsnap"},"name":{"type":"string","example":"Frostsnap"},"score":{"type":"integer","example":125},"assets":{"type":"integer","example":1},"pros":{"type":"integer","example":18},"cons":{"type":"integer","example":0},"price_model":{"type":"string","example":"paid"},"status":{"type":"string","example":"Active"},"released_at":{"type":"string","example":null,"nullable":true},"logo":{"type":"string","example":"https://bitculator.com/storage/media/logo/frostsnap.png"},"website":{"type":"string","example":"https://frostsnap.com"},"categories":{"type":"array","example":[{"group":"type","tags":[{"slug":"hardware","name":"Hardware","value":null}]},{"group":"storage","tags":[{"slug":"cold","name":"Cold","value":null}]}],"items":{"type":"object","properties":{"group":{"type":"string","example":"type"},"tags":{"type":"array","example":[{"slug":"hardware","name":"Hardware","value":null}],"items":{"type":"object","properties":{"slug":{"type":"string","example":"hardware"},"name":{"type":"string","example":"Hardware"},"value":{"type":"string","example":null,"nullable":true}}}}}}}}},"meta":{"type":"object","properties":{"top_score":{"type":"integer","example":214}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Wallet not found."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Wallet not found."}}}}}}}}},"tags":["Wallets"]},"parameters":[{"in":"path","name":"slug","description":"The wallet slug.","example":"frostsnap","required":true,"schema":{"type":"string"}}]},"/api/v1/wallets/{slug}/assets":{"get":{"summary":"Wallet supported coins","operationId":"walletSupportedCoins","description":"Coins the wallet supports, returned in the same shape as `List coins` and\naccepting the same filters/sort.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"type","description":"Restrict to a single asset type: coin or token.","example":"coin","required":false,"schema":{"type":"string","description":"Restrict to a single asset type: coin or token.","example":"coin","enum":["coin","token"],"nullable":true}},{"in":"query","name":"status","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","required":false,"schema":{"type":"string","description":"Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.","example":"active","enum":["active","delisted","untracked","progressing","awaiting","preparing"],"nullable":true}},{"in":"query","name":"search","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Free-text match on name or symbol. Must not be greater than 100 characters.","example":"bitcoin","nullable":true}},{"in":"query","name":"min_price","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"required":false,"schema":{"type":"number","description":"Only coins priced at or above this USD value. Must be at least 0.","example":0.5,"nullable":true}},{"in":"query","name":"max_price","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"required":false,"schema":{"type":"number","description":"Only coins priced at or below this USD value. Must be at least 0.","example":100000,"nullable":true}},{"in":"query","name":"min_marketcap","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_marketcap","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"required":false,"schema":{"type":"number","description":"Only coins with a USD marketcap at or below this value. Must be at least 0.","example":5000000000000,"nullable":true}},{"in":"query","name":"min_volume","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or above this value. Must be at least 0.","example":1000000,"nullable":true}},{"in":"query","name":"max_volume","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"required":false,"schema":{"type":"number","description":"Only coins with 24h USD volume at or below this value. Must be at least 0.","example":100000000000,"nullable":true}},{"in":"query","name":"ids","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","required":false,"schema":{"type":"string","description":"Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.","example":"38,39","nullable":true}},{"in":"query","name":"slugs","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","required":false,"schema":{"type":"string","description":"Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.","example":"bitcoin,ethereum","nullable":true}},{"in":"query","name":"symbols","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","required":false,"schema":{"type":"string","description":"Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.","example":"BTC,ETH","nullable":true}},{"in":"query","name":"sort","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","required":false,"schema":{"type":"string","description":"Comma-separated sort fields; prefix with - for descending. Sortable: marketcap, rank, price, volume_24h, change_24h, change_7d. Must not be greater than 100 characters.","example":"-marketcap","nullable":true}},{"in":"query","name":"interval","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","required":false,"schema":{"type":"string","description":"Movers window for /coins/gainers and /coins/losers only: 24h or 7d.","example":"24h","enum":["24h","7d"],"nullable":true}}],"responses":[],"tags":["Wallets"]},"parameters":[{"in":"path","name":"slug","description":"The wallet slug.","example":"frostsnap","required":true,"schema":{"type":"string"}}]},"/api/v1/global":{"get":{"summary":"Global market snapshot","operationId":"globalMarketSnapshot","description":"One-shot market overview: total marketcap and 24h volume, counts of\ncryptocurrencies / tokens / exchanges / pairs / markets, `dominance`\n(BTC & ETH share plus the rank-based `top3`), and the market `fear_greed`\nreading.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"total_marketcap":2037527560616,"total_volume_24h":83977305058,"total_cryptocurrencies":134,"total_tokens":50,"total_exchanges":10,"total_pairs":823,"total_markets":4172,"dominance":{"btc":62.07,"eth":9.97,"top3":[{"symbol":"BTC","domination":62.07},{"symbol":"ETH","domination":9.97},{"symbol":"USDT","domination":8.17}]},"fear_greed":{"score":15,"regime":"neutral"},"last_updated":"2026-07-03T10:16:06+00:00"}},"properties":{"data":{"type":"object","properties":{"total_marketcap":{"type":"integer","example":2037527560616},"total_volume_24h":{"type":"integer","example":83977305058},"total_cryptocurrencies":{"type":"integer","example":134},"total_tokens":{"type":"integer","example":50},"total_exchanges":{"type":"integer","example":10},"total_pairs":{"type":"integer","example":823},"total_markets":{"type":"integer","example":4172},"dominance":{"type":"object","properties":{"btc":{"type":"number","example":62.07},"eth":{"type":"number","example":9.97},"top3":{"type":"array","example":[{"symbol":"BTC","domination":62.07},{"symbol":"ETH","domination":9.97},{"symbol":"USDT","domination":8.17}],"items":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC"},"domination":{"type":"number","example":62.07}}}}}},"fear_greed":{"type":"object","properties":{"score":{"type":"integer","example":15},"regime":{"type":"string","example":"neutral"}}},"last_updated":{"type":"string","example":"2026-07-03T10:16:06+00:00"}}}}}}}}},"tags":["Global Market"]}},"/api/v1/global/heatmap":{"get":{"summary":"Market heatmap","operationId":"marketHeatmap","description":"Top-100 treemap rows plus framing stats (total marketcap/volume, dominance and\nthe market Fear & Greed score) — the API twin of the web heatmap.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","price":"109731.2","marketcap":2183456789012,"change_24h":1.24,"change_7d":-2.31,"logo":"https://bitculator.com/storage/media/assets/bitcoin-small.png"}],"meta":{"total_marketcap":3456789012345,"total_volume_24h":98765432109,"dominance":{"btc":63.2,"eth":9.1,"top3":74.6},"fear_greed":15}},"properties":{"data":{"type":"array","example":[{"slug":"bitcoin","name":"Bitcoin","symbol":"BTC","price":"109731.2","marketcap":2183456789012,"change_24h":1.24,"change_7d":-2.31,"logo":"https://bitculator.com/storage/media/assets/bitcoin-small.png"}],"items":{"type":"object","properties":{"slug":{"type":"string","example":"bitcoin"},"name":{"type":"string","example":"Bitcoin"},"symbol":{"type":"string","example":"BTC"},"price":{"type":"string","example":"109731.2"},"marketcap":{"type":"integer","example":2183456789012},"change_24h":{"type":"number","example":1.24},"change_7d":{"type":"number","example":-2.31},"logo":{"type":"string","example":"https://bitculator.com/storage/media/assets/bitcoin-small.png"}}}},"meta":{"type":"object","properties":{"total_marketcap":{"type":"integer","example":3456789012345},"total_volume_24h":{"type":"integer","example":98765432109},"dominance":{"type":"object","properties":{"btc":{"type":"number","example":63.2},"eth":{"type":"number","example":9.1},"top3":{"type":"number","example":74.6}}},"fear_greed":{"type":"integer","example":15}}}}}}}}},"tags":["Global Market"]}},"/api/v1/global/history/{metric}":{"get":{"summary":"Global marketcap / volume history","operationId":"globalMarketcapVolumeHistory","description":"Total-market time series for `marketcap` or `volume`. Granularity follows the\n`period`: 24h = half-hourly, 7d = hourly, 30d/all = daily (finer rollups are\npruned).","parameters":[{"in":"query","name":"period","description":"24h, 7d, 30d or all (default 24h).","example":"7d","required":false,"schema":{"type":"string","description":"24h, 7d, 30d or all (default 24h).","example":"7d","nullable":true}}],"responses":[],"tags":["Global Market"]},"parameters":[{"in":"path","name":"metric","description":"Which series: marketcap or volume.","example":"marketcap","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/votes":{"get":{"summary":"Community vote tallies","operationId":"communityVoteTallies","description":"The coin's bullish/bearish community tallies over the rolling 24h window.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"coin":"bitcoin","bullish":184,"bearish":42,"total":226}},"properties":{"data":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"bullish":{"type":"integer","example":184},"bearish":{"type":"integer","example":42},"total":{"type":"integer","example":226}}}}}}}}},"tags":["Sentiment"]},"post":{"summary":"Cast a sentiment vote","operationId":"castASentimentVote","description":"Casts the key owner's sentiment vote for a coin. One vote per key owner per coin\nper rolling 24h window — re-voting inside the window updates the existing vote.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"coin":"bitcoin","bullish":185,"bearish":42,"total":227,"your_vote":"bullish"}},"properties":{"data":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"bullish":{"type":"integer","example":185},"bearish":{"type":"integer","example":42},"total":{"type":"integer","example":227},"your_vote":{"type":"string","example":"bullish"}}}}}}}}},"tags":["Sentiment"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vote":{"type":"string","description":"Your sentiment: `bullish` or `bearish`.","example":"bullish"}},"required":["vote"]}}}}},"parameters":[{"in":"path","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/sentiment/fear-greed":{"get":{"summary":"Fear & Greed index","operationId":"fearGreedIndex","description":"The current Fear & Greed reading (a 15-minute snapshot — no history). Omit `coin`\nfor the market-wide index, or pass a coin slug for a per-coin reading. `intervals`\ncarries the 7d/30d sub-scores and their component breakdown.","parameters":[{"in":"query","name":"coin","description":"Coin slug for a per-coin reading; omit for the market index.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Coin slug for a per-coin reading; omit for the market index.","example":"bitcoin"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"scope":"market","score":15,"regime":"neutral","intervals":{"7d":{"score":15,"regime":"neutral","breakdown":{"volume":40,"breadth":1,"momentum":-8,"volatility":36},"score_normalized":15},"30d":{"score":18,"regime":"neutral","breakdown":{"volume":80,"breadth":1,"momentum":-10,"volatility":18},"score_normalized":18}}}},"properties":{"data":{"type":"object","properties":{"scope":{"type":"string","example":"market"},"score":{"type":"integer","example":15},"regime":{"type":"string","example":"neutral"},"intervals":{"type":"object","properties":{"7d":{"type":"object","properties":{"score":{"type":"integer","example":15},"regime":{"type":"string","example":"neutral"},"breakdown":{"type":"object","properties":{"volume":{"type":"integer","example":40},"breadth":{"type":"integer","example":1},"momentum":{"type":"integer","example":-8},"volatility":{"type":"integer","example":36}}},"score_normalized":{"type":"integer","example":15}}},"30d":{"type":"object","properties":{"score":{"type":"integer","example":18},"regime":{"type":"string","example":"neutral"},"breakdown":{"type":"object","properties":{"volume":{"type":"integer","example":80},"breadth":{"type":"integer","example":1},"momentum":{"type":"integer","example":-10},"volatility":{"type":"integer","example":18}}},"score_normalized":{"type":"integer","example":18}}}}}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"No fear & greed data for this scope."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"No fear & greed data for this scope."}}}}}}}}},"tags":["Sentiment"]}},"/api/v1/sentiment/bull-bear":{"get":{"summary":"Bull / Bear index","operationId":"bullBearIndex","description":"The current Bull/Bear reading (a 15-minute snapshot — no history). Omit `coin`\nfor the market-wide index, or pass a coin slug for a per-coin reading.","parameters":[{"in":"query","name":"coin","description":"Coin slug for a per-coin reading; omit for the market index.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Coin slug for a per-coin reading; omit for the market index.","example":"bitcoin"}}],"responses":[],"tags":["Sentiment"]}},"/api/v1/sentiment/altseason":{"get":{"summary":"Altseason index","operationId":"altseasonIndex","description":"The current altseason reading (count of coins beating BTC out of the top 100),\nwith optional daily `history`. Unlike Fear & Greed, altseason has full daily\nhistory — pass `days` to include it.","parameters":[{"in":"query","name":"days","description":"Days of daily history to include (1–365; 0/omit = current only).","example":30,"required":false,"schema":{"type":"integer","description":"Days of daily history to include (1–365; 0/omit = current only).","example":30,"nullable":true}}],"responses":[],"tags":["Sentiment"]}},"/api/v1/sentiment/indicators":{"get":{"summary":"Market indicator tally","operationId":"marketIndicatorTally","description":"The market-wide technical tally — 25 indicator categories rolled up, each with\nits current state, score and category data.","parameters":[],"responses":[],"tags":["Sentiment"]}},"/api/v1/coins/{slug}/indicators":{"get":{"summary":"Indicator snapshot","operationId":"indicatorSnapshot","description":"The multi-indicator snapshot — every indicator category's latest `state`\n(bullish/bearish/sheepish…), `score` and raw `data`, in one payload. Ideal\nfor a dashboard at-a-glance read; use the dedicated per-indicator endpoints\nbelow for full daily history.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"indicator":"OBV","state":"bearish","score":-1,"data":{"value":1755907904411,"window":21}},{"indicator":"macd","state":"bullish","score":1,"data":{"value":-2811.87686067,"signal":-3364.35539147,"histogram":552.4785308}}],"meta":{"coin":"bitcoin"}},"properties":{"data":{"type":"array","example":[{"indicator":"OBV","state":"bearish","score":-1,"data":{"value":1755907904411,"window":21}},{"indicator":"macd","state":"bullish","score":1,"data":{"value":-2811.87686067,"signal":-3364.35539147,"histogram":552.4785308}}],"items":{"type":"object","properties":{"indicator":{"type":"string","example":"OBV"},"state":{"type":"string","example":"bearish"},"score":{"type":"integer","example":-1},"data":{"type":"object","properties":{"value":{"type":"integer","example":1755907904411},"window":{"type":"integer","example":21}}}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"No indicator data for this coin yet."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"No indicator data for this coin yet."}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/rsi":{"get":{"summary":"RSI (Relative Strength Index)","operationId":"rSIRelativeStrengthIndex","description":"Daily Relative Strength Index — a momentum oscillator bounded 0–100 that\nmeasures the speed and magnitude of recent price moves. Above 70 is\nconventionally overbought, below 30 oversold. Windows: 7, 14, 21, 28 days\n(default 14) — the 21- and 28-day windows require the Starter plan or higher.\nYoung coins return leading warm-up `null`s.","parameters":[{"in":"query","name":"period","description":"Window length — one of 7, 14, 21, 28 (default 14).","example":14,"required":false,"schema":{"type":"integer","description":"Window length — one of 7, 14, 21, 28 (default 14).","example":14}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":42},{"date":"2026-06-15","value":46}],"meta":{"coin":"bitcoin","indicator":"rsi","period":14,"count":2}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":42},{"date":"2026-06-15","value":46}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"integer","example":42}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"rsi"},"period":{"type":"integer","example":14},"count":{"type":"integer","example":2}}}}}}}},"403":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"plan_required","message":"The 28-day rsi window requires the Starter plan or higher.","details":{"required_plan":"starter"}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"plan_required"},"message":{"type":"string","example":"The 28-day rsi window requires the Starter plan or higher."},"details":{"type":"object","properties":{"required_plan":{"type":"string","example":"starter"}}}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/stoch-rsi":{"get":{"summary":"Stochastic RSI","operationId":"stochasticRSI","description":"Daily Stochastic RSI — applies the stochastic oscillator to RSI itself,\ngiving a faster, more sensitive 0–100 momentum read with `%K` and `%D` lines\nthat cross to signal turns. Windows: 7, 14, 21, 28 days (default 14) — the\n21- and 28-day windows require the Starter plan or higher.","parameters":[{"in":"query","name":"period","description":"Window length — one of 7, 14, 21, 28 (default 14).","example":14,"required":false,"schema":{"type":"integer","description":"Window length — one of 7, 14, 21, 28 (default 14).","example":14}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","k":18.4,"d":22.1}],"meta":{"coin":"bitcoin","indicator":"stoch-rsi","period":14,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","k":18.4,"d":22.1}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"k":{"type":"number","example":18.4},"d":{"type":"number","example":22.1}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"stoch-rsi"},"period":{"type":"integer","example":14},"count":{"type":"integer","example":1}}}}}}}},"403":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"plan_required","message":"The 28-day stoch-rsi window requires the Starter plan or higher.","details":{"required_plan":"starter"}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"plan_required"},"message":{"type":"string","example":"The 28-day stoch-rsi window requires the Starter plan or higher."},"details":{"type":"object","properties":{"required_plan":{"type":"string","example":"starter"}}}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/sma":{"get":{"summary":"SMA (Simple Moving Average)","operationId":"sMASimpleMovingAverage","description":"Daily Simple Moving Average — the arithmetic mean of the closing price over\nthe window, the classic trend baseline traders read for support, resistance\nand golden/death crosses. Windows: 50, 100, 200 days (default 50). Values are\ndecimal strings on the price scale.","parameters":[{"in":"query","name":"period","description":"Window length — one of 50, 100, 200 (default 50).","example":50,"required":false,"schema":{"type":"integer","description":"Window length — one of 50, 100, 200 (default 50).","example":50}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":"63120.44821000"}],"meta":{"coin":"bitcoin","indicator":"sma","period":50,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":"63120.44821000"}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"string","example":"63120.44821000"}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"sma"},"period":{"type":"integer","example":50},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/cci":{"get":{"summary":"CCI (Commodity Channel Index)","operationId":"cCICommodityChannelIndex","description":"Daily Commodity Channel Index — measures how far price has deviated from its\nstatistical mean; readings beyond ±100 flag strong trends or potential\nreversals. Windows: 20, 50, 100 days (default 20).","parameters":[{"in":"query","name":"period","description":"Window length — one of 20, 50, 100 (default 20).","example":20,"required":false,"schema":{"type":"integer","description":"Window length — one of 20, 50, 100 (default 20).","example":20}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":-83.5}],"meta":{"coin":"bitcoin","indicator":"cci","period":20,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":-83.5}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":-83.5}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"cci"},"period":{"type":"integer","example":20},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/mfi":{"get":{"summary":"MFI (Money Flow Index)","operationId":"mFIMoneyFlowIndex","description":"Daily Money Flow Index — a volume-weighted RSI (0–100) that factors trading\nvolume into momentum, often called \"volume RSI\"; above 80 overbought, below\n20 oversold. Windows: 7, 14, 28 days (default 14).","parameters":[{"in":"query","name":"period","description":"Window length — one of 7, 14, 28 (default 14).","example":14,"required":false,"schema":{"type":"integer","description":"Window length — one of 7, 14, 28 (default 14).","example":14}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":57.2}],"meta":{"coin":"bitcoin","indicator":"mfi","period":14,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":57.2}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":57.2}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"mfi"},"period":{"type":"integer","example":14},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/williams-r":{"get":{"summary":"Williams %R","operationId":"williamsR","description":"Daily Williams %R — a momentum oscillator bounded −100–0 that maps where the\nclose sits within the recent high-low range; above −20 overbought, below −80\noversold. Windows: 14, 20, 50 days (default 14).","parameters":[{"in":"query","name":"period","description":"Window length — one of 14, 20, 50 (default 14).","example":14,"required":false,"schema":{"type":"integer","description":"Window length — one of 14, 20, 50 (default 14).","example":14}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":-72.4}],"meta":{"coin":"bitcoin","indicator":"williams-r","period":14,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":-72.4}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":-72.4}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"williams-r"},"period":{"type":"integer","example":14},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/price-volatility":{"get":{"summary":"Price volatility","operationId":"priceVolatility","description":"Daily price-volatility index — the dispersion of daily returns over the\nwindow, a normalized read on how choppy price action has been. Windows: 7,\n14, 30 days (default 7) — the 30-day window requires the Starter plan or\nhigher.","parameters":[{"in":"query","name":"period","description":"Window length — one of 7, 14, 30 (default 7).","example":7,"required":false,"schema":{"type":"integer","description":"Window length — one of 7, 14, 30 (default 7).","example":7}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":3.18}],"meta":{"coin":"bitcoin","indicator":"price-volatility","period":7,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":3.18}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":3.18}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"price-volatility"},"period":{"type":"integer","example":7},"count":{"type":"integer","example":1}}}}}}}},"403":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"plan_required","message":"The 30-day price-volatility window requires the Starter plan or higher.","details":{"required_plan":"starter"}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"plan_required"},"message":{"type":"string","example":"The 30-day price-volatility window requires the Starter plan or higher."},"details":{"type":"object","properties":{"required_plan":{"type":"string","example":"starter"}}}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/volume-volatility":{"get":{"summary":"Volume volatility","operationId":"volumeVolatility","description":"Daily volume-volatility index — the dispersion of daily trading volume over\nthe window, a read on how erratic participation has been. Windows: 7, 14, 30\ndays (default 7) — the 30-day window requires the Starter plan or higher.","parameters":[{"in":"query","name":"period","description":"Window length — one of 7, 14, 30 (default 7).","example":7,"required":false,"schema":{"type":"integer","description":"Window length — one of 7, 14, 30 (default 7).","example":7}},{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":12.6}],"meta":{"coin":"bitcoin","indicator":"volume-volatility","period":7,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":12.6}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":12.6}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"volume-volatility"},"period":{"type":"integer","example":7},"count":{"type":"integer","example":1}}}}}}}},"403":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"plan_required","message":"The 30-day volume-volatility window requires the Starter plan or higher.","details":{"required_plan":"starter"}}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"plan_required"},"message":{"type":"string","example":"The 30-day volume-volatility window requires the Starter plan or higher."},"details":{"type":"object","properties":{"required_plan":{"type":"string","example":"starter"}}}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/macd":{"get":{"summary":"MACD","operationId":"mACD","description":"Daily MACD (Moving Average Convergence Divergence) — the 12/26 EMA spread with\na 9-period signal line and histogram, a staple trend-and-momentum indicator\nread for signal-line crossovers and zero-line shifts. Returns `macd`, `signal`\nand `histogram` as decimal strings. No window parameter.","parameters":[{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","macd":"-2811.87686067","signal":"-3364.35539147","histogram":"552.47853080"}],"meta":{"coin":"bitcoin","indicator":"macd","period":null,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","macd":"-2811.87686067","signal":"-3364.35539147","histogram":"552.47853080"}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"macd":{"type":"string","example":"-2811.87686067"},"signal":{"type":"string","example":"-3364.35539147"},"histogram":{"type":"string","example":"552.47853080"}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"macd"},"period":{"type":"string","example":null,"nullable":true},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/obv":{"get":{"summary":"OBV (On-Balance Volume)","operationId":"oBVOnBalanceVolume","description":"Daily On-Balance Volume — a cumulative volume line that adds volume on up days\nand subtracts it on down days, tracking net buying vs. selling pressure and\nconfirming (or diverging from) price trends. Single decimal-string series.","parameters":[{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":"1755907904411"}],"meta":{"coin":"bitcoin","indicator":"obv","period":null,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":"1755907904411"}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"string","example":"1755907904411"}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"obv"},"period":{"type":"string","example":null,"nullable":true},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/adx":{"get":{"summary":"ADX (Average Directional Index)","operationId":"aDXAverageDirectionalIndex","description":"Daily ADX with +DI/−DI — measures trend *strength* (`adx`) and *direction*\n(the `plus_di`/`minus_di` directional indicators). ADX above 25 signals a\nstrong trend regardless of direction; the DI crossover signals which way.\nSingle series, no window parameter.","parameters":[{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","adx":27.3,"plus_di":22.1,"minus_di":15.8}],"meta":{"coin":"bitcoin","indicator":"adx","period":null,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","adx":27.3,"plus_di":22.1,"minus_di":15.8}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"adx":{"type":"number","example":27.3},"plus_di":{"type":"number","example":22.1},"minus_di":{"type":"number","example":15.8}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"adx"},"period":{"type":"string","example":null,"nullable":true},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/vwap":{"get":{"summary":"VWAP (Volume-Weighted Average Price)","operationId":"vWAPVolumeWeightedAveragePrice","description":"Daily VWAP — the average price weighted by volume, a core fair-value and\nexecution reference; price above VWAP reads bullish, below bearish. Single\ndecimal-string series, no window parameter.","parameters":[{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":"62880.10000000"}],"meta":{"coin":"bitcoin","indicator":"vwap","period":null,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":"62880.10000000"}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"string","example":"62880.10000000"}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"vwap"},"period":{"type":"string","example":null,"nullable":true},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/indicators/cmf":{"get":{"summary":"CMF (Chaikin Money Flow)","operationId":"cMFChaikinMoneyFlow","description":"Daily Chaikin Money Flow — sums money-flow volume over the period to gauge\naccumulation vs. distribution; positive reads as net buying pressure, negative\nas selling. Bounded around ±1. Single series, no window parameter.","parameters":[{"in":"query","name":"start","description":"ISO date lower bound.","example":"2026-06-01","required":false,"schema":{"type":"string","description":"ISO date lower bound.","example":"2026-06-01"}},{"in":"query","name":"end","description":"ISO date upper bound.","example":"2026-06-30","required":false,"schema":{"type":"string","description":"ISO date upper bound.","example":"2026-06-30"}},{"in":"query","name":"limit","description":"Max rows (1–1000, default 365).","example":30,"required":false,"schema":{"type":"integer","description":"Max rows (1–1000, default 365).","example":30}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-06-14","value":0.14}],"meta":{"coin":"bitcoin","indicator":"cmf","period":null,"count":1}},"properties":{"data":{"type":"array","example":[{"date":"2026-06-14","value":0.14}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-06-14"},"value":{"type":"number","example":0.14}}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"indicator":{"type":"string","example":"cmf"},"period":{"type":"string","example":null,"nullable":true},"count":{"type":"integer","example":1}}}}}}}}},"tags":["Indicators"]},"parameters":[{"in":"path","name":"slug","description":"The coin slug.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/liquidations":{"get":{"summary":"Liquidation feed","operationId":"liquidationFeed","description":"The raw liquidation feed (~last 48h, then pruned), newest first. Source coverage\nis currently OKX swap markets. Prices are decimal strings. `meta` carries the\npagination fields plus a `retention` and `note`.","parameters":[{"in":"query","name":"page","description":"Page number (1-based). Must be at least 1.","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based). Must be at least 1.","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"required":false,"schema":{"type":"integer","description":"Rows per page. The cap is plan-based (Free 100, Starter/Pro 250); exceeding it returns 422 rather than clamping. Must be at least 1. Must not be greater than 100.","example":50,"nullable":true}},{"in":"query","name":"exchange","description":"Restrict to a single exchange by slug. Source coverage is currently OKX swap markets. Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"okx","required":false,"schema":{"type":"string","description":"Restrict to a single exchange by slug. Source coverage is currently OKX swap markets. Must match the regex /^[a-z0-9\\-]{1,120}$/.","example":"okx","nullable":true}},{"in":"query","name":"instrument","description":"Instrument type: future, option, swap, spot or margin.","example":"swap","required":false,"schema":{"type":"string","description":"Instrument type: future, option, swap, spot or margin.","example":"swap","enum":["future","option","swap","spot","margin"],"nullable":true}},{"in":"query","name":"position","description":"Liquidated position side: long or short.","example":"short","required":false,"schema":{"type":"string","description":"Liquidated position side: long or short.","example":"short","enum":["long","short"],"nullable":true}},{"in":"query","name":"order","description":"Fill side that triggered the liquidation: buy or sell.","example":"buy","required":false,"schema":{"type":"string","description":"Fill side that triggered the liquidation: buy or sell.","example":"buy","enum":["buy","sell"],"nullable":true}},{"in":"query","name":"symbol","description":"Prefix match on the venue instId (e.g. BTC matches BTC-USDT-SWAP). Must match the regex /^[A-Za-z0-9$\\.\\-]{1,25}$/.","example":"BTC","required":false,"schema":{"type":"string","description":"Prefix match on the venue instId (e.g. BTC matches BTC-USDT-SWAP). Must match the regex /^[A-Za-z0-9$\\.\\-]{1,25}$/.","example":"BTC","nullable":true}},{"in":"query","name":"min_usd","description":"Only liquidations with a USD value at or above this threshold. Must be at least 0.","example":1000,"required":false,"schema":{"type":"number","description":"Only liquidations with a USD value at or above this threshold. Must be at least 0.","example":1000,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"symbol":"NEAR-USDT-SWAP","exchange":{"id":20,"slug":"okx","name":"OKX"},"instrument":"swap","position":"short","order":"buy","price":"2.245","value_usd":5727.73,"quantity":259.1,"liquidated_at":"2026-06-21T07:39:41+00:00"}],"meta":{"current_page":1,"per_page":50,"total":4681,"last_page":94,"retention":"~48 hours (raw feed is pruned)","note":"Source coverage: OKX swap markets."}},"properties":{"data":{"type":"array","example":[{"symbol":"NEAR-USDT-SWAP","exchange":{"id":20,"slug":"okx","name":"OKX"},"instrument":"swap","position":"short","order":"buy","price":"2.245","value_usd":5727.73,"quantity":259.1,"liquidated_at":"2026-06-21T07:39:41+00:00"}],"items":{"type":"object","properties":{"symbol":{"type":"string","example":"NEAR-USDT-SWAP"},"exchange":{"type":"object","properties":{"id":{"type":"integer","example":20},"slug":{"type":"string","example":"okx"},"name":{"type":"string","example":"OKX"}}},"instrument":{"type":"string","example":"swap"},"position":{"type":"string","example":"short"},"order":{"type":"string","example":"buy"},"price":{"type":"string","example":"2.245"},"value_usd":{"type":"number","example":5727.73},"quantity":{"type":"number","example":259.1},"liquidated_at":{"type":"string","example":"2026-06-21T07:39:41+00:00"}}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"per_page":{"type":"integer","example":50},"total":{"type":"integer","example":4681},"last_page":{"type":"integer","example":94},"retention":{"type":"string","example":"~48 hours (raw feed is pruned)"},"note":{"type":"string","example":"Source coverage: OKX swap markets."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/liquidations/hourly":{"get":{"summary":"Hourly liquidations","operationId":"hourlyLiquidations","description":"Hourly long/short USD totals over the raw feed. Because the raw feed is pruned at\n~48h, `hours` is capped at 48. Source coverage is currently OKX swap markets.","parameters":[{"in":"query","name":"hours","description":"Look-back window in hours (1–48, default 24).","example":24,"required":false,"schema":{"type":"integer","description":"Look-back window in hours (1–48, default 24).","example":24,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"hour":"2026-07-03T08:00:00+00:00","liquidations":112,"total_usd":1834567.21,"long_usd":1034567.11,"short_usd":800000.1}],"meta":{"hours":24,"note":"Source coverage: OKX swap markets."}},"properties":{"data":{"type":"array","example":[{"hour":"2026-07-03T08:00:00+00:00","liquidations":112,"total_usd":1834567.21,"long_usd":1034567.11,"short_usd":800000.1}],"items":{"type":"object","properties":{"hour":{"type":"string","example":"2026-07-03T08:00:00+00:00"},"liquidations":{"type":"integer","example":112},"total_usd":{"type":"number","example":1834567.21},"long_usd":{"type":"number","example":1034567.11},"short_usd":{"type":"number","example":800000.1}}}},"meta":{"type":"object","properties":{"hours":{"type":"integer","example":24},"note":{"type":"string","example":"Source coverage: OKX swap markets."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/liquidations/daily":{"get":{"summary":"Daily liquidations","operationId":"dailyLiquidations","description":"Daily aggregates (kept forever), summed across exchanges/instruments per day —\ntotal/long/short USD plus long/short position counts. Today's row is partial and\nupdates every ~15 minutes. Source coverage is currently OKX swap markets.","parameters":[{"in":"query","name":"days","description":"Number of calendar days incl. today (1–365, default 30).","example":30,"required":false,"schema":{"type":"integer","description":"Number of calendar days incl. today (1–365, default 30).","example":30,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-07-02","total_usd":27888888.76,"long_usd":18345672.1,"short_usd":9543216.66,"longs":4231,"shorts":2614}],"meta":{"days":30,"note":"Source coverage: OKX swap markets."}},"properties":{"data":{"type":"array","example":[{"date":"2026-07-02","total_usd":27888888.76,"long_usd":18345672.1,"short_usd":9543216.66,"longs":4231,"shorts":2614}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-07-02"},"total_usd":{"type":"number","example":27888888.76},"long_usd":{"type":"number","example":18345672.1},"short_usd":{"type":"number","example":9543216.66},"longs":{"type":"integer","example":4231},"shorts":{"type":"integer","example":2614}}}},"meta":{"type":"object","properties":{"days":{"type":"integer","example":30},"note":{"type":"string","example":"Source coverage: OKX swap markets."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/liquidations/summary":{"get":{"summary":"Today's liquidation summary","operationId":"todaysLiquidationSummary","description":"Today so far — total/long/short USD, position counts and long-vs-short\n`dominance`. Figures are partial and update every ~15 minutes; `data` is null\nuntil the first liquidation of the day is recorded. Source coverage is currently\nOKX swap markets.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"date":"2026-07-03","total_usd":12345678.9,"long_usd":8345678.9,"short_usd":4000000,"longs":1834,"shorts":961,"dominance":{"long":67.6,"short":32.4}},"meta":{"note":"Source coverage: OKX swap markets. Today's figures are partial and update every ~15 minutes."}},"properties":{"data":{"type":"object","properties":{"date":{"type":"string","example":"2026-07-03"},"total_usd":{"type":"number","example":12345678.9},"long_usd":{"type":"number","example":8345678.9},"short_usd":{"type":"integer","example":4000000},"longs":{"type":"integer","example":1834},"shorts":{"type":"integer","example":961},"dominance":{"type":"object","properties":{"long":{"type":"number","example":67.6},"short":{"type":"number","example":32.4}}}}},"meta":{"type":"object","properties":{"note":{"type":"string","example":"Source coverage: OKX swap markets. Today's figures are partial and update every ~15 minutes."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/liquidations/netflow":{"get":{"summary":"Liquidation netflow","operationId":"liquidationNetflow","description":"Long-vs-short liquidation USD flow per day over the window. Source coverage is\ncurrently OKX swap markets.","parameters":[{"in":"query","name":"days","description":"Number of calendar days incl. today (1–90, default 30).","example":30,"required":false,"schema":{"type":"integer","description":"Number of calendar days incl. today (1–90, default 30).","example":30,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"date":"2026-07-02","long":1834567.21,"short":954321.55,"total":2788888.76,"longs":420,"shorts":261}],"meta":{"days":30,"note":"Source coverage: OKX swap markets."}},"properties":{"data":{"type":"array","example":[{"date":"2026-07-02","long":1834567.21,"short":954321.55,"total":2788888.76,"longs":420,"shorts":261}],"items":{"type":"object","properties":{"date":{"type":"string","example":"2026-07-02"},"long":{"type":"number","example":1834567.21},"short":{"type":"number","example":954321.55},"total":{"type":"number","example":2788888.76},"longs":{"type":"integer","example":420},"shorts":{"type":"integer","example":261}}}},"meta":{"type":"object","properties":{"days":{"type":"integer","example":30},"note":{"type":"string","example":"Source coverage: OKX swap markets."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/liquidations/coins":{"get":{"summary":"Top liquidated coins","operationId":"topLiquidatedCoins","description":"Top coins by liquidation volume over the recent window, with the long/short USD\nsplit per coin. Source coverage is currently OKX swap markets.","parameters":[{"in":"query","name":"hours","description":"Look-back window in hours (1–48, default 24).","example":24,"required":false,"schema":{"type":"integer","description":"Look-back window in hours (1–48, default 24).","example":24,"nullable":true}},{"in":"query","name":"limit","description":"Number of coins to return (1–20, default 8).","example":8,"required":false,"schema":{"type":"integer","description":"Number of coins to return (1–20, default 8).","example":8,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"symbol":"BTC","name":"Bitcoin","slug":"bitcoin","logo":"https://bitculator.com/storage/media/assets/bitcoin-small.png","long":734567.21,"short":954321.55,"total":1688888.76}],"meta":{"hours":24,"note":"Source coverage: OKX swap markets."}},"properties":{"data":{"type":"array","example":[{"symbol":"BTC","name":"Bitcoin","slug":"bitcoin","logo":"https://bitculator.com/storage/media/assets/bitcoin-small.png","long":734567.21,"short":954321.55,"total":1688888.76}],"items":{"type":"object","properties":{"symbol":{"type":"string","example":"BTC"},"name":{"type":"string","example":"Bitcoin"},"slug":{"type":"string","example":"bitcoin"},"logo":{"type":"string","example":"https://bitculator.com/storage/media/assets/bitcoin-small.png"},"long":{"type":"number","example":734567.21},"short":{"type":"number","example":954321.55},"total":{"type":"number","example":1688888.76}}}},"meta":{"type":"object","properties":{"hours":{"type":"integer","example":24},"note":{"type":"string","example":"Source coverage: OKX swap markets."}}}}}}}}},"tags":["Liquidations"]}},"/api/v1/convert":{"get":{"summary":"Convert between assets","operationId":"convertBetweenAssets","description":"Server-side conversion between any two active assets (crypto AND fiat). `to`\naccepts a CSV for multi-target conversion; reversing is just swapping `from`/`to`.\nConversion is linear, so `value = unit_rate * amount`. Fiat FX rates refresh\n~twice daily; crypto rates ~every minute.","parameters":[{"in":"query","name":"from","description":"Source asset slug.","example":"bitcoin","required":true,"schema":{"type":"string","description":"Source asset slug.","example":"bitcoin"}},{"in":"query","name":"to","description":"Target asset slug(s), comma-separated (up to 10).","example":"ethereum","required":true,"schema":{"type":"string","description":"Target asset slug(s), comma-separated (up to 10).","example":"ethereum"}},{"in":"query","name":"amount","description":"Amount of the source asset to convert (default 1).","example":2.5,"required":false,"schema":{"type":"number","description":"Amount of the source asset to convert (default 1).","example":2.5,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"from":{"slug":"bitcoin","symbol":"BTC"},"amount":1,"results":[{"slug":"ethereum","symbol":"ETH","value":"37.980395960595"}]}},"properties":{"data":{"type":"object","properties":{"from":{"type":"object","properties":{"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"}}},"amount":{"type":"integer","example":1},"results":{"type":"array","example":[{"slug":"ethereum","symbol":"ETH","value":"37.980395960595"}],"items":{"type":"object","properties":{"slug":{"type":"string","example":"ethereum"},"symbol":{"type":"string","example":"ETH"},"value":{"type":"string","example":"37.980395960595"}}}}}}}}}}},"404":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"error":{"code":"not_found","message":"Unknown currency: dogecoinx."}},"properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"not_found"},"message":{"type":"string","example":"Unknown currency: dogecoinx."}}}}}}}}},"tags":["Conversion"]}},"/api/v1/fiats":{"get":{"summary":"List fiat currencies","operationId":"listFiatCurrencies","description":"The active fiat currencies with their USD FX rates: `rate_per_usd` (units per\nUSD) and its inverse `usd_value`. Fiat FX rates refresh ~twice daily.","parameters":[],"responses":[],"tags":["Conversion"]}},"/api/v1/rates":{"get":{"summary":"List conversion rates","operationId":"listConversionRates","description":"The vs-currencies usable as conversion legs — the top fiats, coins and tokens —\neach with a normalized `usd_value` (USD per one unit). Coin/token values refresh\n~every minute; the slow fiat rates are cached separately (~twice daily).","parameters":[],"responses":[],"tags":["Conversion"]}},"/api/v1/calculators/dca":{"get":{"summary":"DCA calculator","operationId":"dCACalculator","description":"Dollar-cost averaging backtest over the coin's real daily price history: one buy\nof `amount` per `interval` between `start` and `end`. Pass `series=true` to\ninclude the full per-purchase series.","parameters":[{"in":"query","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string","description":"The coin's slug identifier.","example":"bitcoin"}},{"in":"query","name":"amount","description":"USD spent per purchase (0.01–1,000,000,000).","example":100,"required":true,"schema":{"type":"number","description":"USD spent per purchase (0.01–1,000,000,000).","example":100}},{"in":"query","name":"interval","description":"Purchase cadence: `daily`, `weekly`, `monthly`, `quarterly` or `yearly`.","example":"weekly","required":true,"schema":{"type":"string","description":"Purchase cadence: `daily`, `weekly`, `monthly`, `quarterly` or `yearly`.","example":"weekly"}},{"in":"query","name":"start","description":"date First purchase date (after 2008-12-31).","example":"2024-01-01","required":true,"schema":{"type":"string","description":"date First purchase date (after 2008-12-31).","example":"2024-01-01"}},{"in":"query","name":"end","description":"date Last purchase date (defaults to today).","example":"2025-01-01","required":false,"schema":{"type":"string","description":"date Last purchase date (defaults to today).","example":"2025-01-01","nullable":true}},{"in":"query","name":"series","description":"Include the per-purchase series in the payload.","example":false,"required":false,"schema":{"type":"boolean","description":"Include the per-purchase series in the payload.","example":false,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"summary":{"purchases":53,"invested":5300,"accumulated":0.0754210998,"final_value":7098.9,"profit":1798.9,"roi":33.94},"series":null},"meta":{"coin":"bitcoin","interval":"weekly","start":"2024-01-01","end":"2025-01-01","amount_per_buy":100,"currency":"USD"}},"properties":{"data":{"type":"object","properties":{"summary":{"type":"object","properties":{"purchases":{"type":"integer","example":53},"invested":{"type":"integer","example":5300},"accumulated":{"type":"number","example":0.0754210998},"final_value":{"type":"number","example":7098.9},"profit":{"type":"number","example":1798.9},"roi":{"type":"number","example":33.94}}},"series":{"type":"string","example":null,"nullable":true}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"interval":{"type":"string","example":"weekly"},"start":{"type":"string","example":"2024-01-01"},"end":{"type":"string","example":"2025-01-01"},"amount_per_buy":{"type":"integer","example":100},"currency":{"type":"string","example":"USD"}}}}}}}}},"tags":["Calculators"]}},"/api/v1/calculators/profit-loss":{"get":{"summary":"Profit / loss calculator","operationId":"profitLossCalculator","description":"What a buy-then-sell between two historical dates returned, using the coin's real\nprices on those dates. Fees are flat USD amounts, not percentages.","parameters":[{"in":"query","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string","description":"The coin's slug identifier.","example":"bitcoin"}},{"in":"query","name":"amount","description":"USD invested at `buy_date` (0.01–1,000,000,000).","example":1000,"required":true,"schema":{"type":"number","description":"USD invested at `buy_date` (0.01–1,000,000,000).","example":1000}},{"in":"query","name":"buy_date","description":"date Purchase date.","example":"2023-01-01","required":true,"schema":{"type":"string","description":"date Purchase date.","example":"2023-01-01"}},{"in":"query","name":"sell_date","description":"date Sale date (on/after `buy_date`).","example":"2025-01-01","required":true,"schema":{"type":"string","description":"date Sale date (on/after `buy_date`).","example":"2025-01-01"}},{"in":"query","name":"buy_fee","description":"Flat purchase fee in USD (default 0).","example":10,"required":false,"schema":{"type":"number","description":"Flat purchase fee in USD (default 0).","example":10,"nullable":true}},{"in":"query","name":"sell_fee","description":"Flat sale fee in USD (default 0).","example":10,"required":false,"schema":{"type":"number","description":"Flat sale fee in USD (default 0).","example":10,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"buy_price":"16625.08","sell_price":"93429.2","quantity":0.0595486254,"investment_worth":5563.58,"total_fees":20,"profit":4553.58,"roi":455.36},"meta":{"coin":"bitcoin","amount":1000,"buy_date":"2023-01-01","sell_date":"2025-01-01","buy_fee":10,"sell_fee":10,"currency":"USD"}},"properties":{"data":{"type":"object","properties":{"buy_price":{"type":"string","example":"16625.08"},"sell_price":{"type":"string","example":"93429.2"},"quantity":{"type":"number","example":0.0595486254},"investment_worth":{"type":"number","example":5563.58},"total_fees":{"type":"integer","example":20},"profit":{"type":"number","example":4553.58},"roi":{"type":"number","example":455.36}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"amount":{"type":"integer","example":1000},"buy_date":{"type":"string","example":"2023-01-01"},"sell_date":{"type":"string","example":"2025-01-01"},"buy_fee":{"type":"integer","example":10},"sell_fee":{"type":"integer","example":10},"currency":{"type":"string","example":"USD"}}}}}}}}},"tags":["Calculators"]}},"/api/v1/calculators/compound-interest":{"get":{"summary":"Compound interest calculator","operationId":"compoundInterestCalculator","description":"Pure math — no market data. Note that the rate applies PER COMPOUNDING PERIOD\n(the web calculator's convention), not per year.","parameters":[{"in":"query","name":"principal","description":"Starting balance in USD.","example":10000,"required":true,"schema":{"type":"number","description":"Starting balance in USD.","example":10000}},{"in":"query","name":"rate","description":"Interest rate in % per compounding period.","example":1,"required":true,"schema":{"type":"number","description":"Interest rate in % per compounding period.","example":1}},{"in":"query","name":"duration","description":"Length of the projection (years are capped at 50).","example":5,"required":true,"schema":{"type":"integer","description":"Length of the projection (years are capped at 50).","example":5}},{"in":"query","name":"duration_unit","description":"`years` (default) or `months`.","example":"years","required":false,"schema":{"type":"string","description":"`years` (default) or `months`.","example":"years","nullable":true}},{"in":"query","name":"compound_frequency","description":"`daily`, `weekly`, `monthly` (default), `quarterly` or `annually`.","example":"monthly","required":false,"schema":{"type":"string","description":"`daily`, `weekly`, `monthly` (default), `quarterly` or `annually`.","example":"monthly","nullable":true}},{"in":"query","name":"contribution","description":"Recurring deposit in USD (default 0).","example":100,"required":false,"schema":{"type":"number","description":"Recurring deposit in USD (default 0).","example":100,"nullable":true}},{"in":"query","name":"contribution_frequency","description":"`daily`, `weekly`, `monthly` (default), `quarterly` or `annually`.","example":"monthly","required":false,"schema":{"type":"string","description":"`daily`, `weekly`, `monthly` (default), `quarterly` or `annually`.","example":"monthly","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"final_balance":24471.19,"total_contributions":16000,"total_interest":8471.19,"roi":52.94},"meta":{"note":"The rate applies per compounding period (web calculator parity), not per year."}},"properties":{"data":{"type":"object","properties":{"final_balance":{"type":"number","example":24471.19},"total_contributions":{"type":"integer","example":16000},"total_interest":{"type":"number","example":8471.19},"roi":{"type":"number","example":52.94}}},"meta":{"type":"object","properties":{"note":{"type":"string","example":"The rate applies per compounding period (web calculator parity), not per year."}}}}}}}}},"tags":["Calculators"]}},"/api/v1/calculators/loan":{"get":{"summary":"Loan vs sell calculator","operationId":"loanVsSellCalculator","description":"Borrow against crypto vs sell it — compares both scenarios using the coin's\nCURRENT price. Informational projection, not financial advice.","parameters":[{"in":"query","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string","description":"The coin's slug identifier.","example":"bitcoin"}},{"in":"query","name":"crypto_amount","description":"How much of the coin you hold.","example":2,"required":true,"schema":{"type":"number","description":"How much of the coin you hold.","example":2}},{"in":"query","name":"needed_cash","description":"USD you need to free up.","example":50000,"required":true,"schema":{"type":"number","description":"USD you need to free up.","example":50000}},{"in":"query","name":"term_months","description":"Loan term in months (default 36).","example":36,"required":false,"schema":{"type":"integer","description":"Loan term in months (default 36).","example":36,"nullable":true}},{"in":"query","name":"interest_rate","description":"Loan APR in % (default 10).","example":10,"required":false,"schema":{"type":"number","description":"Loan APR in % (default 10).","example":10,"nullable":true}},{"in":"query","name":"ltv","description":"Loan-to-value ratio in % (default 50).","example":50,"required":false,"schema":{"type":"number","description":"Loan-to-value ratio in % (default 50).","example":50,"nullable":true}},{"in":"query","name":"expected_growth","description":"Expected coin price growth over the term in % (default 25).","example":25,"required":false,"schema":{"type":"number","description":"Expected coin price growth over the term in % (default 25).","example":25,"nullable":true}},{"in":"query","name":"tax_rate","description":"Capital-gains tax in % applied to the sale (default 25).","example":25,"required":false,"schema":{"type":"number","description":"Capital-gains tax in % applied to the sale (default 25).","example":25,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"current_price":"109731.2","collateral_value":219462.4,"max_loan":109731.2,"loan_possible":true,"loan_scenario":{"monthly_payment":1613.4,"total_payback":58082.4,"total_interest":8082.4,"net_value":216296.72},"sell_scenario":{"crypto_sold":0.4556647344,"capital_gains_tax":12500,"net_value":230378.86},"better_scenario":"sell","opportunity_cost":14082.14,"break_even_growth":31.42,"risk_level":"medium"},"meta":{"coin":"bitcoin","currency":"USD","note":"Informational projection — the tax model taxes the full proceeds (no cost basis), matching the web calculator."}},"properties":{"data":{"type":"object","properties":{"current_price":{"type":"string","example":"109731.2"},"collateral_value":{"type":"number","example":219462.4},"max_loan":{"type":"number","example":109731.2},"loan_possible":{"type":"boolean","example":true},"loan_scenario":{"type":"object","properties":{"monthly_payment":{"type":"number","example":1613.4},"total_payback":{"type":"number","example":58082.4},"total_interest":{"type":"number","example":8082.4},"net_value":{"type":"number","example":216296.72}}},"sell_scenario":{"type":"object","properties":{"crypto_sold":{"type":"number","example":0.4556647344},"capital_gains_tax":{"type":"integer","example":12500},"net_value":{"type":"number","example":230378.86}}},"better_scenario":{"type":"string","example":"sell"},"opportunity_cost":{"type":"number","example":14082.14},"break_even_growth":{"type":"number","example":31.42},"risk_level":{"type":"string","example":"medium"}}},"meta":{"type":"object","properties":{"coin":{"type":"string","example":"bitcoin"},"currency":{"type":"string","example":"USD"},"note":{"type":"string","example":"Informational projection — the tax model taxes the full proceeds (no cost basis), matching the web calculator."}}}}}}}}},"tags":["Calculators"]}},"/api/v1/calculators/staking":{"get":{"summary":"Staking rewards calculator","operationId":"stakingRewardsCalculator","description":"Pure math — staking rewards with optional compounding and a validator\ncommission. No market data is read.","parameters":[{"in":"query","name":"amount","description":"Amount staked, in the staked asset's units.","example":1000,"required":true,"schema":{"type":"number","description":"Amount staked, in the staked asset's units.","example":1000}},{"in":"query","name":"period","description":"Length of the staking period (capped at the 50-year equivalent).","example":2,"required":true,"schema":{"type":"number","description":"Length of the staking period (capped at the 50-year equivalent).","example":2}},{"in":"query","name":"period_unit","description":"`years` (default), `months` or `days`.","example":"years","required":false,"schema":{"type":"string","description":"`years` (default), `months` or `days`.","example":"years","nullable":true}},{"in":"query","name":"apy","description":"Advertised APY in %.","example":5,"required":true,"schema":{"type":"number","description":"Advertised APY in %.","example":5}},{"in":"query","name":"compound_frequency","description":"`never`, `daily`, `weekly`, `monthly` (default) or `yearly`.","example":"monthly","required":false,"schema":{"type":"string","description":"`never`, `daily`, `weekly`, `monthly` (default) or `yearly`.","example":"monthly","nullable":true}},{"in":"query","name":"commission","description":"Validator commission in %, taken from rewards (default 0).","example":10,"required":false,"schema":{"type":"number","description":"Validator commission in %, taken from rewards (default 0).","example":10,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"final_balance":1094.42,"total_rewards":94.42,"yearly_reward":47.21,"monthly_reward":3.93,"roi":9.44,"risk_level":"low"}},"properties":{"data":{"type":"object","properties":{"final_balance":{"type":"number","example":1094.42},"total_rewards":{"type":"number","example":94.42},"yearly_reward":{"type":"number","example":47.21},"monthly_reward":{"type":"number","example":3.93},"roi":{"type":"number","example":9.44},"risk_level":{"type":"string","example":"low"}}}}}}}}},"tags":["Calculators"]}},"/api/v1/coins/{slug}/videos":{"get":{"summary":"Coin videos","operationId":"coinVideos","description":"Curated videos attached to a coin (the coin page's Videos tab), paginated.","parameters":[{"in":"query","name":"page","description":"Page number (1-based).","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based).","example":1}},{"in":"query","name":"per_page","description":"Rows per page (1–50, default 10).","example":10,"required":false,"schema":{"type":"integer","description":"Rows per page (1–50, default 10).","example":10}},{"in":"query","name":"type","description":"Filter by video type (e.g. `overview`, `tutorial`, `explainer`, `review`, `analysis`, `news`).","example":"review","required":false,"schema":{"type":"string","description":"Filter by video type (e.g. `overview`, `tutorial`, `explainer`, `review`, `analysis`, `news`).","example":"review"}},{"in":"query","name":"search","description":"Free-text match on the title.","example":"halving","required":false,"schema":{"type":"string","description":"Free-text match on the title.","example":"halving"}}],"responses":[],"tags":["Editorial"]},"parameters":[{"in":"path","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/coins/{slug}/insights":{"get":{"summary":"Coin insight timeline","operationId":"coinInsightTimeline","description":"The coin's insight timeline — the same payload the asset page's insights panel\nuses, windowed by `offset`/`limit`.","parameters":[{"in":"query","name":"locale","description":"Content language (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language (falls back to English).","example":"en","nullable":true}},{"in":"query","name":"offset","description":"Rows to skip (0–500, default 0).","example":0,"required":false,"schema":{"type":"integer","description":"Rows to skip (0–500, default 0).","example":0,"nullable":true}},{"in":"query","name":"limit","description":"Rows to return (1–50, default 5).","example":5,"required":false,"schema":{"type":"integer","description":"Rows to return (1–50, default 5).","example":5,"nullable":true}}],"responses":[],"tags":["Editorial"]},"parameters":[{"in":"path","name":"slug","description":"The coin's slug identifier.","example":"bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/articles":{"get":{"summary":"List articles","operationId":"listArticles","description":"Published articles, newest first, paginated. Filter by `tag` or by a related\n`coin` / `exchange` / `wallet` slug, or free-text `search`. Each row is a summary\n(title, subtitle, tags, reading time, hero image, related entities, dates).","parameters":[{"in":"query","name":"page","description":"Page number (1-based).","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based).","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page (1–50, default 20).","example":20,"required":false,"schema":{"type":"integer","description":"Rows per page (1–50, default 20).","example":20,"nullable":true}},{"in":"query","name":"locale","description":"Content language (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language (falls back to English).","example":"en","nullable":true}},{"in":"query","name":"tag","description":"Filter by tag: news, guide, tutorial, explainer, analysis, review, trading, overview or information.","example":"guide","required":false,"schema":{"type":"string","description":"Filter by tag: news, guide, tutorial, explainer, analysis, review, trading, overview or information.","example":"guide","nullable":true}},{"in":"query","name":"coin","description":"Filter to articles related to this coin slug.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Filter to articles related to this coin slug.","example":"bitcoin","nullable":true}},{"in":"query","name":"exchange","description":"Filter to articles related to this exchange slug.","example":"binance-exchange","required":false,"schema":{"type":"string","description":"Filter to articles related to this exchange slug.","example":"binance-exchange","nullable":true}},{"in":"query","name":"wallet","description":"Filter to articles related to this wallet slug.","example":"frostsnap","required":false,"schema":{"type":"string","description":"Filter to articles related to this wallet slug.","example":"frostsnap","nullable":true}},{"in":"query","name":"search","description":"Free-text match on heading/subheading.","example":"halving","required":false,"schema":{"type":"string","description":"Free-text match on heading/subheading.","example":"halving","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":14,"slug":"what-is-bitcoin","title":"What Is Bitcoin?","subtitle":"A plain-language introduction to the first cryptocurrency.","locale":"en","tags":["guide","analysis"],"reading_time_minutes":7,"hero_image":"https://bitculator.com/storage/media/articles/what-is-bitcoin.png","entities":[],"published_at":"2026-06-21","updated_at":"2026-06-21"}],"meta":{"current_page":1,"per_page":20,"total":10,"last_page":1}},"properties":{"data":{"type":"array","example":[{"id":14,"slug":"what-is-bitcoin","title":"What Is Bitcoin?","subtitle":"A plain-language introduction to the first cryptocurrency.","locale":"en","tags":["guide","analysis"],"reading_time_minutes":7,"hero_image":"https://bitculator.com/storage/media/articles/what-is-bitcoin.png","entities":[],"published_at":"2026-06-21","updated_at":"2026-06-21"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":14},"slug":{"type":"string","example":"what-is-bitcoin"},"title":{"type":"string","example":"What Is Bitcoin?"},"subtitle":{"type":"string","example":"A plain-language introduction to the first cryptocurrency."},"locale":{"type":"string","example":"en"},"tags":{"type":"array","example":["guide","analysis"],"items":{"type":"string"}},"reading_time_minutes":{"type":"integer","example":7},"hero_image":{"type":"string","example":"https://bitculator.com/storage/media/articles/what-is-bitcoin.png"},"entities":{"type":"array","example":[]},"published_at":{"type":"string","example":"2026-06-21"},"updated_at":{"type":"string","example":"2026-06-21"}}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"per_page":{"type":"integer","example":20},"total":{"type":"integer","example":10},"last_page":{"type":"integer","example":1}}}}}}}}},"tags":["Editorial"]}},"/api/v1/articles/{slug}":{"get":{"summary":"Get an article","operationId":"getAnArticle","description":"One published article with its full body, tags, hero image, helpful counters and\nrelated entities. `locale` picks the content language with per-field English\nfallback (the payload reports which locale actually won).","parameters":[{"in":"query","name":"locale","description":"Content language (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language (falls back to English).","example":"en","nullable":true}}],"responses":[],"tags":["Editorial"]},"parameters":[{"in":"path","name":"slug","description":"The article's slug.","example":"what-is-bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/articles/{slug}/feedback":{"post":{"summary":"Submit article feedback","operationId":"submitArticleFeedback","description":"Registers a thumbs-up/down on an article — the same counters the web's helpful\nbuttons use. Per-key throttling applies upstream.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"article":"what-is-bitcoin","helpful_yes":13,"helpful_no":2}},"properties":{"data":{"type":"object","properties":{"article":{"type":"string","example":"what-is-bitcoin"},"helpful_yes":{"type":"integer","example":13},"helpful_no":{"type":"integer","example":2}}}}}}}}},"tags":["Editorial"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"helpful":{"type":"boolean","description":"`true` for helpful, `false` for not helpful.","example":true}},"required":["helpful"]}}}}},"parameters":[{"in":"path","name":"slug","description":"The article's slug.","example":"what-is-bitcoin","required":true,"schema":{"type":"string"}}]},"/api/v1/videos/{id}":{"get":{"summary":"Get a video","operationId":"getAVideo","description":"One curated video with its YouTube id, title, type, duration and the\ncoins/exchanges/wallets it is attached to.","parameters":[],"responses":[],"tags":["Editorial"]},"parameters":[{"in":"path","name":"id","description":"The video id.","example":87,"required":true,"schema":{"type":"integer"}}]},"/api/v1/insights":{"get":{"summary":"List insights","operationId":"listInsights","description":"AI-generated market insights, paginated. Filter by `type`, a related `coin` slug\nor free-text `search`; `locale` picks the headline/summary language with English\nfallback.","parameters":[{"in":"query","name":"page","description":"Page number (1-based).","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based).","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page (1–50, default 20).","example":20,"required":false,"schema":{"type":"integer","description":"Rows per page (1–50, default 20).","example":20,"nullable":true}},{"in":"query","name":"locale","description":"Content language (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language (falls back to English).","example":"en","nullable":true}},{"in":"query","name":"type","description":"Filter by insight type: `per_asset`, `market_overview` or `narrative`.","example":"per_asset","required":false,"schema":{"type":"string","description":"Filter by insight type: `per_asset`, `market_overview` or `narrative`.","example":"per_asset","nullable":true}},{"in":"query","name":"coin","description":"Filter to insights about this coin slug.","example":"bitcoin","required":false,"schema":{"type":"string","description":"Filter to insights about this coin slug.","example":"bitcoin","nullable":true}},{"in":"query","name":"search","description":"Free-text match on the headline.","example":"etf","required":false,"schema":{"type":"string","description":"Free-text match on the headline.","example":"etf","nullable":true}},{"in":"query","name":"sort","description":"Sort order: `first_reported` (default) or `last_updated`.","example":"first_reported","required":false,"schema":{"type":"string","description":"Sort order: `first_reported` (default) or `last_updated`.","example":"first_reported","nullable":true}}],"responses":[],"tags":["Editorial"]}},"/api/v1/insights/{id}":{"get":{"summary":"Get an insight","operationId":"getAnInsight","description":"One insight with its full payload — headline, summary, source-article timeline\nand related coins.","parameters":[{"in":"query","name":"locale","description":"Content language (falls back to English).","example":"en","required":false,"schema":{"type":"string","description":"Content language (falls back to English).","example":"en","nullable":true}}],"responses":[],"tags":["Editorial"]},"parameters":[{"in":"path","name":"id","description":"The insight id.","example":101,"required":true,"schema":{"type":"integer"}}]},"/api/v1/alarms":{"get":{"summary":"List alarms","operationId":"listAlarms","description":"The key owner's alarms, newest first, paginated. Filter by `status`, `direction`\nor `notification` channel.","parameters":[{"in":"query","name":"page","description":"Page number (1-based).","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based).","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page (1–100, default 25).","example":25,"required":false,"schema":{"type":"integer","description":"Rows per page (1–100, default 25).","example":25,"nullable":true}},{"in":"query","name":"status","description":"Filter by state: `active` or `triggered`.","example":"active","required":false,"schema":{"type":"string","description":"Filter by state: `active` or `triggered`.","example":"active","nullable":true}},{"in":"query","name":"direction","description":"Filter by trigger direction: `above` or `below`.","example":"above","required":false,"schema":{"type":"string","description":"Filter by trigger direction: `above` or `below`.","example":"above","nullable":true}},{"in":"query","name":"notification","description":"Filter by delivery channel: `email`, `push` or `webhook`.","example":"email","required":false,"schema":{"type":"string","description":"Filter by delivery channel: `email`, `push` or `webhook`.","example":"email","nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":42,"name":"BTC six figures","coin":{"slug":"bitcoin","symbol":"BTC","name":"Bitcoin"},"metric":"rate","direction":"above","target":"100000","notification":"email","status":"active","created_at":"2026-06-21T09:15:00+00:00"}],"meta":{"current_page":1,"per_page":25,"total":3,"last_page":1}},"properties":{"data":{"type":"array","example":[{"id":42,"name":"BTC six figures","coin":{"slug":"bitcoin","symbol":"BTC","name":"Bitcoin"},"metric":"rate","direction":"above","target":"100000","notification":"email","status":"active","created_at":"2026-06-21T09:15:00+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":42},"name":{"type":"string","example":"BTC six figures"},"coin":{"type":"object","properties":{"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"},"name":{"type":"string","example":"Bitcoin"}}},"metric":{"type":"string","example":"rate"},"direction":{"type":"string","example":"above"},"target":{"type":"string","example":"100000"},"notification":{"type":"string","example":"email"},"status":{"type":"string","example":"active"},"created_at":{"type":"string","example":"2026-06-21T09:15:00+00:00"}}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"per_page":{"type":"integer","example":25},"total":{"type":"integer","example":3},"last_page":{"type":"integer","example":1}}}}}}}}},"tags":["Alarms"]},"post":{"summary":"Create an alarm","operationId":"createAnAlarm","description":"Creates a TARGET alarm on a coin and spends one alarm slot from the key owner's\nbalance. The target is checked against the coin's current value so the alarm\ncannot self-trigger instantly: an `above` alarm must target more than the current\nvalue, a `below` alarm less.","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":43,"name":"BTC six figures","coin":{"slug":"bitcoin","symbol":"BTC","name":"Bitcoin"},"metric":"rate","direction":"above","target":"100000","notification":"email","status":"active","created_at":"2026-07-03T08:00:00+00:00"}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":43},"name":{"type":"string","example":"BTC six figures"},"coin":{"type":"object","properties":{"slug":{"type":"string","example":"bitcoin"},"symbol":{"type":"string","example":"BTC"},"name":{"type":"string","example":"Bitcoin"}}},"metric":{"type":"string","example":"rate"},"direction":{"type":"string","example":"above"},"target":{"type":"string","example":"100000"},"notification":{"type":"string","example":"email"},"status":{"type":"string","example":"active"},"created_at":{"type":"string","example":"2026-07-03T08:00:00+00:00"}}}}}}}}},"tags":["Alarms"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"A label for the alarm (max 255 characters).","example":"BTC six figures"},"coin":{"type":"string","description":"The coin's slug identifier.","example":"bitcoin"},"metric":{"type":"string","description":"The watched metric: `rate`, `volume` or `marketcap`.","example":"rate"},"direction":{"type":"string","description":"Trigger direction: `above` or `below`.","example":"above"},"target":{"type":"number","description":"The threshold value (must sit on the `direction` side of the coin's current value).","example":100000},"notification":{"type":"string","description":"Delivery channel: `email`, `push` or `webhook`.","example":"email"}},"required":["name","coin","metric","direction","target","notification"]}}}}}},"/api/v1/alarms/{id}":{"delete":{"summary":"Delete an alarm","operationId":"deleteAnAlarm","description":"Deletes one of the key owner's alarms and refunds the alarm slot it consumed.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"deleted":true}},"properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean","example":true}}}}}}}}},"tags":["Alarms"]},"parameters":[{"in":"path","name":"id","description":"The alarm id.","example":42,"required":true,"schema":{"type":"integer"}}]},"/api/v1/webhooks":{"get":{"summary":"List webhook endpoints","operationId":"listWebhookEndpoints","description":"The key owner's webhook endpoints, newest first. Signing secrets are never\nincluded — each secret is shown exactly once, at creation.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":7,"url":"https://example.com/webhooks/bitculator","events":["alarm.triggered"],"status":"active","consecutive_failures":0,"disabled_at":null,"created_at":"2026-06-20T10:00:00+00:00"}]},"properties":{"data":{"type":"array","example":[{"id":7,"url":"https://example.com/webhooks/bitculator","events":["alarm.triggered"],"status":"active","consecutive_failures":0,"disabled_at":null,"created_at":"2026-06-20T10:00:00+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":7},"url":{"type":"string","example":"https://example.com/webhooks/bitculator"},"events":{"type":"array","example":["alarm.triggered"],"items":{"type":"string"}},"status":{"type":"string","example":"active"},"consecutive_failures":{"type":"integer","example":0},"disabled_at":{"type":"string","example":null,"nullable":true},"created_at":{"type":"string","example":"2026-06-20T10:00:00+00:00"}}}}}}}}}},"tags":["Webhooks"]},"post":{"summary":"Create a webhook endpoint","operationId":"createAWebhookEndpoint","description":"Registers an HTTPS endpoint (max 5 per account) for event deliveries. The\nresponse includes the signing `secret` — the ONLY time it is ever shown, so\nstore it immediately.","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"id":8,"url":"https://example.com/webhooks/bitculator","events":["alarm.triggered"],"status":"active","consecutive_failures":0,"disabled_at":null,"created_at":"2026-07-03T08:00:00+00:00","secret":"whsec_k5cQ1x9jJ2mW7pR4tY8uB3nV6zA0sD5f"}},"properties":{"data":{"type":"object","properties":{"id":{"type":"integer","example":8},"url":{"type":"string","example":"https://example.com/webhooks/bitculator"},"events":{"type":"array","example":["alarm.triggered"],"items":{"type":"string"}},"status":{"type":"string","example":"active"},"consecutive_failures":{"type":"integer","example":0},"disabled_at":{"type":"string","example":null,"nullable":true},"created_at":{"type":"string","example":"2026-07-03T08:00:00+00:00"},"secret":{"type":"string","example":"whsec_k5cQ1x9jJ2mW7pR4tY8uB3nV6zA0sD5f"}}}}}}}}},"tags":["Webhooks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The HTTPS delivery URL. Public hosts only — internal/private addresses are rejected.","example":"https://example.com/webhooks/bitculator"},"events":{"type":"array","description":"Events to subscribe to. Allowed values: `alarm.triggered`.","example":["alarm.triggered"],"items":{"type":"string"}}},"required":["url","events"]}}}}}},"/api/v1/webhooks/{id}":{"delete":{"summary":"Delete a webhook endpoint","operationId":"deleteAWebhookEndpoint","description":"Deletes one of the key owner's webhook endpoints. Pending deliveries to it are\nabandoned.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"deleted":true}},"properties":{"data":{"type":"object","properties":{"deleted":{"type":"boolean","example":true}}}}}}}}},"tags":["Webhooks"]},"parameters":[{"in":"path","name":"id","description":"The webhook endpoint id.","example":7,"required":true,"schema":{"type":"integer"}}]},"/api/v1/webhooks/{id}/test":{"post":{"summary":"Send a test event","operationId":"sendATestEvent","description":"Fires a signed `alarm.triggered` test event (`test: true` in the payload, real\nsignature headers) so receivers can be verified end-to-end.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"queued":true}},"properties":{"data":{"type":"object","properties":{"queued":{"type":"boolean","example":true}}}}}}}}},"tags":["Webhooks"]},"parameters":[{"in":"path","name":"id","description":"The webhook endpoint id.","example":7,"required":true,"schema":{"type":"integer"}}]},"/api/v1/webhooks/{id}/deliveries":{"get":{"summary":"Webhook delivery log","operationId":"webhookDeliveryLog","description":"The endpoint's delivery attempts (kept 30 days), newest first, paginated.","parameters":[{"in":"query","name":"page","description":"Page number (1-based).","example":1,"required":false,"schema":{"type":"integer","description":"Page number (1-based).","example":1,"nullable":true}},{"in":"query","name":"per_page","description":"Rows per page (1–100, default 25).","example":25,"required":false,"schema":{"type":"integer","description":"Rows per page (1–100, default 25).","example":25,"nullable":true}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":[{"id":311,"event":"alarm.triggered","response_status":200,"error":null,"attempts":1,"delivered_at":"2026-07-02T21:14:09+00:00","created_at":"2026-07-02T21:14:08+00:00"}],"meta":{"current_page":1,"per_page":25,"total":6,"last_page":1,"retention":"30 days"}},"properties":{"data":{"type":"array","example":[{"id":311,"event":"alarm.triggered","response_status":200,"error":null,"attempts":1,"delivered_at":"2026-07-02T21:14:09+00:00","created_at":"2026-07-02T21:14:08+00:00"}],"items":{"type":"object","properties":{"id":{"type":"integer","example":311},"event":{"type":"string","example":"alarm.triggered"},"response_status":{"type":"integer","example":200},"error":{"type":"string","example":null,"nullable":true},"attempts":{"type":"integer","example":1},"delivered_at":{"type":"string","example":"2026-07-02T21:14:09+00:00"},"created_at":{"type":"string","example":"2026-07-02T21:14:08+00:00"}}}},"meta":{"type":"object","properties":{"current_page":{"type":"integer","example":1},"per_page":{"type":"integer","example":25},"total":{"type":"integer","example":6},"last_page":{"type":"integer","example":1},"retention":{"type":"string","example":"30 days"}}}}}}}}},"tags":["Webhooks"]},"parameters":[{"in":"path","name":"id","description":"The webhook endpoint id.","example":7,"required":true,"schema":{"type":"integer"}}]},"/api/v1/openapi.json":{"get":{"summary":"OpenAPI spec","operationId":"openAPISpec","description":"The machine-readable OpenAPI 3 document for this API, as JSON — point codegen\nor API tooling at this URL. Public: no key required.","parameters":[],"responses":[],"tags":["Meta"]}},"/api/v1/ping":{"get":{"summary":"Ping","operationId":"ping","description":"An authenticated no-op for verifying a Data API key end-to-end (auth.api →\nper-plan burst throttle → monthly quota). It counts against the quota like any\nother call.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"status":"ok","plan":"free"}},"properties":{"data":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"plan":{"type":"string","example":"free"}}}}}}}}},"tags":["Meta"]}},"/api/v1/usage":{"get":{"summary":"Key usage & quota","operationId":"keyUsageQuota","description":"Usage introspection for the calling key's owner on the product the key belongs to: the\nplan, its monthly limit, used and remaining (always matching the X-Quota-* headers), the\ncurrent period window, and per-endpoint / per-token breakdowns. Called over MCP it reports\nthe MCP plan and pool. Embed-widget usage has its own plan and pool — it never appears here.","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","example":{"data":{"plan":"free","limit":10000,"used":29,"remaining":9971,"period_start":"2026-06-15","period_end":"2026-07-15T00:00:00+00:00","burst_per_minute":60,"endpoints":[{"endpoint":"GET api/v1/prices","requests":18},{"endpoint":"GET api/v1/global","requests":11}],"tokens":[{"id":12,"name":"production","kind":"data-api","requests":29,"last_used_at":"2026-07-02T21:14:09+00:00","revoked":false}]},"meta":{"note":"Endpoint and token breakdowns are flushed from the buffer every minute and can trail `used` slightly."}},"properties":{"data":{"type":"object","properties":{"plan":{"type":"string","example":"free"},"limit":{"type":"integer","example":10000},"used":{"type":"integer","example":29},"remaining":{"type":"integer","example":9971},"period_start":{"type":"string","example":"2026-06-15"},"period_end":{"type":"string","example":"2026-07-15T00:00:00+00:00"},"burst_per_minute":{"type":"integer","example":60},"endpoints":{"type":"array","example":[{"endpoint":"GET api/v1/prices","requests":18},{"endpoint":"GET api/v1/global","requests":11}],"items":{"type":"object","properties":{"endpoint":{"type":"string","example":"GET api/v1/prices"},"requests":{"type":"integer","example":18}}}},"tokens":{"type":"array","example":[{"id":12,"name":"production","kind":"data-api","requests":29,"last_used_at":"2026-07-02T21:14:09+00:00","revoked":false}],"items":{"type":"object","properties":{"id":{"type":"integer","example":12},"name":{"type":"string","example":"production"},"kind":{"type":"string","example":"data-api"},"requests":{"type":"integer","example":29},"last_used_at":{"type":"string","example":"2026-07-02T21:14:09+00:00"},"revoked":{"type":"boolean","example":false}}}}}},"meta":{"type":"object","properties":{"note":{"type":"string","example":"Endpoint and token breakdowns are flushed from the buffer every minute and can trail `used` slightly."}}}}}}}}},"tags":["Meta"]}}}}