privacy:write scope. Create a key just for this and keep it with whoever handles privacy requests.
Both are POST requests, so the email address never appears in a URL or a server log.
Export what Darwin holds
Hand it to the person as it is, or turn it into your own format. An export is a heavy request for rate limits.
Erase a person
DELETE /v1/contacts/{id} does the same and returns the same receipt inside erasure.
The 201 response is a receipt:
GET /v1/contacts?email=jordan@example.com returns an empty list and the conversations counted in the receipt have no transcript.
What erasure removes
In one step, everywhere Darwin keeps it:- The contact is deleted.
- Every conversation that names them loses its transcript, the lead’s name and email, the booker’s email and the handoff note. Darwin’s grading notes on those conversations go too.
- Booking attempts lose their details. Link bookings lose the name, email and the provider’s details.
- Chat API sessions lose the identity and external id you passed.
- Events about them keep their type and time and lose their payload. Webhooks for those events that have not gone out yet send
"data": { "erased": true }.
What erasure keeps
- Each conversation’s row and timestamps, so last month’s counts, opening-test results and billing don’t change.
- The receipt described above.
What it can’t reach
- Emails already sent to your team about a booking or a lead are in their inboxes.
- Your calendar provider’s copy of the meeting. Remove it in Calendly or Google Calendar.
- Systems you sent data to: your CRM, Slack, warehouse or anything else that received webhooks or API reads. Erase it there too.
Running both from code
400 invalid_request with param: "email". An address Darwin holds nothing about still succeeds, with zero counts and contact_deleted: false.