Export and erase a user
Last updated
When a user asks to see their data, or asks you to delete it, use these two endpoints of the Whisperr API. Whisperr processes the data for you, so you answer the user. These endpoints give you what you need.
GET /v1/users/{external_id}/exportDELETE /v1/users/{external_id}Both need the server key (wrk_…). A publishable key gets
403 server_key_required. external_id is the same id you send as
external_user_id. URL-encode it: user@8842 becomes user%408842.
A workspace owner can do the same from the dashboard: Settings → Data and privacy → Privacy requests, or Export data and Erase user on a user’s page.
Export a user
Section titled “Export a user”curl https://api.whisperr.net/v1/users/user_8842/export \ -H "X-API-Key: $WHISPERR_SERVER_KEY" \ -o user_8842.json200 returns everything Whisperr stores about the user. 404 user_not_found
means Whisperr has no user with this id.
{ "export": { "external_id": "user_8842", "exported_at": "2026-10-06T12:00:00Z", "user": { "external_id": "user_8842", "traits": { "first_name": "Ada", "plan": "pro" }, "…": "…" }, "channels": [ { "id": "uch_…", "channel": "email", "address": "ada@example.com", "verified": true, "opted_in": true, "…": "…" } ], "records": { "events": [ { "event_type": "payment_failed", "occurred_at": "…", "properties": { }, "…": "…" } ], "interventions": [ "…" ], "messages": [ "…" ] } }}user: the user, with all stored traits.channels: each contact channel, with the address in clear text.records: one array of stored rows for each of these stores:state,consent,events,imported_events,lifecycle_transitions,evaluations,episodes,decisions,interventions(the messages Whisperr wrote),message_rejections,messages,message_events(deliveries, opens, clicks),relay_messages,exposures,delivery_requests,delivery_events,channel_affinity,billing_state,billing_subscriptions,billing_transitions,billing_events,billing_experiments,source_identities,source_profiles,activity_days,event_days,analytics_dimensions,app_versions. An empty store is an empty array.
Whisperr streams the export, so a user with many events needs no large buffer on either side. If the stream breaks part way, the body is not valid JSON. Check that it parses before you hand it to the user, and request it again if it does not.
Erase a user
Section titled “Erase a user”curl -X DELETE https://api.whisperr.net/v1/users/user_8842 \ -H "X-API-Key: $WHISPERR_SERVER_KEY"{ "erasure": { "external_id": "user_8842", "found": true, "erased_at": "2026-10-06T12:00:00Z" } }Whisperr deletes the user and all their data in one step: traits, channels and addresses, consent, events, scores and decisions, the messages Whisperr wrote and sent, the AI requests that wrote them, delivery events, billing data from RevenueCat, Superwall and Adapty, and data from connected sources. It also removes the user’s requests that Whisperr accepted but has not applied yet.
- Repeat is safe. A second call returns
200withfound: false. - Proof. Whisperr keeps a record that the request was done. The record holds a keyed hash of the id, never the id itself.
- Stop sending first. Data that your app or backend sends for the same
external_user_idafter the erase creates a new user. Stop tracking and identifying the user before you call erase.
Common questions
Can I export or erase a user from the Whisperr dashboard?
Yes. A workspace owner can use Settings → Data and privacy → Privacy requests, or Export data and Erase user on a user's page. The API endpoints return the same bodies.
Is erasing a user in Whisperr reversible?
No. Whisperr deletes the user and their data in one step and keeps only a record that the erasure happened, with a keyed hash of the id.
What happens to events I send for a user after I erase them?
They create a new user with the same external id. Stop sending data for the user before you call erase.