Skip to content
getcoinsight

Developer API

REST API for markets, technical analysis and news — same data that powers this site. OpenAPI spec (JSON)

Authentication

Every request needs an API key in the Authorization header.

curl -H "Authorization: Bearer gcs_YOUR_KEY" \
  "https://getcoinsight.com/api/v1/markets?limit=10"

Create and manage keys in your profile

Daily quotas

Free100 requests/day
Radar1,000 requests/day
Pro10,000 requests/day
Trader+100,000 requests/day

Every plan includes API access, Free too. /analysis returns real-time candles on every plan; /fundamental requires a plan with fundamental analysis (Pro and above). All of an account's keys share one daily quota, with a burst limit of 60 requests per minute.

Responses include X-RateLimit-Limit and X-RateLimit-Remaining headers. Over quota → HTTP 429.

Endpoints

  • GET /api/v1/markets?limit=100

    Top coins by market cap: price, market cap, volume, 1h/24h/7d change.

  • GET /api/v1/candles?symbol=btc&id=bitcoin&interval=1h&limit=300

    OHLCV candles (oldest first, unix-second bar times) — the exact series /analysis is computed on, up to your plan's history window.

  • GET /api/v1/analysis?symbol=btc&id=bitcoin&interval=1h

    Technical snapshot: price, trend, RSI/ADX/ATR, TA consensus rating, regime, composite score. Intervals: 1m–1M.

  • GET /api/v1/fundamental?assetId=bitcoin

    Fundamental Score: peer-group percentile across 5 categories + 90-day history; without assetId — latest-scores list. Requires a plan with fundamental analysis.

  • GET /api/v1/announcements?kind=listings&days=7

    Exchange listing / delisting / caution announcements (Binance, Bybit, OKX, Upbit, Bithumb) with the price at publication, 3 minutes later and when our radar caught it, and the 1h / 24h / 7d moves. Free keys see a row 10 minutes after detection and the last 30 days; Radar+ at once and the whole archive since 2021.

  • GET /api/v1/news?limit=30

    Aggregated crypto headlines (CoinDesk, Cointelegraph, Decrypt, The Block, Bitcoin Magazine).

  • GET /api/v1/presets

    Screener presets: id, name, the filters each applies, its trade side, and which filters your plan would drop.

  • GET /api/v1/funding?limit=100&sort=fundingAbs

    Perp funding (8h-equivalent, Binance/Bybit) with Bybit/OKX/Hyperliquid comparison, basis, open interest and its 1h/4h/24h change. Sort: rank, funding, fundingAbs, oiUsd, oiChangePct.

  • GET /api/v1/screener?preset=oversold_reversal&interval=4h

    Run a screen: a preset and/or filters on 15m–1w over your plan's universe. Returns current matches with score, setup levels and the TradingView ticker.

All endpoints return JSON: { "data": … } on success, { "error": "code" } otherwise. CORS is open — callable from browsers and servers.

Every authenticated response also carries X-RateLimit-Reset (unix seconds of the next reset, 00:00 UTC). 429 and 502 responses carry Retry-After in seconds — wait that long; never retry a 4xx unchanged. An unknown symbol is 404 unknown_symbol. Within v1 fields are only ever added, never removed or retyped.

The screener can also answer 503 busy (every scan slot is taken) or 502 upstream_degraded (most coins could not be read) — both carry Retry-After and are refunded. Any method other than GET gets a JSON 405.

For a bot the announcement webhook below is the better feed: it is pushed and retried. Polling announcements: pass since=<addedAt in ms>, then on every next call the nextCursor of the previous response as cursor. Rows come in the order our radar added them, so a notice caught late is never skipped; deduplicate by id. Without since, rows are newest-published first — page older with cursor while hasMore is true. A poll that returns no rows costs no quota unit once per 10 seconds per account (quotaCharged: false), so polling every 10 seconds fits any plan; a page with rows counts as usual.

# first call: everything added in the last hour, oldest first
curl -H "Authorization: Bearer gcs_YOUR_KEY" \
  "https://getcoinsight.com/api/v1/announcements?since=$(( $(date +%s) * 1000 - 3600000 ))"
# every next call: the nextCursor of the previous response
curl -H "Authorization: Bearer gcs_YOUR_KEY" \
  "https://getcoinsight.com/api/v1/announcements?cursor=NEXT_CURSOR"

