Hosted dashboard

The library does everything locally and for free. The hosted platform at getdpdp.net is optional - it's the evidence vault and dashboard: a durable, third-party-attested record you can show an auditor.

Gate the proof, not the function. The SDK always works standalone; the platform adds proof you can't self-fabricate, never a runtime dependency on our uptime.

What it adds

When your library pushes its audit chain to the platform, the backend:

  1. Verifies the hash-chain with the same hashing the library uses.
  2. Server-timestamps it on receipt (independent "existed at this time").
  3. Counter-signs the Certificate of Erasure with a getdpdp.net key.

The counter-signature is the product - it turns "JSON your company wrote" into "proof a third party attests to."

Push evidence from your app

The Python SDK can push its chain to the vault in one line — evidence only, never PII, and fire-and-forget so it never blocks your request path:

from dpdpstack import EvidenceClient

vault = EvidenceClient("https://getdpdp.net/api/v1", api_key="dpdp_sk_…", source="api")
vault.push_background(log)   # idempotent; returns immediately

See Security & operations for how the vault stays tamper-proof (append-only enforcement, Row-Level Security) and how to verify or crypto-shred it.

The dashboard

Sign up to get an API key and a dashboard over your evidence - audit log, consent records, retention, data-rights (DSR), breaches, erasure targets, and certificates.

DPDPStack dashboard overview

The audit log is the hash-chained record of every decision; the header shows whether the chain still verifies.

Tamper-evident audit log

Issue and verify a Certificate of Erasure for any subject directly from the dashboard - or verify one publicly at getdpdp.net/verify.

Issue and verify Certificates of Erasure

The HTTP API

Everything in the dashboard is also an API — language-agnostic, so you're not limited to the Python engine: call it from Go, Java, Ruby, or anything that speaks HTTP. Authenticate with a secret key (dpdp_sk_…) via the X-API-Key header. Prefer a typed client? The JavaScript SDK wraps every endpoint; for other languages, see Other languages.

# Record an erasure (or legal-hold deferral) for a subject
curl -X POST https://getdpdp.net/api/v1/erasure \
  -H "X-API-Key: dpdp_sk_…" -H "Content-Type: application/json" \
  -d '{"principal_ref": "user_42", "purpose": "kyc"}'

# Issue a counter-signed Certificate of Erasure
curl -X POST https://getdpdp.net/api/v1/certificate \
  -H "X-API-Key: dpdp_sk_…" -H "Content-Type: application/json" \
  -d '{"principal_ref": "user_42", "purpose": "kyc"}'

The verify endpoint is public - no auth - so anyone can check a certificate:

curl -X POST https://getdpdp.net/api/v1/certificate/verify \
  -H "Content-Type: application/json" \
  -d '{"certificate_jwt": "eyJhbGciOiJSUzI1NiIs…"}'

This page shows the highlights. For every endpoint — consent, erasure, audit, certificates, rights, breaches, readiness — see the full API reference. The exhaustive, always-current schema is auto-generated at Swagger and ReDoc (it can't drift from the code).

Key types

KindPrefixUse
Secretdpdp_sk_Server-side, full access. Never expose in a browser.
Publishabledpdp_pk_Safe for client code; limited to the consent-widget endpoints and optionally origin-restricted.

Manage keys (create, mask, revoke) from the dashboard's API keys page.