Export data from Zendesk QA

JSON format

Export are represented as JSON objects with the following properties:

NameTypeRead-onlyMandatoryDescription
commentsarrayfalsefalseList of comments on this conversation
createdAtstringfalsefalseCreation timestamp (legacy format)
createdAtISOstringfalsefalseCreation timestamp (ISO 8601)
externalFieldsarrayfalsefalseCustom fields from the external system
externalIdstringfalsetrueExternal conversation ID
externalUrlstringfalsefalseExternal URL to the conversation in the source system
lastUpdatedstringfalsetrueLast update timestamp (legacy format)
lastUpdatedISOstringfalsefalseLast update timestamp (ISO 8601)
reviewsarrayfalsefalseList of reviews for this conversation
sourceTypestringfalsefalseSource system type (e.g., zendesk, intercom)
urlstringfalsefalseInternal URL to the conversation in Zendesk QA
workspaceIdstringfalsetrueID of the workspace this conversation belongs to
workspaceNamestringfalsefalseName of the workspace

Conversation with associated reviews and comments

Get AutoQA ratings

  • GET /qa/api/export/autoqa/ratings?fromDate={fromDate}

Parameters

NameTypeInRequiredDescription
autoqaCategoryTypestringQueryfalse
connectionIdstringQueryfalse
cursorstringQueryfalse
fromDatestringQuerytrue
latestOnlybooleanQueryfalse
pageintegerQueryfalse
pageSizeintegerQueryfalse
ratingCategoryIdstringQueryfalse
revieweeExternalIdstringQueryfalse
rootCauseCodestringQueryfalse
toDatestringQueryfalse
workspaceIdstringQueryfalse

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings?autoqaCategoryType=&connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&ratingCategoryId=&revieweeExternalId=&rootCauseCode=&toDate=&workspaceId= \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings?autoqaCategoryType=&connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&ratingCategoryId=&revieweeExternalId=&rootCauseCode=&toDate=&workspaceId="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings")		.newBuilder()		.addQueryParameter("autoqaCategoryType", "")		.addQueryParameter("connectionId", "")		.addQueryParameter("cursor", "")		.addQueryParameter("fromDate", "")		.addQueryParameter("latestOnly", "")		.addQueryParameter("page", "")		.addQueryParameter("pageSize", "")		.addQueryParameter("ratingCategoryId", "")		.addQueryParameter("revieweeExternalId", "")		.addQueryParameter("rootCauseCode", "")		.addQueryParameter("toDate", "")		.addQueryParameter("workspaceId", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'autoqaCategoryType': '',    'connectionId': '',    'cursor': '',    'fromDate': '',    'latestOnly': '',    'page': '',    'pageSize': '',    'ratingCategoryId': '',    'revieweeExternalId': '',    'rootCauseCode': '',    'toDate': '',    'workspaceId': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings?autoqaCategoryType=&connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&ratingCategoryId=&revieweeExternalId=&rootCauseCode=&toDate=&workspaceId="headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/autoqa/ratings")uri.query = URI.encode_www_form("autoqaCategoryType": "", "connectionId": "", "cursor": "", "fromDate": "", "latestOnly": "", "page": "", "pageSize": "", "ratingCategoryId": "", "revieweeExternalId": "", "rootCauseCode": "", "toDate": "", "workspaceId": "")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "nextCursor": "eyJwYWdlIjoyfQ==",  "pagination": {    "page": 1,    "pageSize": 50,    "total": 300  },  "rows": [    {      "accountId": "100",      "autoqaRatingId": "rating-123",      "autoqaReviewId": "review-456",      "categoryDisplayName": "Tone",      "connectionId": "300",      "conversationCreatedAt": "2024-01-15T14:20:00Z",      "createdAt": "2024-01-16T09:00:00Z",      "evaluated": true,      "externalTicketId": "TICKET-789",      "isCritical": false,      "ratingCategoryId": "10",      "ratingCategoryName": "Tone",      "ratingMax": 100,      "revieweeEmail": "[email protected]",      "revieweeExternalId": "user-001",      "revieweeName": "Jane Agent",      "rootCauseCodes": [],      "rootCauses": [],      "score": 85,      "scorecardId": "50",      "scorecardName": "QA Scorecard",      "updatedAt": "2024-01-16T09:30:00Z",      "weight": 1,      "workspaceId": "200",      "workspaceName": "Support Team"    }  ]}

