This API lets you manage and interact with Zendesk apps. All actions from these endpoints are recorded in the Audit Log console of the affected Zendesk Support account.

To learn more about the process of creating and managing apps using the Apps REST API described on this page, see Creating and managing private apps

JSON format

Apps are represented as JSON objects with the following properties:

NameTypeRead-onlyMandatoryDescription
app_organizationobjecttruefalseOrganization that submitted the app to the Zendesk Marketplace
author_emailstringtruefalseThe app author's email
author_namestringtruefalseThe app author's name
author_urlstringtruefalseThe app author's URL
categoriesarraytruefalseZendesk Marketplace categories to which the app belongs
collectionsarraytruefalseZendesk Marketplace collections to which the app belongs
created_atstringtruefalseWhen the app was created
date_publishedstringtruefalseWhen the app was published on the Zendesk Marketplace
default_localestringtruefalseThe default locale for translations for the app
deprecatedbooleantruefalseIf true, the app is deprecated
feature_colorstringtruefalseHexadecimal color value used to feature the app on the Zendesk Marketplace
featuredbooleantruefalseWhether or not the app is featured in the Zendesk Marketplace
framework_versionstringtruefalseThe app framework version for which the app was written
google_analytics_codestringtruefalseUniversal Google Analytics ("UA-") tracking id for the app's detail page on the Zendesk Marketplace
idintegertruefalseThe id of the app
installablebooleantruefalseWhether or not the app can be installed
installation_countintegertruefalseCurrent number of installations of the app
installation_instructionsstringtruefalseInstructions for installing the app
large_iconstringtruefalseThe large icon url for an app
locationsarraytruefalseLocation ids for the app. To map these ids to app locations, see the App Locations endpoint
long_descriptionstringtruefalseThe app's long description in the Zendesk Marketplace
marketing_onlybooleantruefalseIf true, the app is an integration app
namestringtruefalseThe name of the app
obsoletebooleantruefalseIf true, the app is obsolete
owner_idintegertruefalseThe app developer id corresponding to the app
paidbooleantruefalseIf true, the app is a paid app
parametersarraytruefalseThe parameters for the app
plansarraytruefalsePayment plans for the app
productsarraytruefalseZendesk products supported by the app
promotedbooleantruefalseWhether or not the app is a promoted app in the Zendesk Marketplace
ratingobjecttruefalseThe ratings of the app
raw_installation_instructionsstringtruefalseThe raw installation instructions
raw_long_descriptionstringtruefalseThe raw long description for the app in the Zendesk Marketplace
remote_installation_urlstringtruefalseURL for the app's installation instructions
screenshotsarraytruefalseScreenshots for the app when displayed in the Zendesk Marketplace
short_descriptionstringtruefalseThe short description of the app in the Zendesk Marketplace
single_installbooleantruefalseWhether or not this app can only be installed once
small_iconstringtruefalseThe url for the small logo for the app
statestringtruefalsePublication state for the app on the Zendesk Marketplace
stripe_publishable_keystringtruefalsePublishable key for the app developer's Stripe account
terms_conditions_urlstringtruefalseURL for the app's terms and conditions
third_party_pricingobjecttruefalseThird-party pricing information for the app
updated_atstringtruefalseWhen the app was last updated
versionstringtruefalseThe version of the app
visibilitystringtruefalseThe app is a private app, which is only visible to your account, or a public app. An example value is "private".

List All Apps

  • GET /api/v2/apps

Lists all public apps on the Zendesk Marketplace. For authenticated agents and admins, the endpoint also lists their account's private apps.

