API
The same data as the site, as JSON, with your own keys. Included in the Desk plan.
Authentication
Create a key on the API keys page of the dashboard (Desk plan). Send it as a bearer token: Authorization: Bearer it_live_…. The key is shown once; keys can be revoked at any time. Keys are per workspace, so a revoked key stops every tool that used it.
Base URL and format
https://api.insidertell.com, JSON. Times are ISO 8601 in UTC, money is US dollars, ids are strings. Unknown query parameters are ignored. Errors come as {"detail": ...} with the usual status codes: 401 for a bad key, 404 for an unknown ticker, CIK or signal, 429 with Retry-After when the limit is hit.
Rate limit
60 requests a minute per key. The feed changes every two minutes at most, so polling faster than that returns the same answers.
Example
curl -H "Authorization: Bearer it_live_..." \
"https://api.insidertell.com/v1/signals?side=buy&tier=notable&days=3&limit=20"
curl -H "Authorization: Bearer it_live_..." "https://api.insidertell.com/v1/companies/NVDA"
Routes
The same routes as the public site, under /v1, without the free caps and with every score component.
| Route | Returns |
|---|---|
| GET /v1/signals?side=&tier=&days=7&min_value=&role=&cluster=true&ticker=&q=&sort=score&limit=100&skip=0 | { signals: Signal[], total }. No cap; components filled. |
| GET /v1/signals/{id} | { signal, transactions, prices (1y), related }. Includes outcomes of comparable signals. |
| GET /v1/companies/{ticker} | { company, signals, transactions (last 100), insiders, prices (1y), markers } |
| GET /v1/insiders/{cik} | { insider, signals, transactions } |
| GET /v1/filings?limit=50&skip=0&code=&ticker= | { transactions, total }, newest first |
| GET /v1/clusters?days=30&side= | { clusters } |
| GET /v1/backtest | { as_of, rows, benchmark } |
| GET /v1/search?q= | { companies, insiders } |
| GET /v1/congress/trades?chamber=&member=&ticker=&type=&days=30&min_amount=&party=&owner=&q=&stock_only=false&sort=filed_at&limit=50&skip=0 | { trades: CongressTrade[], total, locked: 0 }. type is purchase, sale (full and partial), sale_partial or exchange; member is a slug or id; sort is filed_at, trade_date or amount. |
| GET /v1/congress/members?chamber=&party=&sort=recent&q=&limit=100&skip=0 | { members: CongressMember[], total }. sort is recent, trades, track_record or name. |
| GET /v1/congress/members/{slug} | { member, trades (last 200), by_ticker, reports } |
Public congressional routes
The congressional pages are public, so these routes need no key and are cached for two minutes. Without a key the trade list stops at the newest 50 rows.
| Route | Returns |
|---|---|
| GET /congress/trades | As /v1/congress/trades, the newest 50 rows; locked counts the rest. |
| GET /congress/members | As /v1/congress/members. |
| GET /congress/members/{slug} | As /v1/congress/members/{slug}. |
| GET /congress/stats | { trades_total, trades_30d, reports_total, paper_reports, members_with_trades, last_filed_at, last_poll_at, outcomes } |
| GET /congress/outcomes | { as_of, rows: { type, outcomes }[], benchmark, method } |
Shapes
type Side = 'buy' | 'sell'
type Tier = 'strong' | 'notable' | 'moderate' | 'weak'
interface CompanyRef { cik: string; ticker: string | null; name: string; exchange?: string | null; sic?: string | null }
interface InsiderRef { cik: string; name: string; roles: string[]; title: string | null }
interface ScoreComponent { key: string; label: string; points: number; detail: string }
interface PriceContext {
as_of: string // date of the close used
close: number | null
low_52w: number | null
high_52w: number | null
from_low_pct: number | null // (close - low) / low
from_high_pct: number | null // (close - high) / high, negative
}
interface Outcome { horizon: '1m' | '3m' | '6m'; n: number; median_return: number | null; mean_return: number | null; hit_rate: number | null }
interface Signal {
id: string
accession: string
filed_at: string // ISO 8601, UTC
trade_date: string // earliest transaction date in the signal
side: Side
score: number // 0..100
tier: Tier
company: CompanyRef
insider: InsiderRef
shares: number
value_usd: number
avg_price: number | null
holdings_after: number | null
holdings_change_pct: number | null
is_10b5_1: boolean
cluster: { insiders: number; window_days: 14; signal_ids: string[] } | null
price: PriceContext | null
components: ScoreComponent[]
outcomes?: Outcome[] // comparable past signals, same side and tier
returns?: { '1m': number | null; '3m': number | null; '6m': number | null }
filing_url: string
}
interface Transaction {
id: string
accession: string
filed_at: string
date: string
company: CompanyRef
insider: InsiderRef
code: string // P, S, A, M, F, G, D, C, X, J, ...
code_label: string
derivative: boolean
security_title: string
acquired: boolean
shares: number | null
price: number | null
value_usd: number | null
holdings_after: number | null
ownership: 'D' | 'I'
ownership_nature: string | null
is_10b5_1: boolean
signal_id: string | null
filing_url: string
}
// Congressional trades (STOCK Act periodic transaction reports)
interface CongressMemberRef { id: string; name: string; party: string | null; state: string | null; slug: string | null }
interface CongressTrade {
id: string
report_id: string
source: 'house' | 'senate'
chamber: 'house' | 'senate'
member: CongressMemberRef
filed_at: string // the day the report was filed
trade_date: string | null
days_to_report: number | null
owner: 'self' | 'spouse' | 'joint' | 'child' | null
ticker: string | null // only for common stock with a ticker
raw_ticker: string | null // as filed, for options and the like
is_stock: boolean
asset_name: string
asset_code: string | null // House two-letter asset code (ST, OP, GS, ...)
asset_type: string | null // Senate asset type text
type: 'purchase' | 'sale' | 'sale_partial' | 'exchange' | null
amount_min: number | null // the range as filed
amount_max: number | null // null means "over amount_min"
description: string | null
comment: string | null
url: string // the source report
returns: { pending: boolean; '1m': { ret: number; excess: number | null } | null; '3m': ...; '6m': ... } | null
}
interface CongressMember {
id: string // bioguide id, or chamber:slug for an unmatched filer
slug: string
name: string
chamber: 'house' | 'senate'
state: string | null
district: number | null
party: string | null
in_office: boolean | null
matched: boolean
image_url: string | null
stats: { trades: number; trades_365d: number; purchases: number; sales: number; exchanges: number; reports: number; tickers: number; amount_min: number; amount_max: number; first_filed_at: string | null; last_filed_at: string | null }
track_record: { n: number; median_6m_excess: number | null; hit_rate_6m: number | null; label: 'strong' | 'positive' | 'negative' | 'unknown' }
}
Webhooks
A Desk workspace can register a URL on the API keys page. Every new signal at or above the chosen tier is posted to it as { "event": "signal.created", "signal": Signal }, signed with an HMAC in X-InsiderTell-Signature. Failed deliveries are retried for a day.
Terms
Data may be used inside your own products and research. Reselling the feed as a feed is not allowed; the terms have the details. The data is decision support, not advice, and the methodology lists what it can and cannot tell you.