> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usertick.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Erase personal data

> Erase one response, or everything one person sent, for a GDPR request. Erasure runs as a background job that you can follow.

When someone asks you to delete their data, the API erases it permanently, either one response at a time or every response one person sent. Both calls need a credential with the `responses:delete` scope. An erasure reaches every survey, so an app whose approving member has a role with access to selected surveys only gets `403` with `AUTHZ-007-001`.

Erasure runs in the background. The request returns `202 Accepted` immediately with a job, which you follow until it finishes.

## What gets erased

For each response, Usertick erases:

* its answers, its AI analysis and the event itself,
* its status, assignees, notes, stars and corrections,
* its links to Jira or Linear issues and to contacts, and the workflow runs and webhook deliveries it caused,
* the copy of a Microsoft Teams card that showed it, and the record of which Google Sheets row it went to (the row in your spreadsheet stays),
* the in-app notifications and notification emails that quoted its notes or answers, from a mention or a **Notify teammates** step,
* the files the respondent sent with it.

Activity log entries remain. They name the response by its id and hold no answers. A notification email that was already sent stays in the email log with only who received it and when. A contact in your contact list isn't deleted.

## Erase one response

```bash theme={null}
curl -X DELETE "https://app.usertick.com/api/public/v1/responses/9b1c2d3e-4f50-4a61-8b72-93a4b5c6d7e8" \
  -H "Authorization: Bearer utk_live_your_key_here"
```

An unknown response returns `404` with `RSP-002-007`. See [Erase a response](https://docs.usertick.com/developers/api/reference/delete-response.md).

## Erase everything one person sent

```bash theme={null}
curl -X POST "https://app.usertick.com/api/public/v1/responses/erase" \
  -H "Authorization: Bearer utk_live_your_key_here" \
  -H "Idempotency-Key: erase-maya-2026-10-01" \
  -H "Content-Type: application/json" \
  -d '{ "email": "maya@example.com" }'
```

By email, this finds every response:

* with an answer that is exactly that address, in any case, or with that email from [`identify()`](https://docs.usertick.com/installation/identify),
* to an email survey sent to the contact with that address,
* linked to that contact,
* sent with that contact's external id as its user id.

To erase by your own user id instead, send `userId`, which is the id your site passes to `identify()`:

```bash theme={null}
curl -X POST "https://app.usertick.com/api/public/v1/responses/erase" \
  -H "Authorization: Bearer utk_live_your_key_here" \
  -H "Idempotency-Key: erase-user-8271-2026-10-02" \
  -H "Content-Type: application/json" \
  -d '{ "userId": "user_8271" }'
```

By user id, this finds every response sent with it, and every response linked to the contact whose external id it is or sent to that contact by email.

The body takes one of the two, `email` or `userId`. A body with both or neither returns `400` with `PUB-003-007`, and a user id over 256 characters returns `400` with `PUB-003-008`. See [Erase a respondent](https://docs.usertick.com/developers/api/reference/erase-respondent.md).

Usertick stores the email or user id encrypted only while the job needs it and clears it when the job ends. The job shows it masked, as in `m***@example.com` or `user id us***71`.

## Follow the job

Both calls return `202` with the job and a `Location` header that points to it:

```json theme={null}
{
  "id": "7a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
  "type": "responses.erase",
  "status": "queued",
  "subject": "m***@example.com",
  "result": { "responsesErased": 0, "filesDeleted": 0 },
  "error": null,
  "url": "https://app.usertick.com/api/public/v1/jobs/7a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
  "createdAt": "2026-10-01T09:00:00.000Z",
  "startedAt": null,
  "finishedAt": null
}
```

To follow the job, poll [`GET /jobs/{jobId}`](https://docs.usertick.com/developers/api/reference/get-job) until `status` is `succeeded` or `failed`. A few seconds between polls is enough.

| Status | Meaning |
| - | - |
| `queued` | The job is waiting to run, waiting to continue an erasure too large for one run, or waiting to try again after a failed run. |
| `running` | The job is erasing. |
| `succeeded` | The job finished, and `result` gives the number of responses and files erased. |
| `failed` | The job couldn't finish after five tries, and `error` is `PUB-004-002`. A new erasure has to be started. |

`type` is `responses.delete` for one response and `responses.erase` for a respondent. Reading a job needs the same `responses:delete` scope, and a credential sees only its own organization's jobs.

> [!TIP]
>
> If `POST /responses/erase` carries an [Idempotency-Key](https://docs.usertick.com/developers/api/idempotency.md), a retry after a dropped connection doesn't start a second job.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.