Allowed For

  • Everyone

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps"	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 "username:password"
	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://support.zendesk.com/api/v2/apps")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "apps": [    {      "app_organization": {        "country_code": "US",        "email": "[email protected]",        "id": 123,        "name": "Acme",        "stripe_account_id": null,        "website": "https://example.com"      },      "author_email": "[email protected]",      "author_name": "Zendesk User",      "author_url": "https://example.com",      "categories": [],      "collections": [],      "created_at": "2012-05-14T22:28:18Z",      "date_published": "2016-10-26T22:26:18Z",      "default_locale": "en",      "deprecated": false,      "feature_color": null,      "featured": false,      "framework_version": "2.0",      "google_analytics_code": null,      "id": 12345,      "installable": true,      "installation_count": 1234,      "installation_instructions": "",      "large_icon": "/api/v2/apps/12345/assets/logo.png",      "locations": [        7,        2,        1,        3,        4,        5,        6,        10,        8,        19,        17,        15,        18,        16,        25,        22,        23,        24      ],      "long_description": "",      "marketing_only": false,      "name": "Bookmarks",      "obsolete": false,      "owner_id": 1,      "paid": false,      "parameters": [        {          "app_id": 12345,          "created_at": "2012-06-14T17:31:08Z",          "default_value": null,          "id": 21,          "kind": "text",          "name": "name",          "position": 0,          "required": true,          "secure": true,          "updated_at": "2012-06-14T17:31:08Z"        }      ],      "plans": [        {          "active": true,          "amount": 0,          "app_id": 12345,          "cost_id": 1,          "cost_type": "CostFree",          "created_at": "2019-05-15T05:41:13.000Z",          "description": "<p>This is the default plan all existing apps have. You can change the description and name of this plan, or create new ones.</p>\\n",          "entity_id": 123456,          "id": 123,          "name": "Default Plan",          "plan_type": "one_off",          "service_identifier": null,          "stripe_account": null,          "stripe_plan_id": null,          "stripe_publishable_key": null,          "trial_days": 0,          "updated_at": "2019-05-15T05:41:13.000Z",          "vat_reversible": null        }      ],      "products": [        "support",        "chat",        "sell"      ],      "promoted": false,      "rating": {        "average": 3,        "count": {          "1": 2,          "2": 2,          "3": 2,          "4": 2,          "5": 2        },        "total_count": 10      },      "raw_installation_instructions": null,      "raw_long_description": null,      "remote_installation_url": null,      "screenshots": [],      "short_description": null,      "single_install": true,      "small_icon": "/api/v2/apps/12345/assets/logo-small.png",      "state": "published",      "stripe_publishable_key": null,      "terms_conditions_url": null,      "third_party_pricing": {        "has_third_party_pricing": false,        "third_party_pricing_url": null      },      "updated_at": "2014-01-21T00:32:03Z",      "version": "1.0",      "visibility": "private"    }  ]}

List Owned Apps

  • GET /api/v2/apps/owned

Lists apps owned by the current account.

Allowed For

  • Admins

Sideloads

The categories and parameters objects are automatically side-loaded with each app object. However, you can exclude them from the response. Example:

curl https://{subdomain}.zendesk.com/api/v2/apps/owned.json?exclude=parameters \ -u {email_address}:{password}

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/owned.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/owned"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/owned")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/owned',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/owned"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/owned")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "apps": [    {      "author_email": "[email protected]",      "author_name": "Zendesk User",      "author_url": "http://www.example.com",      "categories": [],      "closed_preview": false,      "created_at": "2012-05-14T22:28:18Z",      "default_locale": "en",      "deprecated": false,      "feature_color": null,      "featured": false,      "framework_version": "1.0",      "google_analytics_code": null,      "id": 12345,      "installable": true,      "installation_instructions": "",      "large_icon": "/api/v2/apps/12345/assets/logo.png",      "long_description": "",      "marketing_only": false,      "name": "Bookmarks",      "obsolete": false,      "owner_id": 1,      "paid": false,      "parameters": [        {          "app_id": 12345,          "created_at": "2012-06-14T17:31:08Z",          "default_value": null,          "id": 21,          "kind": "text",          "name": "name",          "position": 0,          "required": true,          "secure": true,          "updated_at": "2012-06-14T17:31:08Z"        }      ],      "products": [        "support",        "chat",        "sell"      ],      "promoted": false,      "raw_installation_instructions": null,      "raw_long_description": null,      "remote_installation_url": null,      "screenshots": [],      "short_description": null,      "single_install": true,      "small_icon": "/api/v2/apps/12345/assets/logo-small.png",      "state": "published",      "terms_conditions_url": null,      "updated_at": "2014-01-21T00:32:03Z",      "version": "1.0",      "visibility": "private"    }  ]}

Get Information About App

  • GET /api/v2/apps/{app_id}

Retrieves information about the specified app accessible to the current user and account.

Allowed For

  • Everyone

