Bitculator
Bitculator · Data API · v1

Bitculator Data API

73 endpoints 15 groups X-Quota-* on every call http://localhost/api/v1

All endpoints live under /api/v1 and require a Bearer key with the data-api ability — create one in your developer console.

Your first call:

curl https://bitculator.com/api/v1/prices/bitcoin \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses are JSON. Prices, rates, and supplies are decimal strings (floats can't carry market precision); counts and analytics values are numbers. Every response carries your live quota in the X-Quota-Limit / X-Quota-Used / X-Quota-Reset headers, and errors always use the {"error": {"code", "message", "details"}} envelope.

The Data API has its own monthly quota, tied to your API plan and fully separate from your embed widgets. per_page caps are plan-based (Free 100, Starter/Pro 250); exceeding a cap returns 422 rather than clamping.

Authentication

To authenticate requests, include an Authorization: Bearer {YOUR_API_KEY} header on every request.

Create a Data API key in your developer console — keys are Bearer-only and carry the data-api ability. Keep them server-side; they are never meant for client-side embedding.

Authorization header
Create a key →
Bearer
bc_••••••••••••••••

Sent as Authorization: Bearer {YOUR_API_KEY} on every request.

9 endpoints

Coins

Ranked coin and token market data: paginated listings, single-coin detail, movers (gainers/losers), recently-added, trending, and per-coin time series. Prices, marketcap and supply are decimal STRINGS (floats can't carry market precision); percentage changes, ranks and counts are numbers.

List coins

Ranked coins with prices, filters and selectors, paginated with Laravel's links + meta envelope. Prices, marketcap and circulating_supply are decimal strings; changes and ranks are numbers.

GET
http://localhost/api/v1/coins
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Recently added coins

Newest listings — sorted by status_updated_at (the went-active timestamp; created_at is the crawl date, which predates listing by arbitrary amounts). Same row shape and pagination envelope as List coins.

GET
http://localhost/api/v1/coins/recently-added
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/recently-added?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Top gainers

Biggest positive movers over the interval window (24h default, or 7d). Same row shape and pagination envelope as List coins.

GET
http://localhost/api/v1/coins/gainers
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/gainers?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Top losers

Biggest negative movers over the interval window (24h default, or 7d). Same row shape and pagination envelope as List coins.

GET
http://localhost/api/v1/coins/losers
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/losers?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get coin detail

Full single-coin profile. Beyond the list fields it adds: supply (circulating/total/max), today OHLC, all_time_high / all_time_low (price, date and percent_from the current price), fully_diluted_valuation, market counts (exchanges/pairs/tickers/wallets), decimals, genesis_date, official links (typed url list), token contracts, and a localized HTML description (falls back to English when the requested locale is missing). All price/supply fields are decimal strings.

GET
http://localhost/api/v1/coins/{slug}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

locale
string optional
en

Content language for the description (falls back to English).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin?locale=en" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Candle history

Per-coin OHLC + volume + marketcap time series. Pick interval: minutely, half-hourly, hourly or daily. Retention is a hard property of the rollup pipeline — minutely 8 days, half-hourly 3 months, hourly 6 months, daily forever; requests beyond a window return what exists. When a limit is set you get the MOST RECENT N rows in the window, emitted oldest-first. Prices are decimal strings.

GET
http://localhost/api/v1/coins/{slug}/history
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

interval
string optional
daily

minutely, half-hourly, hourly or daily (default daily).

start
string optional
2026-06-01

ISO date/time lower bound.

end
string optional
2026-06-30

ISO date/time upper bound (a date-only value means through that day).

limit
integer optional
30

Max rows (1–2000, default 1000).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/history?interval=daily&start=2026-06-01&end=2026-06-30&limit=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Marketcap history

The same per-coin rollups as Candle history, projected to {time, marketcap} only. Same interval choices and retention windows (minutely 8 days, half-hourly 3 months, hourly 6 months, daily forever), most-recent-N when a limit is set.

GET
http://localhost/api/v1/coins/{slug}/marketcap-history
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

interval
string optional
daily

minutely, half-hourly, hourly or daily (default daily).

start
string optional
2026-06-01

ISO date/time lower bound.

end
string optional
2026-06-30

ISO date/time upper bound.

limit
integer optional
30

Max rows (1–2000, default 1000).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/marketcap-history?interval=daily&start=2026-06-01&end=2026-06-30&limit=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Coin sparkline

A compact price series for the coin over the chosen period, for drawing sparklines.

GET
http://localhost/api/v1/coins/{slug}/sparkline
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

period
string optional
7d

24h, 7d, 30d, 60d, 90d, 180d or 365d (default 7d).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/sparkline?period=7d" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
3 endpoints

Prices

The lightweight price hot path — current price, marketcap, 24h volume and recent changes for a requested set of coins. /prices requires a selector (ids, slugs or symbols); /prices/{slug} targets one coin. Optionally convert into a fiat currency (crypto prices refresh ~every minute, fiat FX ~twice daily). Prices and marketcap are decimal strings.

Get prices

Prices for a requested set of coins. Pass at least one selector — ids, slugs or symbols (up to 100 combined). meta.currency echoes the conversion target (USD unless convert is set).

GET
http://localhost/api/v1/prices
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

ids
string optional
38,39

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 slugs and symbols are present. Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Coin slugs to price (CSV). At least one of ids, slugs or symbols is required. This field is required when none of ids and symbols are present. Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Coin symbols to price (CSV, case-insensitive). At least one of ids, slugs or symbols is required. This field is required when none of ids and slugs are present. Must not be greater than 1000 characters.

convert
string optional
EUR

Convert prices/marketcap into an active fiat currency by symbol (default USD). FX rates refresh ~twice daily.

One of: 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

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/prices?ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&convert=EUR" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get a coin price

Single-coin price snapshot. Optionally convert into an active fiat currency by symbol (default USD).

GET
http://localhost/api/v1/prices/{slug}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

convert
string optional
EUR

Active fiat currency symbol to price in (default USD).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/prices/bitcoin?convert=EUR" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Historical price

The coin's USD price on a given date, read from the daily history (exact day, ±3-day fallback — the same resolver the portfolio uses). Crypto only: fiat rows have no daily history.

GET
http://localhost/api/v1/historical-price
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

slug
string required
bitcoin

The coin's slug identifier.

date
string required
2021-04-14

date The lookup date (after 2008-12-31, not in the future).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/historical-price?slug=bitcoin&date=2021-04-14" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
5 endpoints

Markets

Tickers (per-exchange markets) and pairs (venue-aggregated markets), plus a coin's markets and raw per-exchange trading symbols. All of it is snapshot data — no per-ticker/pair history exists. USD volumes are numbers; prices are decimal strings.

Coin markets

All markets for a coin — the tickers whose pair has the coin as base OR quote. Same row shape and filters as List tickers.

GET
http://localhost/api/v1/coins/{slug}/markets
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

exchange
string optional
binance-exchange

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}$/.

