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.
Pull was the standard. Push is the answer. We've rebuilt the layer between.
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 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.
For institutions with Azure enterprise agreements. Discuss Azure deployment →Buy the source, run it behind your gateway. Optional maintenance contract.
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..."
}
}