People events
The webhook events sent when a person is erased, is about to be erased for inactivity, or makes or confirms a rights request, with payloads.
Seven webhook events are about a person as a whole: three on erasure and four on rights requests. Each arrives in the envelope described in Webhook format.
Erasure events#
subject.erased#
Sent when
A record is erased on request: with POST /subjects/erase, from the console, or by an erasure request your team carried out. One event is sent for each record. Delete your own copy of the person's data when it arrives.
Payload
Field in data |
Type | Description |
|---|---|---|
consentId |
string | The record that was erased. |
subject.type |
string | The type of identifier the record was recorded under. |
subject.fingerprint |
string or null |
The subject fingerprint, taken immediately before the erasure, so it still matches your user. |
subject.reference |
string or null |
The identifier as you sent it, only when your project stores a readable copy. |
erasedOn |
time | When the record was erased. |
reason |
string or null |
The reason given with the erasure. null when the console gave none. |
actingAs |
object | Present only when a parent, lawful guardian or nominee asked for the erasure. See Who acted for the person. |
test |
boolean | true for a record written with a test key. |
processors |
array | An ERASE for each Data Processor the person ever allowed on this record. See Processor instructions. |
Example
{
"id": "0c7e5b3a-9f21-4d68-a4b0-6e1d8c2f7a55",
"type": "subject.erased",
"createdOn": "2026-09-24T10:12:03.498Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"consentId": "cns_3f1c9a7e2b8d4c6fa0e5d1b7c9f2a4e8",
"subject": {
"type": "USER_ID",
"fingerprint": "8c41…",
"reference": null
},
"erasedOn": "2026-09-24T10:12:03.000Z",
"reason": "Erasure requested by the learner",
"test": false,
"processors": [
{
"taskId": "7e3b0d52-9a14-4c6f-b8e2-1d5a9c3f7b60",
"key": "nilgiri-mailers",
"name": "Nilgiri Mailers",
"action": "ERASE",
"purposes": ["course-updates-by-email"],
"dueOn": "2026-10-24T10:12:03.498Z",
"retainLogsUntil": "2027-09-24T10:12:03.000Z"
}
]
}
}subject.erasure_notice#
Sent when
A person is 72 hours from being erased for inactivity. This happens only when your team has turned on Erase after inactivity. One notice is sent for each person, not for each record. Tell the person now: under DPDP Rule 8(2) they must hear at least 48 hours before the erasure.
Payload
Field in data |
Type | Description |
|---|---|---|
consentId |
string | The person's most recent record. |
subjectReference |
string or null |
The identifier as you sent it, only when your project stores a readable copy. |
lastActivityOn |
time | The last contact with the person. |
erasureOn |
time | When the erasure happens. It is never less than 48 hours after the notice. |
This event carries no fingerprint. Match it by consentId or by the reference.
Example
{
"id": "6b2f9d40-1a7c-4e83-b5d9-0c3a8e7f1b24",
"type": "subject.erasure_notice",
"createdOn": "2026-12-24T07:00:00.220Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"consentId": "cns_3f1c9a7e2b8d4c6fa0e5d1b7c9f2a4e8",
"subjectReference": null,
"lastActivityOn": "2025-12-27T06:30:00.000Z",
"erasureOn": "2026-12-27T06:30:00.000Z"
}
}Nobody is erased unless someone is listening
If no enabled endpoint subscribes to subject.erasure_notice, the service cannot warn you, so it erases nobody for inactivity.
To cancel a notice, report the person's activity with POST /activity.
subject.erased_inactive#
Sent when
A person was erased for inactivity. No consent.withdrawn or subject.erased event is sent for these records; this event stands for both. Erase the person's data in your own systems too, apart from what a law requires you to keep.
Payload
Field in data |
Type | Description |
|---|---|---|
consentId |
string | The person's most recent record. |
subjectReference |
string or null |
The identifier as you sent it, only when your project stores a readable copy. |
lastActivityOn |
time | The last contact with the person. |
processors |
array | An ERASE for each Data Processor, across the person's records. Empty when the person was known only by a cookie or session id. See Processor instructions. |
This event carries no fingerprint.
Example
{
"id": "a94d1e6c-3b58-4f72-8e0a-5d7c2b9f4e13",
"type": "subject.erased_inactive",
"createdOn": "2026-12-27T07:00:02.640Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"consentId": "cns_3f1c9a7e2b8d4c6fa0e5d1b7c9f2a4e8",
"subjectReference": null,
"lastActivityOn": "2025-12-27T06:30:00.000Z"
}
}Rights request events#
subject_request.received#
Sent when
Someone submits the hosted rights request form. Requests your team types into the console send no event. Email verificationUrl to replyTo: the request waits until the person follows the link.
Payload
Field in data |
Type | Description |
|---|---|---|
reference |
string | The request's reference, shown to the person and in the console. |
requestType |
string | ACCESS, PORTABILITY, ERASURE, WITHDRAW_CONSENT, NOMINATION, GRIEVANCE, OBJECTION, RECTIFICATION or RESTRICTION. |
subjectId |
string | What the person typed to identify themselves, in readable form. |
actingAs |
string | Who made the request: SELF, PARENT, LAWFUL_GUARDIAN or NOMINEE. |
replyTo |
string or null |
Where to write back: the contact given, or else the email address of whoever made the request. |
dueOn |
time | The deadline for answering. |
verificationUrl |
string | The link the person must follow to confirm the request is theirs. |
statusUrl |
string | The request's status page, where the person reads your reply. Valid for 180 days. Send it with the confirmation link. |
contact |
object | Whom to contact. See The contact object. Put it in your reply. |
Example
{
"id": "d5a07f3e-8c14-4b69-9a2e-4f6b1c8d0e72",
"type": "subject_request.received",
"createdOn": "2026-09-24T10:12:03.377Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"reference": "DSR-2026-4F2A91",
"requestType": "ACCESS",
"subjectId": "kavya.menon@example.in",
"actingAs": "SELF",
"replyTo": "kavya.menon@example.in",
"dueOn": "2026-10-24T10:12:03.000Z",
"verificationUrl":
"https://console.dpconsent.com/consent/sdk/v1/pages/verify-request?token=…",
"statusUrl":
"https://console.dpconsent.com/consent/sdk/v1/pages/request-status?token=…",
"contact": {
"organisation": "Kalpa Learning",
"email": "grievance@kalpalearning.example.in",
"dataProtectionOfficer": "Meera Iyer"
}
}
}If you keep records under your own id, link the request to it with POST /requests/link.
subject_request.due_soon#
Sent when
An open request is due within five days or is overdue. The event is sent once a day for each such request until the request is closed.
Payload
Field in data |
Type | Description |
|---|---|---|
reference |
string | The request's reference. |
requestType |
string | The type of request, as in subject_request.received. |
status |
string | RECEIVED, VERIFYING or IN_PROGRESS. |
dueOn |
time | The deadline for answering. |
daysRemaining |
integer | Days until the deadline. Negative once the request is overdue. A part day counts as a whole one. |
overdue |
boolean | true as soon as the deadline has passed. |
contact |
object | See The contact object. |
Example
{
"id": "38f6c2b1-7e9a-4d05-b3c8-9a1e5d4f6072",
"type": "subject_request.due_soon",
"createdOn": "2026-10-21T02:30:00.412Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"reference": "DSR-2026-4F2A91",
"requestType": "ACCESS",
"status": "IN_PROGRESS",
"dueOn": "2026-10-24T10:12:03.000Z",
"daysRemaining": 4,
"overdue": false,
"contact": {
"organisation": "Kalpa Learning",
"email": "grievance@kalpalearning.example.in",
"dataProtectionOfficer": "Meera Iyer"
}
}
}subject_request.completed#
Sent when
A request is carried out, or closed as completed or rejected in the console.
Payload
Field in data |
Type | Description |
|---|---|---|
reference |
string | The request's reference. |
requestType |
string | The type of request, as in subject_request.received. |
subjectHash |
string | The hash of the identifier the request is about. |
outcome |
string | COMPLETED or REJECTED. |
completedOn |
time | When the request was closed. |
actingAs |
string | Who made the request: SELF, PARENT, LAWFUL_GUARDIAN or NOMINEE. |
reply |
string or null |
The answer your team wrote when closing the request. Email it to the person. |
statusUrl |
string | The request's status page, which shows the reply. Valid for 180 days. |
correction |
object | Only for a closed correction request: summary, what was corrected, and evidenceSha256, or null. |
contact |
object | See The contact object. |
Example
{
"id": "7e1b4a9d-2f6c-4835-a0d7-c3e9f5b28164",
"type": "subject_request.completed",
"createdOn": "2026-10-02T09:00:00.156Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"reference": "DSR-2026-4F2A91",
"requestType": "ACCESS",
"subjectHash": "b7c1…",
"outcome": "COMPLETED",
"completedOn": "2026-10-02T09:00:00.000Z",
"actingAs": "SELF",
"reply": "Your data export is attached to this email.",
"statusUrl":
"https://console.dpconsent.com/consent/sdk/v1/pages/request-status?token=…",
"contact": {
"organisation": "Kalpa Learning",
"email": "privacy@kalpalearning.example.in",
"dataProtectionOfficer": "Meera Iyer",
"phone": "+91 80 4567 8900",
"postalAddress": "14 MG Road, Bengaluru 560001",
"grievanceOfficer": {
"name": "Arvind Rao",
"email": "grievance@kalpalearning.example.in",
"phone": "1800 425 0101"
}
}
}
}subject.rectification_requested#
Sent when
A person asks to have their data corrected, completed or updated. A request from the hosted form sends it once the person confirms it. A request your team logs sends it at once. Correct the data in your own systems, then close the request with what was corrected.
Payload
Field in data |
Type | Description |
|---|---|---|
reference |
string | The request's reference. Match it to subject_request.received. |
requestType |
string | RECTIFICATION. |
note |
string or null |
What the person wrote, in their words. |
actingAs |
string | SELF, PARENT, LAWFUL_GUARDIAN or NOMINEE. |
dueOn |
time | The deadline for answering. |
contact |
object | See The contact object. |
The event carries no identifier and no hash of one.
Example
{
"id": "5c0e8f2a-6b37-4d91-a2c4-7e9b1d3f5a08",
"type": "subject.rectification_requested",
"createdOn": "2026-10-09T11:20:41.902Z",
"projectId": "c2a6f0de-51b3-4f0a-9d7e-8b1f3a6c4e90",
"test": false,
"data": {
"reference": "DSR-2026-8C31D0",
"requestType": "RECTIFICATION",
"note": "My delivery address changed to 22 Park Street, Kolkata",
"actingAs": "SELF",
"dueOn": "2026-11-08T11:18:02.000Z",
"contact": {
"organisation": "Kaveri Stores",
"email": "privacy@kaveristores.example.in",
"dataProtectionOfficer": "Meera Iyer",
"phone": null,
"postalAddress": null,
"grievanceOfficer": null
}
}
}Shared fields#
The contact object#
Every rights request event carries contact, from Project settings.
Name these details in each answer to the person (DPDP Rule 9).
| Field | Type | Description |
|---|---|---|
organisation |
string or null |
The project display name. |
email |
string or null |
The privacy contact. |
dataProtectionOfficer |
string or null |
The Data Protection Officer, or whoever answers for you. |
phone |
string or null |
The privacy contact phone. |
postalAddress |
string or null |
The postal address. |
grievanceOfficer |
object or null |
name, email and phone of the grievance officer, when one is named. |
Who acted for the person#
actingAs on subject.erased and consent.withdrawn is present only when
a parent, lawful guardian or nominee made the request behind the change.
It is sealed into the record's history with the event.
| Field | Type | Description |
|---|---|---|
role |
string | PARENT, LAWFUL_GUARDIAN or NOMINEE. |
requestReference |
string | The request that asked for the change. |
authorityConfirmedOn |
time | When your team confirmed their authority. |
evidenceSha256 |
string | The SHA-256 of the document your team checked. |