Skip to content

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.

RouteReturns
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.

RouteReturns
GET /congress/tradesAs /v1/congress/trades, the newest 50 rows; locked counts the rest.
GET /congress/membersAs /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.

Start with Desk