Overview
Grantex’s DPDP routes keep the records a Data Fiduciary needs to evidence its obligations under India’s Digital Personal Data Protection Act 2023 (DPDP Act) and the Digital Personal Data Protection Rules 2025 (DPDP Rules), and to answer GDPR access requests, for AI agent deployments. Each consent record is tied to the Grantex grant that authorised the agent, and every DPDP state change is written to the developer’s tamper-evident audit chain. As of 30 September 2026 most DPDP obligations are not yet in force. The DPDP Rules 2025 (G.S.R. 846(E), notified 13 November 2025) bring the notice, consent, security, breach, erasure, rights and penalty provisions into force on 13 May 2027, and Consent Manager registration on 13 November 2026. See DPDP Act 2023 for the section-by-section mapping and EU AI Act for the EU timeline.Where the features live
The SDKs and CLI cover the original routes. The newer routes and fields (notice
lists and reads, grievance lists and updates, erasure request reads, the breach
register,
responsePeriodDays, consentNoticeVersion, the structured notice
fields and the eu-ai-act-evidence export) are shown below as REST calls; call
them that way unless your SDK version lists them. Release
Status says which versions are published.
Consent notices
A consent notice is registered once pernoticeId, version and language.
Grantex stores its content and a SHA-256 contentHash. A consent record names
the version shown and carries that hash in its signed proof, so a later change
to the notice text is detectable.
A notice can carry structured fields for what DPDP Rules r.3 asks a notice
under DPDP Act s.5 to contain: itemisedPersonalData, purposeDetails (with
the goods or services each purpose enables), withdrawalUrl, rightsUrl,
boardComplaintUrl, and a contact for the person able to answer questions
(s.8(9), r.9). Every response includes a validation block listing which r.3
elements are present or missing, and whether the language is English or an
Eighth Schedule language. The check is for presence, not quality: it is
evidence for your own review. With DPDP_NOTICE_REQUIRE_RULE3=true an
incomplete notice is refused with 400 NOTICE_INCOMPLETE. Details:
Consent Notice Content.
Consent records
A consent record binds a Data Principal’s consent to an active grant and to the notice version shown. Create the grant first, through the normal Grantex authorisation flow, then record the consent:- Refuses a grant that is not the developer’s, or is revoked, suspended or
expired (
400 INVALID_GRANT). WithDPDP_ENFORCE_GRANT_PRINCIPAL=trueit also refuses adataPrincipalIdthat is not the grant’s principal. - Uses the latest version of the notice unless
consentNoticeVersionpins one;consentNoticeLanguagepicks the language when that version exists in several. - Signs a consent proof: a compact JWS (EdDSA over Ed25519) covering the
record id, grant, principal, notice id, version and hash, the purpose codes
and the consent time. It has no
exp, because it is evidence the fiduciary may need for as long as it keeps the record (DPDP Act s.6(10) puts the burden of proving consent on the fiduciary). Verify it with the key itskidnames in the JWKS atjwksUri. If it cannot be signed, no record is created (503 CONSENT_PROOF_UNAVAILABLE). - Sets
retentionUntilto 30 days afterprocessingExpiresAt. This is a product default, not a legal retention period, and Grantex does not delete anything when it passes.
active, withdrawn, expired and erased. A record
becomes expired only when the consent expiry worker is on
(DPDP_CONSENT_EXPIRY_ENABLED=true); with DPDP_CONSENT_EXPIRY_REVOKES_GRANT=true
the worker also revokes the grant.
Purpose limitation. The record stores the purposes the principal agreed to
and the grant’s scopes. Grantex does not compare an agent’s later actions with
those purposes. What an agent can do is bounded by the grant’s scopes, and a
grant can carry a purpose that tools check (see
Purpose-Bound Grants). Choosing scopes that
match the consented purposes is your design decision.
Reads (GET /v1/dpdp/consent-records, /v1/dpdp/consent-records/{recordId}
and /v1/dpdp/data-principals/{principalId}/records) have no side effects. Record lists return what they always did (up to 100
records unfiltered, every match for a data principal) unless you send limit
(up to 200) or cursor, in which case they page and return nextCursor;
totalRecords is always the full count.
Withdrawal
Under DPDP Act s.6(4) a Data Principal may withdraw consent at any time, as easily as it was given. Offering that means, for example a control next to the one that gave consent, is your application’s job; it then calls:reasonis required. Only anactiverecord can be withdrawn: a second withdrawal is409 ALREADY_WITHDRAWN, and erased or expired records answer409 CONSENT_ERASEDor409 CONSENT_EXPIRED.revokeGrant: truerevokes the record’s own grant (revokedAt, the revocation cache and agrant.revokedevent); grants delegated from it keep working. An operator who setsDPDP_REVOCATION_CASCADE=truegets the same cascade asDELETE /v1/grants/{id}instead: delegated grants, credentials and wallet reservations. WithoutrevokeGrantthe grant stays active, unless the operator setsDPDP_WITHDRAWAL_REVOKES_GRANT=true, which makes an omittedrevokeGrantmeantrue. After a withdrawal the fiduciary and its processors must cease processing within a reasonable time (s.6(6)). Revoking the grant stops processing that goes through Grantex; a service that verifies tokens offline sees the revocation only once it checks revocation state.deleteProcessedData: trueemits adpdp.data_deletion.requestedwebhook (recordId,grantId,dataPrincipalId,requestedAt). Grantex holds none of the data your application processed, so it deletes nothing itself (dataDeletedis alwaysfalse); deleting that data in your systems and your processors’ is your step (s.8(7)).
Erasure
POST /v1/dpdp/data-principals/{principalId}/erasure acts on a Data
Principal’s erasure request (DPDP Act s.12). In one transaction it revokes the
principal’s active grants (their delegated grants too only with
DPDP_REVOCATION_CASCADE=true), marks the consent records erased, and stores
an erasure request (ER-YYYY-<ULID>) that says what was retained and why.
With DPDP_ERASURE_EXPANDED=true it also replaces grievance descriptions and
evidence with a fixed marker and deletes stored exports about the principal;
without it, both are kept and listed as retained:
A repeat call returns the completed request with
200. The request can be
read again from GET /v1/dpdp/erasure-requests/{requestId}.
The DPDP Rules’ three-year inactivity erasure and its 48-hour advance notice
(r.8(1) and r.8(2), Third Schedule) apply only to large e-commerce, online
gaming and social media platforms. Grantex does not track inactivity or send
that notice.
Grievances
A Data Fiduciary must offer a grievance mechanism and publish its response period, which may not exceed 90 days (DPDP Act s.13; DPDP Rules r.14(3)). Grantex records each grievance with a non-sequential reference (GRV-YYYY-<ULID>), the period you publish (responsePeriodDays, 1 to 90; the
default of 7 is a product default, not a statutory period) and
expectedResolutionBy:
PATCH /v1/dpdp/grievances/{grievanceId}:
submitted to in_review, then resolved or rejected with a resolution;
any other move is 409 INVALID_TRANSITION. List grievances with
GET /v1/dpdp/grievances?status=in_review. Each change emits
dpdp.grievance.updated. Grantex stores the due date; it does not chase it,
route the grievance to a person, or reply to the principal.
Breach register
Under DPDP Act s.8(6) and DPDP Rules r.7, a fiduciary that becomes aware of a personal data breach informs each affected Data Principal without delay, informs the Board without delay, and sends the Board a detailed report within 72 hours of becoming aware (extendable on written request). There is no risk threshold. Separately, the CERT-In directions of 28 April 2022 require cyber incidents to be reported to CERT-In within 6 hours. The breach register keeps your record of this:- The response carries
boardDetailedReportDueAt(awareAtplus 72 hours, or a granted extension’s date),boardDetailedReportOverdue, andprincipalIntimation(intimatedCount,pendingCount). PATCH /v1/dpdp/breaches/{breachId}records the Board intimation times, the r.7(2)(b) detailed report fields, an extension, and the status (open,initial_intimated,reported,closed, in that order).POST /v1/dpdp/breaches/{breachId}/principal-intimationsrecords who was told, by which channel, when, and which r.7(1)(a)-(e) content the message carried.- Webhooks:
dpdp.breach.recorded,dpdp.breach.principal_intimation_due, and, withDPDP_BREACH_DEADLINE_ALERTS_ENABLED=true,dpdp.breach.board_report_duebefore and after the 72-hour deadline.
Exports
POST /v1/dpdp/exports produces a JSON export, stored for 7 days
(410 GONE after that). Audit entries are capped at 1,000 per export, and
truncated says when the cap was hit.
Webhook events
Subscribe with webhooks. Breach events carry no principal
ids or breach text.
Audit trail
Every DPDP state change appends an entry to the developer’s hash-chained audit log:grantex.dpdp.consent_created, consent_withdrawn, consent_expired,
erasure_completed, grievance_filed, grievance_updated, notice_created,
export_created, breach_recorded, breach_updated,
breach_principals_intimated and breach_deadline_alerted. Grantex never
rewrites or deletes audit entries; how long they are kept is the retention of
your database (the DPDP Rules ask for at least one year).
Configuration flags
All default off and take the exact valuetrue.
Set
ED25519_PRIVATE_KEY in production so consent proofs stay verifiable
across restarts and instances, and ED25519_STABLE_KID=true so the key id
does not change with the month the service restarts in. See
Self-Hosting.
What remains your responsibility
- Choosing the lawful basis (consent, or a legitimate use under s.7) and the purposes, and showing a notice that meets s.5 and r.3.
- Giving users a way to withdraw that is as easy as consenting, and ceasing processing in your systems and your processors’ after a withdrawal.
- Erasing the data you and your processors hold, and giving the r.8(2) 48-hour notice where the Third Schedule applies.
- Publishing your contact details and grievance response period, and answering grievances within it.
- Notifying affected principals and the Board of breaches, and CERT-In of cyber incidents.
- Verifiable parental consent for children (s.9, r.10), the duties of a Significant Data Fiduciary (s.10, r.13), and any cross-border restriction (s.16).
Related Resources
- DPDP Act 2023 — section and rule mapping
- EU AI Act — article mapping and timeline
- DPDP integration — endpoint list
- Compliance Matrix — cross-framework mapping
- Principal Sessions — authenticated links for the core agent-permission dashboard; not a DPDP rights portal
- Blog: DPDP Act and AI Agents