pair
integer optional
1

Restrict to a single pair by id. Must be at least 1.

instrument
string optional
spot

Instrument type: future, option, swap, spot or margin (plurals accepted).

One of: future option swap spot margin

search
string optional
BTC

Free-text match on the ticker symbol. Must not be greater than 50 characters.

min_volume
number optional
1000000

Only tickers with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only tickers with 24h USD volume at or below this value. Must be at least 0.

min_change
number optional
-50

Only tickers with a 24h percentage change at or above this value.

max_change
number optional
50

Only tickers with a 24h percentage change at or below this value.

sort
string optional
-volume_usd

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.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/markets?page=1&per_page=50&exchange=binance-exchange&pair=1&instrument=spot&search=BTC&min_volume=1000000&max_volume=100000000000&min_change=-50&max_change=50&sort=-volume_usd" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Coin trading symbols

The coin's raw per-exchange trading symbols — sparsely populated reference data (coverage is best-effort).

GET
http://localhost/api/v1/coins/{slug}/symbols
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/symbols" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List tickers

Individual per-exchange markets (tickers), paginated. Filter by exchange, pair, instrument and volume/change ranges. USD volumes are numbers; prices are decimal strings.

GET
http://localhost/api/v1/tickers
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

exchange
string optional
binance-exchange

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}$/.

pair
integer optional
1

Restrict to a single pair by id. Must be at least 1.

instrument
string optional
spot

Instrument type: future, option, swap, spot or margin (plurals accepted).

One of: future option swap spot margin

search
string optional
BTC

Free-text match on the ticker symbol. Must not be greater than 50 characters.

min_volume
number optional
1000000

Only tickers with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only tickers with 24h USD volume at or below this value. Must be at least 0.

min_change
number optional
-50

Only tickers with a 24h percentage change at or above this value.

max_change
number optional
50

Only tickers with a 24h percentage change at or below this value.

sort
string optional
-volume_usd

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.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/tickers?page=1&per_page=50&exchange=binance-exchange&pair=1&instrument=spot&search=BTC&min_volume=1000000&max_volume=100000000000&min_change=-50&max_change=50&sort=-volume_usd" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List pairs

Venue-aggregated trading pairs, ranked by 24h USD volume. Filter by a coin slug (base or quote) and volume range.

GET
http://localhost/api/v1/pairs
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

search
string optional
BTC

Free-text match on the pair symbol. Must not be greater than 50 characters.

coin
string optional
bitcoin

Restrict to pairs where this coin slug is the base or quote asset. Must match the regex /^[a-z0-9-]{1,120}$/.

min_volume
number optional
1000000

Only pairs with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only pairs with 24h USD volume at or below this value. Must be at least 0.

sort
string optional
-volume_usd

Sort field: volume_usd or updated (prefix with - for descending). Defaults to -volume_usd.

One of: volume_usd -volume_usd updated -updated

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/pairs?page=1&per_page=50&search=BTC&coin=bitcoin&min_volume=1000000&max_volume=100000000000&sort=-volume_usd" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get pair detail

One pair plus every exchange ticker listing it, ordered by volume.

GET
http://localhost/api/v1/pairs/{id}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
1

The pair id.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/pairs/1" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
7 endpoints

Exchanges

Exchange rankings, detail, trust scores, time series and per-exchange market/coin listings. Volumes are USD. There is no CEX/DEX column — type is derived from the exchange taxonomy, so it can be "cex", "dex" or null.

List exchanges

Ranked exchanges with 24h volume, dominance, pair/asset counts and recent changes. Paginated with Laravel's links + meta envelope.

GET
http://localhost/api/v1/exchanges
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
cex

Restrict to a venue type: cex or dex (resolved via the exchange taxonomy).

One of: cex dex

search
string optional
binance

Free-text match on exchange name. Must not be greater than 100 characters.

min_pairs
integer optional
100

Only exchanges listing at least this many pairs. Must be at least 0.

max_pairs
integer optional
2000

Only exchanges listing at most this many pairs. Must be at least 0.

min_assets
integer optional
50

Only exchanges listing at least this many assets. Must be at least 0.

