Alt data for the European buy side — long/short & liquidity desks
EU insider trades + 5% holdings,
one polling API.
MAR Article 19 PDMR disclosures and Transparency-Directive 5% crossings across 24 European markets — aggregated, normalised, tier-graded for freshness and completeness, and pollable with a one-line curl. Self-serve trial key, no intro call required to look at the data.
The signal works — measured on our own data
German board buys hit 54% positive at 6–12 months. Their spouses and holding companies hit 13%.
4.0×
Hit-rate ratio
Vorstand vs. related-party buys at 180–365d holding
+40pp
Hit-rate spread
Vorstand 54% − related-party 13%
248
DE buys in sample
winsorised at 1st/99th percentile
The role tag is the moat — not latency. Treat every PDMR row the same and you eat 13% hit rate alongside 55%. Our normalisedinsider_rolefield lets you filter on the people who actually time it. Full methodology + matrix →
Worked example — a real precursor cluster from the data
3 insiders at Basler Aktiengesellschaft bought €195kof their own stock — it's up +48% since.
Between 2026-03-31 and 2026-03-31, 3 different insiders at Basler Aktiengesellschaft (DE · BSL.DE, ISIN DE0005102008) disclosed buys totalling €195k at a weighted price of €12.00. The stock now trades at €17.80 — the position is worth €289k, a +48% (€94k) move in 200 days.
Buyers: Ley, Dr. Dietmar, Garbrecht, Horst W., Mehl, Hardy. Each row published under MAR Article 19 within 3 business days of the trade, ingested into the API the same morning the regulator released it. The cluster signal is the precursor — the price action is the consequence the market priced in afterwards. We aggregate every one of these across 29 European markets.
What you actually get — live numbers, refreshed nightly
Every cell below comes from the same Postgres views the audit doc tracks. No marketing decoration — if a country isn't live yet, it isn't counted.
Insider filings (MAR Article 19 PDMR)
5% holdings (Transparency Directive)
Coverage tiers — at a glance
Same schema everywhere. What varies is enrichment depth. We publish this so you can pick the markets you need before you commit.
| Tier | Markets | Daily flow | Enrichment |
|---|---|---|---|
| Tier 1 — Full | CH | ~12/day | ISIN, EUR value, sub-PDMR role, shares + price |
| Tier 2 — Strong PDMR | SE, DE | ~57/day | Full PDMR; signal-grade holdings |
| Tier 3 — High volume, partial | GB, NO, FI, FR, NL, BE, ES | ~125/day | Insider/issuer/date, partial ISIN/value |
| Tier 4 — Signal-only | IT, AT, DK, GR, HU, CY, HR, RO, LU, IS, PT | ~25/day | Insider/issuer/date + source URL |
| Tier 5 — Archive only | LV, LT, EE, SI, PL, AU, MT | 0/day | Historical backfill, no live feed. Not pitched. |
Sample row
Same shape across every market. Field-by-field documentation in the schema doc.
{
"id": "SE-FI-2026-05-19-A4B92",
"country": "SE",
"insider_name": "Erik Hägglund",
"insider_role": "Chief Executive Officer",
"company_name": "Saab AB",
"isin": "SE0000112385",
"ticker": "SAAB-B.ST",
"transaction_date": "2026-05-16",
"filing_date": "2026-05-19",
"transaction_type": "buy",
"shares": 2000,
"price": 524.40,
"value_eur": 90876.12,
"currency": "SEK",
"source_url": "https://marknadssok.fi.se/...",
"ingested_at": "2026-05-20T02:30:35Z"
}Per-country tier — live freshness + completeness
GOLD = freshness <5d AND ≥95% ISIN AND ≥95% secondary field. SILVER = <10d, ≥80%, ≥70%. Everything else is BRONZE — usable as a signal feed but we don't pretend it's a structured dataset.
| Market | Insider tier | PDMR rows | Lag (d) | ISIN% | Holdings tier | 5% rows | Lag (d) | ISIN% |
|---|---|---|---|---|---|---|---|---|
| 🇩🇪Germany | GOLD | 3,728 | 2 | 100% | BRONZE | 4,027 | 1 | 54% |
| 🇬🇧United Kingdom | BRONZE | 5,135 | 1 | 55% | BRONZE | 4,280 | 1 | 38% |
| 🇫🇷France | BRONZE | 1,304 | 1 | 90% | BRONZE | 1,044 | 1 | 73% |
| 🇮🇹Italy | BRONZE | 395 | 3 | 22% | BRONZE | 184 | 3 | 1% |
| 🇪🇸Spain | SILVER | 1,096 | 2 | 100% | BRONZE | 85 | 0 | 68% |
| 🇳🇱Netherlands | BRONZE | 349 | 5 | 96% | BRONZE | 4,028 | 2 | 31% |
| 🇨🇭Switzerland | GOLD | 6,835 | 1 | 99% | SILVER | 2,571 | 1 | 84% |
| 🇵🇱Poland | BRONZE | 141 | 1 | 100% | BRONZE | 422 | 1 | 100% |
| 🇮🇪Ireland | BRONZE | 14 | 3 | 0% | — | — | — | — |
| 🇧🇪Belgium | BRONZE | 275 | 1 | 100% | BRONZE | 520 | 1 | 53% |
| 🇸🇪Sweden | GOLD | 67,441 | 1 | 99% | BRONZE | 320 | 2 | 27% |
| 🇦🇹Austria | BRONZE | 1,871 | 2 | 100% | BRONZE | 1,873 | 1 | 100% |
| 🇳🇴Norway | BRONZE | 1,921 | 1 | 8% | BRONZE | 1,020 | 1 | 5% |
| 🇩🇰Denmark | BRONZE | 932 | 1 | 78% | BRONZE | 541 | 1 | 63% |
| 🇷🇴Romania | BRONZE | 127 | 1 | 100% | BRONZE | 55 | 3 | 51% |
| 🇵🇹Portugal | BRONZE | 52 | 96 | 100% | — | — | — | — |
| 🇫🇮Finland | BRONZE | 2,523 | 2 | 89% | BRONZE | 922 | 2 | 84% |
| 🇬🇷Greece | BRONZE | 576 | 1 | 0% | BRONZE | 67 | 1 | 5% |
| 🇭🇺Hungary | BRONZE | 489 | 1 | 0% | BRONZE | 30 | 1 | 0% |
| 🇭🇷Croatia | BRONZE | 370 | -54 | 78% | BRONZE | 26 | 47 | 12% |
| 🇱🇺Luxembourg | BRONZE | 256 | 1 | 0% | BRONZE | 46 | 8 | 4% |
| 🇱🇹Lithuania | BRONZE | 78 | 1 | 0% | BRONZE | 22 | 379 | 0% |
| 🇸🇮Slovenia | BRONZE | 22 | 1 | 0% | BRONZE | 12 | 94 | 0% |
| 🇱🇻Latvia | BRONZE | 365 | 12 | 69% | BRONZE | 233 | 208 | 12% |
| 🇪🇪Estonia | BRONZE | 9 | 1073 | 22% | BRONZE | 92 | 150 | 13% |
| 🇨🇾Cyprus | BRONZE | 213 | 1 | 0% | BRONZE | 14 | 2 | 0% |
| 🇮🇸Iceland | BRONZE | 82 | 9 | 7% | BRONZE | 133 | 5 | 26% |
| 🇲🇹Malta | BRONZE | 64 | 1 | 0% | BRONZE | 4 | 50 | 50% |
Sample the data — no signup
Two CSVs, breadth-sliced across countries (no single market dominates), same column layout as the API. Headline numbers regenerated from live data on every page load.
filings sample (CSV)
CSV250 rows · 26 countries · last 90 days
Total disclosed: €361.4M · biggest in file: Marcus Wallenberg bought €307.4M of EQT AB (SE)
id, country, filing_date, transaction_date, transaction_type, company_name, isin, ticker, exchange, insider_name, insider_role, shares, price, value_eur, currency, source_url
Download →
holdings sample (CSV)
CSV172 rows · 20 countries · 5%+ crossings · last 90 days
Biggest crossing in file: Vasile-George Cristescu acting in concert disclosed 96.37% of ELECTRECORD SA BUCURESTI (RO)
id, country, filing_date, event_date, issuer_name, issuer_isin, filer_name, threshold_pct, direction, new_pct, previous_pct, regulation, source_url
Download →
How you receive it
REST is the self-serve default. The other two are real options — ask and we'll set them up.
Polling REST API
Bearer auth, cursor + delta-since pagination. The trial key plugs in here. Build orchestration around it.
Postgres direct (read-only)
Connection string into our Supabase. Your engineers write SQL, no pagination ceiling. Best when you want flexibility — the trade-off is queries are coupled to our schema.
Daily dump — Parquet / JSONL.gz
Atomic snapshot to S3, SFTP, or signed-URL email. Drop into your data lake on a schedule. ~24h freshness ceiling.
Snowflake share, webhooks, or custom delivery — also available. Email george@insidereu.com with what you need.
Refresh cadence
API-backed sources (BaFin DealingsInfo CSV, AFM Wmz bulk, Finansinspektionen Insyn, SIX SER, Nasdaq Nordic) run daily and could push to hourly on request — no architectural blocker. PDF / scrape-backed sources stay daily because the upstream regulator portals don't republish more often. Source-side delays (e.g. BaFin's 6–7d gap between transaction and publication) are surfaced in the per-row days_since_last_filing field — never hidden.
Historical depth
We have multi-year history available — most regulators expose back to 2007–2015 (BaFin, FI Insynsregistret, LSE RNS, SIX SER, Consob, AFM all do). The hot dataset is the last ~12 months; older windows we backfill on request once we know the scope. Email george@insidereu.comwith the window and we'll quote.
Why insidereu vs the incumbents
vs Smart Insider
Smart Insider's coverage skews Anglo and they sell curated win-rate scores. We sell the raw event stream — one schema across 24 markets, flat per-seat pricing, source URL on every row so you can audit. Where they package alpha, we package inputs.
vs 2iQ
2iQ leads with their alpha-scoring overlay. Funds with a research team don't want the score — they want clean inputs to feed their own model. We sell only the inputs.
vs Bloomberg AIQ
AIQ is bundled into Terminal seats at $24k/year/user. You pay for the front-end and the data team writes Excel macros to extract it. We sell flat-file / API at desk pricing, no Terminal dependency, and publish in EUR alongside the original currency.
vs Bloomberg / Refinitiv terminals (general)
Strong on US insider trades. Patchy for EU PDMR (24+ regulators, different XML schemas, signal-only PDFs). 5% threshold crossings come per-country, not as one normalised feed.
vs building it yourself
23 separate portals: BaFin CSV, AFM bulk, Finansinspektionen Insyn, Consob 1INFO, OeKB OAM GraphQL, Euronext per-issuer pages. Building parsers for each is a ~6-month engineering project; maintaining them is forever.
Latency — what we actually measure
- Best-case (low-volume HTML feeds):<1 hour from regulator publication to row in our DB.
- PDF-resolved sources (DE BaFin, ES CNMV, DK Nasdaq Copenhagen): 6–24 hours.
- Nightly bulk paths: by 03:00 UTC every day.
Actual measured lag per source ships in the data quality audit. We do not currently offer a contractual SLA — pilot customers get a Slack channel with the data engineer instead.
Schema stability
insidereu.filings and insidereu.substantial_holdings have not had a field renamed or dropped since 2025-Q4. Every column documented, including dedup recommendations and known semantic caveats per country. Full schema doc →
The API is two endpoints
/api/v1/filings (PDMR insider trades) and /api/v1/holdings (5%+ shareholder crossings). Cursor + delta-since pagination — a polling consumer pulls only what changed since its last call.
# All German insider trades from the last week curl -H "Authorization: Bearer ins_live_xxx..." \ "https://www.insidereu.com/api/v1/filings?country=DE&from=2026-04-29" # Substantial holdings >= 5% in Swiss issuers curl -H "Authorization: Bearer ins_live_xxx..." \ "https://www.insidereu.com/api/v1/holdings?country=CH&min_pct=5" # Delta poll — only what landed since your last call curl -H "Authorization: Bearer ins_live_xxx..." \ "https://www.insidereu.com/api/v1/filings?since=2026-05-04T22:00:00Z"
For your compliance team: every row carries a source_url pointing back to the original regulator publication. Audit and provenance are one click — we don't host any copyrighted content, just normalise the public filing.
Institutional & Pod Pricing
Transparent desk pricing designed to fit within discretionary pod research budgets (€1,000/mo expensable limits). No multi-week procurement delays. Instant checkout or 7-day API trial.
Boutique Pod Feed
- •Up to 5 named analyst / PM seats (provisioned after checkout)
- •REST API (3,000 req/min, 5,000 row cap)
- •Real-time SSE streaming wire
- •Issuer LEI (GLEIF) + ISIN on every row where resolvable; coverage varies by market, see schema docs
- •Nightly CSV / Parquet file drop to your bucket (set up on request)
- •Private Slack channel with engineering
Multi-Desk / Mid-Market
- •Up to 15 named analyst seats across pods
- •Same 3,000 req/min API + nightly file drop
- •Postgres read-replica access
- •Custom watchlist alerts
- •Quarterly procurement invoicing available
Enterprise / Global Master
- •Unlimited firm-wide seats
- •Dedicated Postgres replica & private S3 bucket
- •Custom national regulator scrapers on demand
- •Contractual SLA + 99.9% uptime guarantee
- •Dedicated data-engineer support
Request a sample
Drop your work email and a fund domain. You'll get a 30-day sample of both filings.csv and substantial_holdings.csv plus the schema doc within 1 business day. George replies personally — no SDR will call you.
Get a 7-day trial key
Drop your work email. Trial tier: 250 rows/page, 120 req/min, 7 days. Enough to validate the data shape and run a backtest; not enough to bulk-export the dataset. Real key in your inbox in under a minute — not a “we’ll be in touch” auto-reply.
Or book 15 minutes with George
Founder. I'll walk through the data shape, your specific use case, and what custom coverage would cost if you need it.
What we're honest about
- Tier is per-country and lives in the API response— every row carries its country's tier so you can filter at query time.
- Some markets are signal-only (issuer + date + URL, no shares/value). Where the regulator publishes the data inside a PDF, we link the PDF and flag the row
signal_only. - Source-side delays are surfaced: BaFin DealingsInfo publishes 6–7 days after the transaction. We don't hide that —
days_since_last_filingis in the data-quality response above. - Historical depth is currently ~12 months on most sources. BaFin DealingsInfo, FI Insynsregistret, LSE RNS, and SIX SER all expose multi-year archives we can ingest on request — ask and we'll quote.