Specifying app requirements
An app may depend on one or more Zendesk resources, such as ticket fields or targets, to work properly. When you create an app, you can declare these resources as requirements. When an admin installs the app, Zendesk creates the app's required resources in the admin's account. App requirements only work with Support and Sell apps.
Declaring app requirements
You declare requirements in a requirements.json file in the app's root directory.
To declare app requirements
-
In the app's root directory, create a file named requirements.json.
-
In your text editor, open requirements.json. In the file, create a root-level JSON object.
Each property in the object represents a resource type. You can declare resources of that type using a custom property key and a related resource schema. For supported properties and resource schemas, see Supported resource types.
For example, the following requirements.json file declares a target, a webhook, and two ticket fields as requirements. Each resource has a custom property key, such as
an_email_target
ornumber_of_issues
.{
"targets": {
"an_email_target": {
"title": "An example email target",
"type": "email_target",
"email": "[email protected]",
"subject": "Hello, from this target!"
}
},
"webhooks": {
"an_example_webhook": {
"authentication": {
"add_position": "header",
"data": {
"password": "hello_123",
"username": "john_smith"
},
"type": "basic_auth"
},
"endpoint": "https://example.com/status/200",
"http_method": "GET",
"name": "An example webhook",
"request_format": "json",
"status": "active",
"subscriptions": ["conditional_ticket_events"],
"signing_secret": {
"algorithm": "SHA256",
"secret": "abcdefghijklmnopqrstuvwxyz"
}
}
},
"ticket_fields": {
"support_description": {
"type": "text",
"title": "Support description"
},
"number_of_issues": {
"type": "integer",
"title": "Number of issues"
}
}
}
Supported resource types
requirements.json supports the following top-level properties and resource schemas.
Resource type property | Resource schema |
---|---|
automations | POST payload for the automations API endpoint |
channel_integrations | See Channel installer app |
custom_objects | See Custom object app requirements |
macros | POST payload for the macros API endpoint |
organization_fields | POST payload for the organization_fields API endpoint |
targets | POST payload for the targets API endpoint |
ticket_fields | POST payload for the ticket_fields API endpoint |
triggers | POST payload for the triggers API endpoint |
user_fields | POST payload for the user_fields API endpoint |
view | POST payload for the views API endpoint |
webhooks | POST payload for the webhooks API endpoint |
Legacy custom object app requirements
You can use the custom_objects
property to declare legacy custom object
types
and legacy custom object relationship
types
as requirements. The property supports two related child properties:
custom_object_types
and custom_object_relationship_types
.
Legacy custom object type requirements
To declare legacy custom object types, use the custom_object_types
property.
The property accepts an array of JSON objects. These objects use the
same structure as the legacy custom object
type
resource but omit the data
key. You can require up to 50 legacy custom object types
per app.
Example:
{
"custom_objects": {
"custom_object_types": [
{
"key": "app_event_logs",
"schema": {
"properties": {
"location": {
"type": "string",
"description": "Location"
},
"event": {
"type": "string",
"description": "Event"
}
},
"required": ["location", "event"]
}
}
]
}
}
Legacy custom object relationship type requirements
To declare legacy custom object relationship types, use the
custom_object_relationship_types
property. The property accepts an
array of JSON objects. These objects use the same structure as the
legacy relationship
type
resource but omit the data
key.
Example:
{
"custom_objects": {
"custom_object_relationship_types": [
{
"key": "ticket_has_many_app_event_logs",
"source": "zen:ticket",
"target": ["app_event_logs"]
}
],
"custom_object_types": [
{
"key": "app_event_logs",
"schema": {
"properties": {
"location": {
"type": "string",
"description": "Location"
},
"event": {
"type": "string",
"description": "Event"
}
},
"required": ["location", "event"]
}
}
]
}
}
Avoiding conflicts
When assigning custom property keys to resources in requirements.json, ensure you use a unique namespace. If an app's requirements conflict with existing resources on an account, the app will fail to install.
For example, an app requires a ticket field with a title of "Description" in requirements.json. If an account already has a ticket field with a title of "Description", attempts to install the app on the account will fail.
Passing installation setting values in app requirements
You can use the {{setting.SETTING_NAME}}
syntax to pass an installation
setting
value in requirements.json. In most cases, an admin specifies this setting
value during app installation.
For example, the following manifest.json file creates an installation
setting named email_to_notify
. To install the app, an admin must specify a
value for this setting.
{
...
"parameters": [
{
"name": "email_to_notify",
"type": "text",
"required": true
},
...
]
}
The following requirements.json file declares a required email target. The
target uses the value of the email_to_notify
setting in one of its properties.
{
"targets": {
"an_email_target": {
"title": "Send notification email",
"type": "email_target",
"email": "{{setting.email_to_notify}}",
"subject": "Hey, something's happened!"
}
}
}
Dependent app requirements
Some required resources, such as triggers or views, may depend on other resources in requirements.json. In these cases, use the resource's property key wherever the equivalent API payload would use the resource's id.
For example, the following requirements.json file declares an email target and a trigger. The trigger references the email target's property key.
{
"targets": {
"an_email_target": {
"title": "A sample email Target",
"type": "email_target",
"email": "[email protected]",
"subject": "Hello, from this target!"
}
},
"triggers": {
"email_on_ticket_solved": {
"title": "Email on ticket solved Trigger",
"all": [
{
"field": "status",
"operator": "is",
"value": "solved"
}
],
"actions": [
{
"field": "notification_target",
"value": ["an_email_target", "Ticket {{ticket.id}} has been updated."]
}
]
}
}
}
Creating a requirements-only app
A requirements-only app is an app that only creates required resources in an account. The app doesn't do anything else. You can only install a requirements-only app as a Support app.
To create a requirements-only app
-
Create the starter files for a new app. See Creating starter files for a Zendesk app.
-
In your text editor, open the app's manifest.json file and make the following changes:
- Add the
"requirementsOnly": true
property. - Add the
"singleInstall": true
property. An account can only have one active installation of a requirements-only app at a time - Delete the
location
property - Delete the
frameworkVersion
property. Requirements-only apps don't specify a framework version.
Example:
{
"name": "Example app",
"author": {
"name": "John Doe",
"email": "[email protected]"
},
"defaultLocale": "en",
"private": false,
"version": "1.0",
"requirementsOnly": true,
"singleInstall": true
}
- Add the
-
In the app's root directory, create a requirements.json file. In the file, specify the resources to create. For details, see Declaring app requirements.
Updating or deleting requirements
You can change an app's requirements.json file to update or delete certain types of resources created by the app.
Resource type | Updatable | Deletable |
---|---|---|
automations | Yes | Yes |
channel integrations | No | No |
custom object types | Yes | Yes |
custom object relationship types | No | Yes |
macros | Yes | Yes |
organization fields | No | No |
targets | Yes | Yes |
ticket fields | No | No |
triggers | Yes | Yes |
user fields | No | No |
views | Yes | Yes |
webhooks | Yes | Yes |
To update requirements for a private app, upload the new version of the app to your account. This new version should contain your updated requirements.json file. To update a private app using ZCLI, see Updating a private Zendesk app.
To update requirements for a public app, first test your changes to ensure they won't negatively affect your app users. To do this, we recommend testing the app as a private app in a test account. If your changes work as expected, resubmit the public app for approval.
Once an app is updated, its requirement changes can't be reverted. It may take up to five minutes for an app to update.
The following requirements.json examples update required user field resources.
From
{
"user_fields": {
"user_city": {
"type": "text",
"title": "City"
}
}
}
To
{
"user_fields": {
"user_city": {
"type": "text",
"title": "City"
},
"user_address": {
"type": "text",
"title": "Address"
}
}
}
Accessing requirements from an app
You can use the Zendesk Apps framework (ZAF) client's
get() method to
access app requirements in a Support or Sell app. To access a requirement, call
client.get('requirement:IDENTIFIER')
. Replace IDENTIFIER
with the property
key for the resource in requirements.json.
Example:
const client = ZAFClient.init();
client.get("requirement:number_of_issues").then((data) => {
console.log(data);
});
For more information, see the requirement object in the ZAF Core API documentation.
Uninstalling or disabling the app
If an admin disables an app, Zendesk disables any resources in the app's requirements.json file, excluding:
- Channel integrations
- Custom object types
- Custom object relationship types
If an admin uninstalls an app, Zendesk deletes any resources listed in the app's
requirements.json
file. If the resource is a custom field, Zendesk deletes the field itself and all data for the field. However, the data still remains available in ticket
audits.
Limitations
- The ZCLI server can't create resources from requirements.json. Similarly, you can't access the requirement object using the ZCLI server.
- An app can't require more than 5,000 resources in requirements.json. An app can't require more than 50 custom object types.
- Chat apps don't support app requirements.