max_assets
integer optional
1000

Only exchanges listing at most this many assets. Must be at least 0.

min_volume
number optional
1000000

Only exchanges with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only exchanges with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
1,12

Filter to specific exchange ids (CSV, up to 100). Must not be greater than 1000 characters.

slugs
string optional
binance-exchange,gateio

Filter to specific exchange slugs (CSV, up to 100). Must not be greater than 2000 characters.

sort
string optional
-volume

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.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges?page=1&per_page=50&type=cex&search=binance&min_pairs=100&max_pairs=2000&min_assets=50&max_assets=1000&min_volume=1000000&max_volume=100000000000&ids=1%2C12&slugs=binance-exchange%2Cgateio&sort=-volume" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get exchange detail

Full single-exchange profile: ranking, volume/dominance, pair and asset counts, established date, location, referral website, and the derived type (cex/dex/null).

GET
http://localhost/api/v1/exchanges/{slug}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get exchange trust score

An aggregate 0–10 trust score plus its 13-factor breakdown (rank, volume, age, volume_trend, stability, rank_stability, ticker_health, pairs, community, assets, dominance, market_breadth, transparency). Computed per exchange and cached 24h.

GET
http://localhost/api/v1/exchanges/{slug}/trust-score
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange/trust-score" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Exchange history

Volume / dominance / pairs / assets time series (the exchange rollups carry no OHLC). Pick interval: minutely, hourly or daily. Retention is a hard property of the rollup pipeline — minutely 8 days, hourly 6 months, daily forever; when a limit is set you get the most-recent N rows in the window, oldest-first.

GET
http://localhost/api/v1/exchanges/{slug}/history
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

Query parameters

interval
string optional
daily

minutely, hourly or daily (default daily).

start
string optional
2026-06-01

ISO date/time lower bound.

end
string optional
2026-06-30

ISO date/time upper bound (a date-only value means through that day).

limit
integer optional
30

Max rows (1–2000, default 1000).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange/history?interval=daily&start=2026-06-01&end=2026-06-30&limit=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Exchange sparkline

The exchange's volume sparkline series for a period (defaults to 7d) — the same series the web's exchange rows render.

GET
http://localhost/api/v1/exchanges/{slug}/sparkline
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

Query parameters

period
string optional
7d

One of 24h, 7d (default), 30d, 60d, 90d, 180d, 365d.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange/sparkline?period=7d" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Exchange markets

The exchange's ticker listings (its markets), paginated. Already scoped to the exchange — do not pass an exchange parameter here.

GET
http://localhost/api/v1/exchanges/{slug}/tickers
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

exchange
string optional
binance-exchange

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}$/.

pair
integer optional
1

Restrict to a single pair by id. Must be at least 1.

instrument
string optional
spot

Instrument type: future, option, swap, spot or margin (plurals accepted).

One of: future option swap spot margin

search
string optional
BTC

Free-text match on the ticker symbol. Must not be greater than 50 characters.

min_volume
number optional
1000000

Only tickers with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only tickers with 24h USD volume at or below this value. Must be at least 0.

min_change
number optional
-50

Only tickers with a 24h percentage change at or above this value.

max_change
number optional
50

Only tickers with a 24h percentage change at or below this value.

sort
string optional
-volume_usd

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.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange/tickers?page=1&per_page=50&exchange=binance-exchange&pair=1&instrument=spot&search=BTC&min_volume=1000000&max_volume=100000000000&min_change=-50&max_change=50&sort=-volume_usd" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Exchange coins

Coins listed on the exchange, returned in the same shape as List coins and accepting the same filters/sort.

GET
http://localhost/api/v1/exchanges/{slug}/assets
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
binance-exchange

The exchange slug.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/exchanges/binance-exchange/assets?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
5 endpoints

Wallets

Crypto wallet reviews — review score, supported-asset count, pros/cons counts, price model and release date, plus a grouped tag taxonomy on detail/compare responses. meta.top_score is the highest score across all wallets (use it to normalize scores into a 0–1 range).

List wallets

Reviewed wallets with score, asset count, pros/cons counts, price model, status and release date. Paginated with Laravel's links + meta envelope, plus meta.top_score.

GET
http://localhost/api/v1/wallets
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

search
string optional
ledger

Free-text match on wallet name. Must not be greater than 100 characters.

min_score
integer optional
50

Only wallets with a review score at or above this value. Must be at least 0.

max_score
integer optional
214

Only wallets with a review score at or below this value. Must be at least 0.

tags
string optional
12,34

Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.

ids
string optional
175,317

Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.

slugs
string optional
frostsnap,coin98-fusion-card

Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.

sort
string optional
-score

Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/wallets?page=1&per_page=50&search=ledger&min_score=50&max_score=214&tags=12%2C34&ids=175%2C317&slugs=frostsnap%2Ccoin98-fusion-card&sort=-score" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Wallet release timeline

The wallet list pinned to released_at descending (undated wallets last). Same row shape and pagination envelope as List wallets.

GET
http://localhost/api/v1/wallets/timeline
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

search
string optional
ledger

Free-text match on wallet name. Must not be greater than 100 characters.

min_score
integer optional
50

Only wallets with a review score at or above this value. Must be at least 0.

max_score
integer optional
214

Only wallets with a review score at or below this value. Must be at least 0.

tags
string optional
12,34

Filter by tag taxonomy: comma-separated category-group ids (the same ids the web facet filters submit). Must not be greater than 1000 characters.

ids
string optional
175,317

