DPDPEnforced May 13, 2027Checklist →
++

Audit Ledger & Signed Records

How ConsentPlix signs every consent record with HMAC-SHA256, stores it in an append-only ledger, and how auditors can verify a record themselves.

Updated October 12, 2026

Section 6(10) of the DPDP Act puts the burden of proof on you: if anyone questions whether consent was given, you must show it. This page explains how ConsentPlix records consent so that proof holds up.

Why a normal database log is not enough

A row in an ordinary database table can be edited, backdated or deleted by anyone with admin access. If a regulator or auditor asks, you cannot easily prove that it was not changed, or which version of the notice the person actually saw.

ConsentPlix signs each record when it is created and never updates it afterwards. Any change to a stored record breaks its signature, so tampering is visible.

{
  "artifact_id": "art_c7e394b8109f4a56a02e77b1029c",
  "site_id": "40f5012a-4c22-4a0b-9cf7-e41d8e1329a1",
  "event_type": "GRANT",
  "subject_key": "d41d8cd98f00b204e9800998ecf8427e...",
  "purposes_granted": ["analytics", "marketing"],
  "purposes_denied": ["profiling"],
  "policy_version_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "ip_hash": "7b2c918a03f446059d08e709c004a43b...",
  "signature": "a8f5c312d1b7428f9901b0a51478201de38e83b4b54019a3b65f49e0c70410a8",
  "key_version": 1,
  "recorded_at": "2026-10-12T16:29:31.144Z"
}
FieldMeaning
event_typeGRANT, WITHDRAW or UPDATE
subject_keySalted hash of the visitor’s identifier. No raw personal data is stored.
purposes_granted / purposes_deniedExactly what the person agreed to and refused
policy_version_hashHash of the notice text the person saw
ip_hashSalted hash of the IP address
signatureHMAC-SHA256 over the record, using your tenant key
key_versionWhich key signed it, so keys can be rotated safely

Merkle checkpoints

Records are grouped into batches, and each batch is summarised as a Merkle root. If any single record in a batch changes, the root no longer matches. This lets you prove that a record existed at a given time without exposing the other records in the batch.

Verify a record yourself

Auditors and compliance officers can check a signature with standard OpenSSL, without using ConsentPlix at all:

#!/bin/bash
# Recompute the HMAC-SHA256 signature for a consent record
RECORD_DATA="d41d8cd98f00b204e9800998ecf8427e:GRANT:e3b0c44298fc1c149afbf4c8996fb924:2026-10-12T16:29:31.144Z"
TENANT_SECRET="whsec_your_tenant_secret_key"

COMPUTED_SIG=$(echo -n "$RECORD_DATA" | openssl dgst -sha256 -hmac "$TENANT_SECRET" | awk '{print $2}')
echo "Computed signature: $COMPUTED_SIG"

If the computed value matches the signature field, the record has not been changed since it was signed.

You can also check a receipt in the browser with the receipt verifier.