Hitting a KeyError when attempting to extract an array of survey data | XM Community
Skip to main content
I've managed to cobble together a script from the Qualtrics samples that gets a list of all of the surveys associated with my apiToken and then exports all active surveys into a folder. Unfortunately, I've found that if I just create an array of all of my surveyIds where isActive == True, I get a KeyError on the following line (Python): progressId = downloadRequestResponse.json()["result"]["id"] If I run a check on ownerId, I don't get the KeyError. However, not all of my surveys are extracted. It's super weird and I'm a bit at a loss. Anyone have any ideas of how I might fix this? ~~~~ import os import requests import json import zipfile try: import simplejson as json except ImportError: import json

Setting user Parameters

apiToken = 'APITOKEN' dataCenter = 'DATACENTER'

Constructing the URL

baseUrl = "https://{0}.qualtrics.com/API/v3/surveys".format(dataCenter) headers = { "x-api-token": apiToken, }

Getting the json data

json_data = requests.get(baseUrl,headers=headers).json()

Set the empty array

surveyIds = [] i = 0

Create the array; prints are for debugging only all active survey names and IDs

for each in json_data['result']['elements']:

If I don't include the OwnerID check, I get the KeyError, but if I do include the OwnerID check, I don't get all of my surveys

if each['isActive'] == True and each['ownerId'] == 'OWNERID': surveyIds.append(each['id']) print(each['name']) print(each['id']) print i = i + 1

For debugging

print "There are ", i, " active surveys" print(surveyIds)

Construct the survey extracts

for surveyId in surveyIds: fileFormat = "csv" # This the data center our qualtrics site uses. dataCenter = 'DATACENTER' # Setting static parameters requestCheckProgress = 0 progressStatus = "in progress" baseUrl = "https://{0}.qualtrics.com/API/v3/responseexports/".format(dataCenter) headers = { "content-type": "application/json", "x-api-token": apiToken, } # Step 1: Creating Data Export downloadRequestUrl = baseUrl downloadRequestPayload = '{"format":"' + fileFormat + '","surveyId":"' + surveyId + '"}' downloadRequestResponse = requests.request("POST", downloadRequestUrl, data=downloadRequestPayload, headers=headers)

This is where the error is thrown if I don't include the OwnerID check

progressId = downloadRequestResponse.json()["result"]["id"] print downloadRequestResponse.text # Step 2: Checking on Data Export Progress and waiting until export is ready while requestCheckProgress < 100 and progressStatus is not "complete": requestCheckUrl = baseUrl + progressId requestCheckResponse = requests.request("GET", requestCheckUrl, headers=headers) requestCheckProgress = requestCheckResponse.json()["result"]["percentComplete"] print "Download is " + str(requestCheckProgress) + " complete" # Step 3: Downloading file requestDownloadUrl = baseUrl + progressId + '/file' requestDownload = requests.request("GET", requestDownloadUrl, headers=headers, stream=True) # Step 4: Unzipping file with open("RequestFile.zip", "wb") as f: for chunk in requestDownload.iter_content(chunk_size=1024): f.write(chunk) zipfile.ZipFile("RequestFile.zip").extractall("SurveyExports")
Hi @muriah! We're sorry that you were experiencing this issue. If you are still encountering this problem, we recommend reaching out to our support team and they can help you get this sorted!