Filter to specific wallet ids (CSV, up to 100). Must not be greater than 1000 characters.

slugs
string optional
frostsnap,coin98-fusion-card

Filter to specific wallet slugs (CSV, up to 100). Must not be greater than 2000 characters.

sort
string optional
-score

Comma-separated sort fields; prefix with - for descending. Sortable: score, released_at, assets, pros, cons. Must not be greater than 100 characters.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/wallets/timeline?page=1&per_page=50&search=ledger&min_score=50&max_score=214&tags=12%2C34&ids=175%2C317&slugs=frostsnap%2Ccoin98-fusion-card&sort=-score" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Compare wallets

Side-by-side comparison of 2–4 wallets with their full grouped tag taxonomy. data[] preserves the requested slug order so consumers can render columns positionally.

GET
http://localhost/api/v1/wallets/compare
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

slugs
string required
frostsnap,coin98-fusion-card

2–4 distinct wallet slugs, comma-separated.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/wallets/compare?slugs=frostsnap%2Ccoin98-fusion-card" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get wallet detail

Full single-wallet profile including the grouped tag taxonomy: categories is a list of {group, tags[]} where each tag has a slug, name and optional value. meta.top_score is the highest score across all wallets.

GET
http://localhost/api/v1/wallets/{slug}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
frostsnap

The wallet slug.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/wallets/frostsnap" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Wallet supported coins

Coins the wallet supports, returned in the same shape as List coins and accepting the same filters/sort.

GET
http://localhost/api/v1/wallets/{slug}/assets
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
frostsnap

The wallet slug.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

type
string optional
coin

Restrict to a single asset type: coin or token.

One of: coin token

status
string optional
active

Listing status: active, delisted, untracked, progressing, awaiting or preparing. Defaults to all public statuses.

One of: active delisted untracked progressing awaiting preparing

search
string optional
bitcoin

Free-text match on name or symbol. Must not be greater than 100 characters.

min_price
number optional
0.5

Only coins priced at or above this USD value. Must be at least 0.

max_price
number optional
100000

Only coins priced at or below this USD value. Must be at least 0.

min_marketcap
number optional
1000000

Only coins with a USD marketcap at or above this value. Must be at least 0.

max_marketcap
number optional
5000000000000

Only coins with a USD marketcap at or below this value. Must be at least 0.

min_volume
number optional
1000000

Only coins with 24h USD volume at or above this value. Must be at least 0.

max_volume
number optional
100000000000

Only coins with 24h USD volume at or below this value. Must be at least 0.

ids
string optional
38,39

Filter to specific coin ids (CSV, up to 100 selectors combined with slugs/symbols). Must not be greater than 1000 characters.

slugs
string optional
bitcoin,ethereum

Filter to specific coin slugs (CSV, up to 100 selectors combined). Must not be greater than 2000 characters.

symbols
string optional
BTC,ETH

Filter to specific coin symbols (CSV, case-insensitive, up to 100 selectors combined). Must not be greater than 1000 characters.

sort
string optional
-marketcap

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.

interval
string optional
24h

Movers window for /coins/gainers and /coins/losers only: 24h or 7d.

One of: 24h 7d

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/wallets/frostsnap/assets?page=1&per_page=50&type=coin&status=active&search=bitcoin&min_price=0.5&max_price=100000&min_marketcap=1000000&max_marketcap=5000000000000&min_volume=1000000&max_volume=100000000000&ids=38%2C39&slugs=bitcoin%2Cethereum&symbols=BTC%2CETH&sort=-marketcap&interval=24h" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
3 endpoints

Global Market

Market-wide aggregates — total marketcap and volume, asset/exchange/pair/market counts, BTC/ETH dominance with a rank-based top-3, the market Fear & Greed reading, plus a top-100 heatmap and marketcap/volume history.

Global market snapshot

One-shot market overview: total marketcap and 24h volume, counts of cryptocurrencies / tokens / exchanges / pairs / markets, dominance (BTC & ETH share plus the rank-based top3), and the market fear_greed reading.

GET
http://localhost/api/v1/global
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/global" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Market heatmap

Top-100 treemap rows plus framing stats (total marketcap/volume, dominance and the market Fear & Greed score) — the API twin of the web heatmap.

GET
http://localhost/api/v1/global/heatmap
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/global/heatmap" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Global marketcap / volume history

Total-market time series for marketcap or volume. Granularity follows the period: 24h = half-hourly, 7d = hourly, 30d/all = daily (finer rollups are pruned).

GET
http://localhost/api/v1/global/history/{metric}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

metric
string required
marketcap

Which series: marketcap or volume.

Query parameters

period
string optional
7d

24h, 7d, 30d or all (default 24h).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/global/history/marketcap?period=7d" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
6 endpoints

Sentiment

Market and per-coin sentiment indices. Fear & Greed and Bull/Bear are 15-minute-refresh SNAPSHOTS — only the current reading exists, there is no time series for them. Altseason carries full daily history. indicators is the market-wide technical tally.

Community vote tallies

The coin's bullish/bearish community tallies over the rolling 24h window.

GET
http://localhost/api/v1/coins/{slug}/votes
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin's slug identifier.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/votes" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Cast a sentiment vote

Casts the key owner's sentiment vote for a coin. One vote per key owner per coin per rolling 24h window — re-voting inside the window updates the existing vote.

POST
http://localhost/api/v1/coins/{slug}/votes
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin's slug identifier.

Body parameters

vote
string required
bullish

Your sentiment: bullish or bearish.

Request

