API ACCESS · CLOSED BETA Sigma is in closed beta. The API and MCP server unlock with the Pro and Quant tiers. Join the waitlist for early access (10,000 req/mo, 20-year history, MCP, webhooks).
X-Api-Key: <key> · alternative if your HTTP client doesn't handle the Authorization header well.
The key is shown only once at creation. If lost, revoke it and generate a new one. Limit: 10 active keys per account. Revoked keys remain visible in history.
Key format
text
sit_live_<32 base62 characters>
Example visible prefix (safe for logs): sit_live_Ab1C
The full key is ~40 characters. Stored hashed (SHA-256) server-side,
never retrievable in plain text.
Invalid, expired or revoked key
Any authentication error returns an HTTP 401 in a uniform format:
json
{
"error": {
"code": "invalid_api_key",
"message": "Invalid, unknown or revoked API key. Generate a new key from your account.",
"status": 401
}
}
Fundamentals
Key concepts
Base URL
text
https://insiders-trades.com
Universal metadata
Every 200 response includes a meta object. It contains the server latency and a dataFreshness mini-dictionary with the last update date of each data block, letting your client decide whether to invalidate its cache.
Listing endpoints support ?limit (default 50, max 200) and ?offset (default 0). The returned total field allows paginating through all results.
Timestamp format
All timestamps are in ISO 8601 UTC (2026-04-20T18:32:11.123Z).
Nullable fields
A missing field in the database is serialised as null (never omitted). This lets you distinguish between "absent data" and a field error.
BigInt (amounts)
Fields like marketCap, revenue, totalAmount can exceed JS float capacity (253). They are returned as numbers, but for large totals (L'Oréal at €195bn…) your client code should use BigInt if precision matters below €1.
API Reference
Endpoints
18 endpoints, all read-only. Grouped by domain. Cross-market filter via ?market=fr|us|de|ch|uk|ca|it|es on every listing endpoint.
── Authentication
GET/api/v1/me
Verify a key and retrieve identity
Returns the information of the key owner + metadata about the key itself. Use it as a ping to validate that a key is still active.
Catalogue of the 8 ingested regulators with live counters (declarations, companies) and per-market coverage window. Call once at integration startup to verify what's available.
Net buy minus net sell on a single company, bucketed by month (or ISO week), with per-insider rollups and a rolling 90-day signal. Designed to spot accumulation / distribution phases.
Alias of from. Pair with sort=pubDate&order=asc for incremental polling.
include
string
·
CSV of related objects to inline. Supported: backtest
from
ISO date
·
Filter pubDate >= from
to
ISO date
·
Filter pubDate <= to
minScore
number
·
Minimum signalScore threshold
maxScore
number
·
Maximum signalScore threshold
direction
enum
·
BUY | SELL
cluster
boolean
·
true = cluster trades only
minAmount
number
·
Minimum amount in €
company
string
·
Company name search
insider
string
·
Executive name search
isin
string
·
Exact ISIN filter
sort
enum
pubDate
pubDate | signalScore | amount
order
enum
desc
asc | desc
limit
integer
50
1 → 200
offset
integer
0
Pagination offset
bash
# Top 20 buy signals with v3 score ≥ 50 (high conviction) over the last 30 days
curl "https://insiders-trades.com/api/v1/declarations?direction=BUY&minScore=50&from=2026-03-20&sort=signalScore&order=desc&limit=20" \
-H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Returns the value, raw points awarded, cap, and a short rationale for each of the 9 factors of the v3 composite score. No black box, audit any signal yourself. Methodology: see /methodology.
Paramètres de chemin
Nom
Type
Défaut
Description
amfIdrequis
string
·
Unique identifier (e.g. 2026DD1108988 or SEC:0001127602-25-009876)
Proxies READ /api/v1/* routes without auth. Sliding 24h cap: 10 calls per fingerprint (3 for bot UAs). Datacenter IPs denied, captcha from call 6 onward, watermark in every response. Bulk export, MCP, webhooks are NOT proxied.
Issues an HMAC challenge (16-bit difficulty, 10-min TTL). Client must find a nonce s.t. sha256(challenge + ':' + nonce) starts with 4 hex zeroes, then resend X-Sandbox-POW-Challenge + X-Sandbox-POW-Solution on the next call.
bash
curl -X POST "https://insiders-trades.com/api/v1/sandbox/challenge"
Schema
Data model
Five main entities. Here are the fields exposed in the API (some internal fields such as indexes or technical timestamps are not included).
Malformed, unknown, or revoked key. Banned user = same.
404
company_not_found
Non-existent company slug
404
insider_not_found
Non-existent executive slug
404
declaration_not_found
Non-existent amfId
500
internal_error
Server error, please share the URL + time with us
Retry any response ≥ 500 with exponential back-off (e.g. 1 s, 2 s, 4 s, max 5 attempts). Never retry 401 / 404.
Quotas
Rate limits & best practices
Default limits during the beta phase:
Closed beta: 50 pages/day (web, anonymous), 20 sandbox requests/day, 40 API requests/day per key (counter resets at 00:00 UTC). Pro and Quant quotas open at GA.
10 req/second (burst) · sufficient for most use cases. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (ISO 8601).
10 active keys maximum per account. Beyond that, revoke one from your keys page.
Usage counters are visible in real-time by the user (total + today) and by the admin (with top consumers).
Best practices
Respect freshness. Data doesn't change every second. Yahoo prices are refreshed 1×/day (4 AM UTC), insider filings from our 28 regulators (AMF, SEC, BaFin, SIX SER, RNS, SEDI, Consob, CNMV, AFM, FSMA, Oslo, Helsinki, Copenhagen, ASX, FMA, CVM, HKEX, BSE-Sofia, Tadawul, DART, EDINET, SSE, SZSE, SEBI, KNF, PSE, NZX, JSE) 1×/hour. Check meta.dataFreshness to adapt your polling frequency.
Cache aggressively. A company detail rarely changes, cache it client-side until priceAt + 1h.
Paginate correctly. Use a reasonable limit (20–50) and offset for large datasets.
Retry 5xx. With exponential back-off, max 5 attempts.
Store your key securely. Never in plain text in a Git repo, in the frontend, or in logs.
Examples
Code samples
Fetch today's top signals
const API = "https://insiders-trades.com";
const KEY = process.env.INSIDERS_API_KEY;
async function topSignals(direction = "BUY", days = 1) {
const url = new URL(API + "/api/v1/signals");
url.searchParams.set("direction", direction);
url.searchParams.set("lookbackDays", String(days));
url.searchParams.set("minScore", "50");
url.searchParams.set("limit", "10");
const res = await fetch(url, {
headers: { Authorization: "Bearer " + KEY },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { items, meta } = await res.json();
console.log(`${items.length} signals · latency ${meta.latencyMs}ms`);
for (const s of items) {
console.log(
`[${s.signal.score}] ${s.company.name.padEnd(32)} ${s.insider.name} · ${s.transaction.amount}€`
);
}
}
topSignals();
CSV export of all filings for a company
import csv, os, requests
API = "https://insiders-trades.com"
KEY = os.environ["INSIDERS_API_KEY"]
def fetch_all(slug):
items, offset = [], 0
while True:
r = requests.get(
f"{API}/api/v1/companies/{slug}/declarations",
params={"limit": 100, "offset": offset},
headers={"Authorization": f"Bearer {KEY}"},
)
r.raise_for_status()
page = r.json()
items.extend(page["items"])
if offset + 100 >= page["total"]:
break
offset += 100
return items
with open("bouygues_declarations.csv", "w", newline="") as f:
rows = fetch_all("bouygues-1454")
w = csv.writer(f)
w.writerow(["pubDate", "insider", "role", "nature",
"isin", "unitPrice", "volume", "amount", "score"])
for d in rows:
w.writerow([
d["pubDate"],
d["insider"]["name"],
d["insider"]["function"],
d["transaction"]["nature"],
d["transaction"]["isin"],
d["transaction"]["unitPrice"],
d["transaction"]["volume"],
d["transaction"]["totalAmount"],
d["signal"]["score"],
])
print(f"Wrote {len(rows)} rows")
Versioning
Changelog
v1.0.0· 2026-04-20
Public API launch.
18 endpoints, API key authentication, freshness + rate-limit metadata on every response.
The API is in private beta. Access is by invitation. No contractual SLA is provided during the beta, but the team monitors data freshness daily (hourly multi-market cron + daily Yahoo).