Get AutoQA reviews

  • GET /qa/api/export/autoqa/reviews?fromDate={fromDate}

Parameters

NameTypeInRequiredDescription
connectionIdstringQueryfalse
cursorstringQueryfalse
fromDatestringQuerytrue
latestOnlybooleanQueryfalse
pageintegerQueryfalse
pageSizeintegerQueryfalse
revieweeExternalIdstringQueryfalse
toDatestringQueryfalse
workspaceIdstringQueryfalse

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews?connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&revieweeExternalId=&toDate=&workspaceId= \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews?connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&revieweeExternalId=&toDate=&workspaceId="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews")		.newBuilder()		.addQueryParameter("connectionId", "")		.addQueryParameter("cursor", "")		.addQueryParameter("fromDate", "")		.addQueryParameter("latestOnly", "")		.addQueryParameter("page", "")		.addQueryParameter("pageSize", "")		.addQueryParameter("revieweeExternalId", "")		.addQueryParameter("toDate", "")		.addQueryParameter("workspaceId", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'connectionId': '',    'cursor': '',    'fromDate': '',    'latestOnly': '',    'page': '',    'pageSize': '',    'revieweeExternalId': '',    'toDate': '',    'workspaceId': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews?connectionId=&cursor=&fromDate=&latestOnly=&page=&pageSize=&revieweeExternalId=&toDate=&workspaceId="headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/autoqa/reviews")uri.query = URI.encode_www_form("connectionId": "", "cursor": "", "fromDate": "", "latestOnly": "", "page": "", "pageSize": "", "revieweeExternalId": "", "toDate": "", "workspaceId": "")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "nextCursor": "eyJwYWdlIjoyfQ==",  "pagination": {    "page": 1,    "pageSize": 50,    "total": 300  },  "rows": [    {      "accountId": "100",      "appConversationLink": "https://qa.zendesk.com/conversations/12345",      "autoqaReviewId": "review-456",      "connectionId": "300",      "conversationChannel": "email",      "conversationCreatedAt": "2024-01-15T14:20:00Z",      "createdAt": "2024-01-16T09:00:00Z",      "externalConversationLink": "https://support.example.com/tickets/12345",      "externalTicketId": "TICKET-789",      "isBot": false,      "language": "en",      "revieweeEmail": "[email protected]",      "revieweeExternalId": "user-001",      "revieweeName": "Jane Agent",      "updatedAt": "2024-01-16T09:30:00Z",      "workspaceId": "200",      "workspaceName": "Support Team"    }  ]}

Search conversations

  • POST /qa/api/export/conversations/search

Search for conversation data by end user email. Returns matching conversation IDs and external links.

Example body

{  "endUserEmail": "[email protected]"}

Code Samples