curl --request POST \
    "http://localhost/api/v1/coins/bitcoin/votes" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"vote\": \"bullish\"
}"

Fear & Greed index

The current Fear & Greed reading (a 15-minute snapshot — no history). Omit coin for the market-wide index, or pass a coin slug for a per-coin reading. intervals carries the 7d/30d sub-scores and their component breakdown.

GET
http://localhost/api/v1/sentiment/fear-greed
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

coin
string optional
bitcoin

Coin slug for a per-coin reading; omit for the market index.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/sentiment/fear-greed?coin=bitcoin" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Bull / Bear index

The current Bull/Bear reading (a 15-minute snapshot — no history). Omit coin for the market-wide index, or pass a coin slug for a per-coin reading.

GET
http://localhost/api/v1/sentiment/bull-bear
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

coin
string optional
bitcoin

Coin slug for a per-coin reading; omit for the market index.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/sentiment/bull-bear?coin=bitcoin" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Altseason index

The current altseason reading (count of coins beating BTC out of the top 100), with optional daily history. Unlike Fear & Greed, altseason has full daily history — pass days to include it.

GET
http://localhost/api/v1/sentiment/altseason
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

days
integer optional
30

Days of daily history to include (1–365; 0/omit = current only).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/sentiment/altseason?days=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Market indicator tally

The market-wide technical tally — 25 indicator categories rolled up, each with its current state, score and category data.

GET
http://localhost/api/v1/sentiment/indicators
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/sentiment/indicators" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
2 endpoints

Indicators

Per-coin technical indicators — a multi-indicator snapshot plus per-family daily time series. All families are DAILY series computed from daily candles (full retention; young assets return warm-up nulls until enough history exists). Price-scale families (sma, vwap, macd, obv) emit decimal strings; bounded oscillators emit numbers. Some long-window periods require a paid plan (see the family endpoint).

Indicator snapshot

The multi-indicator snapshot — every indicator category's latest state (bullish/bearish/sheepish…), score and raw data, in one payload.

GET
http://localhost/api/v1/coins/{slug}/indicators
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/indicators" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Indicator family series

One indicator family's daily time series. Families with multiple windows accept a period, and the valid windows differ per family: RSI/Stoch-RSI 7/14/21/28, SMA 50/100/200, CCI 20/50/100, MFI 7/14/28, Williams %R 14/20/50, price/volume-volatility 7/14/30. Single-series families (MACD, OBV, ADX, VWAP, CMF) ignore period. Young coins return leading warm-up nulls.

Some long windows require a paid plan: RSI & Stoch-RSI 21/28-day and the 30-day volatility windows need Starter or higher — requesting them on the Free plan returns 403 with code plan_required.

GET
http://localhost/api/v1/coins/{slug}/indicators/{family}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin slug.

family
string required
rsi

Indicator family — one of rsi, stoch-rsi, sma, cci, mfi, williams-r, price-volatility, volume-volatility, macd, obv, adx, vwap, cmf.

Query parameters

period
integer optional
14

Window length (only where the family has windows; must be one of that family's valid windows).

start
string optional
2026-06-01

ISO date lower bound.

end
string optional
2026-06-30

ISO date upper bound.

limit
integer optional
30

Max rows (1–1000, default 365).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/indicators/rsi?period=14&start=2026-06-01&end=2026-06-30&limit=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
6 endpoints

Liquidations

Derivatives liquidations. Source coverage is currently OKX swap markets only (stated in every meta.note). The RAW feed (the /liquidations list and the hourly breakdown) is pruned after ~48 hours; daily rollups are kept forever. Today's aggregates are partial and update every ~15 minutes.

Liquidation feed

The raw liquidation feed (~last 48h, then pruned), newest first. Source coverage is currently OKX swap markets. Prices are decimal strings. meta carries the pagination fields plus a retention and note.

GET
http://localhost/api/v1/liquidations
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based). Must be at least 1.

per_page
integer optional
50

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.

exchange
string optional
okx

Restrict to a single exchange by slug. Source coverage is currently OKX swap markets. Must match the regex /^[a-z0-9-]{1,120}$/.

instrument
string optional
swap

Instrument type: future, option, swap, spot or margin.

One of: future option swap spot margin

position
string optional
short

Liquidated position side: long or short.

One of: long short

order
string optional
buy

Fill side that triggered the liquidation: buy or sell.

One of: buy sell

symbol
string optional
BTC

Prefix match on the venue instId (e.g. BTC matches BTC-USDT-SWAP). Must match the regex /^[A-Za-z0-9$.-]{1,25}$/.

min_usd
number optional
1000

Only liquidations with a USD value at or above this threshold. Must be at least 0.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations?page=1&per_page=50&exchange=okx&instrument=swap&position=short&order=buy&symbol=BTC&min_usd=1000" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Hourly liquidations

Hourly long/short USD totals over the raw feed. Because the raw feed is pruned at ~48h, hours is capped at 48. Source coverage is currently OKX swap markets.

GET
http://localhost/api/v1/liquidations/hourly
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

hours
integer optional
24

Look-back window in hours (1–48, default 24).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations/hourly?hours=24" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Daily liquidations

Daily aggregates (kept forever), summed across exchanges/instruments per day — total/long/short USD plus long/short position counts. Today's row is partial and updates every ~15 minutes. Source coverage is currently OKX swap markets.

GET
http://localhost/api/v1/liquidations/daily
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

days
integer optional
30

Number of calendar days incl. today (1–365, default 30).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations/daily?days=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Today's liquidation summary

