Note: The endpoints listed on this page are for the legacy CSAT feature. We recommend you use survey responses for more accurate and relevant feedback. For more information, see Survey responses, Survey offered event, and Survey response submitted event. See also Setting up the CSAT survey. If you are using the legacy CSAT, you must deactivate legacy CSAT and manually deactivate any custom CSAT automations and triggers before you can use survey responses. You can have only one CSAT option activated at a time.

When satisfaction reasons are enabled in your Zendesk Support account, and a user gives a negative rating to a solved ticket, a follow-up question is presented to the user. The question includes a list menu of possible reasons for the negative rating. You can use this API to inspect the list of reasons.

You must use the admin interface to add or remove reasons. See Customizing and localizing satisfaction reasons in the Support Help Center.

JSON format

Satisfaction Reasons are represented as JSON objects with the following properties:

NameTypeRead-onlyMandatoryDescription
created_atstringtruefalseThe time the reason was created
deleted_atstringtruefalseThe time the reason was deleted
idintegertruefalseAutomatically assigned upon creation
raw_valuestringfalsefalseThe dynamic content placeholder, if present, or the current "value", if not. See Dynamic Content Items
reason_codeintegertruefalseAn account-level code for referencing the reason. Custom reasons are assigned an auto-incrementing integer (non-system reason codes begin at 1000). See Reason codes
updated_atstringtruefalseThe time the reason was updated
urlstringtruefalseAPI URL for the resource
valuestringfalsetrueTranslated value of the reason in the account locale

Reason codes

The follow-up question has the following default reasons the user can select for giving a negative rating:

CodeReason
0No reason provided (the user didn't select a reason from the list menu)
5The issue took too long to resolve
6The issue was not resolved
7The agent's knowledge is unsatisfactory
8The agent's attitude is unsatisfactory
1000Some other reason

An admin in Zendesk Support can create custom reasons. Any custom reason is assigned a code of 1000 or higher when the reason is created. See Customizing and localizing satisfaction reasons in the Support Help Center.

Example

{  "created_at": "2011-07-20T22:55:29Z",  "deleted_at": "2012-03-12T12:45:32Z",  "id": 35436,  "raw_value": "{{dc.reason_code_1003}}",  "reason_code": 1003,  "updated_at": "2011-07-20T22:55:29Z",  "url": "https://example.zendesk.com/api/v2/satisfaction_reasons/35436.json",  "value": "Agent did not respond quickly"}

List Reasons for Satisfaction Rating

  • GET /api/v2/satisfaction_reasons

List all reasons for an account

Allowed For

  • Admins

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/satisfaction_reasons.json \  -v -u {email_address}/token:{api_token}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://example.zendesk.com/api/v2/satisfaction_reasons"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "{email_address}/token:{api_token}"
	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://example.zendesk.com/api/v2/satisfaction_reasons")		.newBuilder();String userCredentials = "your_email_address" + "/token:" + "your_api_token";String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", basicAuth)		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://example.zendesk.com/api/v2/satisfaction_reasons',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "{email_address}/token:{api_token}"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requestsfrom requests.auth import HTTPBasicAuth
url = "https://example.zendesk.com/api/v2/satisfaction_reasons"headers = {	"Content-Type": "application/json",}email_address = 'your_email_address'api_token = 'your_api_token'# Use basic authenticationauth = HTTPBasicAuth(f'{email_address}/token', api_token)
response = requests.request(	"GET",	url,	auth=auth,	headers=headers)
print(response.text)
Ruby
require "net/http"require "base64"uri = URI("https://example.zendesk.com/api/v2/satisfaction_reasons")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")email = "your_email_address"api_token = "your_api_token"credentials = "#{email}/token:#{api_token}"encoded_credentials = Base64.strict_encode64(credentials)request["Authorization"] = "Basic #{encoded_credentials}"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
{  "reasons": [    {      "created_at": "2011-07-20T22:55:29Z",      "id": 35436,      "raw_value": "{{dc.reason_code_1000}}",      "reason_code": 1000,      "updated_at": "2011-07-20T22:55:29Z",      "url": "https://company.zendesk.com/api/v2/satisfaction_reasons/35436.json",      "value": "Agent did not respond quickly."    },    {      "created_at": "2011-07-20T22:55:29Z",      "id": 120447,      "raw_value": "{{dc.reason_code_1000}}",      "reason_code": 1001,      "updated_at": "2011-07-20T22:55:29Z",      "url": "https://company.zendesk.com/api/v2/satisfaction_reasons/120447.json",      "value": "Issue is not resolved."    }  ]}

Show Reason for Satisfaction Rating

  • GET /api/v2/satisfaction_reasons/{satisfaction_reason_id}

Allowed For

  • Admins

Parameters

NameTypeInRequiredDescription
satisfaction_reason_idintegerPathtrueThe id of the satisfaction rating reason

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/satisfaction_reasons/{id}.json \  -v -u {email_address}/token:{api_token}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://example.zendesk.com/api/v2/satisfaction_reasons/35121"	method := "GET"	req, err := http.NewRequest(method, url, nil)
	if err != nil {		fmt.Println(err)		return	}	req.Header.Add("Content-Type", "application/json")	req.Header.Add("Authorization", "Basic <auth-value>") // Base64 encoded "{email_address}/token:{api_token}"
	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://example.zendesk.com/api/v2/satisfaction_reasons/35121")		.newBuilder();String userCredentials = "your_email_address" + "/token:" + "your_api_token";String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", basicAuth)		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://example.zendesk.com/api/v2/satisfaction_reasons/35121',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "{email_address}/token:{api_token}"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requestsfrom requests.auth import HTTPBasicAuth
url = "https://example.zendesk.com/api/v2/satisfaction_reasons/35121"headers = {	"Content-Type": "application/json",}email_address = 'your_email_address'api_token = 'your_api_token'# Use basic authenticationauth = HTTPBasicAuth(f'{email_address}/token', api_token)
response = requests.request(	"GET",	url,	auth=auth,	headers=headers)
print(response.text)
Ruby
require "net/http"require "base64"uri = URI("https://example.zendesk.com/api/v2/satisfaction_reasons/35121")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")email = "your_email_address"api_token = "your_api_token"credentials = "#{email}/token:#{api_token}"encoded_credentials = Base64.strict_encode64(credentials)request["Authorization"] = "Basic #{encoded_credentials}"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
{  "reason": [    {      "created_at": "2011-07-20T22:55:29Z",      "id": 35121,      "raw_value": "{{dc.reason_code_1000}}",      "reason_code": 1000,      "updated_at": "2011-07-20T22:55:29Z",      "url": "https://company.zendesk.com/api/v2/satisfaction_reason/35121.json",      "value": "Agent did not respond quickly."    }  ]}