Skip to main content

Managing Right To Erasure

This guide elaborates on data privacy operations that allow our customers to easily manage their compliance requirements around data privacy. With these endpoints they can easily build automations that service any right to erasure requests they receive.

Also on the Admin UI​

For customers without api access Erasure Requests can be initiated from the Data Privacy tab in Admin UI:

Data Pivacy Location

Currently erasure requests are identified by email, and you can include more than one email address in a single request. When processed, the request will search for any entities within Qualtrics that match any of the supplied emails; these entities include

  • Users
  • MailingList & XM Directory contacts
  • People

For any entity discovered the service will erase any responses to surveys they have submitted, along with any tickets that may have originated from their responses before erasing the entity itself.

Permissions​

Complying with erasure requests requires purging entities completely from our system. This is a destructive process and is by definition not recoverable. Understandably, care needs to be taken when issuing erasure requests. Requesting erasure is a privileged operation and can only be initiated by brand administrators. The admin should have full access to each of the systems from which entities will be erased.

Creating an Erasure Request​

Creating an erasure request involves a simple call to the Create Erasure Request, supplying a list of emails of people that have requested erasure. Optionally, it is possible to search only to see what would be deleted

Code and Qualtrics Support​

Our support team does not offer assistance or consultation on custom coding, but you can always try asking our community of dedicated users. If you’d like to know more about our custom coding services you can commission, please contact your Qualtrics Account Executive.

# Create Erasure Request

import requests

# Setting user Parameters
apiToken = "YOUR API TOKEN"
dataCenter = "YOUR DATA CENTER"

baseUrl = "https://{0}.qualtrics.com/API/v3/op-erase-personal-data".format(dataCenter)
headers = {
"x-api-token": apiToken,
"Content-Type": "application/json"
}

toErase = {
"emails": ["user1@qualtrics.com","user2@qualtrics.com"],
"searchOnly": False
}

response = requests.post(baseUrl, json=toErase, headers=headers)
print(response.text)

An example response will look like the following.

{
"result": {
"requestId": "OP-5863c62b-452e-4084-9dc8-xxxx",
"user": "UR_3RiBzsomeuser"
}
}

Checking the status of an Erasure Request​

Erasure requests are processed asynchronously. When a request is submitted, it gets queued within the processing system and a receipt with the requestId is returned. This request id is required to check the status the erasure at a later stage using the Get Erasure Request endpoint.

# Check Erasure Request

import requests

# Setting user Parameters
apiToken = "YOUR API TOKEN"
dataCenter = "YOUR DATA CENTER"
existingRequestId = "op-some-erasure-request-id"

baseUrl = "https://{0}.qualtrics.com/API/v3/op-erase-personal-data/{1}".format(dataCenter, existingRequestId)
headers = {
"x-api-token": apiToken,
"Content-Type": "application/json"
}

response = requests.get(baseUrl, headers=headers)
print(response.text)

An example response will look like the following.

{
"result": {
"requestid": "OP-5863c62b-452e-4084-9dc8-650fadxxxx",
"status": "Complete",
"user": "UR_3RiBzsomeuser",
"created": "2018-09-21T10:42:55Z",
"updated": "2018-09-21T10:45:04Z",
"searchOnly": "false",
"failureReason": "",
"emailsNotFound": [],
"emailList": [ "ac0251c2a48e590baec1740a08086f8e0537419109910327055668ea600a8f5d", "ba81ecc1f19daa7d06749089ac708c68d2448ea1333c9a62a8389c0703b80101"
],
"numEmailsRequested": 2
},
"meta": {
"httpStatus": 200
}
}

Verifying Erasure.​

If an email is found and its associated entities are erased it will be replaced in the email list with a sha256 hash of the email. This can be used to verify the deletion while no longer tracking the actual email.

Any emails that were not found will be returned as received in emailsNotFound list in the results.

Listing Erasure Requests​

At any stage the List Erasure Requests endpoint can be used to page over previous requests. This will retrieve a high level summary & status of the requests.

# List Erasure Requests

import requests

# Setting user Parameters
apiToken = "YOUR API TOKEN"
dataCenter = "YOUR DATA CENTER"

baseUrl = "https://{0}.qualtrics.com/API/v3/op-erase-personal-data".format(dataCenter)
headers = {
"x-api-token": apiToken,
"Content-Type": "application/json"
}

response = requests.get(baseUrl, headers=headers)
print(response.text)

Which will return a response like the following.

{
"result": {
"elements": [
{
"requestid": "OP-5863c62b-452e-4084-9dc8-650fad8f8503",
"status": "Complete",
"user": "UR_3RiBzsomeuser",
"created": "2018-09-21T10:42:55Z",
"updated": "2018-09-21T10:45:04Z",
"searchOnly": "false",
"failureReason": "",
"emailsNotFound": [],
"emailList": [ "ac0251c2a48e590baec1740a08086f8e0537419109910327055668ea600a8f5d", "ba81ecc1f19daa7d06749089ac708c68d2448ea1333c9a62a8389c0703b80101"
],
"numEmailsRequested": 2
},
{
"requestid": "OP-1234-5678-9333",
"status": "Complete",
"user": "UR_000000000000",
"created": "2018-07-19T13:05:00Z",
"updated": "2018-07-19T13:05:15Z",
"searchOnly": "false",
"failureReason": "",
"emailsNotFound": [
"test1@example.com"
],
"emailList": [ "e549d519aa0ff9d6fb3a021abcb007894fdc5775394f14f25de4550ea4259bab"
],
"numEmailsRequested": 1
}
]
},
"meta": {
"httpStatus": 200
}
}