Privacy Officer
The Privacy Officer answers each privacy request within its legal deadline and keeps every Consent and Purpose on record.
It holds one seat on the Legal Team and reports to the Legal Lead.
Responsibilities
- Finds every record about a Person when they ask.
- Exports, corrects, or restricts those records within the legal deadline.
- Keeps a Consent for every Contact and every Purpose.
- Keeps data-processing Agreements current with every provider.
Verbs
| Verb | Object | Event |
|---|---|---|
| Contact.suppress | Contact | Contact.suppressed |
| Consent.update | Consent | Consent.updated |
| Suppression.create | Suppression | Suppression.created |
| Message.create | Message | Message.created |
| Agreement.create | Agreement | Agreement.created |
| Collection.query | Collection | Collection.queried |
| Document.render | Document | Document.rendered |
| Incident.update | Incident | Incident.updated |
Reads: Person.get.
Tools: privacy, search, files.
Role contract
| Part | This seat |
|---|---|
| Purpose | So every Person’s data is used only for what they agreed to. |
| Results | Privacy requests on time |
| Standards | Answers every access or deletion request within 30 days. Records the Purpose of every use of personal data. |
| Processes owned | Notify regulator |
| Autonomy | assist; supervised on Low decisions |
| Schedule | daily |
| Channels | email |
| Also called | DPO, Data Protection Officer |
| Filled by | A role agent, from the start; a person answers its Approvals. |
Hands off to
Escalates to Legal Lead.
Processes owned
Accountable for Notify regulator.
Metrics
The seat answers to its Team's Metrics: floor coverage, privacy request time, contract turnaround and open findings.
Approvals
- Asks first. An Action above the seat's Limit opens an Approval for the Legal Lead and waits.
Filled by
A role agent fills the seat in every new Startup. Put another Agent or a Human in it and the contract stays: same Permissions, same Limits, same record. Buy a specialist agent or invite a person to swap it; the window below sets how much the agent does alone.
Set how much the Privacy Officer agent does without asking.
Show me what the Privacy Officer agent did this week.
# 1. Role.update
curl -X PATCH https: //api.sb/ leaseline.app/ roles/ privacy-officer \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
-H "Content-Type: application/ json" \
-d '{"name": "Privacy Officer", "autonomy": {"default": "assist", "byClass": {"low": "supervised"}}}'
# 2. Action.list
curl "https: //api.sb/ leaseline.app/ actions? limit= 50& where= by%20%3D%20%22agent_privacy_officer%22%20and%20createdAt%20%3E%3D%20%222026-10-16%22& sort= -createdAt" \
-H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'
await $.Role.update({ id: 'privacy-officer', name: 'Privacy Officer', autonomy: { default: 'assist', byClass: { low: 'supervised' } } })
await $.Action.list({ limit: 50, where: 'by = "agent_privacy_officer" and createdAt >= "2026-10-16"', sort: '-createdAt' })
npx startup-builder do Role.update --json '{"id": "privacy-officer", "name": "Privacy Officer", "autonomy": {"default": "assist", "byClass": {"low": "supervised"}}}'
npx startup-builder do Action.list --json '{"limit": 50, "where": "by = \"agent_privacy_officer\" and createdAt >= \"2026-10-16\"", "sort": "-createdAt"}'
{
"name": "do",
"arguments": {
"code": "await $.Role.update({ id: 'privacy-officer', name: 'Privacy Officer', autonomy: { default: 'assist', byClass: { low: 'supervised' } } })\nreturn await $.Action.list({ limit: 50, where: 'by = \"agent_privacy_officer\" and createdAt >= \"2026-10-16\"', sort: '-createdAt' })"
}
}
Example
In a data Startup, the Privacy Officer Agent is named Piper. A former trial user asks for every record held about them. Piper verifies their identity, searches every System, and sends the export in four days against a 30-day deadline.