We provide the authoritative trust anchor between your regulated APIs and the TPP ecosystem. Our 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.
We have asked us the same thing for years: "why not push, rather than pull" So we built it.
Submit incoming certificates to ourendpoint and apply your own compliance ruleset on our responses. Simple, synchronous, works today.
{
"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.
{
"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-region EU endpoint on Cloudflare + Azure. Fastest path to production, zero ops.
Deploy into your own subscription. Data sovereignty, funded by existing MACC credits.
Buy the source, run it behind your gateway. Optional maintenance contract.
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 with an Authorization header and optional ?cc= country filter. Deterministic, auditable JSON back.
POST /v5/validate?cc=DE,FR,NL HTTP/3 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 and we POST signed events to your endpoint whenever that certificate's status changes.
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/3
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..."
}
}