Parameters

NameTypeInRequiredDescription
app_idintegerPathtrueThe ID of the app to be retrieved

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/{app_id}.json \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/1"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/1")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "author_email": "[email protected]",  "author_name": "Zendesk User",  "author_url": "http://www.example.com",  "categories": [],  "closed_preview": false,  "created_at": "2012-05-14T22:28:18Z",  "default_locale": "en",  "deprecated": false,  "feature_color": null,  "featured": false,  "framework_version": "2.0",  "google_analytics_code": null,  "id": 12345,  "installable": true,  "installation_instructions": "",  "large_icon": "/api/v2/apps/12345/assets/logo.png",  "long_description": "",  "marketing_only": false,  "name": "Bookmarks",  "obsolete": false,  "owner_id": 1,  "paid": false,  "parameters": [    {      "app_id": 12345,      "created_at": "2012-06-14T17:31:08Z",      "default_value": null,      "id": 21,      "kind": "text",      "name": "name",      "position": 0,      "required": true,      "secure": true,      "updated_at": "2012-06-14T17:31:08Z"    }  ],  "products": [    "support",    "chat",    "sell"  ],  "promoted": false,  "raw_installation_instructions": null,  "raw_long_description": null,  "remote_installation_url": null,  "screenshots": [],  "short_description": null,  "single_install": true,  "small_icon": "/api/v2/apps/12345/assets/logo-small.png",  "state": "published",  "terms_conditions_url": null,  "updated_at": "2014-01-21T00:32:03Z",  "version": "1.0",  "visibility": "private"}

Get App Public Key

  • GET /api/v2/apps/{app_id}/public_key

Reveals the app's public key in PEM format.

You can use it to verify that certain requests from the app are legitimate.

Allowed For

  • Agents

Parameters

NameTypeInRequiredDescription
app_idintegerPathtrueThe ID of the app

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/{app_id}/public_key.pem \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/1/public_key"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/1/public_key")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/1/public_key',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/1/public_key"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/1/public_key")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Z6U0KVY2HstBHKDiNIx\nFoxzkhhMjvyB3LiBWLqre+H1rHiqZl3Q3oQ1+61qNyBBulu+6hr1GkkIVVEHBnfe\n9OO+u2F9UAMi6JMl2L7QaaTxa+fR8ADNRNmg+5vsdKq/+nNTf2EA2ynwpwt/F5yp\nmKg6n8jhy0eqsea4qKpYLLEE6AguR04KXgQymb0Mg0PQsNowpFCoLTg3IXZGCIVE\nztOfgYaYPOVwGr3pN71L4cW5euyKPl36tpp42iHyuJ3mP3q2d7GPfLwUoLNsDZYQ\nZ8vcOkvkA7N0tZUDqIzofKGwsjk/++LYBFL04Qbj3avRHcouo70q13Lb+k4rm20u\nlwIDAQAB\n-----END PUBLIC KEY-----\n"

Create App

  • POST /api/v2/apps

Adds a build of a new app to the job queue.

You must provide an upload_id in the post payload to this endpoint in order to specify the uploaded app package to use for the build. See Upload App Package.

The response contains a job_id to check the status of the build. See Get Job Status.

Allowed For

  • Admins

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps.json \  -d '{"name":"My App", "short_description":"My App description", "upload_id":"123"}' \  -H "Content-Type: application/json" -X POST \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps"	method := "POST"	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 "username:password"
	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://support.zendesk.com/api/v2/apps")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("POST", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'POST',  url: 'https://support.zendesk.com/api/v2/apps',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps"headers = {	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps")request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "job_id": "fa8cac3098330130f49c14109fd02dfb"}

Update App

  • PUT /api/v2/apps/{app_id}

Adds a build of an existing app to the job queue.

You must provide the id of the app you want to update. Use the List Owned Apps endpoint to get the id.

You must also provide an upload_id to specify the uploaded app package to use for the build. See Upload App Package.

The response contains a job_id to check the status of the build. See Get Job Status.

Allowed For

  • Admins

Parameters