Today so far — total/long/short USD, position counts and long-vs-short dominance. Figures are partial and update every ~15 minutes; data is null until the first liquidation of the day is recorded. Source coverage is currently OKX swap markets.

GET
http://localhost/api/v1/liquidations/summary
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations/summary" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Liquidation netflow

Long-vs-short liquidation USD flow per day over the window. Source coverage is currently OKX swap markets.

GET
http://localhost/api/v1/liquidations/netflow
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

days
integer optional
30

Number of calendar days incl. today (1–90, default 30).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations/netflow?days=30" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Top liquidated coins

Top coins by liquidation volume over the recent window, with the long/short USD split per coin. Source coverage is currently OKX swap markets.

GET
http://localhost/api/v1/liquidations/coins
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

hours
integer optional
24

Look-back window in hours (1–48, default 24).

limit
integer optional
8

Number of coins to return (1–20, default 8).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/liquidations/coins?hours=24&limit=8" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
3 endpoints

Conversion

Convert between any two active assets (crypto AND fiat), and list the currencies usable as conversion legs. Values are decimal strings. Fiat FX rates refresh ~twice daily; crypto rates ~every minute.

Convert between assets

Server-side conversion between any two active assets (crypto AND fiat). to accepts a CSV for multi-target conversion; reversing is just swapping from/to. Conversion is linear, so value = unit_rate * amount. Fiat FX rates refresh ~twice daily; crypto rates ~every minute.

GET
http://localhost/api/v1/convert
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

from
string required
bitcoin

Source asset slug.

to
string required
ethereum

Target asset slug(s), comma-separated (up to 10).

amount
number optional
2.5

Amount of the source asset to convert (default 1).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/convert?from=bitcoin&to=ethereum&amount=2.5" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List fiat currencies

The active fiat currencies with their USD FX rates: rate_per_usd (units per USD) and its inverse usd_value. Fiat FX rates refresh ~twice daily.

GET
http://localhost/api/v1/fiats
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/fiats" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List conversion rates

The vs-currencies usable as conversion legs — the top fiats, coins and tokens — each with a normalized usd_value (USD per one unit). Coin/token values refresh ~every minute; the slow fiat rates are cached separately (~twice daily).

GET
http://localhost/api/v1/rates
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/rates" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
5 endpoints

Calculators

Server-side financial calculators mirroring the web tools: DCA, profit/loss and loan (which read cached market data), plus stateless compound-interest and staking math.

DCA calculator

Dollar-cost averaging backtest over the coin's real daily price history: one buy of amount per interval between start and end. Pass series=true to include the full per-purchase series.

GET
http://localhost/api/v1/calculators/dca
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

slug
string required
bitcoin

The coin's slug identifier.

amount
number required
100

USD spent per purchase (0.01–1,000,000,000).

interval
string required
weekly

Purchase cadence: daily, weekly, monthly, quarterly or yearly.

start
string required
2024-01-01

date First purchase date (after 2008-12-31).

end
string optional
2025-01-01

date Last purchase date (defaults to today).

series
boolean optional
false

Include the per-purchase series in the payload.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/calculators/dca?slug=bitcoin&amount=100&interval=weekly&start=2024-01-01&end=2025-01-01&series=" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Profit / loss calculator

What a buy-then-sell between two historical dates returned, using the coin's real prices on those dates. Fees are flat USD amounts, not percentages.

GET
http://localhost/api/v1/calculators/profit-loss
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

slug
string required
bitcoin

The coin's slug identifier.

amount
number required
1000

USD invested at buy_date (0.01–1,000,000,000).

buy_date
string required
2023-01-01

date Purchase date.

sell_date
string required
2025-01-01

date Sale date (on/after buy_date).

buy_fee
number optional
10

Flat purchase fee in USD (default 0).

sell_fee
number optional
10

Flat sale fee in USD (default 0).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/calculators/profit-loss?slug=bitcoin&amount=1000&buy_date=2023-01-01&sell_date=2025-01-01&buy_fee=10&sell_fee=10" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Compound interest calculator

