Skip to main content

Erasure Proof — GDPR Article 17 Compliance

When a user exercises their right to erasure, GRAFOMEM doesn't just delete the data — it issues a cryptographic erasure certificate proving the deletion happened, all references were scrubbed, and the certificate is Ed25519-signed for independent verification.

Not just deletion — proof of deletion

Most systems delete data and hope for the best. GRAFOMEM produces a tamper-evident, Ed25519-signed certificate that you can hand to a DPA (Data Protection Authority) or the data subject themselves.

Withdrawn claim — backup-restore independence (2026-09-10)

Earlier material described an erasure ledger that survives a database restore, so that erasures performed after a backup was taken would be re-applied automatically when that backup is restored. That property does not currently hold and the claim is withdrawn: the erasure ledger presently resides in the same database as the data it records, so a restore rolls both back together. Erasure certificates remain valid as signed evidence that each erasure occurred; what is withdrawn is only the automatic re-scrub-after-restore guarantee. This notice stays until the ledger is relocated to a store independent of the primary database, and will be updated, dated, when that lands.

The erasure workflow​

1. Fact is deleted from memory store
↓
2. All references scrubbed from Decision Trail records
(content replaced with "[REDACTED — GDPR Article 17]")
↓
3. Content hash computed — BLAKE2b-128 of deleted content
(proves what was deleted WITHOUT retaining PII)
↓
4. Certificate ID = BLAKE2b-128(tenant_id ‖ fact_ref ‖ timestamp)
↓
5. Certificate Ed25519-signed
↓
6. Certificate persisted to PostgreSQL

Certificate schema​

FieldTypeDescription
certificate_idstringBLAKE2b-128 hex digest
tenant_idstringTenant that requested erasure
fact_refintMemory ref that was deleted
fact_content_hashstringBLAKE2b-128 hash of the content (proof without PII)
governance_recordJSONBProtocol 3.4 formal effect record (declared/observed/result/freshness)
coverageJSONB(Legacy) Subsystems where content was checked or removed
scrubbed_decision_idsstring[]IDs of affected decision records
erasure_requested_atdatetimeWhen erasure was requested
erasure_completed_atdatetimeWhen erasure completed
legal_basisstringe.g. "GDPR Article 17 — Right to Erasure"
requested_bystringWho requested: data_subject, dpo, or automated
signaturebytesEd25519 signature
public_keybytesSigner's public key
verifiedboolWhether signature was verified at issuance

API reference​

POST /v1/erasure/issue​

Issue a signed erasure certificate.

curl -X POST https://cloud.grafomem.com/v1/erasure/issue \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fact_ref": 42,
"fact_content": "Aria lives in Rome",
"requested_by": "data_subject"
}'
The fact_content field is never stored

It is only used to compute a BLAKE2b-128 hash. The hash proves you knew what was deleted, without retaining the PII itself.

GET /v1/erasure/stats​

Summary: total certificates, total decisions scrubbed, signed count, first/last erasure dates.

GET /v1/erasure/{certificate_id}​

Retrieve a single erasure certificate by its ID.

GET /v1/erasure/{certificate_id}/verify​

Independently verify the Ed25519 signature:

{
"valid": true,
"certificate_id": "28b5813a622ed648...",
"detail": "Ed25519 signature verified — certificate is authentic"
}

The verification reconstructs the canonical data, recomputes the BLAKE2b-256 digest, and verifies the Ed25519 signature against the stored public key.

GET /v1/erasure/fact/{fact_ref}​

Find the erasure certificate for a specific fact ref.

GET /v1/erasure/​

List all erasure certificates for the tenant (paginated).

Configuration​

Set ERASURE_SIGNING_KEY as a hex-encoded 32-byte Ed25519 seed:

export ERASURE_SIGNING_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))")
grafomem serve --cloud --db postgresql://...

All certificates will be automatically signed at issuance.