NameTypeInRequiredDescription
app_idintegerPathtrueThe ID of the app to be updated

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/{app_id}.json \  -d '{"name":"My App", "short_description":"My App description", "upload_id":"123"}' \  -H "Content-Type: application/json" -X PUT \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/1"	method := "PUT"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/1")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("PUT", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'PUT',  url: 'https://support.zendesk.com/api/v2/apps/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"PUT",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/1")request = Net::HTTP::Put.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "job_id": "fa8cac3098330130f49c14109fd02dfb"}

Delete App

  • DELETE /api/v2/apps/{app_id}

Deletes the specified app and removes it from the My Apps page in Zendesk Support.

Allowed For

  • Admins

Parameters

NameTypeInRequiredDescription
app_idintegerPathtrueThe ID of the app to be deleted

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/{app_id}.json \  -u {email_address}:{password} -X DELETE
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/1"	method := "DELETE"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("DELETE", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'DELETE',  url: 'https://support.zendesk.com/api/v2/apps/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"DELETE",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/1")request = Net::HTTP::Delete.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

204 No Content
// Status 204 No Content
null

Get job status

  • GET /api/v2/apps/job_statuses/{job_status_id}

Gets the application build job status. You must provide the job id returned when the job was created.

When the job status is 'completed', the app has been built successfully. You can proceed to install the app using the app id in the response. See Install App.

If the status is 'failed', check the message for the reason.

If you're constantly getting the same error message and the error message isn't clear, try creating the app through the Zendesk Support user interface before contacting support. See Uploading and installing your private app in Zendesk Support.

For more information pertaining to Job Status objects, please see Job Statuses.

Allowed For

  • Admins

JSON Format

App creation job statuses have the following attributes:

NameTypeRead-onlyMandatoryComment
idstringyesnoAutomatically assigned when the job is queued
urlstringyesnoThe URL to poll for status updates
app_idintegeryesnoThe ID of the app created by this job, if it exists
totalintegeryesnoThe total number of tasks this job is batching through
progressintegeryesnoNumber of tasks completed
statusstringyesnoOne of "queued", "working", "failed", "completed", "killed"
messagestringyesnoMessage from the job worker, if any
retry_inintegeryesnoNumber of seconds after which you may re-check status

Parameters

NameTypeInRequiredDescription
job_status_idintegerPathtrueThe ID of the job

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/job_statuses/{job_status_id}.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/job_statuses/1"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/job_statuses/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/job_statuses/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/job_statuses/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/job_statuses/1")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "app_id": 123,  "app_url": "https://{subdomain}.zendesk.com/api/v2/apps/123.json",  "id": "fa8cac3098330130f49c14109fd02dfb",  "message": "Completed at 2013-05-06 15:02:40 +1000",  "progress": 126,  "retry_in": 3,  "status": "completed",  "total": 126,  "url": "https://{subdomain}.zendesk.com/api/v2/apps/job_statuses/fa8cac3098330130f49c14109fd02dfb.json"}
404 Not Found
// Status 404 Not Found
{  "id": "fa8cac3098330130f49c14109fd02dfb",  "message": "Cannot unzip the package",  "progress": null,  "retry_in": 3,  "status": "failed",  "total": null,  "url": "https://{subdomain}.zendesk.com/api/v2/apps/job_statuses/fa8cac3098330130f49c14109fd02dfb.json"}

Upload App Package

  • POST /api/v2/apps/uploads

Uploads a new app package to Zendesk Support. See Packaging and installing a private Zendesk app.

Use the returned upload id to create or update the app in the Zendesk Support instance.

Allowed For

  • Admins

Example Response

Status: 200
{  "id": 123}

Code Samples

curl

If you run the curl command in the app root folder where you packaged the app, the file path for the uploaded_data attribute should look as follows: uploaded_data=@tmp/app-20170210150930.zip.

curl https://{subdomain}.zendesk.com/api/v2/apps/uploads.json \  -F uploaded_data=@/path/to/app_zip_file -X POST \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/uploads"	method := "POST"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/uploads")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("POST", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'POST',  url: 'https://support.zendesk.com/api/v2/apps/uploads',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/uploads"headers = {	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/uploads")request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "id": 123}

Send Notification to App

  • POST /api/v2/apps/notify

Sends messages to currently open instances of a Zendesk Apps framework (ZAF) app. The messages cause an event to fire in the app. For example, you could use this API in conjunction with a custom ZAF app to send critical product information to all signed-in agents. For information on how to set up custom event handlers, see Notification events in the ZAF docs.

