Compliance APIs
GDPR & CCPA
Handle data retrieval and deletion requests
POST
/
api
/
app
/
data-retrievals
/
v3.0
GDPR & CCPA
curl --request POST \
--url https://mixpanel.com/api/app/data-retrievals/v3.0 \
--header 'Content-Type: application/json' \
--data '
{
"distinct_ids": [
{}
],
"compliance_type": "<string>",
"disclosure_type": "<string>"
}
'import requests
url = "https://mixpanel.com/api/app/data-retrievals/v3.0"
payload = {
"distinct_ids": [{}],
"compliance_type": "<string>",
"disclosure_type": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({distinct_ids: [{}], compliance_type: '<string>', disclosure_type: '<string>'})
};
fetch('https://mixpanel.com/api/app/data-retrievals/v3.0', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mixpanel.com/api/app/data-retrievals/v3.0",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'distinct_ids' => [
[
]
],
'compliance_type' => '<string>',
'disclosure_type' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mixpanel.com/api/app/data-retrievals/v3.0"
payload := strings.NewReader("{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mixpanel.com/api/app/data-retrievals/v3.0")
.header("Content-Type", "application/json")
.body("{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mixpanel.com/api/app/data-retrievals/v3.0")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"results.status": "<string>",
"results.results": "<string>",
"results.distinct_ids": [
{}
]
}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.string
required
Your project token
array
required
Array of distinct IDs to retrieve data for
string
Compliance regulation type:
GDPR or CCPADefault: GDPRstring
CCPA disclosure type (only if compliance_type is CCPA):
Data, Categories, or SourcesDefault: DataExample Request
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"
}'
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']}")
Response
{
"status": "ok",
"results": {
"task_id": "job-tracking-id-12345"
}
}
Check Retrieval Status
Check the status of a data retrieval job.string
required
The task ID returned from the create request
string
required
Your project token
Example Request
curl "https://mixpanel.com/api/app/data-retrievals/v3.0/job-tracking-id-12345?token=YOUR_PROJECT_TOKEN" \
-H "Authorization: Bearer YOUR_OAUTH_TOKEN"
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']}")
Response
string
Overall API response status
string
Job status:
PENDING, STAGING, STARTED, SUCCESS, FAILURE, REVOKED, NOT_FOUND, UNKNOWNstring
Download link when job is complete, empty string if incomplete
array
Array of distinct IDs included in the retrieval
{
"status": "ok",
"results": {
"status": "SUCCESS",
"results": "https://export.mixpanel.com/download/12345",
"distinct_ids": ["user123", "user456"]
}
}
{
"status": "ok",
"results": {
"status": "PENDING",
"results": "",
"distinct_ids": ["user123", "user456"]
}
}
Create Data Deletion
Create a deletion job to remove user data from Mixpanel.string
required
Your project token
array
required
Array of distinct IDs to delete
string
Compliance type:
GDPR or CCPADefault: GDPRExample Request
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"
}'
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']}")
Data deletion is permanent and cannot be undone. Ensure you have the correct distinct IDs before proceeding.
Check Deletion Status
string
required
The task ID from the deletion request
string
required
Your project token
Example Request
curl "https://mixpanel.com/api/app/data-deletions/v3.0/job-tracking-id-12345?token=YOUR_PROJECT_TOKEN" \
-H "Authorization: Bearer YOUR_OAUTH_TOKEN"
Cancel Deletion
Cancel a deletion job that is still in progress.string
required
The task ID of the deletion to cancel
string
required
Your project token
Example Request
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"
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
Deletions can only be canceled while in
PENDING or STARTED status. Once SUCCESS, the deletion is complete and cannot be reversed.GDPR & CCPA
curl --request POST \
--url https://mixpanel.com/api/app/data-retrievals/v3.0 \
--header 'Content-Type: application/json' \
--data '
{
"distinct_ids": [
{}
],
"compliance_type": "<string>",
"disclosure_type": "<string>"
}
'import requests
url = "https://mixpanel.com/api/app/data-retrievals/v3.0"
payload = {
"distinct_ids": [{}],
"compliance_type": "<string>",
"disclosure_type": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({distinct_ids: [{}], compliance_type: '<string>', disclosure_type: '<string>'})
};
fetch('https://mixpanel.com/api/app/data-retrievals/v3.0', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mixpanel.com/api/app/data-retrievals/v3.0",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'distinct_ids' => [
[
]
],
'compliance_type' => '<string>',
'disclosure_type' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mixpanel.com/api/app/data-retrievals/v3.0"
payload := strings.NewReader("{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mixpanel.com/api/app/data-retrievals/v3.0")
.header("Content-Type", "application/json")
.body("{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mixpanel.com/api/app/data-retrievals/v3.0")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"distinct_ids\": [\n {}\n ],\n \"compliance_type\": \"<string>\",\n \"disclosure_type\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "<string>",
"results.status": "<string>",
"results.results": "<string>",
"results.distinct_ids": [
{}
]
}