Alt data for European long/short
EU insider trades + 5% holdings,
one polling API.
Every MAR Article 19 PDMR disclosure and every Transparency-Directive 5% crossing across 28 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
+41pp
Hit-rate spread
Vorstand 54% − related-party 13%
250
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
9 insiders at BASF SE bought €2.1Mof their own stock — it's up +29% since.
Between 2025-05-05 and 2025-06-03, 9 different insiders at BASF SE (DE · BAS.DE, ISIN DE000BASF111) disclosed buys totalling €2.1M at a weighted price of €42.34. The stock now trades at €54.44 — the position is worth €2.7M, a +29% (€605k) move in 352 days.
Buyers: Elvermann, Dr. Dirk, Genco, Alessandra, Bock, Dr. Kurt, Kamieth, Dr. Markus, Asenkerschbaumer, Prof. Dr. Stefan +4 more. 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 28 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 | 1,588 | 1 | 99% | BRONZE | 2,411 | 1 | 46% |
| 🇬🇧United Kingdom | BRONZE | 431 | 1 | 11% | BRONZE | 413 | 1 | 4% |
| 🇫🇷France | BRONZE | 157 | 0 | 100% | BRONZE | 576 | 0 | 37% |
| 🇮🇹Italy | BRONZE | 150 | 1 | 1% | BRONZE | 69 | 1 | 0% |
| 🇪🇸Spain | BRONZE | 454 | 1 | 22% | BRONZE | 68 | 0 | 32% |
| 🇳🇱Netherlands | BRONZE | 35 | 2 | 100% | BRONZE | 2,391 | 2 | 10% |
| 🇨🇭Switzerland | GOLD | 2,060 | 2 | 99% | SILVER | 1,931 | 1 | 81% |
| 🇵🇱Poland | BRONZE | 5 | 1 | 100% | BRONZE | 32 | 1 | 100% |
| 🇧🇪Belgium | BRONZE | 29 | 1 | 100% | BRONZE | 290 | 2 | 11% |
| 🇸🇪Sweden | GOLD | 1,817 | 1 | 100% | — | — | — | — |
| 🇦🇹Austria | BRONZE | 1,641 | 1 | 98% | BRONZE | 1,623 | 1 | 100% |
| 🇳🇴Norway | BRONZE | 708 | 0 | 6% | BRONZE | 330 | 0 | 2% |
| 🇩🇰Denmark | BRONZE | 498 | 1 | 10% | BRONZE | 451 | 7 | 17% |
| 🇷🇴Romania | BRONZE | 13 | 1 | 100% | BRONZE | 6 | 1 | 17% |
| 🇵🇹Portugal | BRONZE | 17 | 1 | 100% | — | — | — | — |
| 🇫🇮Finland | BRONZE | 1,664 | 1 | 7% | BRONZE | 762 | 2 | 8% |
| 🇬🇷Greece | BRONZE | 44 | 1 | 0% | BRONZE | 8 | 1 | 13% |
| 🇭🇺Hungary | BRONZE | 32 | 1 | 0% | BRONZE | 6 | 20 | 0% |
| 🇭🇷Croatia | BRONZE | 47 | 6 | 11% | BRONZE | 2 | 2488 | 0% |
| 🇱🇺Luxembourg | BRONZE | 93 | 3 | 0% | BRONZE | 11 | 1 | 9% |
| 🇱🇹Lithuania | BRONZE | 61 | 6 | 0% | BRONZE | 22 | 230 | 0% |
| 🇸🇮Slovenia | BRONZE | 5 | 10 | 0% | BRONZE | 3 | 7 | 0% |
| 🇱🇻Latvia | BRONZE | 354 | 1 | 0% | BRONZE | 233 | 59 | 0% |
| 🇪🇪Estonia | BRONZE | 9 | 924 | 0% | BRONZE | 92 | 1 | 0% |
| 🇨🇾Cyprus | BRONZE | 100 | 2 | 0% | BRONZE | 7 | 6 | 0% |
| 🇮🇸Iceland | BRONZE | 52 | 1 | 8% | BRONZE | 118 | 1 | 21% |
| 🇲🇹Malta | BRONZE | 3 | 3 | 0% | BRONZE | 1 | 3 | 0% |
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: €35.5M · biggest in file: Board Member (Zurich Insurance Group AG) bought €9.5M of Zurich Insurance Group AG (CH)
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)
CSV161 rows · 21 countries · 5%+ crossings · last 90 days
Biggest crossing in file: BIC disclosed 59.02% of SOCIETE BIC (FR)
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 28 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.
Pricing
Flat per-seat. No per-row metering, no surprise overage. 8-week free POC for funds — full dataset, full API, no commitment, no card.
Single seat
- •One named analyst
- •REST API + nightly CSV drop
- •250k requests / month
- •Slack support
Team
- •Up to 5 named seats
- •Same API + CSV drop
- •Postgres read-replica access
- •Slack support
Enterprise
- •Unlimited seats
- •Dedicated Postgres replica
- •SLA + custom enrichment
- •Direct data-engineer access
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.