Apps
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:
Name | Type | Read-only | Mandatory | Description |
---|---|---|---|---|
app_organization | object | true | false | Organization that submitted the app to the Zendesk Marketplace |
author_email | string | true | false | The app author's email |
author_name | string | true | false | The app author's name |
author_url | string | true | false | The app author's URL |
categories | array | true | false | Zendesk Marketplace categories to which the app belongs |
collections | array | true | false | Zendesk Marketplace collections to which the app belongs |
created_at | string | true | false | When the app was created |
date_published | string | true | false | When the app was published on the Zendesk Marketplace |
default_locale | string | true | false | The default locale for translations for the app |
deprecated | boolean | true | false | If true, the app is deprecated |
feature_color | string | true | false | Hexadecimal color value used to feature the app on the Zendesk Marketplace |
featured | boolean | true | false | Whether or not the app is featured in the Zendesk Marketplace |
framework_version | string | true | false | The app framework version for which the app was written |
google_analytics_code | string | true | false | Universal Google Analytics ("UA-") tracking id for the app's detail page on the Zendesk Marketplace |
id | integer | true | false | The id of the app |
installable | boolean | true | false | Whether or not the app can be installed |
installation_count | integer | true | false | Current number of installations of the app |
installation_instructions | string | true | false | Instructions for installing the app |
large_icon | string | true | false | The large icon url for an app |
locations | array | true | false | Location ids for the app. To map these ids to app locations, see the App Locations endpoint |
long_description | string | true | false | The app's long description in the Zendesk Marketplace |
marketing_only | boolean | true | false | If true, the app is an integration app |
name | string | true | false | The name of the app |
obsolete | boolean | true | false | If true, the app is obsolete |
owner_id | integer | true | false | The app developer id corresponding to the app |
paid | boolean | true | false | If true, the app is a paid app |
parameters | array | true | false | The parameters for the app |
plans | array | true | false | Payment plans for the app |
products | array | true | false | Zendesk products supported by the app |
promoted | boolean | true | false | Whether or not the app is a promoted app in the Zendesk Marketplace |
rating | object | true | false | The ratings of the app |
raw_installation_instructions | string | true | false | The raw installation instructions |
raw_long_description | string | true | false | The raw long description for the app in the Zendesk Marketplace |
remote_installation_url | string | true | false | URL for the app's installation instructions |
screenshots | array | true | false | Screenshots for the app when displayed in the Zendesk Marketplace |
short_description | string | true | false | The short description of the app in the Zendesk Marketplace |
single_install | boolean | true | false | Whether or not this app can only be installed once |
small_icon | string | true | false | The url for the small logo for the app |
state | string | true | false | Publication state for the app on the Zendesk Marketplace |
stripe_publishable_key | string | true | false | Publishable key for the app developer's Stripe account |
terms_conditions_url | string | true | false | URL for the app's terms and conditions |
third_party_pricing | object | true | false | Third-party pricing information for the app |
updated_at | string | true | false | When the app was last updated |
version | string | true | false | The version of the app |
visibility | string | true | false | The 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}/token:{api_token}
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 "{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://support.zendesk.com/api/v2/apps")
.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://support.zendesk.com/api/v2/apps',
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 requests
from requests.auth import HTTPBasicAuth
url = "https://support.zendesk.com/api/v2/apps"
headers = {
"Content-Type": "application/json",
}
email_address = 'your_email_address'
api_token = 'your_api_token'
# Use basic authentication
auth = 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://support.zendesk.com/api/v2/apps")
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
{
"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}/token:{api_token}
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/v2/apps/owned.json \
-u {email_address}/token:{api_token}
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 "{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://support.zendesk.com/api/v2/apps/owned")
.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://support.zendesk.com/api/v2/apps/owned',
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 requests
from requests.auth import HTTPBasicAuth
url = "https://support.zendesk.com/api/v2/apps/owned"
headers = {
"Content-Type": "application/json",
}
email_address = 'your_email_address'
api_token = 'your_api_token'
# Use basic authentication
auth = 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://support.zendesk.com/api/v2/apps/owned")
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
{
"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
Name | Type | In | Required | Description |
---|---|---|---|---|
app_id | integer | Path | true | The 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}/token:{api_token}
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 "{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://support.zendesk.com/api/v2/apps/1")
.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://support.zendesk.com/api/v2/apps/1',
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 requests
from requests.auth import HTTPBasicAuth
url = "https://support.zendesk.com/api/v2/apps/1"
headers = {
"Content-Type": "application/json",
}
email_address = 'your_email_address'
api_token = 'your_api_token'
# Use basic authentication
auth = 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://support.zendesk.com/api/v2/apps/1")
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
{
"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
Name | Type | In | Required | Description |
---|---|---|---|---|
app_id | integer | Path | true | The ID of the app |
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/v2/apps/{app_id}/public_key.pem \
-u {email_address}/token:{api_token}
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 "{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://support.zendesk.com/api/v2/apps/1/public_key")
.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://support.zendesk.com/api/v2/apps/1/public_key',
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 requests
from requests.auth import HTTPBasicAuth
url = "https://support.zendesk.com/api/v2/apps/1/public_key"
headers = {
"Content-Type": "application/json",
}
email_address = 'your_email_address'
api_token = 'your_api_token'
# Use basic authentication
auth = 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://support.zendesk.com/api/v2/apps/1/public_key")
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
"-----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}/token:{api_token}
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 "{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://support.zendesk.com/api/v2/apps")
.newBuilder();
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
"""
""");
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("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", basicAuth)
.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 "{email_address}/token:{api_token}"