Insider transactions from SEC and BaFin in one format. For downstream systems /dealings/changes is the right entry point, not a time window.
What it is good for is on the product page: Directors' dealings
/dealingsGET/dealings/by/{identifier}GET/dealings/changesGET/dealings/eventsGET/dealings/item/{source_key}GET/dealings/jobs/{job_id}GET/dealings/recentPOST/dealings/rematchPOST/dealings/sync/bafinPOST/dealings/sync/bafin/allPOST/dealings/sync/bafin/recentPOST/dealings/sync/bulkPOST/dealings/sync/sec/backfillPOST/dealings/sync/sec/recentPOST/dealings/sync/sec/{identifier}/dealingsPersisted directors' dealings, filtered and paginated.
| Name | Type | Meaning |
|---|---|---|
ticker | string, in query optional | — |
isin | string, in query optional | — |
direction | string, in query optional | BUY | SELL | OTHER |
source | string, in query optional | sec | bafin |
person | string, in query optional | Namensteil, case-insensitive |
date_from | string, in query optional | Transaktionsdatum >= YYYY-MM-DD |
date_to | string, in query optional | Transaktionsdatum <= YYYY-MM-DD |
match_status | string, in query optional | matched | unmatched |
min_volume | number, in query optional | — |
since | string, in query optional | Nur Datensätze mit created_at > since (ISO-Cursor) |
updated_since | string, in query optional | Nur Datensätze mit updated_at > Wert |
order | string, in query optional | created_at | updated_at (aufsteigend); sonst neueste Transaktion zuerst |
limit | integer, in query optional · default 100 | — |
offset | integer, in query optional · default 0 | — |
curl "$API/dealings" \ -H "X-API-Key: $KEY"
/dealings/by/{identifier}Dealings for a ticker / ISIN / CIK / WKN / entity_value.
The identifier is resolved centrally; the search then runs over both the ticker AND the share ISIN (filings can be stored under either). If the security cannot be resolved, the older ISIN/ticker heuristic applies.
| Name | Type | Meaning |
|---|---|---|
identifier | string, in path required | — |
limit | integer, in query optional · default 100 | — |
offset | integer, in query optional · default 0 | — |
curl "$API/dealings/by/SAP" \ -H "X-API-Key: $KEY"
/dealings/changesGap-free increment feed for downstream consumers (a newsroom, for example).
Cursor over the ingestion timestamp created_at, ascending. Two ways to use the same endpoint:
A) Derive the cursor from your own data (stateless): send as since the
largestcreated_atyou have already imported. The feed answers inclusively (created_at >= since); deduplicating onsource_keycatches the one boundary record. The simplest route.
B) Pass the next_since token through: store the returned next_since and
send it on the next call. Exact, no re-fetch.
Both are gap-free: the cursor is composed of (created_at, source_key), so records sharing a created_at at a batch boundary are not lost. created_at — not the transaction or filing date — is the right key, because filings arrive late (SEC amendments, BaFin corrections) and only ingestion time is monotonic from a consumer's point of view.
| Name | Type | Meaning |
|---|---|---|
since | string, in query optional | Cursor. Entweder MAX(created_at) der eigenen Daten (ISO) ODER das `next_since`-Token aus dem letzten Aufruf. Leer = von Anfang. |
updated_since | string, in query optional | Alternativ: nach updated_at feeden (fängt auch In-Place-Änderungen). |
source | string, in query optional | sec | bafin |
limit | integer, in query optional · default 500 | — |
curl "$API/dealings/changes" \ -H "X-API-Key: $KEY"
/dealings/eventsAggregated directors' dealings news events for downstream use (newsroom).
Bundles the raw rows (one document per transaction) into one event per security and day (ticker_day, the default) or per filing (filing). Each event carries net buys and sells, the people involved, gross and net volume, currencies and — for expanding — the source_keys.
Usage:
?date_from=2026-01-01 (optionally source= and/orticker=/isin=), then page through viaoffsetuntilhas_more=false. - Ongoing: pull a trailing window (e.g.date_from=today-14d) and upsert byevent_idon the consumer side (events are idempotent; late filings update the event in place).
Only matched rows (those with a ticker) feed ticker_day events; unmatched raw rows stay visible via GET /dealings?match_status=unmatched.
| Name | Type | Meaning |
|---|---|---|
group | string, in query optional · default ticker_day | ticker_day | filing |
date_from | string, in query optional | Event-Tag >= YYYY-MM-DD (z.B. 2026-01-01 für Erstbefüllung) |
date_to | string, in query optional | Event-Tag <= YYYY-MM-DD |
source | string, in query optional | sec | bafin (leer = alle Quellen) |
ticker | string, in query optional | — |
isin | string, in query optional | — |
include_source_keys | boolean, in query optional · default True | Roh-source_keys je Event zum Aufklappen mitliefern |
limit | integer, in query optional · default 100 | — |
offset | integer, in query optional · default 0 | — |
curl "$API/dealings/events" \ -H "X-API-Key: $KEY"
/dealings/item/{source_key}| Name | Type | Meaning |
|---|---|---|
source_key | string, in path required | — |
curl "$API/dealings/item/SAP" \ -H "X-API-Key: $KEY"
/dealings/jobs/{job_id}| Name | Type | Meaning |
|---|---|---|
job_id | string, in path required | — |
curl "$API/dealings/jobs/job_7f3c" \ -H "X-API-Key: $KEY"
/dealings/recentDealings of the last N days (by transaction date).
| Name | Type | Meaning |
|---|---|---|
days | integer, in query optional · default 7 | — |
source | string, in query optional | — |
direction | string, in query optional | — |
limit | integer, in query optional · default 100 | — |
offset | integer, in query optional · default 0 | — |
curl "$API/dealings/recent?days=7&limit=2" \ -H "X-API-Key: $KEY"
{
"count": 2,
"items": [
{ "issuer": "SAP SE", "isin": "DE0007164600",
"person": "Christian Klein", "type": "buy",
"shares": 4200, "price": 231.40, "date": "2026-08-29",
"regulator": "BaFin" }
]
}/dealings/rematchRematches persisted dealings against the current matching and ticker_reference.
Run once after an improvement to the attribution: filings already stored are re-attributed without fetching them again. Background job — progress via GET /dealings/jobs/{job_id} (successful = records updated).
| Name | Type | Meaning |
|---|---|---|
source | string, in query optional | sec | bafin (Default: beide) |
curl -X POST "$API/dealings/rematch" \ -H "X-API-Key: $KEY"
/dealings/sync/bafinSynchronises managers' transactions from the BaFin database.
Without isin/issuer the search runs market-wide — scope then applies (default: the last month, all = the entire database).
No parameters.
BafinSyncRequest| Name | Type | Meaning |
|---|---|---|
isin | string optional | Isin |
issuer | string optional | Issuer |
from_date | string optional | From Date |
to_date | string optional | To Date |
scope | string optional | Scope |
curl -X POST "$API/dealings/sync/bafin" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/dealings/sync/bafin/allBaFin bulk sync across all German ISINs (one query per issuer).
Only needed for targeted depth per German issuer (scope=all fetches the complete currently available window for a security). For the regular recurring sync use /sync/bafin/recent instead — more complete and cheaper. Runs as a background job — progress via GET /dealings/jobs/{job_id}.
| Name | Type | Meaning |
|---|---|---|
scope | string, in query optional · default month | week | month | all (Fenster pro Emittent) |
curl -X POST "$API/dealings/sync/bafin/all" \ -H "X-API-Key: $KEY"
/dealings/sync/bafin/recentRecurring BaFin sync: ONE market-wide pull of the last N days.
The preferred route for the daily sync — it captures every ISIN nationality (not only DE) in a single request. About 13 % of filings carry a non-German ISIN (mostly GB/US), which the German-ISIN approach of /sync/bafin/all would miss. Runs synchronously (one pull) and returns counters.
| Name | Type | Meaning |
|---|---|---|
days | integer, in query optional · default 7 | Marktweites Fenster in Tagen |
curl -X POST "$API/dealings/sync/bafin/recent" \ -H "X-API-Key: $KEY"
/dealings/sync/bulkBackground job: directors' dealings for a list of identifiers.
SEC runs per identifier over EDGAR; for BaFin the ISIN is used directly or resolved via ticker_reference.
No parameters.
BulkSyncRequest| Name | Type | Meaning |
|---|---|---|
identifiers | array required | Identifiers |
sources | array optional · default ['sec', 'bafin'] | Sources |
concurrency | integer optional · default 5 | Concurrency |
limit | integer optional · default 25 | Limit |
curl -X POST "$API/dealings/sync/bulk" \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{ … }'/dealings/sync/sec/backfillMarket-wide historical backfill over a date range (daily index).
Runs as a background job, day by day; large ranges can take hours (~2,000 Form 4 filings per trading day). Progress via GET /dealings/jobs/{job_id} (fields current_date, filings_ingested). Idempotent — a repeat run adds only what is new.
| Name | Type | Meaning |
|---|---|---|
from_date | string, in query optional · default 2026-01-01 | Start YYYY-MM-DD |
to_date | string, in query optional | Ende YYYY-MM-DD (Default: heute) |
curl -X POST "$API/dealings/sync/sec/backfill" \ -H "X-API-Key: $KEY"
/dealings/sync/sec/recentMarket-wide sync of every Form 3/4/5 of one trading day via the EDGAR daily index.
Starts a background job — progress via GET /dealings/jobs/{job_id}.
| Name | Type | Meaning |
|---|---|---|
date | string, in query optional | Handelstag YYYY-MM-DD (Default: heute) |
curl -X POST "$API/dealings/sync/sec/recent" \ -H "X-API-Key: $KEY"
/dealings/sync/sec/{identifier}Synchronises one issuer's directors' dealings from SEC EDGAR.
identifier: ticker, CIK, or an isin: / wkn: / ticker: / cik: prefix. history=true loads the complete filing history (back to 1994).
| Name | Type | Meaning |
|---|---|---|
identifier | string, in path required | — |
limit | integer, in query optional · default 25 | Max. Form-3/4/5-Filings |
history | boolean, in query optional · default False | Volle Historie (alle Shards, ignoriert limit) |
curl -X POST "$API/dealings/sync/sec/SAP" \ -H "X-API-Key: $KEY"