Submit beneficial-owner and custody-chain data to any EU member-state tax authority. Receive the official UUID per beneficial owner — the prerequisite for every WHT reclaim.
End-to-end pipeline
Every step is validated and persisted. The pipeline fails closed before any submission — no partial reports, no silent errors.
Real output
Not a mockup. Every identifier, amount and XML fragment below is captured from an actual pipeline run against the real API — 100 SAP SE shares held in omnibus by two beneficial owners.
POST /v1/institutions → Helvetia Broker AG · api_key cp_live_…
POST /v1/dividend-events → SAP SE · DE0007164600 · record 2026-05-11
POST /v1/submissions → 2 owners · 100 shares · 1 custody hop
POST /v1/reports/generate → status: uuid_received
dae09025-c8d3-56f7-8c4b-13225ef06015 Alpine Pension Fund (CH) · 60 sh
136619a3-bd69-51c4-89ea-24e81498ae97 John A. Investor (US) · 40 sh
<fmfach:Paymentline ISIN="DE0007164600" Zahlungstag="2026-05-14"
COAF="CA20260514SAP01" ArtDesWertpapieres="Aktie">
<fmfach:AusschuettendeGesellschaft Bezeichnung="SAP SE"/>
<fmfach:Kapitalertrag KontonummerGutschrift="CH-KONTO-60001"
GutschriftArt="Bargeld" Stueckzahl="60.0000"
KapitalertragBrutto="132.00" KapitalertragNetto="97.18">
<fmfach:EinbehalteneSteuern Kapitalertragsteuer="33.00" Solz="1.82"
KapEStSteuersatz="25.00" SolzSteuersatz="5.50"
KapEStRechtsgrundlage="§ 43a Absatz 1 Nr. 1 EStG"/>
</fmfach:Kapitalertrag>
<fmfach:Stueckzahlen StueckzahlMehrAls5Tage="60.0000"
StueckzahlInnerhalbVon5Tagen="0.0000"
StueckzahlMitFinanzvereinbarung="0.0000"
StueckzahlOhneFinanzvereinbarung="60.0000"/>
</fmfach:Paymentline>
60 shares × €2.20 = €132.00 gross · 25 % Kapitalertragsteuer €33.00 · 5.5 % Solidaritätszuschlag €1.82 · €97.18 net. The §36a Stückzahl split and the § 43a legal basis are derived, not entered.
Every field above is supplied data or computed output — no placeholders. Where a mandatory field is not supplied, ChainPipe emits a clearly marked placeholder and the go-live preflight refuses to file for real until it is replaced.
Built for production
Designed for institutions that need auditability and correctness — not just a wrapper around a tax authority API.
inline returns UUIDs synchronously — ideal for CI. queued returns 202 and finalises via Arq worker with DIP ack polling.POST /v1/reports/validate) or on a filed report (POST /v1/reports/{id}/validate). It also flags which officially-mandatory fields would go out as placeholders, which XSD validation alone cannot detect. GET /v1/reports/{id}/status returns the live saga state plus an audit timeline, and GET /v1/reports/{id}/xml downloads the rendered MiKaDiv payload.GET /v1/etrc/coverage reports per-beneficial-owner eTRC coverage for a dividend's record date. GET /v1/dividend-events/{id}/sla tracks the FASTER quick-refund deadline (Art 14: 60 days after the request period).GET /v1/pricing) and a cost calculator (GET /v1/pricing/quote) — predictable cost, not contingency fees. GET /v1/usage/billing-summary projects a tenant's spend from metered usage, and GET /v1/analytics/summary quantifies recovery yield across reports and reclaims.beneficial_owner_id tag. The pipeline attributes MehrAls5Tage / InnerhalbVon5Tagen buckets accurately per creditor. Falls back to the safe all-MehrAls5Tage default and records unattributed BOs in the audit trail for resubmission.NatInlandMitId (IdNr), NichtNatInlandMitWid (WIdNr), or NichtNatInlandMitStNr (Steuernr). Gracefully falls back to the foreign-resident variant when no usable German tax id is present.depot_account_number + depot_account_type (A–G) per hop override the placeholder and are written into the MiKaDiv XML as ArtDesDepotkontos./v1/annex2) — an explicit seam for the Commission's XSD. The SLA endpoint adds the Art. 13 reporting deadline and per-claim Art. 14(3) late-payment interest, closed at refunded_on via POST /v1/reclaims/{id}/refund.cfi_alerts and webhooks. GET /v1/liability/exposure quantifies strict-liability exposure with risk flags and an exclusion-override invariant detector.Country coverage
Each member state is a transport adapter. The pipeline, validation, and saga stay identical across every country.
Regulatory scope
Not retrofitted. Data model and transport seam were designed around standardised FASTER reporting from the start.
eu-* regions only.NatInlandMitId / NichtNatInlandMitWid / NichtNatInlandMitStNr. Verwahrstelle nodes enriched from GLEIF; client-supplied depot accounts accepted per hop. Client-provided COAF, security type, and credit kind carried through to the filing.Technology
Get started
Zero external services required — the unit suite runs in-process with a mock DIP client and no database container.
# install dev dependencies pip install -r requirements-dev.txt # 500+ unit tests — no external services required pytest -q 500+ passed (integration tests need Postgres)
Clone the repo, run the quickstart, and have a report generating UUIDs in under ten minutes.