ZAT and ZCLI local servers

When developing Zendesk apps using the ZAT local web server, you can send messages to your unpublished app by setting the app_id parameter to 0.

The ZCLI local web server can't receive messages from this endpoint. As a workaround, you can use ZCLI to install the app as a private app instead. See Packaging and installing a private Zendesk app.

Limitations

This API is rate limited. 100 requests per minute are allowed per account. For more information, see Rate limits.

The maximum payload for a Notify API request is 1MB (1024kB).

Allowed For

  • Agents

JSON format

Notifications sent to apps are represented as JSON objects with the following properties:

NameTypeMandatoryComment
app_idintegeryesThe id of the app you want to send the message to
eventstringyesThe name of the event you want to fire in your app
bodystringnoIf it's valid JSON, it's passed to your app as a JavaScript object.
agent_idintegernoSend the notification to only one agent

For example, to send a user's updated phone number to agent #534 using the app with an id of 375, the request body might look something like this:

{  "app_id": 375,  "event": "updateUsersPhoneNumber",  "body": "+61455534512",  "agent_id": 534}

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/notify.json \  -d '{"event": "updateUsersPhoneNumber", "app_id": 375, "agent_id": 534, "body": "+61455534512"}' \  -H "Content-Type: application/json" -X POST \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/notify"	method := "POST"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/notify")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("POST", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'POST',  url: 'https://support.zendesk.com/api/v2/apps/notify',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/notify"headers = {	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/notify")request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
null
413 Request Entity Too Large
// Status 413 Request Entity Too Large
"Payload too large"

Install App

  • POST /api/v2/apps/installations

Installs an app in the account.

You must provide the app_id and a settings object containing properties for all required parameters for the app. You can use the List All Apps endpoint to get the id of the app you want to install.

Allowed For

  • Admins

JSON format

App installations are represented as JSON objects with the following properties:

NameTypeRead-onlyMandatoryDescription
app_idintegerfalsetrueid of the app
collapsiblebooleantruefalseIf true, the app can be minimized in the Zendesk user interface (UI)
created_atstringtruefalseWhen the app installation was created
enabledbooleanfalsefalseIf true, the app installation is enabled
group_restrictionsarray of stringsfalsefalseGroup restrictions for the app installation
has_incomplete_subscriptionbooleantruefalseIf true, the app installation's Stripe payment subscription is incomplete
has_unpaid_subscriptionbooleantruefalseIf true, the app installation's Stripe payment subscription is unpaid
idintegertruefalseid of the app installation
paidbooleantruefalseIf true, the app is a paid app
pending_installationbooleantruefalseIf true, the app installation is pending
pending_job_idstringtruefalseid for the app installation job. See app requirements
plan_informationobjecttruefalseInformation about the Stripe payment plan for the app installation
productstringtruefalseZendesk product the app is installed on
recurring_paymentbooleanfalsefalseIf true, the app installation has a recurring Stripe payment subscription
redirect_pathbooleantruefalseURL path used to redirect admins after installing the app in the Zendesk UI
role_restrictionsarray of stringsfalsefalseRole restrictions for the app installation
servablebooleantruefalseIf true, user making the API request can use the app installation
settingsobjectfalsetrueInstallation settings for the app, formatted as a flat object
settings_objectsarray of objectsfalsefalseInstallation settings for the app, formatted as an array of objects
stripe_accountstringtruefalseApp developer's Stripe account id
stripe_publishable_keystringtruefalsePublishable key for the app developer's Stripe account
stripe_subscription_idstringtruefalseStripe subscription id for the app installation
updatedstringtruefalseWhen the app was last updated
updated_atstringtruefalseWhen the app installation was last updated

Installation settings

All apps support the "name" installation setting. App developers can define other installation settings using the app's manifest file. For more information about defining installation settings, see Defining installation settings.

You specify installation setting values using the settings or settings_objects properties. settings formats the settings as a flat object. settings_objects formats the settings as an array of objects.

You must specify at least one installation setting value in settings. If you specify a setting value in both settings and settings_objects, only the value in settings is used.

App requirements

If the app has requirements, the API response includes a job ID you can use to poll the installation status. See Get Requirements Install Status. Example:

