We provide the authoritative trust anchor between your regulated APIs and the TPP ecosystem. Our service engine automates the complex verification of eIDAS certificates and regulatory roles, giving you the real-time clarity needed to grant or deny access — instantly.
New in v5 — stop polling.
Subscribe once and we push every status change directly to your stack, signed and verifiable.
Push vs pull ↓
Forward any QWAC or QSealC PEM for instant chain-of-trust verification. We validate QTSP signatures and extract all PSD2 attributes in a single atomic pass.
Full-path validation against EU Trust Lists with OCSP and CRL fallback. Zero-cache policy: every check uses live-refreshed anchors (updated hourly).
Real-time mapping of licenses and cross-border permissions. We bridge the gap between national registers to confirm an entity's standing in your target markets.
Cryptographically signed results with hash-chained provenance. Traceable to source records and tamper-evident—providing immutable grounds for your enforcement.
Article 32(3) of the SCA-RTS is explicit: no obstacles to TPPs with a valid eIDAS certificate. Pull-based validation forces a choice between two kinds of non-compliance — add latency that obstructs the legitimate, or cache trust and risk serving the revoked. Push is the third option. We call back the instant a certificate or license changes state, so the verdict lives in your system before the request arrives. Adding no extra latency at all for valid Certificate holders. A closed gate for the rest. So, truly non-obstructive, by design.
Pull was the standard. Push is the answer. We've rebuilt the layer between.
Submit incoming TPP certificates to ourendpoint and apply your own compliance ruleset on our responses. Simple, synchronous, works today.
POST /v5/validate?cc=DE HTTP/3 Host: api.tppvalidation.com Authorization: BearerContent-Type: application/json { "pem": "-----BEGIN CERTIFICATE-----\n...", }
{
"organizationIdentifier": "PSDFR-ACPR-16828",
"serialNumber": "107134684502035741319485938482960176000",
"timestamp": 1776614411000
}
Simply add a Webhook URL with your initial Certificate request. We then POST a signed event to your webhook immediately when anything changes.
{
"webhook_url": "https://bank.eu/hooks/tpp"
}
{
"event_type": "cert.status_changed",
"data": {
"issuer_hash": "773ddc302ea5b96b",
"serial": "6145605090800385797785912406225945772",
"entity_name": "Plaid, B.V.",
"old_status": "valid",
"new_status": "invalid",
"reason": "certificateExpired",
"checked_at": "2026-04-19T19:58:51.243Z"
}
}
Plug our validation tools directly into Claude, Cursor or any MCP-capable agent. Every verdict is a tool call, every check a structured resource.
A slash command away from a verdict. Paste a cert, mention a provider, get a signed response in-channel with full audit link.
Adaptive Card responses, SSO through your tenant, and Graph-integrated audit trails. For the compliance team that lives in Teams.
Multi-endpoints, on multiple large cloud vendors. Fastest path to production, zero ops.
Latency · Uptime · Updates · Support — all on by us. Try it out Now →Deploy into your own subscription. Data sovereignty, funded by existing MACC credits. Deployed in select EU regions.
For institutions with Azure enterprise agreements. Discuss Azure deployment →Buy the source, run it behind your gateway. Optional maintenance contract. Setup and integration available.
Air-gapped environments, full code audit rights. Inquire about source licensing →Free forever for developers and testers — send a cert, get a verdict, ship with confidence.
The price of a coffee, the diligence of a full compliance team — always on, always current, always signed.
The gravity of institutional compliance, the agility of modern infrastructure — your policy, logs and now code.
POST the raw PEM to /v5/validate. Scope the verdict to specific jurisdictions with?cc=se,fr,.. Get deterministic, auditable JSON back.
POST /v5/validate?cc=DE,FR,NL HTTP/1.1 Host: api.tppvalidation.com Authorization: Bearer <token> Content-Type: text/plain -----BEGIN CERTIFICATE----- MIIGkTCCBHmgAwIBAgIUEh... -----END CERTIFICATE-----
HTTP/3 200 OK
Content-Type: application/json
X-TPP-Passports: DE=PSP_PI,PSP_AI;FR=PSP_PI,PSP_AI;NL=PSP_PI,PSP_AI
X-TPP-Identifier: a8f2c9d1...
X-TPP-Entity: PSP
{
"result": {
"serialNumber": "107134684502035741319485938482960176000",
"organizationIdentifier": "PSDFR-ACPR-16828",
"timestamp": 1776614411000
},
"webhookRegistered": false
}
Add a webhook_url to any /v5/validate call. We POST signed events when status changes. No polling required. POST the same PEM again — for a heartbeat. ❤️
POST /v5/validate?cc=DE HTTP/3
Host: api.tppvalidation.com
Authorization: Bearer <token>
Content-Type: application/json
{
"pem": "-----BEGIN CERTIFICATE-----\n...",
"webhook_url": "https://bank.eu/hooks/tpp"
}
# Your endpoint receives:
POST /hooks/tpp HTTP/1.1
Content-Type: application/json
X-Webhook-Signature: t=1776756250,v1=50666a0d107f69bd914017e55e2250d40ce69875...
X-Webhook-Event-Id: 01KPQESF7DNJW5JAZ2PTC5GRKV
X-Webhook-Delivery-Id: 1d7b77e4-7c00-4dce-ba36-ab39a9de09f9
User-Agent: tpp-validator-webhooks/5.0
{
"event_id": "01KPQESF7DNJW5JAZ2PTC5GRKV",
"event_type": "cert.status_changed",
"created_at": "2026-04-21T07:24:03.693Z",
"data": {
"issuer_hash": "34b00ae80ada1f90",
"serial": "107134684502035741319485938482960176000",
"entity_name": "Plaid, B.V.",
"old_status": "valid",
"new_status": "invalid",
"reason": "certificateRevoked",
"checked_at": "2026-04-21T07:24:03.611Z"
}
}
Every webhook subscription emits its own lifecycle event. You always know whether your endpoint is live, whether a URL change landed, and when an unsubscribe takes effect — confirmed by a signed callback, not a silent KV write.
POST a cert with a webhook_url. First time registers the subscription. Same URL again = heartbeat ping that confirms your endpoint still works end-to-end.
{
"event_type": "webhook.subscription_created",
"data": {
"webhook_url": "https://bank.eu/hooks/tpp",
"issuer_hash": "34b00ae80ada1f90",
"serial": "107134...",
"entity_name": "Plaid, B.V."
}
}
POST the same cert with a different webhook_url. We swap the destination atomically and deliver one confirmation event to the new URL with the previous one in the payload.
{
"event_type": "webhook.subscription_updated",
"data": {
"webhook_url": "https://bank.eu/hooks/tpp-v2",
"previous_webhook_url": "https://bank.eu/hooks/tpp",
"issuer_hash": "34b00ae80ada1f90",
"serial": "107134..."
}
}
Send DELETE /v5/subscriptions/{issuer_hash}/{serial} with your bearer token. We remove the subscription and deliver one final goodbye event to the URL that was registered.
{
"event_type": "webhook.subscription_deleted",
"data": {
"webhook_url": "https://bank.eu/hooks/tpp-v2",
"issuer_hash": "34b00ae80ada1f90",
"serial": "107134..."
}
}