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 URL | https://partner.infinitequant.app |
| Feed endpoint | GET /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
/apikeyagain 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
| Param | Default | Description |
|---|---|---|
after_id | 0 | Return only submissions with id greater than this — your poll cursor. When set, results are ascending. |
status | all | all, open (still running), or closed (resolved). |
limit | 50 | 1–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
| Field | Type | Notes |
|---|---|---|
id | integer | Monotonic. Use as your after_id cursor. |
asset | string | e.g. BTCUSD, XAUUSD, EURUSD. |
asset_class | string | crypto, forex-commodities, … |
direction | string | LONG or SHORT. |
entry / stop / target | number | Price levels. 1 : 1 risk-reward. |
status | string | open · won · lost · washed (timed out). |
result_bps | number | null | Realized basis points on a resolved call; null while open or washed. |
horizon_hours | integer | Max time to resolve. |
submitted_at | string | ISO-8601 UTC. |
trader | object | The submitter’s track record — see below. |
trader object
| Field | Type | Notes |
|---|---|---|
id | integer | Stable submitter id — group a trader’s calls by this. |
name | string | Display name. |
tier | string | WARMUP · ACTIVE · QUALIFIED · SHARP · WOLF. |
qualified | boolean | Past the warmup gate at ≥55% hit-rate. |
hit_rate_pct | number | Lifetime decisive win rate. |
decisive / won / lost | integer | Decisive count and the W/L split behind it. |
avg_r | number | Average R per call (1R = the stop distance). |
avg_mfe_bps / avg_mae_bps | number | Average favorable / adverse excursion, bps from entry. |
bittensor_hotkey | string | null | SN89 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
| HTTP | Meaning |
|---|---|
401 | Missing, malformed, revoked, or unknown bearer key. |
403 | Key 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.