Data Deletion
Bulk erasure of contact and email data
Erasure scoped to the active project. Both endpoints require the project admin or
owner role - they are destructive and irreversible.
Delete Contact Data
POST /api/v1/data/delete-contacts
Erase one address from the contacts list and the suppression list :
{
"email": "user@example.com"
}
Response:
{
"deleted": 1,
"message": "Erased user@example.com from contacts and the suppression list."
}
To erase every contact in the project, omit the address and confirm explicitly:
{
"confirm_all": true
}
An empty body is refused rather than treated as consent:
Response (400):
{
"error": "pass an email to erase one contact, or confirm_all: true to erase every contact in this project"
}
This leaves the email log alone
Removing the record that a message was sent is a separate decision with separate consequences - billing, deliverability disputes, and your own audit trail. It lives behind the endpoint below so the two are never conflated.
Delete Email Logs
POST /api/v1/data/delete-email-logs
| Field | Effect |
|---|---|
email | Erase records where this address is the sender or a recipient |
older_than_days | Erase records older than N days |
confirm_all | Required to erase every record when neither of the above is given |
{
"older_than_days": 30
}
Response:
{
"deleted": 1500,
"message": "Deleted 1500 email records older than 30 days."
}
Address matching is exact. Passing ob@x.com deletes nothing even though it is a substring of bob@x.com and
rob@x.com.
In-flight mail is never deleted
Records with status queued, scheduled, or processing are exempt however old they are, and however broad the
request. Deleting one would strand work the delivery queue is about to claim. The same rule
the retention job
follows.