Law and project events
The webhook events for a changed DPDP rule set, a published privacy policy and a project that is closing or deleted, with examples.
Four webhook events report changes to the law the checks use, to your privacy policy and to the project itself. Each arrives in the envelope described in Webhook format. In all of them the envelope's test is false.
Events#
ruleset.changed#
Sent when
The DPDP rule set in force differs from the one someone in the project last acknowledged. The cause is a new release, or a change the platform team recorded because the Government notified one. It is sent once for each change. That is within minutes of an operator's change or of the API starting, and otherwise at 07:00 in the API's time zone. Review the DPDP Act check.
Payload
Field in data |
Type | Description |
|---|---|---|
law |
string | DPDP. |
version |
string | The rule set version now in force, such as 2026.1. |
reviewedOn |
date | When that version was last checked against the Gazette. |
fingerprint |
string | SHA-256 over the commencement dates and values now in force. |
previousVersion |
string | The version the project last acknowledged. |
previousFingerprint |
string | The fingerprint of the dates and values it last acknowledged. |
changes |
array | One entry for each date that moved: key, provisions, from, to, setBy (RELEASE or OPERATOR) and setOn. |
valueChanges |
array | One entry for each value that changed: key, label, unit (days or hours), provisions, from, to, effectiveFrom, setBy and setOn. |
ruleChanges |
array | One entry for each threshold, list, wording or written rule that changed: key, label, change (CREATED, CHANGED or RETIRED) and effectiveFrom. |
dates |
array | Every commencement date now in force, with key, provisions, date, releaseDate, setBy, setOn, instrument, citation and url. |
values |
array | Every value, with key, label, unit, value, inForce, releaseValue, effectiveFrom, provisions, setBy, setOn, instrument, citation and url. value is the amended value; inForce is the one in force today. |
The keys are listed in DPDP rule set.
Example
{
"id": "6b1f0e2a-3c4d-4e5f-8a9b-0c1d2e3f4a5b",
"type": "ruleset.changed",
"createdOn": "2026-10-10T07:00:04.118Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"law": "DPDP",
"version": "2026.2",
"reviewedOn": "2026-11-07",
"fingerprint": "9c3e…",
"previousVersion": "2026.2",
"previousFingerprint": "41d7…",
"changes": [
{
"key": "act-eighteen-months",
"provisions": "Sections 3 to 5, 6(1) to (8) and (10), 7 to 17, …",
"from": "2027-05-13",
"to": "2026-11-13",
"setBy": "OPERATOR",
"setOn": "2026-10-10T06:58:41.000Z"
}
],
"valueChanges": [
{
"key": "board-report-hours",
"label": "Full report of a breach to the Board",
"unit": "hours",
"provisions": "Rule 7(2)(b)",
"from": 72,
"to": 48,
"effectiveFrom": "2027-01-01",
"setBy": "OPERATOR",
"setOn": "2026-11-07T06:58:41.000Z"
}
],
"ruleChanges": [
{
"key": "eighth-schedule-languages",
"label": "Languages a notice and request must be offered in",
"change": "CHANGED",
"effectiveFrom": "2027-02-01"
}
],
"dates": [],
"values": []
}
}policy.published#
Sent when
A privacy policy or other notice is published. Forms linked to it that still show an earlier version are listed, with the current records collected under them. After a material change, ask those people again or tell them. See Update the privacy policy.
Payload
Field in data |
Type | Description |
|---|---|---|
policyId |
UUID | The policy's id. |
policyKey |
string | The policy's key. |
title |
string | Its title. |
type |
string | PRIVACY_POLICY, COOKIE_POLICY, NOTICE_AT_COLLECTION, TERMS or DPA. |
version |
integer | The version now published. |
changeType |
string | WORDING when nothing new is asked of anyone, MATERIAL when what people agreed to changes. The publisher chooses. |
contentHash |
string | The hash of the published wording. |
publishedOn |
time | When it was published. |
changeNote |
string | The publisher's note. Empty when none was given. |
affectedFormIds |
array of UUIDs | Published forms linked to the policy that show an earlier version. |
affectedRecords |
integer | Current live records, granted or partly granted, collected under those forms' earlier versions. |
Example
{
"id": "0f4e8d2c-9b7a-4c61-8e5d-3a2b1c0d9e8f",
"type": "policy.published",
"createdOn": "2026-10-09T11:20:45.902Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"policyId": "8d2f6a10-4b3c-4e9d-a1f7-5c6b2e9d0a34",
"policyKey": "privacy-policy-en",
"title": "Kaveri Stores privacy policy",
"type": "PRIVACY_POLICY",
"version": 3,
"changeType": "MATERIAL",
"contentHash": "b5c2…",
"publishedOn": "2026-10-09T11:20:45.000Z",
"changeNote": "Orders are now shared with our courier partner",
"affectedFormIds": ["0b9c6f0e-6a55-4c1e-9d0a-2f6f0f4f7a11"],
"affectedRecords": 1840
}
}project.closing#
Sent when
An owner schedules the project's deletion, or cancels it. Stop sending new data to the project before deleteOn. See Close a project.
Payload
Field in data |
Type | Description |
|---|---|---|
closureId |
UUID | The closure's id. |
status |
string | SCHEDULED, or CANCELLED when the owner cancels. |
scheduledOn |
time | When the deletion was scheduled. |
deleteOn |
time | When the deletion starts. |
deletionDays |
integer | Days between scheduling and deletion. |
rows |
object | Rows held in each table when it was scheduled. |
Example
{
"id": "a3c5e7f9-1b2d-4f6a-8c0e-2d4f6a8c0e1b",
"type": "project.closing",
"createdOn": "2026-10-09T12:02:10.300Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"closureId": "5e7a9c1b-3d5f-4a7c-9e1b-3d5f7a9c1e3b",
"status": "SCHEDULED",
"scheduledOn": "2026-10-09T12:02:10.000Z",
"deleteOn": "2026-11-08T12:02:10.000Z",
"deletionDays": 30,
"rows": { "consent_record": 6200, "consent_event": 12000 }
}
}project.deleted#
Sent when
The deletion has removed the project's data. The webhook endpoints themselves go after this event is delivered, or seven days later.
Payload
Field in data |
Type | Description |
|---|---|---|
closureId |
UUID | The closure's id. |
deletedOn |
time | When the data was deleted. |
rows |
object | Rows deleted from each table. |
kept |
array of strings | Tables that are kept: audit_log, project_closure and legal_hold. |
Example
{
"id": "c7e9a1b3-5d7f-4b9d-a1c3-5e7f9b1d3f5a",
"type": "project.deleted",
"createdOn": "2026-11-09T02:31:40.512Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"closureId": "5e7a9c1b-3d5f-4a7c-9e1b-3d5f7a9c1e3b",
"deletedOn": "2026-11-09T02:31:40.000Z",
"rows": { "consent_record": 6200, "consent_event": 12000 },
"kept": ["audit_log", "project_closure", "legal_hold"]
}
}