Aller au contenu
API v1 · 2026-10-17

Documentation de l'API

La seule API de transactions d'initiés couvrant 37 marchés(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) en un schéma unique. Montants FX-normalisés en EUR/USD. Backtests retail T+30/T+90/T+365 inline. Scoring transparent (7 facteurs décomposables). Native AI : serveur MCP pour Claude, Cursor, Windsurf. API sur Pro et Quant.

Swagger UI interactive ↗Serveur MCP pour IA ↗Générer une clé API ↗Spec OpenAPI JSON ↗Comparatif vs Quiver, OpenInsider ↗
Accès API · bêta privée
Insiders Trades est en bêta. L'API et le serveur MCP s'ouvrent avec les tiers Pro et Quant. Rejoignez la liste d'attente pour un accès anticipé (334 req/jour, 5 ans d'historique API, MCP, alertes email).
Exemple de réponse · GET /v1/declarations
$ 
Démarrage

Quickstart

Trois étapes pour faire votre première requête :

  1. Créez un compte, puis rendez-vous sur Mon compte → Clés API.
  2. Générez une clé nommée (ex : « Production bot »). Copiez-la immédiatement, elle ne sera plus affichée.
  3. Ajoutez le header Authorization: Bearer <key> à chaque requête.
curl https://insiders-trades.com/api/v1/me \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Sécurité

Authentification

Chaque requête doit inclure exactement une clé API valide et non révoquée. Deux formats sont acceptés, au choix :

  • Authorization: Bearer <key> · standard, recommandé.
  • X-Api-Key: <key> · alternative si votre client HTTP ne gère pas bien le header Authorization.
La clé est affichée une seule fois à la création. En cas de perte, révoquez-la et générez-en une nouvelle. Limite : 10 clés actives par compte. Les clés révoquées restent visibles en historique.

Format des clés

text
sit_live_<32 caractères base62>

Exemple de préfixe visible (safe pour logs) : sit_live_Ab1C
La clé complète fait ~40 caractères. Stockée hashée (SHA-256) côté serveur,
jamais retrouvable en clair.

Clé invalide, expirée ou révoquée

Toute erreur d'authentification renvoie un HTTP 401 au format uniforme :

json
{
 "error": {
 "code": "invalid_api_key",
 "message": "Clé API invalide, inconnue ou révoquée. Générez une nouvelle clé depuis votre compte.",
 "status": 401
 }
}
Fondamentaux

Concepts clés

Base URL

text
https://insiders-trades.com

Métadonnées universelles

Chaque réponse 200 inclut un objet meta. Il contient la latence serveur et un mini-dictionnaire dataFreshness avec la date de dernière mise à jour de chaque bloc de données, permettant à votre client de décider s'il doit invalider son cache.

json
{
 "items": [ /* ... */ ],
 "meta": {
 "requestedAt": "2026-04-20T18:32:11.123Z",
 "latencyMs": 47,
 "dataFreshness": {
 "priceAt": "2026-04-20T16:01:45.120Z",
 "financialsAt": "2026-04-20T15:04:10.940Z"
 }
 }
}

Pagination

Les endpoints listing supportent ?limit (défaut 50, max 200) et ?offset (défaut 0). Le champ total retourné permet de paginer jusqu'au bout.

Format des timestamps

Tous les timestamps sont en ISO 8601 UTC (2026-04-20T18:32:11.123Z).

Champs nullable

Un champ manquant dans la BDD est sérialisé en null (jamais omis). Cela permet de distinguer « donnée absente » d'une erreur de champ.

BigInt (montants)

