TorinagiDocs
API MCP Back to Torinagi
Docs Get started

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.

Request header
Authorization: Bearer tk_live_a1b2c3…
Keep keys server-side

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
curl "https://api.torinagi.com/v1/signals?limit=5" \
  -H "Authorization: Bearer $TORINAGI_KEY"
Response
{
  "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?

FieldMeaning
confluenceScoreSigned agreement, -1+1. Sign is direction; magnitude is strength.
directionnet_buying, net_selling, or mixed.
convictionBuild against this. How much weight is behind the call: high, strong, building, or early.
isConfluenttrue once agreement and breadth both clear the confluence threshold.
riskContextEvent-risk overlay (e.g. country or sector shock), or null.
agreementRatioRaw. Share of contributing sources pointing the same way, 01.
breadthRaw. Share of tracked sources that had anything to say about this name.
participatingSourcesRaw count behind conviction. Prefer conviction — this count can shift as coverage changes.
Direction and magnitude are separate

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

GET/v1/signals

The ranked feed of current signals — the same data behind the cockpit's Signals view.

ParameterTypeDescription
assetClassstringFilter to equity, crypto, or forex. Omit for all.
confluentOnlybooleanReturn only names that cleared the confluence threshold.
limitintegerMaximum items to return.

Ticker confluence

GET/v1/signals/{ticker}

The full confluence record for one symbol.

ParameterTypeDescription
tickerrequiredstringSymbol to look up, e.g. NVDA.

Country exposure

GET/v1/exposure

Who sits in the blast radius of a country shock, ranked by risk score.

ParameterTypeDescription
countryrequiredstringISO-3166 alpha-2 code, e.g. KR.
limitintegerMaximum items to return.
Response
{
  "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

GET/v1/legislative

Directional per-ticker impact of advancing legislation — not just which names are exposed, but which way each one leans as provisions move.

Subsidiaries

GET/v1/entities/{ticker}/subsidiaries

Walk the corporate graph for a company — the structure that powers indirect exposure.

Entities

GET/v1/entities
GET/v1/entities/lookup
GET/v1/entities/{id}

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.

Status — hosted endpoint not yet live

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.

StatusMeaning
400Malformed request — a required parameter is missing or invalid.
401Missing or invalid API key.
403Key is valid but lacks scope for this resource.
404No record for that identifier.
429Rate limit exceeded — see Rate limits.
5xxSomething 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:

HeaderDescription
X-RateLimit-LimitRequests allowed in the current window.
X-RateLimit-RemainingRequests left in the window.
X-RateLimit-ResetUnix 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.

Public-data-derived intelligence. Not investment advice.
© 2026 Torinagi LLC