{  "id":     16,  "app_id": 82,  "settings": {    "title": "100 requirements API app"  },  "enabled":              false,  "updated":              "20141209034341",  "pending_installation": true,  "pending_job_id":       "648c47b0618d01326d443c15c2bba27e"}

Disabling apps on installation

By default, apps are enabled upon installation. To install an app and immediately disable it, pass "enabled": false in the install request.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations.json \  -d '{"app_id": "225", "settings": {"name": "Helpful App", "api_token": "53xjt93n6tn4321p", "use_ssl": true}}' \  -H "Content-Type: application/json" -X POST \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations"	method := "POST"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("POST", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'POST',  url: 'https://support.zendesk.com/api/v2/apps/installations',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations"headers = {	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations")request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "app_id": 218618,  "collapsible": true,  "created_at": "2020-06-11T06:12:48Z",  "enabled": true,  "group_restrictions": [],  "has_incomplete_subscription": false,  "has_unpaid_subscription": null,  "id": 361234573552,  "paid": null,  "pending_installation": true,  "pending_job_id": "587986abda901cde3873697585091dab",  "plan_information": {    "name": null  },  "product": "support",  "recurring_payment": false,  "redirect_path": "/support/apps/manage",  "role_restrictions": null,  "servable": true,  "settings": {    "allowlist": null,    "attachment_tag": "has_attachment",    "blocklist": null,    "items_per_page": "6",    "name": "Attachment Manager",    "new_attachment_tag": "has_new_attachment",    "title": "Attachment Manager"  },  "settings_objects": [    {      "name": "attachment_tag",      "value": "has_attachment"    },    {      "name": "blocklist",      "value": null    },    {      "name": "items_per_page",      "value": "6"    },    {      "name": "name",      "value": "Attachment Manager"    },    {      "name": "new_attachment_tag",      "value": "has_new_attachment"    },    {      "name": "title",      "value": "Attachment Manager"    },    {      "name": "allowlist",      "value": null    }  ],  "stripe_account": "acct_1CyabcGO5FKrIYc5",  "stripe_publishable_key": "pk_live_zMw5abcdYBbd6axDbyrzrRl9",  "stripe_subscription_id": null,  "updated": "20200305221223",  "updated_at": "2020-06-11T06:12:48Z"}

List App Installations

  • GET /api/v2/apps/installations

Lists all app installations in the account. In the response, the enabled property indicates whether or not the installed app is active in the product.

Allowed For

  • Agents

Sideloads

You can pass include=app as a parameter to side-load the app object associated with each installation.

curl https://{subdomain}.zendesk.com/api/v2/apps/installations.json?include=app \  -u {email_address}:{password}

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/installations',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "installations": [    {      "app_id": 218618,      "collapsible": true,      "created_at": "2020-06-11T06:12:48Z",      "enabled": true,      "group_restrictions": [],      "has_incomplete_subscription": false,      "has_unpaid_subscription": null,      "id": 361234573552,      "paid": null,      "pending_installation": true,      "pending_job_id": "587986abda901cde3873697585091dab",      "plan_information": {        "name": null      },      "product": "support",      "recurring_payment": false,      "redirect_path": "/support/apps/manage",      "role_restrictions": null,      "servable": true,      "settings": {        "allowlist": null,        "attachment_tag": "has_attachment",        "blocklist": null,        "items_per_page": "6",        "name": "Attachment Manager",        "new_attachment_tag": "has_new_attachment",        "title": "Attachment Manager"      },      "settings_objects": [        {          "name": "attachment_tag",          "value": "has_attachment"        },        {          "name": "blocklist",          "value": null        },        {          "name": "items_per_page",          "value": "6"        },        {          "name": "name",          "value": "Attachment Manager"        },        {          "name": "new_attachment_tag",          "value": "has_new_attachment"        },        {          "name": "title",          "value": "Attachment Manager"        },        {          "name": "allowlist",          "value": null        }      ],      "stripe_account": "acct_1CyabcGO5FKrIYc5",      "stripe_publishable_key": "pk_live_zMw5abcdYBbd6axDbyrzrRl9",      "stripe_subscription_id": null,      "updated": "20200305221223",      "updated_at": "2020-06-11T06:12:48Z"    }  ]}

Show App Installation

  • GET /api/v2/apps/installations/{app_installation_id}

Retrieves information about the specified app installation, including the installation settings.

The value of the servable property depends on the user making the API request. The value is true for installations that you can use.

Allowed For

  • Agents

Parameters

NameTypeInRequiredDescription
app_installation_idintegerPathtrueThe ID of the app installation

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations/{app_installation_id}.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations/1"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/installations/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations/1")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "app_id": 218618,  "collapsible": true,  "created_at": "2020-06-11T06:12:48Z",  "enabled": true,  "group_restrictions": [],  "has_incomplete_subscription": false,  "has_unpaid_subscription": null,  "id": 361234573552,  "paid": null,  "pending_installation": true,  "pending_job_id": "587986abda901cde3873697585091dab",  "plan_information": {    "name": null  },  "product": "support",  "recurring_payment": false,  "redirect_path": "/support/apps/manage",  "role_restrictions": null,  "servable": true,  "settings": {    "allowlist": null,    "attachment_tag": "has_attachment",    "blocklist": null,    "items_per_page": "6",    "name": "Attachment Manager",    "new_attachment_tag": "has_new_attachment",    "title": "Attachment Manager"  },  "settings_objects": [    {      "name": "attachment_tag",      "value": "has_attachment"    },    {      "name": "blocklist",      "value": null    },    {      "name": "items_per_page",      "value": "6"    },    {      "name": "name",      "value": "Attachment Manager"    },    {      "name": "new_attachment_tag",      "value": "has_new_attachment"    },    {      "name": "title",      "value": "Attachment Manager"    },    {      "name": "allowlist",      "value": null    }  ],  "stripe_account": "acct_1CyabcGO5FKrIYc5",  "stripe_publishable_key": "pk_live_zMw5abcdYBbd6axDbyrzrRl9",  "stripe_subscription_id": null,  "updated": "20200305221223",  "updated_at": "2020-06-11T06:12:48Z"}

