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

# GDPR & CCPA

> Handle data retrieval and deletion requests

# GDPR & CCPA API

Handle GDPR and CCPA compliance requests for data retrieval and deletion.

## Authentication

Use OAuth Token with Bearer authentication.

## Create Data Retrieval

Create a job to retrieve all data for specific users.

<ParamField query="token" type="string" required>
  Your project token
</ParamField>

<ParamField body="distinct_ids" type="array" required>
  Array of distinct IDs to retrieve data for
</ParamField>

<ParamField body="compliance_type" type="string">
  Compliance regulation type: `GDPR` or `CCPA`

  Default: `GDPR`
</ParamField>

<ParamField body="disclosure_type" type="string">
  CCPA disclosure type (only if compliance\_type is CCPA): `Data`, `Categories`, or `Sources`

  Default: `Data`
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://mixpanel.com/api/app/data-retrievals/v3.0?token=YOUR_PROJECT_TOKEN" \
    -X POST \
    -H "Authorization: Bearer YOUR_OAUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "distinct_ids": ["user123", "user456"],
      "compliance_type": "GDPR"
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://mixpanel.com/api/app/data-retrievals/v3.0',
      headers={
          'Authorization': 'Bearer YOUR_OAUTH_TOKEN',
          'Content-Type': 'application/json'
      },
      params={'token': 'YOUR_PROJECT_TOKEN'},
      json={
          'distinct_ids': ['user123', 'user456'],
          'compliance_type': 'GDPR'
      }
  )

  result = response.json()
  print(f"Task ID: {result['results']['task_id']}")
  ```
</CodeGroup>

### Response

<CodeGroup>
  ```json 201 Created theme={null}
  {
    "status": "ok",
    "results": {
      "task_id": "job-tracking-id-12345"
    }
  }
  ```
</CodeGroup>

***

## Check Retrieval Status

Check the status of a data retrieval job.

<ParamField path="tracking_id" type="string" required>
  The task ID returned from the create request
</ParamField>

<ParamField query="token" type="string" required>
  Your project token
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://mixpanel.com/api/app/data-retrievals/v3.0/job-tracking-id-12345?token=YOUR_PROJECT_TOKEN" \
    -H "Authorization: Bearer YOUR_OAUTH_TOKEN"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://mixpanel.com/api/app/data-retrievals/v3.0/job-tracking-id-12345',
      headers={'Authorization': 'Bearer YOUR_OAUTH_TOKEN'},
      params={'token': 'YOUR_PROJECT_TOKEN'}
  )

  data = response.json()
  if data['results']['status'] == 'SUCCESS':
      print(f"Download link: {data['results']['results']}")
  else:
      print(f"Status: {data['results']['status']}")
  ```
</CodeGroup>

### Response

<ResponseField name="status" type="string">
  Overall API response status
</ResponseField>

<ResponseField name="results.status" type="string">
  Job status: `PENDING`, `STAGING`, `STARTED`, `SUCCESS`, `FAILURE`, `REVOKED`, `NOT_FOUND`, `UNKNOWN`
</ResponseField>

<ResponseField name="results.results" type="string">
  Download link when job is complete, empty string if incomplete
</ResponseField>

<ResponseField name="results.distinct_ids" type="array">
  Array of distinct IDs included in the retrieval
</ResponseField>

<CodeGroup>
  ```json 200 Success - Complete theme={null}
  {
    "status": "ok",
    "results": {
      "status": "SUCCESS",
      "results": "https://export.mixpanel.com/download/12345",
      "distinct_ids": ["user123", "user456"]
    }
  }
  ```

  ```json 200 Success - Pending theme={null}
  {
    "status": "ok",
    "results": {
      "status": "PENDING",
      "results": "",
      "distinct_ids": ["user123", "user456"]
    }
  }
  ```
</CodeGroup>

***

## Create Data Deletion

Create a deletion job to remove user data from Mixpanel.

<ParamField query="token" type="string" required>
  Your project token
</ParamField>

<ParamField body="distinct_ids" type="array" required>
  Array of distinct IDs to delete
</ParamField>

<ParamField body="compliance_type" type="string">
  Compliance type: `GDPR` or `CCPA`

  Default: `GDPR`
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://mixpanel.com/api/app/data-deletions/v3.0?token=YOUR_PROJECT_TOKEN" \
    -X POST \
    -H "Authorization: Bearer YOUR_OAUTH_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "distinct_ids": ["user123"],
      "compliance_type": "GDPR"
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://mixpanel.com/api/app/data-deletions/v3.0',
      headers={
          'Authorization': 'Bearer YOUR_OAUTH_TOKEN',
          'Content-Type': 'application/json'
      },
      params={'token': 'YOUR_PROJECT_TOKEN'},
      json={
          'distinct_ids': ['user123'],
          'compliance_type': 'GDPR'
      }
  )

  result = response.json()
  print(f"Deletion Task ID: {result['results']['task_id']}")
  ```
</CodeGroup>

<Warning>
  Data deletion is permanent and cannot be undone. Ensure you have the correct distinct IDs before proceeding.
</Warning>

***

## Check Deletion Status

<ParamField path="tracking_id" type="string" required>
  The task ID from the deletion request
</ParamField>

<ParamField query="token" type="string" required>
  Your project token
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://mixpanel.com/api/app/data-deletions/v3.0/job-tracking-id-12345?token=YOUR_PROJECT_TOKEN" \
    -H "Authorization: Bearer YOUR_OAUTH_TOKEN"
  ```
</CodeGroup>

***

## Cancel Deletion

Cancel a deletion job that is still in progress.

<ParamField path="tracking_id" type="string" required>
  The task ID of the deletion to cancel
</ParamField>

<ParamField query="token" type="string" required>
  Your project token
</ParamField>

### Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://mixpanel.com/api/app/data-deletions/v3.0/job-tracking-id-12345?token=YOUR_PROJECT_TOKEN" \
    -X DELETE \
    -H "Authorization: Bearer YOUR_OAUTH_TOKEN"
  ```

  ```python Python theme={null}
  import requests

  response = requests.delete(
      'https://mixpanel.com/api/app/data-deletions/v3.0/job-tracking-id-12345',
      headers={'Authorization': 'Bearer YOUR_OAUTH_TOKEN'},
      params={'token': 'YOUR_PROJECT_TOKEN'}
  )

  print(f"Status: {response.status_code}")  # 204 = Success
  ```
</CodeGroup>

<Note>
  Deletions can only be canceled while in `PENDING` or `STARTED` status. Once `SUCCESS`, the deletion is complete and cannot be reversed.
</Note>