Prices per ticker: priceAtAnnouncement and move1hPct / move24hPct / move7dPct are from the publication minute — kept for compatibility, not a price you could trade on a fast listing. priceAt3m with movesFrom3m (and movesFrom3mVsBtc, minus BTC's move) starts 3 minutes after publication — the base of the site's statistics; priceAtDetection with movesFromDetection starts when our radar caught the notice. Every horizon ends at one time, horizonsEndAt (publication minute + 1h / 24h / 7d): "1h" from +3 min spans 57 minutes, and a horizon with less than 75% of it left at our catch has no move from detection. No fees, slippage or funding.

Bot fields (API and webhook): market (spot / perp / alpha / tradfi), quotes (the quote markets the title names, e.g. KRW, BTC, USDT — empty when not stated), tradingStartsAt (only when the title states a time; null otherwise — the notice body is not parsed), detectedAt (when our radar first saw it) and tradable — the venue market codes to trade: role notice = the market the notice is about (INITUSDT, KRW-INIT, INIT-USD), role reference = the Binance/Bybit market our prices are read from.

Screener API

Run any screener preset or your own filters from code — the same engine, universe and plan gates as the website. Each result carries the setup levels and a TradingView ticker, ready for a bot.

curl -H "Authorization: Bearer gcs_YOUR_KEY" \
  "https://getcoinsight.com/api/v1/screener?preset=strong_uptrend&interval=4h&universe=100&limit=10"

# explicit filters (override the preset's):
curl -G -H "Authorization: Bearer gcs_YOUR_KEY" \
  "https://getcoinsight.com/api/v1/screener" \
  --data-urlencode 'filters={"rsiMax":35,"sma200":"above"}' \
  --data-urlencode "interval=1h"
{ "data": { "preset": "strong_uptrend", "interval": "4h", "universe": 100,
  "scanned": 97, "matched": 7, "skippedYoung": 2, "errored": 1,
  "scannedAt": "2026-10-01T18:30:08.283Z", "results": [ {
    "id": "solana", "symbol": "SOL", "rank": 6, "price": 152.3, "compositeScore": 0.41,
    "rating": "buy", "regime": "trending_up", "rsi": 61.2, "adx": 27.4, "atrPct": 2.1,
    "tvTicker": "BINANCE:SOLUSDT.P",
    "venue": { "exchange": "binance", "market": "perp", "symbol": "SOLUSDT" },
    "setup": { "side": "long", "entry": 152.3, "stop": 146.9, "targets": [161.2, 168],
               "rr": 1.6, "rrNet": 1.4, "viable": true, "status": "idea", "watchReason": null } } ] } }

Parameters: preset, filters (JSON), interval (15m, 1h, 4h, 1d, 1w), universe (capped by your plan), limit. At most 6 scans per minute. preset: oversold_reversal, overbought_rejection, volume_spike, volume_dump, breakout, breakdown, strong_uptrend, strong_downtrend, trend_pullback, downtrend_rally, bearish_breakdown, overbought, deep_drawdown, momentum_7d, accumulation, bb_squeeze, mean_reversion, relative_strength, deriv_squeeze, short_squeeze, smart_money, multi_pillar, strong_shorts, range_long, range_short, dip_weekly_uptrend, oi_build_flat, ema_cross_btc_up. Numeric shorthands: rsiMin, rsiMax, scoreMin, scoreMax, relVolumeMin, adxMin, adxMax, change24hMin, change24hMax, change7dMin, change7dMax, volumeMin.

Webhooks for trading bots

Alerts, saved-screen matches and the daily ideas can be POSTed to your own https URL. Choose the body format in Profile → Notifications.

  • JSON — one request per notification with structured fields (event type, symbol, TradingView ticker per venue, side, price, timeframe, alert id, entry/stop/targets) plus the original subject/text/url fields.
  • 3Commas — one request per signal in 3Commas Signal Bot format; paste your bot's secret and bot_uuid into the template.
  • Cornix — one plain-text Cornix-style signal per event (pair, exchange, direction, entry, take-profits, stop).
  • Custom — your own template with placeholders in double curly braces; TradingView-style names such as ticker, exchange, close and interval work too.
{ "event": "notification", "type": "price_alert", "version": 2,
  "subject": "…", "text": "…", "url": "https://getcoinsight.com/…", "timestamp": "2026-01-01T12:00:00.000Z",
  "symbol": "BTC", "base": "BTC", "quote": "USDT", "coinId": "bitcoin",
  "exchange": "binance", "market": "perp", "venueSymbol": "BTCUSDT", "ticker": "BINANCE:BTCUSDT.P",
  "tickers": { "binance": "BINANCE:BTCUSDT.P", "bybit": "BYBIT:BTCUSDT.P", "okx": "OKX:BTCUSDT.P" },
  "side": "long", "direction": "above", "price": 65000, "timeframe": "1h",
  "alertId": "clx…", "alertType": "price_above", "threshold": 65000,
  "entry": 65000, "stop": 63500, "targets": [67500, 70000], "rr": 1.7,
  "assetUrl": "https://getcoinsight.com/coin/bitcoin?symbol=btc&interval=1h",
  "signals": [ { "event": "price_alert", "symbol": "BTC", … } ] }

3Commas Signal Bot template:

{
  "secret": "PASTE_3COMMAS_SECRET",
  "max_lag": "300",
  "timestamp": "{{timenow}}",
  "trigger_price": "{{close}}",
  "tv_exchange": "{{exchange}}",
  "tv_instrument": "{{ticker}}",
  "action": "{{action}}",
  "bot_uuid": "PASTE_BOT_UUID"
}

Placeholders: {{event}} {{kind}} {{symbol}} {{base}} {{quote}} {{coin_id}} {{tv_symbol}} {{ticker}} {{exchange}} {{tv_exchange}} {{tv_instrument}} {{venue}} {{market}} {{venue_symbol}} {{pair}} {{pair_3commas}} {{side}} {{direction}} {{action}} {{exit_action}} {{intent}} {{price}} {{close}} {{timeframe}} {{interval}} {{alert_id}} {{alert_type}} {{threshold}} {{screen_id}} {{screen_name}} {{entry}} {{stop}} {{target1}} {{target2}} {{targets}} {{rr}} {{url}} {{timestamp}} {{timenow}} {{subject}} {{text}} {{signal_id}} {{test}} {{leverage}} {{disclaimer}}

The action placeholder is enter_long / enter_short ONLY for signals you opted into bot trading: an alert's Bot choice (long, short or follow the setup side), a saved screen's “Send to bot” (confirmed closed-bar setups only), or the daily-ideas toggle. A price crossing never implies a direction by itself. Everything else is informational and never reaches 3Commas or Cornix. Each signal carries signal_id and its original timestamp; a signal is never re-sent, never sent more than 5 minutes late, and at most your daily bot limit (≤ 10) goes out per 24h.

Bracket alerts: touching the entry sends enter_long / enter_short with the bracket's stop and targets; the stop (or the trailed stop) and the last target send exit_long / exit_short — only to a bot that received our entry. Cornix gets the entry with its stop and targets and closes on its own. A coin without a verified exchange market, a stock sent to 3Commas / Cornix, a short on a spot market, or a direction that contradicts the signal's own levels is never sent as a trade.

Every request is signed: X-GCS-Signature: sha256=HMAC(body, your secret). Bot formats send at most 10 signals per notification.

Announcement webhook (Radar and above)

Every listing, delisting or caution notice that matches your announcement settings is POSTed as JSON (event "announcement") when our radar catches it — JSON format only. Each attempt has an 8-second deadline and redirects are not followed: answer 2xx quickly. A failed attempt is retried with a backoff growing to 30 minutes, up to 9 attempts over about 2 hours, so a delivery can arrive late. Deduplicate by eventId (also the X-Getcoinsight-Delivery header; attempt and X-Getcoinsight-Attempt count the tries) and judge freshness by announcement.detectedAt or firstAttemptAt — timestamp is the send time of that attempt. Backfill anything missed from /api/v1/announcements?since=…. After 20 failed deliveries in a row the webhook is switched off and you get a notice in the bell.

POST <your https URL>
Content-Type: application/json
X-GCS-Signature: sha256=<hex HMAC-SHA256 of the raw body, your secret>
X-Getcoinsight-Delivery: announcement:binance:1234567
X-Getcoinsight-Attempt: 1

{ "event": "announcement", "type": "announcement", "version": 2,
  "subject": "…", "text": "…", "url": "https://getcoinsight.com/…", "timestamp": "2026-10-26T09:00:04.120Z",
  "eventId": "announcement:binance:1234567", "attempt": 1, "firstAttemptAt": "2026-10-26T09:00:04.100Z",
  "disclaimer": "…", "signals": [],
  "announcement": { "id": "binance:1234567", "exchange": "binance", "kind": "listing",
    "title": "Binance Will List X (X)", "symbols": ["X"],
    "publishedAt": "2026-10-26T09:00:00.000Z", "noticeUrl": "https://www.binance.com/…",
    "market": "spot", "quotes": ["USDT"], "tradingStartsAt": null, "detectedAt": "2026-10-26T09:00:03.900Z",
    "tradable": [ { "base": "X", "venue": "binance", "type": "spot", "symbol": "XUSDT", "role": "notice" } ],
    "eventId": "announcement:binance:1234567", "attempt": 1, "firstAttemptAt": "2026-10-26T09:00:04.100Z" } }

Set up your webhook in Profile → Notifications →