Les champs comme marketCap, revenue, totalAmount peuvent dépasser la capacité du nombre flottant JS (253). Ils sont retournés comme des nombres, mais pour les sommes globales (L'Oréal à 195 Md€…) votre code client doit utiliser des BigInt si la précision vaut plus de 1 €.

API Reference

Endpoints

18 endpoints, tous en lecture seule. Groupés par domaine. Filtre cross-marché via ?market=fr|us|de|ch|uk|ca|it|es sur tous les endpoints de listing.

── Authentification
GET/api/v1/me

Vérifier une clé et obtenir l'identité

Renvoie les informations de l'utilisateur propriétaire de la clé + métadonnées de la clé elle-même. Utilisez-le comme ping pour valider qu'une clé est toujours active.

curl https://insiders-trades.com/api/v1/me -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
── Santé & stats
GET/api/v1/health

État du système

Ping de la base de données (avec latence mesurée), horodatage de chaque étape de la pipeline. Utile pour détecter un arrêt du cron horaire ou du scoring.

bash
curl https://insiders-trades.com/api/v1/health -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Réponse (extraits)
json
{
 "status": "ok",
 "database": { "reachable": true, "latencyMs": 187 },
 "lastAmfPublicationAt": "2026-04-20T16:20:03.577Z",
 "lastIngestAt": "2026-04-20T16:59:53.841Z",
 "lastScoringAt": "2026-04-20T17:59:59.061Z",
 "lastBacktestAt": "2026-04-19T20:13:54.245Z",
 "lastFinancialsAt": "2026-04-20T15:04:10.940Z",
 "lastPriceAt": "2026-04-20T16:01:45.120Z"
}
GET/api/v1/stats

Compteurs globaux

Nombre total de déclarations, de sociétés, d'initiés, de backtests, ventilations par fenêtre temporelle (24h / 7j / 30j), score moyen global.

bash
curl https://insiders-trades.com/api/v1/stats -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/markets

Lister les marchés / régulateurs supportés

Catalogue des 8 régulateurs ingérés avec compteurs vivants (déclarations, sociétés) et fenêtre de couverture par marché. À appeler une fois au démarrage de votre intégration pour vérifier ce qui est dispo.

bash
curl https://insiders-trades.com/api/v1/markets -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
json
{
 "total": { "markets": 8, "declarations": 31420, "companies": 2480 },
 "markets": [
 { "code": "fr", "iso": "FR", "label": "FR", "regulator": "AMF",
 "currency": "EUR", "declarations": 18900, "companies": 1240,
 "coverage": { "oldestPubDate": "2015-01-05T...", "latestPubDate": "2026-05-17T..." } },
 { "code": "us", "iso": "US", "label": "US", "regulator": "SEC (Form 4)",
 "currency": "USD", "declarations": 9100, "companies": 720, "coverage": { ... } },
 { "code": "de", "regulator": "BaFin", ... },
 { "code": "ch", "regulator": "SIX SER", ... },
 { "code": "uk", "regulator": "RNS (LSE)", ... },
 { "code": "ca", "regulator": "SEDI", ... },
 { "code": "it", "regulator": "Consob", ... },
 { "code": "es", "regulator": "CNMV", ... }
 ],
 "meta": { "requestedAt": "...", "latencyMs": 90 }
}
── Sociétés
GET/api/v1/companies

Lister les sociétés

Retourne les sociétés filtrées.

Paramètres de requête
NomTypeDéfautDescription
qstring·Recherche insensitive sur le nom
isinstring·Filtre exact par ISIN
marketstring·Filtre marché de cotation (ex : Euronext Paris)
marketCodeenum·Juridiction du régulateur : fr | us | de | ch | uk | ca | it | es
hasLogoboolean·Ne retourne que celles avec (true) ou sans (false) logo
sortenumnamename | marketCap | recent
orderenumascasc | desc
limitinteger501 → 200
offsetinteger0Pagination
bash
curl "https://insiders-trades.com/api/v1/companies?q=lvmh&limit=3" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Réponse (tronquée)
json
{
 "total": 585, "offset": 0, "limit": 3,
 "items": [
 {
 "name": "LVMH MOET HENNESSY-LOUIS VUITTON",
 "slug": "lvmh-moet-hennessy-louis-vuitton-0042",
 "isin": "FR0000121014",
 "market": "Euronext Paris",
 "yahooSymbol": "MC.PA",
 "marketCap": 320200000000,
 "currentPrice": 643.40,
 "trailingPE": 22.43,
 "analystReco": "buy",
 "targetMean": 595.72,
 "logoUrl": "https://.../lvmh.webp",
 "declarationsCount": 147,
 "priceAt": "2026-04-20T16:01:45.120Z",
 "financialsAt": "2026-04-20T15:04:10.940Z"
 }
 ],
 "meta": { "requestedAt": "...", "latencyMs": 650, "dataFreshness": { ... } }
}
GET/api/v1/companies/{slug}

Détail d'une société (fondamentaux complets)

Renvoie l'intégralité du profil : income statement, bilan, valorisation (P/E, P/B, beta), consensus analyste (reco, target mean/high/low), technicals (52-week, 50/200 DMA, dividend yield).

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Identifiant URL unique de la société (présent dans la liste)
bash
curl https://insiders-trades.com/api/v1/companies/bouygues-1454 \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Les champs Yahoo (trailingPE, analystReco, targetMean…) peuvent être null pour les micro-caps non couvertes par les analystes.
GET/api/v1/companies/{slug}/declarations

Déclarations d'initiés d'une société

Historique complet des transactions de dirigeants sur une société, triées par pubDate desc.

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Slug société
Paramètres de requête
NomTypeDéfautDescription
directionenum·BUY | SELL (défaut: toutes)
minScorenumber·Seuil signalScore
limitinteger501 → 200
offsetinteger0Pagination
bash
curl "https://insiders-trades.com/api/v1/companies/bouygues-1454/declarations?direction=BUY&minScore=40&limit=5" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/companies/{slug}/insider-flow

Flux net acheteur / vendeur agrégé

Net buy − net sell sur une société, bucketé par mois (ou semaine ISO), avec rollups par dirigeant et un signal rolling 90 jours. Idéal pour détecter une phase d'accumulation ou de distribution.

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Slug société
Paramètres de requête
NomTypeDéfautDescription
windowDaysinteger73030 → 3650 days
bucketenummonthmonth | week
bash
curl "https://insiders-trades.com/api/v1/companies/bouygues-1454/insider-flow?windowDays=365&bucket=month" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
json
{
 "company": { "name": "BOUYGUES", "slug": "bouygues-1454", "marketCap": 12400000000 },
 "windowDays": 365, "bucket": "month",
 "totals": { "tradeCount": 47, "buyAmount": 18450000, "sellAmount": 2100000, "netAmount": 16350000, "sellToBuyRatio": 0.114 },
 "rolling90d": { "buyAmount": 7800000, "sellAmount": 0, "netAmount": 7800000 },
 "buckets": [
 { "period": "2025-06", "buyAmount": 1200000, "sellAmount": 0, "netAmount": 1200000, "tradeCount": 4 },
 { "period": "2025-07", "buyAmount": 840000, "sellAmount": 320000, "netAmount": 520000, "tradeCount": 3 }
 ],
 "topInsiders": [
 { "name": "M. BOUYGUES", "slug": "martin-bouygues", "function": "PDG",
 "buyAmount": 6400000, "sellAmount": 0, "netAmount": 6400000, "tradeCount": 12 }
 ]
}
── Dirigeants
GET/api/v1/insiders

Lister les dirigeants

2 091 dirigeants trackés. Recherche fuzzy par nom.

Paramètres de requête
NomTypeDéfautDescription
qstring·Recherche insensitive sur le nom
limitinteger501 → 200
offsetinteger0Pagination
bash
curl "https://insiders-trades.com/api/v1/insiders?q=arnault&limit=5" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/insiders/{slug}

Détail d'un dirigeant

Profil + sociétés auxquelles il/elle est rattaché(e) avec sa fonction + score moyen et max de ses déclarations.

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Slug dirigeant
bash
curl https://insiders-trades.com/api/v1/insiders/bernard-arnault \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/insiders/{slug}/declarations

Historique transactions d'un dirigeant

Chaîne complète des trades, toutes sociétés confondues, triée par pubDate desc.

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Slug dirigeant
Paramètres de requête
NomTypeDéfautDescription
limitinteger50Max 200
offsetinteger0Pagination
bash
curl https://insiders-trades.com/api/v1/insiders/bernard-arnault/declarations \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/insiders/{slug}/timeline

Timeline chronologique avec position cumulée

Transactions ordonnées dans le temps pour un dirigeant, avec un cumul de volume par société recalculé à chaque ligne. Tu vois la position se construire trade par trade.

Paramètres de chemin
NomTypeDéfautDescription
slugrequisstring·Slug dirigeant
Paramètres de requête
NomTypeDéfautDescription
fromISO date·Borne inférieure pubDate (optionnelle)
toISO date·Borne supérieure pubDate (optionnelle)
limitinteger5001 → 2000
bash
curl "https://insiders-trades.com/api/v1/insiders/bernard-arnault/timeline?from=2024-01-01&limit=200" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
── Déclarations
GET/api/v1/declarations

Recherche avancée de déclarations

Endpoint généraliste avec 12 filtres combinables. C'est le point d'entrée principal pour exporter un corpus historique ou analyser par critère.

Paramètres de requête
NomTypeDéfautDescription
marketenum·Juridiction : fr | us | de | ch | uk | ca | it | es (défaut : all)
currencyenum·EUR | USD | GBP | CHF | SEK | NOK | DKK | AUD | CAD · ajoute transaction.converted
sinceISO date·Alias de from. Combiner avec sort=pubDate&order=asc pour du polling incrémental.
includestring·Liste CSV d'objets à inclure inline. Supporté : backtest
fromISO date·Filtre pubDate >= from
toISO date·Filtre pubDate <= to
minScorenumber·Seuil signalScore minimum
maxScorenumber·Seuil signalScore maximum
directionenum·BUY | SELL
clusterboolean·true = uniquement trades groupés
minAmountnumber·Montant minimum en €
companystring·Recherche nom société
insiderstring·Recherche nom dirigeant
isinstring·Filtre ISIN exact
sortenumpubDatepubDate | signalScore | amount
orderenumdescasc | desc
limitinteger501 → 200
offsetinteger0Pagination
bash
# Top 20 signaux d'achat avec score v3 ≥ 50 (conviction élevée) sur 30 derniers jours
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"
Variantes multi-marchés
bash
# Achats US uniquement, montants en EUR, avec backtest inline
curl "https://insiders-trades.com/api/v1/declarations?market=us&direction=BUY&currency=EUR&include=backtest&limit=20" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# Polling incrémental, toutes les nouvelles déclarations depuis hier, triées asc
curl "https://insiders-trades.com/api/v1/declarations?since=2026-05-16&sort=pubDate&order=asc&limit=200" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# Cluster achats DE+CH (Vorstand allemand + Conseil suisse) au-dessus de 500 k€
curl "https://insiders-trades.com/api/v1/declarations?market=de&cluster=true&minAmount=500000" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/declarations/{amfId}

Détail d'une déclaration (avec backtest)

Objet complet incluant le backtest retail T+30/90/365 si calculé. Entrée : clôture pubDate+1.

Paramètres de chemin
NomTypeDéfautDescription
amfIdrequisstring·Identifiant AMF (ex: 2026DD1108988)
bash
curl https://insiders-trades.com/api/v1/declarations/2026DD1108988 \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Extrait du bloc backtest
json
"backtest": {
"returnBasis": "retail_pubDate_plus_1_close",
 "direction": "BUY",
"priceAtPub": 33.10,
"returnsPct": {
  "T30": 4.16,
  "T90": 8.23,
  "T365": 19.88
},
"pubLeakPct": 2.0,
 "computedAt": "2026-04-19T20:13:54.245Z"
}
── Signaux
GET/api/v1/signals

Top signaux (achats / ventes)

Raccourci pour obtenir les meilleurs scores sur une fenêtre glissante. Idéal pour un dashboard ou un bot de notification.

Paramètres de requête
NomTypeDéfautDescription
directionenumBUYBUY | SELL
lookbackDaysinteger7Fenêtre (1 → 90)
minScoreinteger40Score minimum (0 → 100)
limitinteger20Max 100
bash
curl "https://insiders-trades.com/api/v1/signals?direction=BUY&minScore=50&lookbackDays=7&limit=5" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
── Scoring (transparence)
GET/api/v1/scoring/explain/{amfId}

Décomposer le signalScore en 7 facteurs pondérés

Retourne la valeur, les points bruts attribués, le plafond et un court rationale pour chacun des 7 facteurs du score composite v3. Aucune boîte noire, auditez n'importe quel signal vous-même. Méthodologie : voir /methodology.

Paramètres de chemin
NomTypeDéfautDescription
amfIdrequisstring·Identifiant unique (ex : 2026DD1108988 ou SEC:0001127602-25-009876)
bash
curl https://insiders-trades.com/api/v1/scoring/explain/SEC:0001127602-25-009876 \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
json
{
 "declaration": { "amfId": "SEC:...", "storedScore": 78, "direction": "BUY", ... },
 "breakdown": {
 "sumFactorPoints": 78,
 "factors": [
 { "key": "pctOfMarketCap", "label": "Trade size vs market cap",
 "value": 0.42, "points": 14, "maxPoints": 16, "description": "Log-scaled..." },
 { "key": "directionalCluster", "label": "Directional cluster (±30d)",
 "value": 3, "points": 15, "maxPoints": 18, "description": "..." },
 { "key": "trackRecord", "label": "Insider track record (Bayesian-shrunk)",
 "value": 8.4, "sampleSize": 12, "points": 11, "maxPoints": 14, "description": "..." }
 ],
 "notes": [ "Sum of factor points is clamped to [0, 100]." ]
 }
}
── Backtest
GET/api/v1/backtest

Statistiques backtest globales

Retours moyens retail par horizon (T+30, T+90, T+365) et win rate à T+90. Filtrable par direction / score / période.

Paramètres de requête
NomTypeDéfautDescription
directionenum·BUY | SELL (défaut : les deux)
minScorenumber·Filtre sur signalScore de la déclaration sous-jacente
fromISO·Filtre pubDate >= from
toISO·Filtre pubDate <= to
bash
curl "https://insiders-trades.com/api/v1/backtest?direction=BUY&minScore=50" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Réponse type
json
{
 "filters": { "direction": "BUY", "minScore": "50", "from": null, "to": null },
 "total": 2 340,
 "byDirection": { "BUY": 2340 },
"returnBasis": "retail_pubDate_plus_1_close",
 "averageReturnsPct": {
"T30": 1.24, "T90": 4.62, "T365": 9.85
 },
 "sampleCounts": {
"T30": 2340, "T90": 2290, "T365": 1940
 },
 "winRates90d": { "BUY": 0.582, "SELL": null }
}
── Recherche
── Stratégie & performance
GET/api/v1/strategy/winning

Cohorte gagnante en live

Signaux qui satisfont les 6 filtres de la Sigma Winning Strategy (cluster, mid-cap, fonctions clés, fraîcheur ≤ 7j, acquisition, score v3 ≥ 40). Inclut la preuve historique 4 ans.

Paramètres de requête
NomTypeDéfautDescription
lookbackDaysinteger36530 → 1825
minScoreinteger700 → 100
bash
curl "https://insiders-trades.com/api/v1/strategy/winning?minScore=70" \
 -H "Authorization: Bearer sit_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
GET/api/v1/oos-performance

Suivi réel par groupe de rangs (Top 3, 5, 10)

Mêmes chiffres que /performance : une position par société dès son premier jour dans le top k, rendement comparé à l'indice de sa région sur les mêmes dates, à 30 jours, 90 jours et 1 an, avec couverture et intervalles à 95 %. Version 2 depuis le 13/10/2026. Public, sans clé API.

bash
curl "https://insiders-trades.com/api/v1/oos-performance"
── Sandbox anonyme
GET/api/v1/sandbox/{path}

Proxy anonyme (10 appels / 24h, sans clé)

Proxy les routes READ de /api/v1/* sans authentification. Cap glissant 24h: 10 appels par empreinte (3 si user-agent bot). Datacenter refusé, captcha à partir du 6e appel, watermark dans chaque réponse. Bulk export, MCP, webhooks ne sont PAS proxiés.

bash
# No header needed. Try it:
curl "https://insiders-trades.com/api/v1/sandbox/declarations?limit=3"
curl "https://insiders-trades.com/api/v1/sandbox/signals?direction=BUY&limit=5"
curl "https://insiders-trades.com/api/v1/sandbox/status"
POST/api/v1/sandbox/challenge

POW pour user-agents bot

Émet un challenge HMAC (difficulté 16 bits, TTL 10 min). Le client doit trouver un nonce tel que sha256(challenge + ':' + nonce) commence par 4 zéros hex, puis renvoyer X-Sandbox-POW-Challenge + X-Sandbox-POW-Solution sur l'appel suivant.

bash
curl -X POST "https://insiders-trades.com/api/v1/sandbox/challenge"
Schéma

Modèle de données

Cinq entités principales. Voici les champs exposés dans l'API (certains champs internes comme les index ou timestamps techniques ne sont pas inclus).

Company

slugstringIdentifiant URL, ex: bouygues-1454
namestringRaison sociale (source AMF)
isinstring | nullInternational Securities ID Number
marketstring | nullEx: Euronext Paris
yahooSymbolstring | nullTicker Yahoo pour prix / fondamentaux
marketCapnumber | nullCapitalisation en €
currentPricenumber | nullDernier cours connu
trailingPE, forwardPE, priceToBook, betanumber | nullValorisation Yahoo
analystReco, analystScore, targetMean, targetHigh, targetLowmixedConsensus analystes
dividendYield, fiftyTwoWeekHigh/Low, fiftyDayAverage, twoHundredDayAveragenumber | nullTechnicals
logoUrlstring | nullURL du logo
priceAt, financialsAt, analystAtISO date-timeFraîcheur par bloc

Insider

slugstringIdentifiant URL
namestringNom du dirigeant (source AMF)
declarationsCountintegerNombre de transactions totales
companiesCompany[]Sociétés liées avec fonction occupée

Declaration

amfIdstringIdentifiant AMF unique (ex: 2026DD1108988)
pubDateISO date-timeDate publication AMF
transactionDateISO date-time | nullDate effective de la transaction
pdfUrlstringLien vers le PDF officiel AMF
transactionobjectnature, instrument, isin, unitPrice, volume, totalAmount, currency, venue
insiderobjectname, slug, function
companyobjectname, slug, yahooSymbol, marketCap
signalobjectscore (0-100), pctOfMarketCap, pctOfInsiderFlow, insiderCumNet, isCluster, scoredAt

BacktestResult (imbriqué dans Declaration.backtest)

directionstringBUY | SELL | OTHER
returnBasisstringretail_pubDate_plus_1_close
priceAtPubnumber | nullPrix d'entrée retail (clôture pubDate+1)
returnsPct.T30 / T90 / T365number | nullRetours retail par horizon
pubLeakPctnumber | nullMouvement entre transaction et publication
computedAtISO date-timeQuand le calcul a eu lieu

Signal (composant de scoring v3, calculé à la volée)

scorenumber (0-100)Score composite v3 (10 composantes · voir /methodologie)
pctOfMarketCapnumber | nullRatio montant / capitalisation (%)
pctOfInsiderFlownumber | nullPart dans le flux total du dirigeant
insiderCumNetnumber | nullNet cumulé (buy - sell) jusqu'au trade
isClusterboolean≥ 2 dirigeants dans le MÊME sens ±30j (directionnel v3)
Erreurs

Gestion des erreurs

Toutes les erreurs suivent un format uniforme (RFC-7807-like) :

json
{
 "error": {
 "code": "<machine_readable_slug>",
 "message": "<human-readable French description>",
 "status": <http_status>
 }
}

Codes d'erreur

StatusCodeQuand
401missing_api_keyAucun header Authorization ni X-Api-Key
401invalid_api_keyClé mal formée, inconnue, ou révoquée. User banni = idem.
404company_not_foundSlug de société inexistant
404insider_not_foundSlug de dirigeant inexistant
404declaration_not_foundamfId inexistant
500internal_errorErreur serveur, remontez-nous l'URL + heure
Retryez toute réponse ≥ 500 avec un back-off exponentiel (ex : 1 s, 2 s, 4 s max 5 tentatives). Ne retryez jamais 401 / 404.
Quotas

Rate limits & bonnes pratiques

Plafonds par défaut durant la phase beta :

  • Bêta privée : pas de limite de pages web, 20 requêtes sandbox/jour avec un compte Free (compteur reset 00:00 UTC). Les clés API commencent avec Pro et Quant.
  • 10 req/seconde (burst) · suffisant pour la plupart des usages. Chaque réponse renvoie X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset (ISO 8601).
  • 10 clés actives maximum par compte. Au-delà, révoquez-en une depuis votre page de clés.
  • Les compteurs d'usage sont visibles en temps réel par l'utilisateur (total + aujourd'hui) et par l'admin (avec Top consommateurs).

Bonnes pratiques

  • Respectez la fraîcheur. Les données ne bougent pas toutes les secondes. Les cours Yahoo sont rafraîchis 1×/jour (4 h UTC), les déclarations d'initiés des 37 marchés (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 et plus) plusieurs fois par jour selon la source. Consultez meta.dataFreshness pour adapter votre fréquence de polling.
  • Cachez agressivement. Un détail société change rarement, cachez-le côté client jusqu'au priceAt + 1h.
  • Paginez correctement. Utilisez limit raisonnable (20-50) et offset pour les gros datasets.
  • Retryez les 5xx. Avec back-off exponentiel, max 5 tentatives.
  • Stockez la clé en secret. Jamais en clair dans un repo Git, dans le frontend, ou dans les logs.
Exemples

Code samples

Récupérer les top signaux du jour

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();

Export CSV de toutes les déclarations d'une société

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
  • Lancement de l'API publique.
  • 18 endpoints, authentification par clé API, métadonnées de fraîcheur.
  • Swagger UI interactive disponible sur /api/docs.
  • 11 oct. 2026 : le champ gender est retiré des objets insider (REST, OpenAPI, MCP). Il était inféré, pas déclaré, et n'est plus publié.
Support

Aide, retours, SLA

L'API est en beta privée. L'accès est sur invitation. Aucun SLA contractuel n'est fourni pendant la beta, mais l'équipe veille quotidiennement à la fraîcheur des données (cron horaire multi-marchés + quotidien Yahoo).

  • Demande d'accès beta ou quota augmenté : contactez contact@insiders-trades.com.
  • Bug / anomalie : mentionnez l'URL exacte, l'heure (UTC), et le prefix de la clé utilisée.
  • Roadmap : endpoints POST pour notifications push, webhooks sur nouveaux signaux, scopes granulaires.
Usage éthique. Les déclarations d'initiés (AMF, SEC, BaFin, SIX, RNS, SEDI, Consob, CNMV, AFM, FSMA, Oslo, Helsinki, Stockholm, Copenhagen, ASX, FMA, Dublin et plus) sont publiques, mais le rate limit sert aussi à éviter de surcharger les serveurs amont (Yahoo Finance, BDIF, EDGAR, etc.). Les patterns abusifs entraînent la révocation immédiate de la clé.

Prêt à intégrer le signal des initiés ?

Générez une clé en 10 secondes, copiez l'exemple cURL du quickstart, et explorez les endpoints en direct avec Swagger.