Update App Installation

  • PUT /api/v2/apps/installations/{app_installation_id}

Updates the specified installation. Use the List App Installations endpoint to get the installation id.

Allowed For

  • Admins

Parameters

NameTypeInRequiredDescription
app_installation_idintegerPathtrueThe ID of the app installation

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations/{app_installation_id}.json \  -d '{"settings": {"name": "Helpful App - Updated", "api_token": "659323ngt4ut9an"}}' \  -H "Content-Type: application/json" -X PUT \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations/1"	method := "PUT"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations/1")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""""");
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("PUT", body)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'PUT',  url: 'https://support.zendesk.com/api/v2/apps/installations/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"PUT",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations/1")request = Net::HTTP::Put.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "app_id": 218618,  "collapsible": true,  "created_at": "2020-06-11T06:12:48Z",  "enabled": true,  "group_restrictions": [],  "has_incomplete_subscription": false,  "has_unpaid_subscription": null,  "id": 361234573552,  "paid": null,  "pending_installation": true,  "pending_job_id": "587986abda901cde3873697585091dab",  "plan_information": {    "name": null  },  "product": "support",  "recurring_payment": false,  "redirect_path": "/support/apps/manage",  "role_restrictions": null,  "servable": true,  "settings": {    "allowlist": null,    "attachment_tag": "has_attachment",    "blocklist": null,    "items_per_page": "6",    "name": "Attachment Manager",    "new_attachment_tag": "has_new_attachment",    "title": "Attachment Manager"  },  "settings_objects": [    {      "name": "attachment_tag",      "value": "has_attachment"    },    {      "name": "blocklist",      "value": null    },    {      "name": "items_per_page",      "value": "6"    },    {      "name": "name",      "value": "Attachment Manager"    },    {      "name": "new_attachment_tag",      "value": "has_new_attachment"    },    {      "name": "title",      "value": "Attachment Manager"    },    {      "name": "allowlist",      "value": null    }  ],  "stripe_account": "acct_1CyabcGO5FKrIYc5",  "stripe_publishable_key": "pk_live_zMw5abcdYBbd6axDbyrzrRl9",  "stripe_subscription_id": null,  "updated": "20200305221223",  "updated_at": "2020-06-11T06:12:48Z"}

Remove App Installation

  • DELETE /api/v2/apps/installations/{app_installation_id}

Removes an installed app. Use the List App Installations endpoint to get the installation id.

Allowed For

  • Admins

Parameters

NameTypeInRequiredDescription
app_installation_idintegerPathtrueThe ID of the app installation

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations/{app_installation_id}.json \  -u {email_address}:{password} -X DELETE
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations/1"	method := "DELETE"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("DELETE", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'DELETE',  url: 'https://support.zendesk.com/api/v2/apps/installations/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"DELETE",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations/1")request = Net::HTTP::Delete.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|	http.request(request)end

Example response(s)

204 No Content
// Status 204 No Content
null

List Requirements

  • GET /api/v2/apps/installations/{app_installation_id}/requirements

Lists all app requirements for an installation.

Allowed For

  • Agents

Parameters

NameTypeInRequiredDescription
app_installation_idintegerPathtrueThe ID of the app installation

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations/{id}/requirements.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations/1/requirements"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations/1/requirements")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/installations/1/requirements',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations/1/requirements"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations/1/requirements")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "requirements": [    {      "account_id": 2,      "created_at": "2014-03-26T00:57:43Z",      "identifier": "a_basecamp_target",      "requirement_id": 302,      "requirement_type": "targets",      "updated_at": "2014-03-26T00:57:43Z"    },    {      "account_id": 2,      "created_at": "2014-03-26T00:57:43Z",      "identifier": "an_email_target",      "requirement_id": 307,      "requirement_type": "targets",      "updated_at": "2014-03-26T00:57:43Z"    },    {      "account_id": 2,      "created_at": "2014-03-26T00:57:43Z",      "identifier": "sample_ticket_field",      "requirement_id": 137,      "requirement_type": "ticket_fields",      "updated_at": "2014-03-26T00:57:43Z"    }  ]}

Get Requirements Install Status

  • GET /api/v2/apps/installations/job_statuses/{job_id}

If a job has kicked off to install an app and the app has requirements, this endpoint returns the status of the requirements installation. The job id is supplied in the response to the app installation request.

If the status is "completed", the installation has been created successfully with its requirements, and is available for use.

If the status is "failed" check the message for the reason.

If you're constantly getting the same error message and the error message isn't clear, try installing the app with the Zendesk Support user interface before contacting Zendesk Customer Support. See Uploading and installing your private app in Zendesk Support.

Allowed For

  • Admins

JSON Format

Installation job statuses are represented as JSON objects with the following properties:

NameTypeRead-onlyMandatoryComment
idstringyesnoAutomatically assigned when job is queued
urlstringyesnoThe URL to poll for status updates
totalintegeryesnoThe total number of tasks this job is batching through
progressintegeryesnoNumber of completed tasks
statusstringyesno"queued", "working", "failed", "completed", "killed"
messagestringyesnoMessage from the job worker, if any
installation_idintegeryesnoUnique ID of the installation

Parameters

NameTypeInRequiredDescription
job_idintegerPathtrueThe ID of the job

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/apps/installations/job_statuses/{job_id}.json \  -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/v2/apps/installations/job_statuses/1"	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 "username:password"
	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://support.zendesk.com/api/v2/apps/installations/job_statuses/1")		.newBuilder();
Request request = new Request.Builder()		.url(urlBuilder.build())		.method("GET", null)		.addHeader("Content-Type", "application/json")		.addHeader("Authorization", Credentials.basic("your-email", "your-password"))		.build();Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {  method: 'GET',  url: 'https://support.zendesk.com/api/v2/apps/installations/job_statuses/1',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requests
url = "https://support.zendesk.com/api/v2/apps/installations/job_statuses/1"headers = {	"Content-Type": "application/json",}
response = requests.request(	"GET",	url,	auth=('<username>', '<password>'),	headers=headers)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/v2/apps/installations/job_statuses/1")request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")request.basic_auth "username", "password"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
{  "id": "fa8cac3098",  "installation_id": 16,  "message": "Completed at 2013-05-06 15:02:40 +1000",  "progress": 100,  "status": "completed",  "total": 100,  "url": "https://{subdomain}.zendesk.com/api/v2/apps/installations/job_statuses/fa8cac3098.json"}