INFINITE·QUANT
Signal API · for builders

The signal firehose

Every submission from every trader — unfiltered — each enriched with the submitter’s full track record (win rate, tier, W/L, average R, MFE/MAE). The same raw data the desk uses to build its copy-trade algorithm: you get all the trades and all the trader stats, and build your own logic.

The API is intentionally unfiltered. The desk’s algo-filtered, risk-adjusted stream is delivered over the Premium Telegram channel — not here. Active subscription required ($49/mo); not subscribed? Subscribe.

Overview

  • One read-only endpoint returns every submission as JSON, each with the submitter’s track record embedded.
  • No algo filtering — all trades from all traders, qualified or not. You decide what to act on.
  • Authenticated with a bearer API key tied to your subscription — valid only while active.
  • Poll on a cursor (after_id) to stream new submissions; no webhooks required.
Base URLhttps://partner.infinitequant.app
Feed endpointGET /api/signals/feed

Get your API key

Your key is issued by the bot — no dashboard needed.

  • DM @Iqsignals2026_bot and subscribe with /payment (if you haven’t already).
  • Once active, send /apikey — the bot DMs your key.
  • Running /apikey again rotates it; the previous key stops working immediately.

The key stays valid only while your subscription is active. When it lapses, the feed returns 403 until you renew with /payment.

Authentication

Pass your key as a bearer token on every request:

Authorization: Bearer <your-api-key>

GET /api/signals/feed

Returns every submission, newest first, each with the submitter’s track record. {"filtered": false} on every response — this is the raw stream. (/api/signals/premium-feed is a back-compat alias for the same endpoint.)

Query parameters

ParamDefaultDescription
after_id0Return only submissions with id greater than this — your poll cursor. When set, results are ascending.
statusallall, open (still running), or closed (resolved).
limit501–200 submissions per response.

Example

curl -s "https://partner.infinitequant.app/api/signals/feed?status=open&limit=10" \
  -H "Authorization: Bearer $IQ_KEY"

Response

{
  "ok": true,
  "count": 1,
  "filtered": false,
  "signals": [
    {
      "id": 1499,
      "submitted_at": "2026-06-21T17:27:04.714Z",
      "asset": "XAUUSD",
      "asset_class": "forex-commodities",
      "direction": "LONG",
      "entry": 4154.72,
      "stop": 4118.16,
      "target": 4191.28,
      "status": "open",
      "result_bps": null,
      "horizon_hours": 12,
      "trader": {
        "id": 15,
        "name": "Xau Jean",
        "tier": "QUALIFIED",
        "qualified": true,
        "hit_rate_pct": 53.85,
        "decisive": 39,
        "won": 21,
        "lost": 18,
        "avg_r": 0.12,
        "avg_mfe_bps": 86.5,
        "avg_mae_bps": -81.6,
        "bittensor_hotkey": "5GP8Ca…C5XP"
      }
    }
  ]
}

Signal object

FieldTypeNotes
idintegerMonotonic. Use as your after_id cursor.
assetstringe.g. BTCUSD, XAUUSD, EURUSD.
asset_classstringcrypto, forex-commodities, …
directionstringLONG or SHORT.
entry / stop / targetnumberPrice levels. 1 : 1 risk-reward.
statusstringopen · won · lost · washed (timed out).
result_bpsnumber | nullRealized basis points on a resolved call; null while open or washed.
horizon_hoursintegerMax time to resolve.
submitted_atstringISO-8601 UTC.
traderobjectThe submitter’s track record — see below.

trader object

FieldTypeNotes
idintegerStable submitter id — group a trader’s calls by this.
namestringDisplay name.
tierstringWARMUP · ACTIVE · QUALIFIED · SHARP · WOLF.
qualifiedbooleanPast the warmup gate at ≥55% hit-rate.
hit_rate_pctnumberLifetime decisive win rate.
decisive / won / lostintegerDecisive count and the W/L split behind it.
avg_rnumberAverage R per call (1R = the stop distance).
avg_mfe_bps / avg_mae_bpsnumberAverage favorable / adverse excursion, bps from entry.
bittensor_hotkeystring | nullSN89 hotkey, if registered.

Build your own copy logic on top: weight by tier / hit_rate_pct, require a minimum decisive, gate on avg_r — whatever your model needs.

Polling pattern

Track the highest id you’ve seen and pass it as after_id to get only new calls:

cursor = 0
loop every 30s:
    res = GET /api/signals/premium-feed?after_id={cursor}
    for sig in res.signals:        # ascending when after_id > 0
        handle(sig)
        cursor = max(cursor, sig.id)

Polling every ~30s is plenty — calls fire a handful of times a day. The Telegram channel remains the human-readable mirror of this same feed.

Errors

HTTPMeaning
401Missing, malformed, revoked, or unknown bearer key.
403Key is valid but the subscription isn’t active — renew with /payment.

Support

Questions, or want webhook push instead of polling? DM the desk on Telegram at @Iqsignals2026_bot.