Intelligence API
READ: feed, views, datasets, markets under /api/v1/intelligence/*. sk_live_… server-side (Authentication). Read-only. Execution → Actions, chat → Assistant API. Aliases → API Layout.
At a Glance
| Base URL | https://app.torque.fi/api/v1 |
| Primary Route | GET /api/v1/intelligence/feed |
| Auth | Authorization: Bearer sk_live_… (business API key) |
| Platform catalog | 21: GET /api/v1/capabilities → manifestVersion |
| Intelligence schema | 7: feed meta.manifestVersion / capabilities.intelligence.schemaVersion |
| Conditional GET | If-None-Match + ETag → 304 |
| Canonical item | IntelligenceItemV1 (bias: Buy|Sell|Watch|Yes|No) |
| Integrator status | GET /api/v1/accounts/business |
Read Profiles
| Profile | Prefix | Use when |
|---|---|---|
| feed | /intelligence/feed, /intelligence/views/* | Editorial carousel: IntelligenceItemV1 |
| dataset | /intelligence/datasets/* | Pipeline DTOs (events, earnings) |
| market | /intelligence/markets/* | Yield & lend/borrow rate tiles |
Get Started
# sk_live_… → app.torque.fi → API Integration (server only)
curl -sS "https://app.torque.fi/api/v1/capabilities" | jq '.manifestVersion, .intelligence.primary'
export TORQUE_KEY="sk_live_…"
curl -sS "https://app.torque.fi/api/v1/intelligence/feed?chainId=8453&includeBrief=1&walletAddress=0x…" \
-H "Authorization: Bearer $TORQUE_KEY" \
| jq '.meta.manifestVersion, (.items | length), .brief.summary'Primary Feed
GET https://app.torque.fi/api/v1/intelligence/feed
Query Parameters
| Param | Default | Description |
|---|---|---|
| walletAddress | n/a | Personalize trade angles & outlook context |
| chainId | 8453 (Base) | Chain for action deep links in items |
| lanes | all | Comma-separated: timely, desk, outlook |
| kinds | signal,angle | Comma-separated: signal, angle, brief, outlook |
| limit | 12 (max 24) | Max items in flat items[] |
| includeBrief | 0 | Set 1 to include brief object |
| force | 0 | Set 1 to force live angle reroll (cooldown applies) |
Response Shape
{
"meta": {
"manifestVersion": 7,
"generatedAtMs": 1710000000000,
"bundleIngestedAtMs": 1710000004500,
"personalized": true,
"walletAddress": "0x892e…",
"chainId": 8453,
"resolution": {
"angles": { "tier": "pool", "ageMs": 120000 },
"signals": { "tier": "live", "bundleAgeMs": 45000 }
},
"dedupedCount": 2
},
"brief": { "id": "…", "kind": "brief", "title": "…", "summary": "…", "symbols": ["ETH"] },
"lanes": {
"timely": { "id": "timely", "label": "Happening now", "items": [/* signal */] },
"desk": { "id": "desk", "label": "Trade angles", "items": [/* angle */] }
},
"items": [/* flat, deduped, server-ranked list */]
}Render items[] or pre-partitioned lanes.desk / lanes.timely. includeBrief=1 → hero brief.summary.
Data Model: IntelligenceItemV1
One IntelligenceItemV1 shape across v7: single list/carousel; branch on kind; ignore unknown kinds.
| kind | Meaning | Typical Lane |
|---|---|---|
| signal | Proactive / happening-now market event | timely |
| angle | Desk trade read with bias & levels | desk |
| brief | Hero one-liner for home / notification surfaces | n/a (top-level brief field) |
| outlook | Stored market outlook synthesis per wallet | outlook |
{
"id": "desk_ETH_watch_gmq2sjj9i",
"kind": "angle",
"title": "ETH tokenization megatrend, short squeeze potential",
"summary": "Ethereum looks constructive toward $1,600…",
"horizon": "swing",
"symbols": ["ETH"],
"bias": "Watch",
"relevanceScore": 4,
"levels": { "last": 1554.71, "invalidation": 1530, "target": 1600 },
"source": { "type": "desk", "label": "Torque desk synthesis" },
"actions": [
{ "label": "Buy ETH", "href": "/trade?sell=usd&buy=eth", "chainId": 8453, "iconSymbol": "ETH" }
],
"dedupeKey": "eth-tokenization-megatrend",
"ingestedAtMs": 1710000000000,
"resolution": { "tier": "pool", "ageMs": 312564 }
}Display body is summary. Server dedupes via dedupeKey; no client merge.
Enriched Action Tiles
Optional actions[] deep links per item. Live rate tables → Markets.
| Field | Example | Use |
|---|---|---|
| label | "Lend USD" | Primary tile title |
| subtitle | "Earn 23.45% APY on USD via Aave." | Secondary line |
| href | /lend?supply=usd | Torque app path |
| torqueUrl | https://app.torque.fi/lend?… | Absolute link for partners |
| apyPercent / aprPercent | 23.45 / 3.35 | Supply yield / borrow rate |
| opportunityType | lend | borrow | trade | perp | other | Tile category |
| protocol | "Aave" | Venue label |
| idleUsd / estimatedAnnualUsd | n/a | Personalized yield only |
Specialized Views
Prefer /feed; views for smaller payloads or legacy keys.
| Route | Equivalent Feed Filter | Response |
|---|---|---|
| GET …/trade-angles | kinds=angle, lanes=desk | { ideas: IntelligenceItemV1[], meta } |
| GET …/happening-now | kinds=signal, lanes=timely | { items, ingestedAtMs, meta } |
| GET …/brief | includeBrief=1 | { brief: IntelligenceItemV1 } |
| GET …/market-outlook | kinds=outlook, wallet required | { item, meta }: 404 when none stored |
SDK Methods
| Endpoint | torque-node / torque-intelligence | Returns |
|---|---|---|
| GET …/intelligence/feed | getFeed() | Signals, angles, brief, lanes |
| GET …/intelligence/views/trade-angles | getTradeAngles() / getView() | Desk trade angles |
| GET …/intelligence/views/happening-now | getHappeningNow() / getView() | Timely macro & market signals |
| GET …/intelligence/views/brief | getView('brief') | Single brief item |
| GET …/intelligence/views/market-outlook | getView('market-outlook') | Stored outlook for wallet |
| GET …/intelligence/markets/yield | getYieldOpportunities() | Idle cash APY tiles |
| GET …/intelligence/markets/lending | getLendingOpportunities() | Lend/borrow catalog rates |
| GET …/intelligence/datasets/* | getDataset(id, params?) | Pipeline DTOs (Pro SKUs) |
Datasets (read profile dataset)
Pipeline DTOs: GET /intelligence/datasets/* (aliases /data/*, /widgets/*). Pro SKUs need Platform Data Pro on your account.
| SKU | Route | Status | Tier | SDK |
|---|---|---|---|---|
| earnings-spotlight | GET /api/v1/intelligence/datasets/earnings-spotlight | Shipped | Pro | getDataset('earnings-spotlight') |
| events | GET /api/v1/intelligence/datasets/events | Shipped | Pro | getDataset('events', { days }) |
| movers | GET /api/v1/data/movers | Planned | Pro | n/a |
| flight-radar | GET /api/v1/data/flight-radar | Planned | Pro | n/a |
| marine-traffic | GET /api/v1/data/marine-traffic | Planned | Pro | n/a |
| allocation | GET /api/v1/data/allocation?walletAddress= | Planned | Pro | n/a |
GET /api/v1/intelligence/datasets/events
FOMC schedule, curated US macro, tracked earnings. Query days (default 90, max 365). Legacy alias /data/events.
curl -sS "https://app.torque.fi/api/v1/intelligence/datasets/events?days=30" \
-H "Authorization: Bearer sk_live_…"GET /api/v1/intelligence/datasets/earnings-spotlight
Upcoming earnings (~14 days), estimates, perp/spot flags. Legacy alias /data/earnings-spotlight.
curl -sS "https://app.torque.fi/api/v1/intelligence/datasets/earnings-spotlight" \
-H "Authorization: Bearer sk_live_…"Dataset Response Meta
interface PlatformDataMetaV1 {
generatedAtMs: number
pipelineId: string // SKU, e.g. "events"
homeWidgetId?: string // optional Torque UI trace
integratorTier: 'standard' | 'pro'
}Use dedicated dataset DTOs; do not force pipeline rows into IntelligenceItemV1 when a pipeline shape exists.
Discord
Use Discord as a distribution channel for Torque desk trade angles: poll Intelligence, or push when a new angle publishes. Useful for community servers, ops channels, and bots that surface bias, summary, and a deep link into Torque Trade — without embedding execution in Discord.
Prerequisites
- Business API key (
sk_live_…) from developers.torque.fi signalscapability on your key (Platform / Pro)- Discord incoming webhook URL per channel your bot posts to
Poll Trade Angles
export TORQUE_KEY="sk_live_…"
curl -sS "https://app.torque.fi/api/v1/intelligence/views/trade-angles" \
-H "Authorization: Bearer $TORQUE_KEY" \
| jq '.ideas[] | {id, symbols, bias, title, summary, actions}'SDK: torque-intelligence → getTradeAngles().
Sample Discord Worker
Run on a cron (e.g. every 10 minutes). Dedupe by idea.id so you do not repost the same angle.
import { createTorqueIntelligenceFromEnv } from "torque-intelligence"
const DISCORD_WEBHOOK = process.env.DISCORD_WEBHOOK_URL
const SYMBOLS = new Set(["BTC", "NVDA", "ETH"])
const seen = new Set()
const ti = createTorqueIntelligenceFromEnv()
const { ideas } = await ti.getTradeAngles()
for (const idea of ideas) {
const sym = idea.symbols?.[0]?.toUpperCase()
if (!sym || !SYMBOLS.has(sym)) continue
if (seen.has(idea.id)) continue
seen.add(idea.id)
const tradeAction = idea.actions?.find((a) => a.label?.toLowerCase().includes("buy") || a.label?.toLowerCase().includes("sell"))
const tradeUrl = tradeAction?.href
? `https://app.torque.fi${tradeAction.href}`
: undefined
await fetch(DISCORD_WEBHOOK, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
embeds: [{
title: `${sym} — ${idea.bias ?? "WATCH"}`,
description: idea.summary ?? idea.title,
footer: { text: "Torque desk" },
...(tradeUrl ? { url: tradeUrl } : {}),
}],
...(tradeUrl ? {
components: [{
type: 1,
components: [{ type: 2, style: 5, label: "Open Trade", url: tradeUrl }],
}],
} : {}),
}),
})
}Push Webhooks
Configure a Signals webhook URL in portal Settings to receive desk.angle.published when Torque posts a new desk angle (HMAC-signed, same scheme as deposit webhooks). Optional symbol filter limits which tickers you receive.
{
"type": "desk.angle.published",
"businessId": "…",
"digestSlot": 291234,
"timestamp": 1710000000000,
"item": {
"id": "desk_ETH_watch_…",
"kind": "angle",
"title": "…",
"summary": "…",
"symbols": ["ETH"],
"bias": "Watch",
"actions": [{ "label": "Buy ETH", "href": "/trade?buy=eth" }]
}
}Starter: developers.torque.fi Templates → Signals Discord Bot.
Markets (Read Profile market)
Yield & lending rate tiles: /intelligence/markets/* (alias /opportunities/*).
| GET /api/v1/intelligence/markets/yield | Idle cash APY; alias /opportunities/yield |
| GET /api/v1/intelligence/markets/lending | Supply APY + borrow APR; alias /opportunities/lending |
curl -sS "https://app.torque.fi/api/v1/intelligence/markets/yield?walletAddress=0x…" \
-H "Authorization: Bearer sk_live_…" | jq '.meta, (.markets | length)'Errors
| Status | Code | When |
|---|---|---|
| 401 | UNAUTHORIZED / INVALID_API_KEY | Missing or invalid business key |
| 429 | RATE_LIMIT_EXCEEDED | Business key exceeded 100 req/min. Retry-After header; see Errors guide |
| 429 | COOLDOWN | force=1 within reroll cooldown: retryAfterMs in body |
| 503 | INTELLIGENCE_UNAVAILABLE | Bundle temporarily unavailable |
See Also
- Authentication :
sk_live_…&walletAddress - API Layout ; aliases & manifest
- React SDK : BFF hooks for feed & markets
- Live capabilities JSON
Questions or corrections? hello@torque.fi