Pure math — no market data. Note that the rate applies PER COMPOUNDING PERIOD (the web calculator's convention), not per year.

GET
http://localhost/api/v1/calculators/compound-interest
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

principal
number required
10000

Starting balance in USD.

rate
number required
1

Interest rate in % per compounding period.

duration
integer required
5

Length of the projection (years are capped at 50).

duration_unit
string optional
years

years (default) or months.

compound_frequency
string optional
monthly

daily, weekly, monthly (default), quarterly or annually.

contribution
number optional
100

Recurring deposit in USD (default 0).

contribution_frequency
string optional
monthly

daily, weekly, monthly (default), quarterly or annually.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/calculators/compound-interest?principal=10000&rate=1&duration=5&duration_unit=years&compound_frequency=monthly&contribution=100&contribution_frequency=monthly" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Loan vs sell calculator

Borrow against crypto vs sell it — compares both scenarios using the coin's CURRENT price. Informational projection, not financial advice.

GET
http://localhost/api/v1/calculators/loan
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

slug
string required
bitcoin

The coin's slug identifier.

crypto_amount
number required
2

How much of the coin you hold.

needed_cash
number required
50000

USD you need to free up.

term_months
integer optional
36

Loan term in months (default 36).

interest_rate
number optional
10

Loan APR in % (default 10).

ltv
number optional
50

Loan-to-value ratio in % (default 50).

expected_growth
number optional
25

Expected coin price growth over the term in % (default 25).

tax_rate
number optional
25

Capital-gains tax in % applied to the sale (default 25).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/calculators/loan?slug=bitcoin&crypto_amount=2&needed_cash=50000&term_months=36&interest_rate=10&ltv=50&expected_growth=25&tax_rate=25" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Staking rewards calculator

Pure math — staking rewards with optional compounding and a validator commission. No market data is read.

GET
http://localhost/api/v1/calculators/staking
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

amount
number required
1000

Amount staked, in the staked asset's units.

period
number required
2

Length of the staking period (capped at the 50-year equivalent).

period_unit
string optional
years

years (default), months or days.

apy
number required
5

Advertised APY in %.

compound_frequency
string optional
monthly

never, daily, weekly, monthly (default) or yearly.

commission
number optional
10

Validator commission in %, taken from rewards (default 0).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/calculators/staking?amount=1000&period=2&period_unit=years&apy=5&compound_frequency=monthly&commission=10" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
8 endpoints

Editorial

Editorial articles — published (ACTIVE) only. locale picks the content language with per-field English fallback (the payload reports which locale actually won). Articles can be filtered by tag or by a related coin/exchange/wallet slug. API reads deliberately do NOT increment view counts.

Coin videos

Curated videos attached to a coin (the coin page's Videos tab), paginated.

GET
http://localhost/api/v1/coins/{slug}/videos
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin's slug identifier.

Query parameters

page
integer optional
1

Page number (1-based).

per_page
integer optional
10

Rows per page (1–50, default 10).

type
string optional
review

Filter by video type (e.g. overview, tutorial, explainer, review, analysis, news).

search
string optional
halving

Free-text match on the title.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/videos?page=1&per_page=10&type=review&search=halving" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Coin insight timeline

The coin's insight timeline — the same payload the asset page's insights panel uses, windowed by offset/limit.

GET
http://localhost/api/v1/coins/{slug}/insights
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
bitcoin

The coin's slug identifier.

Query parameters

locale
string optional
en

Content language (falls back to English).

offset
integer optional
0

Rows to skip (0–500, default 0).

limit
integer optional
5

Rows to return (1–50, default 5).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/coins/bitcoin/insights?locale=en&offset=0&limit=5" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List articles

Published articles, newest first, paginated. Filter by tag or by a related coin / exchange / wallet slug, or free-text search. Each row is a summary (title, subtitle, tags, reading time, hero image, related entities, dates).

GET
http://localhost/api/v1/articles
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based).

per_page
integer optional
20

Rows per page (1–50, default 20).

locale
string optional
en

Content language (falls back to English).

tag
string optional
guide

Filter by tag: news, guide, tutorial, explainer, analysis, review, trading, overview or information.

coin
string optional
bitcoin

Filter to articles related to this coin slug.

exchange
string optional
binance-exchange

Filter to articles related to this exchange slug.

wallet
string optional
frostsnap

Filter to articles related to this wallet slug.

search
string optional
halving

Free-text match on heading/subheading.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/articles?page=1&per_page=20&locale=en&tag=guide&coin=bitcoin&exchange=binance-exchange&wallet=frostsnap&search=halving" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get an article

One published article with its full body, tags, hero image, helpful counters and related entities. locale picks the content language with per-field English fallback (the payload reports which locale actually won).

GET
http://localhost/api/v1/articles/{slug}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
what-is-bitcoin

The article's slug.

Query parameters

locale
string optional
en

Content language (falls back to English).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/articles/what-is-bitcoin?locale=en" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Submit article feedback

Registers a thumbs-up/down on an article — the same counters the web's helpful buttons use. Per-key throttling applies upstream.

POST
http://localhost/api/v1/articles/{slug}/feedback
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

slug
string required
what-is-bitcoin

The article's slug.

Body parameters

helpful
boolean required
true

true for helpful, false for not helpful.

Request

curl --request POST \
    "http://localhost/api/v1/articles/what-is-bitcoin/feedback" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"helpful\": true
}"

Get a video

One curated video with its YouTube id, title, type, duration and the coins/exchanges/wallets it is attached to.

GET
http://localhost/api/v1/videos/{id}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
87

The video id.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/videos/87" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

List insights

AI-generated market insights, paginated. Filter by type, a related coin slug or free-text search; locale picks the headline/summary language with English fallback.

GET
http://localhost/api/v1/insights
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based).

per_page
integer optional
20

Rows per page (1–50, default 20).

locale
string optional
en

Content language (falls back to English).

type
string optional
per_asset

Filter by insight type: per_asset, market_overview or narrative.

coin
string optional
bitcoin

Filter to insights about this coin slug.

search
string optional
etf

Free-text match on the headline.

sort
string optional
first_reported

Sort order: first_reported (default) or last_updated.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/insights?page=1&per_page=20&locale=en&type=per_asset&coin=bitcoin&search=etf&sort=first_reported" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Get an insight

One insight with its full payload — headline, summary, source-article timeline and related coins.

GET
http://localhost/api/v1/insights/{id}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
101

The insight id.

Query parameters

locale
string optional
en

Content language (falls back to English).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/insights/101?locale=en" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
3 endpoints

Alarms

Price-alarm CRUD — the same alarms the web app manages. Alarms consume the key owner's alarm inventory balance, are TARGET-type on coins only, and an above/below vs current-value guard blocks alarms that would self-trigger instantly. Key-scoped (the API key sets the owner) and never response-cached.

List alarms

The key owner's alarms, newest first, paginated. Filter by status, direction or notification channel.

GET
http://localhost/api/v1/alarms
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Query parameters

page
integer optional
1

Page number (1-based).

per_page
integer optional
25

