Torinagi for developers
Query the same smart-money intelligence the cockpit runs on — confluence, exposure, legislative impact, and the corporate graph — over a REST API or from any MCP-compatible AI client.
Overview
Torinagi reads where congress, insiders, funds, and on-chain money are actually positioning across stocks, crypto, and forex. The API exposes that as structured data. Everything is derived from public sources and returned as JSON over HTTPS.
The base URL for all requests is:
https://api.torinagi.com
All endpoints are versioned under /v1/. Responses are JSON; timestamps are ISO-8601 in UTC.
Authentication
Every request requires an API key, sent in the Authorization: Bearer header. Create and revoke
keys in the cockpit under Developers › API keys.
Authorization: Bearer tk_live_a1b2c3…
A key carries your full account scope. Never ship one in browser or mobile code — proxy through your own backend instead.
Quickstart
Fetch the strongest current signals:
curl "https://api.torinagi.com/v1/signals?limit=5" \ -H "Authorization: Bearer $TORINAGI_KEY"
{
"count": 5,
"items": [
{
"symbol": "NVDA",
"assetClass": "equity",
"direction": "net_buying",
"confluenceScore": 0.66,
"conviction": "high",
"agreementRatio": 0.83,
"breadth": 0.6667,
"participatingSources": 4,
"isConfluent": true,
"riskContext": null,
"computedAt": "2026-07-24T19:20:42.339051+00:00"
}
]
}
Confluence & conviction
A confluence score runs from -1 (unanimous selling) to +1
(unanimous buying). It answers one question: when independent pools of informed money disagree or
agree about a name, which way does the weight fall?
| Field | Meaning |
|---|---|
| confluenceScore | Signed agreement, -1…+1. Sign is direction; magnitude is strength. |
| direction | net_buying, net_selling, or mixed. |
| conviction | Build against this. How much weight is behind the call: high, strong, building, or early. |
| isConfluent | true once agreement and breadth both clear the confluence threshold. |
| riskContext | Event-risk overlay (e.g. country or sector shock), or null. |
| agreementRatio | Raw. Share of contributing sources pointing the same way, 0…1. |
| breadth | Raw. Share of tracked sources that had anything to say about this name. |
| participatingSources | Raw count behind conviction. Prefer conviction — this count can shift as coverage changes. |
The risk overlay never sets direction — it only scales conviction. A name can be strongly net-buying and still carry high event risk.
Exposure
Exposure answers “if this country takes a hit, who actually feels it?” A company is direct when it is based there, and indirect when it is reached through a subsidiary, supplier, or revenue concentration. Indirect links are discounted, then sharpened by matching the event's sector against the company's — so a chip shock surfaces semiconductor names rather than every company with an office in the region.
API reference
Signals feed
The ranked feed of current signals — the same data behind the cockpit's Signals view.
| Parameter | Type | Description |
|---|---|---|
| assetClass | string | Filter to equity, crypto, or forex. Omit for all. |
| confluentOnly | boolean | Return only names that cleared the confluence threshold. |
| limit | integer | Maximum items to return. |
Ticker confluence
The full confluence record for one symbol.
| Parameter | Type | Description |
|---|---|---|
| tickerrequired | string | Symbol to look up, e.g. NVDA. |
Country exposure
Who sits in the blast radius of a country shock, ranked by risk score.
| Parameter | Type | Description |
|---|---|---|
| countryrequired | string | ISO-3166 alpha-2 code, e.g. KR. |
| limit | integer | Maximum items to return. |
{
"country": "KR",
"count": 2,
"items": [
{
"symbol": "ABBV",
"exposure": "indirect",
"via": "subsidiary:KR",
"riskLevel": "high",
"riskScore": 9320.69,
"computedAt": "2026-07-24T19:19:40.668987+00:00"
}
]
}
Legislative impact
Directional per-ticker impact of advancing legislation — not just which names are exposed, but which way each one leans as provisions move.
Subsidiaries
Walk the corporate graph for a company — the structure that powers indirect exposure.
Entities
Search and resolve entities. lookup maps an identifier or name to a canonical entity —
use it to reconcile your own tickers against Torinagi's graph before joining data.
MCP server
The Model Context Protocol server exposes the signal graph to AI clients such as Claude or Cursor, so an agent can query entities, events and derivations directly.
Two transports are supported, backed by the same server and the same tool set: stdio, which an MCP client launches as a child process, and Streamable HTTP, for clients that connect to a remote endpoint.
The Streamable HTTP transport is built and the endpoint below is the address it will answer on, but it is not yet serving publicly. Until it is, use the stdio transport. Contact us if you want early access.
Connecting
The MCP endpoint is a single path that answers POST and GET,
per the Model Context Protocol
transport
specification:
https://api.torinagi.com/mcp
It authenticates with the same API key as the REST surface —
Authorization: Bearer tk_live_… — so one key covers both.
Protocol revisions 2024-11-05 through 2025-11-25 are
negotiated at initialize.
The server is stateless, so no MCP-Session-Id is issued and none is
required on subsequent calls. GET returns 405 by design:
there are no server-initiated messages to stream, so there is no long-lived
connection to hold open. Point a health check at /health rather than at
the MCP endpoint.
{
"mcpServers": {
"torinagi": {
"url": "https://api.torinagi.com/mcp",
"headers": { "Authorization": "Bearer tk_live_your_key_here" }
}
}
}
Tool reference
Eight tools are exposed today. Each returns structured JSON from the same substrate the REST API serves.
query_signal_events
Query the event stream — the raw public-data events behind every signal — filtered by entity, feed or time window.
get_signal_entity
Fetch a canonical entity (company, asset or instrument) by ticker, including its resolved names and metadata.
{ "ticker": "NVDA" } // required
graph_neighbors
Walk the relationship graph outward from an entity — ownership, subsidiaries and operating countries. This is the structure behind exposure fan-out.
entityId is the entity's UUID, not a ticker — resolve
a ticker first with get_signal_entity.
{
"entityId": "3fa85f64-5717-4562-b3fc-2c963f66afa6", // required, UUID
"relationshipKind": "owns", // optional
"maxDepth": 2, // optional
"limit": 25 // optional
}
list_signal_derivations
List computed derivations for an entity — confluence, congressional flow, insider flow, news tone, event risk and the rest — with their scores and timestamps.
get_confluence
Smart-money confluence for one ticker — direction, score, conviction,
tension, and any risk overlay. Mirrors GET /v1/signals/{ticker}.
screen_signals
Screen the ranked feed by asset class, direction, confluent-only, or tense-only — names where independent sources are engaged and actively disagree. Confluence collapses those to a score of zero, so this is the only way to surface contested positioning.
country_exposure
Who sits in the blast radius of a country shock, direct and indirect, ranked by
risk. Mirrors GET /v1/exposure.
similarity_search
Semantic search across entity descriptions and filing summaries, for questions that don’t map to an exact identifier.
Errors
Errors use standard HTTP status codes with a JSON body.
| Status | Meaning |
|---|---|
| 400 | Malformed request — a required parameter is missing or invalid. |
| 401 | Missing or invalid API key. |
| 403 | Key is valid but lacks scope for this resource. |
| 404 | No record for that identifier. |
| 429 | Rate limit exceeded — see Rate limits. |
| 5xx | Something failed on our side. Retry with backoff. |
{
"error": "invalid_parameter",
"message": "'country' must be an ISO-3166 alpha-2 code."
}
Rate limits
Limits are applied per API key and vary by plan. Every response carries your current state:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Requests allowed in the current window. |
| X-RateLimit-Remaining | Requests left in the window. |
| X-RateLimit-Reset | Unix seconds until the window resets. |
On 429, back off and retry after the reset. Signals recompute on a schedule — polling
faster than that returns identical computedAt values and wastes quota.