Documentation → Directors' dealings
Documentation

Directors' dealings

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

GET /dealings

Dealings List

Persisted directors' dealings, filtered and paginated.

NameTypeMeaning
tickerstring, in query
optional
isinstring, in query
optional
directionstring, in query
optional
BUY | SELL | OTHER
sourcestring, in query
optional
sec | bafin
personstring, in query
optional
Namensteil, case-insensitive
date_fromstring, in query
optional
Transaktionsdatum >= YYYY-MM-DD
date_tostring, in query
optional
Transaktionsdatum <= YYYY-MM-DD
match_statusstring, in query
optional
matched | unmatched
min_volumenumber, in query
optional
sincestring, in query
optional
Nur Datensätze mit created_at > since (ISO-Cursor)
updated_sincestring, in query
optional
Nur Datensätze mit updated_at > Wert
orderstring, in query
optional
created_at | updated_at (aufsteigend); sonst neueste Transaktion zuerst
limitinteger, in query
optional · default 100
offsetinteger, in query
optional · default 0

Example

curl "$API/dealings" \
  -H "X-API-Key: $KEY"
GET /dealings/by/{identifier}

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.

NameTypeMeaning
identifierstring, in path
required
limitinteger, in query
optional · default 100
offsetinteger, in query
optional · default 0

Example

curl "$API/dealings/by/SAP" \
  -H "X-API-Key: $KEY"
GET /dealings/changes

Dealings Changes

Gap-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

largest created_at you have already imported. The feed answers
inclusively (created_at >= since); deduplicating on source_key catches
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.

NameTypeMeaning
sincestring, 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_sincestring, in query
optional
Alternativ: nach updated_at feeden (fängt auch In-Place-Änderungen).
sourcestring, in query
optional
sec | bafin
limitinteger, in query
optional · default 500

Example

curl "$API/dealings/changes" \
  -H "X-API-Key: $KEY"
GET /dealings/events

Dealings Events

Aggregated 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:

  • Initial load: ?date_from=2026-01-01 (optionally source= and/or
  ticker=/isin=), then page through via offset until
  has_more=false.
- Ongoing: pull a trailing window (e.g. date_from=today-14d) and
  upsert by event_id on 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.

NameTypeMeaning
groupstring, in query
optional · default ticker_day
ticker_day | filing
date_fromstring, in query
optional
Event-Tag >= YYYY-MM-DD (z.B. 2026-01-01 für Erstbefüllung)
date_tostring, in query
optional
Event-Tag <= YYYY-MM-DD
sourcestring, in query
optional
sec | bafin (leer = alle Quellen)
tickerstring, in query
optional
isinstring, in query
optional
include_source_keysboolean, in query
optional · default True
Roh-source_keys je Event zum Aufklappen mitliefern
limitinteger, in query
optional · default 100
offsetinteger, in query
optional · default 0

Example

curl "$API/dealings/events" \
  -H "X-API-Key: $KEY"
GET /dealings/item/{source_key}

Dealings Item

NameTypeMeaning
source_keystring, in path
required

Example

curl "$API/dealings/item/SAP" \
  -H "X-API-Key: $KEY"
GET /dealings/jobs/{job_id}

Dealings Job Status

NameTypeMeaning
job_idstring, in path
required

Example

curl "$API/dealings/jobs/job_7f3c" \
  -H "X-API-Key: $KEY"
GET /dealings/recent

Dealings Recent

Dealings of the last N days (by transaction date).

NameTypeMeaning
daysinteger, in query
optional · default 7
sourcestring, in query
optional
directionstring, in query
optional
limitinteger, in query
optional · default 100
offsetinteger, in query
optional · default 0

Example

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" }
  ]
}
POST /dealings/rematch

Dealings Rematch

Rematches 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).

NameTypeMeaning
sourcestring, in query
optional
sec | bafin (Default: beide)

Example

curl -X POST "$API/dealings/rematch" \
  -H "X-API-Key: $KEY"
POST /dealings/sync/bafin

Dealings Sync Bafin

Synchronises 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.

Request body BafinSyncRequest

NameTypeMeaning
isinstring
optional
Isin
issuerstring
optional
Issuer
from_datestring
optional
From Date
to_datestring
optional
To Date
scopestring
optional
Scope

Example

curl -X POST "$API/dealings/sync/bafin" \
  -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{ … }'
POST /dealings/sync/bafin/all

Dealings Sync Bafin All

BaFin 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}.

NameTypeMeaning
scopestring, in query
optional · default month
week | month | all (Fenster pro Emittent)

Example

curl -X POST "$API/dealings/sync/bafin/all" \
  -H "X-API-Key: $KEY"
POST /dealings/sync/bafin/recent

Dealings Sync Bafin Recent

Recurring 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.

NameTypeMeaning
daysinteger, in query
optional · default 7
Marktweites Fenster in Tagen

Example

curl -X POST "$API/dealings/sync/bafin/recent" \
  -H "X-API-Key: $KEY"
POST /dealings/sync/bulk

Dealings Sync Bulk

Background 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.

Request body BulkSyncRequest

NameTypeMeaning
identifiersarray
required
Identifiers
sourcesarray
optional · default ['sec', 'bafin']
Sources
concurrencyinteger
optional · default 5
Concurrency
limitinteger
optional · default 25
Limit

Example

curl -X POST "$API/dealings/sync/bulk" \
  -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{ … }'
POST /dealings/sync/sec/backfill

Dealings Sync Sec Backfill

Market-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.

NameTypeMeaning
from_datestring, in query
optional · default 2026-01-01
Start YYYY-MM-DD
to_datestring, in query
optional
Ende YYYY-MM-DD (Default: heute)

Example

curl -X POST "$API/dealings/sync/sec/backfill" \
  -H "X-API-Key: $KEY"
POST /dealings/sync/sec/recent

Dealings Sync Sec Recent

Market-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}.

NameTypeMeaning
datestring, in query
optional
Handelstag YYYY-MM-DD (Default: heute)

Example

curl -X POST "$API/dealings/sync/sec/recent" \
  -H "X-API-Key: $KEY"
POST /dealings/sync/sec/{identifier}

Dealings Sync Sec

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).

NameTypeMeaning
identifierstring, in path
required
limitinteger, in query
optional · default 25
Max. Form-3/4/5-Filings
historyboolean, in query
optional · default False
Volle Historie (alle Shards, ignoriert limit)

Example

curl -X POST "$API/dealings/sync/sec/SAP" \
  -H "X-API-Key: $KEY"