Rows per page (1–100, default 25).

status
string optional
active

Filter by state: active or triggered.

direction
string optional
above

Filter by trigger direction: above or below.

notification
string optional
email

Filter by delivery channel: email, push or webhook.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/alarms?page=1&per_page=25&status=active&direction=above&notification=email" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Create an alarm

Creates a TARGET alarm on a coin and spends one alarm slot from the key owner's balance. The target is checked against the coin's current value so the alarm cannot self-trigger instantly: an above alarm must target more than the current value, a below alarm less.

POST
http://localhost/api/v1/alarms
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Body parameters

name
string required
BTC six figures

A label for the alarm (max 255 characters).

coin
string required
bitcoin

The coin's slug identifier.

metric
string required
rate

The watched metric: rate, volume or marketcap.

direction
string required
above

Trigger direction: above or below.

target
number required
100000

The threshold value (must sit on the direction side of the coin's current value).

notification
string required
email

Delivery channel: email, push or webhook.

Request

curl --request POST \
    "http://localhost/api/v1/alarms" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"BTC six figures\",
    \"coin\": \"bitcoin\",
    \"metric\": \"rate\",
    \"direction\": \"above\",
    \"target\": 100000,
    \"notification\": \"email\"
}"

Delete an alarm

Deletes one of the key owner's alarms and refunds the alarm slot it consumed.

DELETE
http://localhost/api/v1/alarms/{id}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
42

The alarm id.

Request

curl --request DELETE \
    "http://localhost/api/v1/alarms/42" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
5 endpoints

Webhooks

Bitculator POSTs each event as JSON with an HMAC signature header:

X-Bitculator-Signature: t=<unix-ts>,v1=<hex hmac_sha256("<ts>.<raw-body>", secret)>
X-Bitculator-Event: alarm.triggered

Verify it by recomputing the HMAC over "." with your endpoint secret and comparing in constant time; reject if t is older than a few minutes (replay guard). Example (PHP):

[$t, $v1] = sscanf($_SERVER['HTTP_X_BITCULATOR_SIGNATURE'], 't=%d,v1=%s');
$expected = hash_hmac('sha256', $t.'.'.file_get_contents('php://input'), $secret);
abort_unless(hash_equals($expected, $v1) && abs(time() - $t) < 300, 403);

Supported events: alarm.triggered. Deliveries retry 3× with backoff; an endpoint auto-disables after 10 consecutive failed deliveries.

List webhook endpoints

The key owner's webhook endpoints, newest first. Signing secrets are never included — each secret is shown exactly once, at creation.

GET
http://localhost/api/v1/webhooks
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/webhooks" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Create a webhook endpoint

Registers an HTTPS endpoint (max 5 per account) for event deliveries. The response includes the signing secret — the ONLY time it is ever shown, so store it immediately.

POST
http://localhost/api/v1/webhooks
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Body parameters

url
string required
https://example.com/webhooks/bitculator

The HTTPS delivery URL. Public hosts only — internal/private addresses are rejected.

events
string[] required
["alarm.triggered"]

Events to subscribe to. Allowed values: alarm.triggered.

Request

curl --request POST \
    "http://localhost/api/v1/webhooks" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"url\": \"https:\\/\\/example.com\\/webhooks\\/bitculator\",
    \"events\": [
        \"alarm.triggered\"
    ]
}"

Delete a webhook endpoint

Deletes one of the key owner's webhook endpoints. Pending deliveries to it are abandoned.

DELETE
http://localhost/api/v1/webhooks/{id}
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
7

The webhook endpoint id.

Request

curl --request DELETE \
    "http://localhost/api/v1/webhooks/7" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Send a test event

Fires a signed alarm.triggered test event (test: true in the payload, real signature headers) so receivers can be verified end-to-end.

POST
http://localhost/api/v1/webhooks/{id}/test
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
7

The webhook endpoint id.

Request

curl --request POST \
    "http://localhost/api/v1/webhooks/7/test" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Webhook delivery log

The endpoint's delivery attempts (kept 30 days), newest first, paginated.

GET
http://localhost/api/v1/webhooks/{id}/deliveries
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

Path parameters

id
integer required
7

The webhook endpoint id.

Query parameters

page
integer optional
1

Page number (1-based).

per_page
integer optional
25

Rows per page (1–100, default 25).

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/webhooks/7/deliveries?page=1&per_page=25" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
3 endpoints

Meta

API meta and introspection: an authenticated ping to verify a key and the middleware stack, current-key usage/quota, and the machine-readable OpenAPI spec.

OpenAPI spec

The machine-readable OpenAPI 3 document for this API, as JSON — point codegen or API tooling at this URL. Public: no key required.

GET
http://localhost/api/v1/openapi.json
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/openapi.json" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Ping

An authenticated no-op for verifying a Data API key end-to-end (auth.api → per-plan burst throttle → monthly quota). It counts against the quota like any other call.

GET
http://localhost/api/v1/ping
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/ping" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Key usage & quota

Usage introspection for the calling key's owner: the Data API plan, its monthly limit, used and remaining (always matching the X-Quota-* headers), the current period window, and per-endpoint / per-token breakdowns. Embed-widget usage has its own plan and pool — it never appears here.

GET
http://localhost/api/v1/usage
Bearer
bc_••••••••••••••••

Keys are Bearer-only and carry the data-api ability — keep them server-side.

GET request — no request body.

Request

curl --request GET \
    --get "http://localhost/api/v1/usage" \
    --header "Authorization: Bearer {YOUR_API_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"