Curl
curl --request POST https://yoursubdomain.zendesk.com/qa/api/export/conversations/search \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json" \--data-raw '{  "endUserEmail": "[email protected]"}'
Go
import (	"fmt"	"io"	"net/http"	"strings")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/conversations/search"	method := "POST"	payload := strings.NewReader(`{  "endUserEmail": "[email protected]"}`)	req, err := http.NewRequest(method, url, payload)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/conversations/search")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""{  \"endUserEmail\": \"customer@example.com\"}""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("POST", body)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');var data = JSON.stringify({  "endUserEmail": "[email protected]"});
var config = {  method: 'POST',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/conversations/search',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  data : data,};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requestsimport json
url = "https://yoursubdomain.zendesk.com/qa/api/export/conversations/search"
payload = json.loads("""{  "endUserEmail": "[email protected]"}""")headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	headers=headers,	json=payload)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/conversations/search")request = Net::HTTP::Post.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")request.body = %q({  "endUserEmail": "[email protected]"})response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "conversations": [    {      "externalId": "CONV-12345",      "externalLink": "https://support.example.com/conversations/12345"    },    {      "externalId": "CONV-67890",      "externalLink": "https://support.example.com/conversations/67890"    }  ]}
400 Bad Request
// Status 400 Bad Request
{  "code": 3,  "details": [],  "message": "invalid argument"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get account CSAT data

  • GET /qa/api/export/csat?fromDate={fromDate}

Export Customer Satisfaction (CSAT) data for all tickets in the account. Supports pagination and date filtering.

Parameters

NameTypeInRequiredDescription
fromDatestringQuerytrueStart date for CSAT export (ISO 8601 timestamp)
pageintegerQueryfalsePage number for pagination (starts at 1)
pageSizeintegerQueryfalseNumber of results per page
toDatestringQueryfalseEnd date for CSAT export (ISO 8601 timestamp)
workspacestringQueryfalse

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z&workspace= \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z&workspace="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/csat")		.newBuilder()		.addQueryParameter("fromDate", "2024-01-01T00:00:00Z")		.addQueryParameter("page", "1")		.addQueryParameter("pageSize", "50")		.addQueryParameter("toDate", "2024-01-31T23:59:59Z")		.addQueryParameter("workspace", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/csat',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '2024-01-01T00%3A00%3A00Z',    'page': '1',    'pageSize': '50',    'toDate': '2024-01-31T23%3A59%3A59Z',    'workspace': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z&workspace="headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/csat")uri.query = URI.encode_www_form("fromDate": "2024-01-01T00:00:00Z", "page": "1", "pageSize": "50", "toDate": "2024-01-31T23:59:59Z", "workspace": "")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "pagination": {    "page": 1,    "pageSize": 50,    "total": 100  },  "tickets": [    {      "agentEmail": "[email protected]",      "agentName": "Jane Agent",      "conversationSource": "zendesk",      "conversationUrl": "https://qa.zendesk.com/conversations/12345",      "csatAnsweredAt": "2024-01-15T14:05:00Z",      "csatCreatedAt": "2024-01-15T14:00:00Z",      "csatRawScore": "good",      "csatScore": "5",      "customerEmail": "[email protected]",      "customerName": "Alice Customer",      "externalTicketId": "TICKET-12345",      "ticketCreatedAt": "2024-01-15T10:30:00Z"    }  ]}
400 Bad Request
// Status 400 Bad Request
{  "code": 3,  "details": [],  "message": "invalid argument"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

List all quizzes

  • GET /qa/api/export/quizzes

Export all quizzes in the account, including metadata, author information, and participation statistics.

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/quizzes \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/quizzes"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/quizzes")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/quizzes',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/quizzes"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/quizzes")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "quizzes": [    {      "authorId": "1001",      "authorName": "Training Manager",      "averageScorePercentage": "78",      "id": "5001",      "name": "Product Knowledge Quiz",      "numberOfParticipants": "25",      "publishedDate": "2024-01-01T00:00:00Z",      "status": "PUBLISHED"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get quizzes leaderboard

  • GET /qa/api/export/quizzes/leaderboard

Export the overall quiz leaderboard across all quizzes, showing user rankings and average scores.

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/leaderboard")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "leaderboardUsers": [    {      "averageScorePercentage": "92",      "id": "1001",      "name": "Jane Smith",      "quizzesTaken": "5",      "ranking": "1",      "requesterCanManageAnyQuiz": true    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get quiz overview

  • GET /qa/api/export/quizzes/{id}/overview

Export detailed overview of a specific quiz, including all fields, questions, options, and aggregated statistics.

Parameters

NameTypeInRequiredDescription
idintegerPathtrueThe quiz ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/overview")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "averageScorePercentage": "78",  "createdAt": "2024-01-01T00:00:00Z",  "createdBy": "1001",  "description": "Test your knowledge of our product features",  "id": "5001",  "name": "Product Knowledge Quiz",  "publishedDate": "2024-01-05T00:00:00Z",  "responseCount": "25",  "status": "PUBLISHED"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get quiz responses

  • GET /qa/api/export/quizzes/{id}/responses

Export all user responses for a specific quiz, showing who took the quiz and their scores.

Parameters

NameTypeInRequiredDescription
idintegerPathtrueThe quiz ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "responses": [    {      "correctAnswerPercentage": "85",      "responseId": "7001",      "userId": "1001",      "userName": "Jane Smith"    },    {      "correctAnswerPercentage": "70",      "responseId": "7002",      "userId": "1002",      "userName": "John Doe"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get single quiz response

  • GET /qa/api/export/quizzes/{id}/responses/{response}

Export detailed data for a single user's quiz response, including all answers and whether they were correct.

Parameters

NameTypeInRequiredDescription
idintegerPathtrueThe quiz ID
responseintegerPathtrueThe response ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001 \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/quizzes/5001/responses/7001")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "createdAt": "2024-01-15T10:00:00Z",  "description": "Test your knowledge of our product features",  "name": "Product Knowledge Quiz",  "quizId": "5001",  "responseId": "7001",  "userId": "1001",  "userName": "Jane Smith"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get account reviews

  • GET /qa/api/export/reviews?fromDate={fromDate}

Export all reviews and associated comments across the entire account. Supports pagination and date filtering.

Parameters

NameTypeInRequiredDescription
fromDatestringQuerytrueStart date for the review export (ISO 8601 timestamp)
pageintegerQueryfalsePage number for pagination (starts at 1)
pageSizeintegerQueryfalseNumber of results per page
toDatestringQueryfalseEnd date for the review export (ISO 8601 timestamp)

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/reviews")		.newBuilder()		.addQueryParameter("fromDate", "2024-01-01T00:00:00Z")		.addQueryParameter("page", "1")		.addQueryParameter("pageSize", "50")		.addQueryParameter("toDate", "2024-01-31T23:59:59Z");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/reviews',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '2024-01-01T00%3A00%3A00Z',    'page': '1',    'pageSize': '50',    'toDate': '2024-01-31T23%3A59%3A59Z',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/reviews")uri.query = URI.encode_www_form("fromDate": "2024-01-01T00:00:00Z", "page": "1", "pageSize": "50", "toDate": "2024-01-31T23:59:59Z")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "conversations": [    {      "externalId": "TICKET-12345",      "externalUrl": "https://support.example.com/tickets/12345",      "lastUpdated": "2024-01-15T14:20:00Z",      "lastUpdatedISO": "2024-01-15T14:20:00Z",      "reviews": [        {          "created": "2024-01-16T09:00:00Z",          "createdISO": "2024-01-16T09:00:00Z",          "id": "98765",          "reviewer": {            "email": "[email protected]",            "name": "John Manager"          },          "score": 90        }      ],      "url": "https://qa.zendesk.com/conversations/12345",      "workspaceId": "12345",      "workspaceName": "Support Team"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "total": 300  }}
400 Bad Request
// Status 400 Bad Request
{  "code": 3,  "details": [],  "message": "invalid argument"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get account users

  • GET /qa/api/export/users

Export all users belonging to the account, including their ID, name, and email.

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/users \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/users"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/users")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/users',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/users"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/users")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "users": [    {      "email": "[email protected]",      "id": "1001",      "name": "Jane Smith"    },    {      "email": "[email protected]",      "id": "1002",      "name": "John Doe"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get calibration sessions

  • GET /qa/api/export/workspace/{workspace}/calibration-sessions?fromDate={fromDate}

Parameters

NameTypeInRequiredDescription
fromDatestringQuerytrue
pageintegerQueryfalse
pageSizeintegerQueryfalse
toDatestringQueryfalse
workspacestringPathtrue

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions?fromDate=&page=&pageSize=&toDate= \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions?fromDate=&page=&pageSize=&toDate="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions")		.newBuilder()		.addQueryParameter("fromDate", "")		.addQueryParameter("page", "")		.addQueryParameter("pageSize", "")		.addQueryParameter("toDate", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '',    'page': '',    'pageSize': '',    'toDate': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions?fromDate=&page=&pageSize=&toDate="headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace//calibration-sessions")uri.query = URI.encode_www_form("fromDate": "", "page": "", "pageSize": "", "toDate": "")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "calibrationSessions": [    {      "conversations": [        {          "createdAt": "2024-01-11T09:00:00Z",          "createdBy": "100",          "externalId": "TICKET-789",          "reviews": [            {              "comment": "Great handling of the customer issue",              "createdAt": "2024-01-11T12:00:00Z",              "createdISO": "2024-01-11T12:00:00Z",              "id": "review-001",              "received": true,              "score": 90,              "updatedAt": "2024-01-11T12:30:00Z",              "updatedISO": "2024-01-11T12:30:00Z"            }          ]        }      ],      "createdAt": "2024-01-10T08:00:00Z",      "createdBy": "100",      "dueAt": "2024-01-20T17:00:00Z",      "id": "session-001",      "title": "January Calibration",      "updatedAt": "2024-01-12T10:00:00Z"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "total": 12  }}

Get workspace CSAT data

  • GET /qa/api/export/workspace/{workspace}/csat?fromDate={fromDate}

Export Customer Satisfaction (CSAT) data for tickets in a specific workspace. Supports pagination and date filtering.

Parameters

NameTypeInRequiredDescription
fromDatestringQuerytrueStart date for CSAT export (ISO 8601 timestamp)
pageintegerQueryfalsePage number for pagination (starts at 1)
pageSizeintegerQueryfalseNumber of results per page
toDatestringQueryfalseEnd date for CSAT export (ISO 8601 timestamp)
workspaceintegerPathtrueThe workspace ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat")		.newBuilder()		.addQueryParameter("fromDate", "2024-01-01T00:00:00Z")		.addQueryParameter("page", "1")		.addQueryParameter("pageSize", "50")		.addQueryParameter("toDate", "2024-01-31T23:59:59Z");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '2024-01-01T00%3A00%3A00Z',    'page': '1',    'pageSize': '50',    'toDate': '2024-01-31T23%3A59%3A59Z',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/csat")uri.query = URI.encode_www_form("fromDate": "2024-01-01T00:00:00Z", "page": "1", "pageSize": "50", "toDate": "2024-01-31T23:59:59Z")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "pagination": {    "page": 1,    "pageSize": 50,    "total": 75  },  "tickets": [    {      "conversationSource": "zendesk",      "conversationUrl": "https://qa.zendesk.com/conversations/12345",      "csatScore": "4",      "externalTicketId": "TICKET-12345"    }  ]}
400 Bad Request
// Status 400 Bad Request
{  "code": 3,  "details": [],  "message": "invalid argument"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get workspace disputes

  • GET /qa/api/export/workspace/{workspace}/disputes

Export all review disputes for a specific workspace, including dispute status, categories, and resolution information.

Parameters

NameTypeInRequiredDescription
fromDatestringQueryfalse
pageintegerQueryfalse
pageSizeintegerQueryfalse
toDatestringQueryfalse
workspacestringPathtrueThe workspace ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes?fromDate=&page=&pageSize=&toDate= \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes?fromDate=&page=&pageSize=&toDate="	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes")		.newBuilder()		.addQueryParameter("fromDate", "")		.addQueryParameter("page", "")		.addQueryParameter("pageSize", "")		.addQueryParameter("toDate", "");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '',    'page': '',    'pageSize': '',    'toDate': '',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes?fromDate=&page=&pageSize=&toDate="headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/disputes")uri.query = URI.encode_www_form("fromDate": "", "page": "", "pageSize": "", "toDate": "")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "disputes": [    {      "account": "1001",      "connectionId": "5001",      "conversationId": "CONV-12345",      "createdAt": "2024-01-16T10:00:00Z",      "createdBy": {        "avatar": "https://example.com/avatars/jane.jpg",        "id": "1002",        "name": "Jane Agent"      },      "disputeId": "DISPUTE-001",      "reviewId": "98765",      "status": "open",      "type": "rating_disagreement",      "workspace": "12345"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get workspace reviews

  • GET /qa/api/export/workspace/{workspace}/reviews?fromDate={fromDate}

Export reviews and associated comments for a specific workspace. Supports pagination and date filtering.

Parameters

NameTypeInRequiredDescription
fromDatestringQuerytrueStart date for the review export (ISO 8601 timestamp)
pageintegerQueryfalsePage number for pagination (starts at 1)
pageSizeintegerQueryfalseNumber of results per page
toDatestringQueryfalseEnd date for the review export (ISO 8601 timestamp)
workspaceintegerPathtrueThe workspace ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews")		.newBuilder()		.addQueryParameter("fromDate", "2024-01-01T00:00:00Z")		.addQueryParameter("page", "1")		.addQueryParameter("pageSize", "50")		.addQueryParameter("toDate", "2024-01-31T23:59:59Z");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },  params: {    'fromDate': '2024-01-01T00%3A00%3A00Z',    'page': '1',    'pageSize': '50',    'toDate': '2024-01-31T23%3A59%3A59Z',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews?fromDate=2024-01-01T00%3A00%3A00Z&page=1&pageSize=50&toDate=2024-01-31T23%3A59%3A59Z"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/reviews")uri.query = URI.encode_www_form("fromDate": "2024-01-01T00:00:00Z", "page": "1", "pageSize": "50", "toDate": "2024-01-31T23:59:59Z")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "conversations": [    {      "createdAt": "2024-01-15T10:30:00Z",      "createdAtISO": "2024-01-15T10:30:00Z",      "externalId": "TICKET-12345",      "externalUrl": "https://support.example.com/tickets/12345",      "lastUpdated": "2024-01-15T14:20:00Z",      "lastUpdatedISO": "2024-01-15T14:20:00Z",      "reviews": [        {          "created": "2024-01-16T09:00:00Z",          "createdISO": "2024-01-16T09:00:00Z",          "id": "98765",          "received": true,          "reviewee": {            "email": "[email protected]",            "name": "Jane Agent"          },          "reviewer": {            "email": "[email protected]",            "name": "John Manager"          },          "score": 85.5,          "scorecard": {            "id": "111",            "name": "Support Quality Scorecard"          },          "updated": "2024-01-16T09:30:00Z",          "updatedISO": "2024-01-16T09:30:00Z"        }      ],      "sourceType": "zendesk",      "url": "https://qa.zendesk.com/conversations/12345",      "workspaceId": "12345",      "workspaceName": "Support Team"    }  ],  "pagination": {    "page": 1,    "pageSize": 50,    "total": 150  }}
400 Bad Request
// Status 400 Bad Request
{  "code": 3,  "details": [],  "message": "invalid argument"}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get workspace scorecards

  • GET /qa/api/export/workspace/{workspace}/scorecards

Export all scorecards configured for a specific workspace, including their categories and rating criteria.

Parameters

NameTypeInRequiredDescription
workspaceintegerPathtrueThe workspace ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/scorecards")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "data": [    {      "createdAt": "2024-01-01T00:00:00Z",      "id": "111",      "name": "Support Quality Scorecard",      "updatedAt": "2024-01-15T12:00:00Z"    }  ],  "total": 1}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

Get workspace users

  • GET /qa/api/export/workspace/{workspace}/users

Export all users belonging to a specific workspace, including their ID, name, and email.

Parameters

NameTypeInRequiredDescription
workspaceintegerPathtrueThe workspace ID

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspace/12345/users")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "users": [    {      "email": "[email protected]",      "id": "1001",      "name": "Jane Smith"    },    {      "email": "[email protected]",      "id": "1002",      "name": "John Doe"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
404 Not Found
// Status 404 Not Found
{  "code": 5,  "details": [],  "message": "not found"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}

List all workspaces

  • GET /qa/api/export/workspaces

Export all workspaces in the account, showing their IDs and names.

Code Samples

Curl
curl --request GET https://yoursubdomain.zendesk.com/qa/api/export/workspaces \--header "Authorization: Bearer ${authToken}" \--header "Content-Type: application/json"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://yoursubdomain.zendesk.com/qa/api/export/workspaces"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Authorization", "Bearer ${authToken}")	req.Header.Add("Content-Type", "application/json")
	client := &http.Client {}	res, err := client.Do(req)	if err != nil {		fmt.Println(err)		return	}	defer res.Body.Close()
	body, err := io.ReadAll(res.Body)	if err != nil {		fmt.Println(err)		return	}	fmt.Println(string(body))}
Java
import com.squareup.okhttp.*;OkHttpClient client = new OkHttpClient();HttpUrl.Builder urlBuilder = HttpUrl.parse("https://yoursubdomain.zendesk.com/qa/api/export/workspaces")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Authorization", "Bearer ${authToken}")		.addHeader("Content-Type", "application/json")		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://yoursubdomain.zendesk.com/qa/api/export/workspaces',  headers: {	'Authorization': 'Bearer ${authToken}',	'Content-Type': 'application/json',  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://yoursubdomain.zendesk.com/qa/api/export/workspaces"headers = {	"Authorization": "Bearer ${authToken}",	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://yoursubdomain.zendesk.com/qa/api/export/workspaces")request = Net::HTTP::Get.new(uri, "Authorization": "Bearer ${authToken}", "Content-Type": "application/json")response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

200 OK
// Status 200 OK
{  "workspaces": [    {      "id": "12345",      "name": "Support Team"    },    {      "id": "12346",      "name": "Sales Team"    }  ]}
401 Unauthorized
// Status 401 Unauthorized
{  "code": 16,  "details": [],  "message": "unauthenticated"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "code": 13,  "details": [],  "message": "internal"}