A bundle is a declaration of a ZIS integration's resources. A bundle can include:

  • One or more flows
  • Zero or more custom action definitions
  • One or more job specs

For more information about bundles, see Understanding Zendesk Integration Services.

JSON format

Bundles are represented as JSON objects with the following properties:

Name Type Read-only Mandatory Description
description string true false The description of the bundle
name string false true The name of the bundle
resources object true true A collection of ZIS resources
zis_template_version string false true The ZIS bundle template version. Allowed value of "2019-10-14".

Upload or Update Bundle

  • POST /api/services/zis/registry/{integration}/bundles

Uploads a new bundle or updates an existing bundle for a ZIS integration.

Authentication

You can authorize requests using basic authentication or an API token.

Allowed for

  • Admins

Deleting a bundle

You can't delete a bundle. To disable an integration, uninstall its job spec. See the Uninstall Job Spec endpoint.

Parameters

Name Type In Required Description
integration string Path true The name of the integration. integration can be up to 64 characters long. It can only include lower-case letters (a-z), numbers, dash (-), and underscore (_) characters

Example body

{  "description": "this is an example bundle",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "zis_template_version": "2019-10-14"}

Code Samples

cURL
curl https://{subdomain}.zendesk.com/api/services/zis/registry/{integration}/bundles \-u {email_address}:{password} \-X POST \-H "Content-Type: application/json" \-d @bundle.json
Go
import (	"fmt"	"io"	"net/http"	"strings")
func main() {	url := "https://support.zendesk.com/api/services/zis/registry/my_integration/bundles"	method := "POST"	payload := strings.NewReader(`{  "description": "this is an example bundle",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "zis_template_version": "2019-10-14"}`)	req, err := http.NewRequest(method, url, payload)
	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/services/zis/registry/my_integration/bundles")		.newBuilder();RequestBody body = RequestBody.create(MediaType.parse("application/json"),		"""{  \"description\": \"this is an example bundle\",  \"name\": \"example bundle\",  \"resources\": {    \"example_flow\": {      \"properties\": {        \"definition\": {          \"StartAt\": \"HelloWorld\",          \"States\": {            \"HelloWorld\": {              \"End\": true,              \"Result\": \"Hello World!\",              \"ResultPath\": \"$.messages\",              \"Type\": \"Pass\"            }          }        },        \"name\": \"my_flow\"      },      \"type\": \"ZIS::Flow\"    },    \"example_job_spec\": {      \"properties\": {        \"event_source\": \"support\",        \"event_type\": \"ticket.TicketCreated\",        \"flow_name\": \"zis:example:flow:my_flow\",        \"name\": \"my_job_Spec\"      },      \"type\": \"ZIS::JobSpec\"    }  },  \"zis_template_version\": \"2019-10-14\"}""");
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 data = JSON.stringify({  "description": "this is an example bundle",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "zis_template_version": "2019-10-14"});
var config = {  method: 'POST',  url: 'https://support.zendesk.com/api/services/zis/registry/my_integration/bundles',  headers: {	'Content-Type': 'application/json',	'Authorization': 'Basic <auth-value>', // Base64 encoded "username:password"  },  data : data,};
axios(config).then(function (response) {  console.log(JSON.stringify(response.data));}).catch(function (error) {  console.log(error);});
Python
import requestsimport json
url = "https://support.zendesk.com/api/services/zis/registry/my_integration/bundles"
payload = json.loads("""{  "description": "this is an example bundle",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "zis_template_version": "2019-10-14"}""")headers = {	"Content-Type": "application/json",}
response = requests.request(	"POST",	url,	auth=('<username>', '<password>'),	headers=headers,	json=payload)
print(response.text)
Ruby
require "net/http"uri = URI("https://support.zendesk.com/api/services/zis/registry/my_integration/bundles")request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")request.body = %q({  "description": "this is an example bundle",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "zis_template_version": "2019-10-14"})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
400 Bad Request
// Status 400 Bad Request
{  "errors": [    {      "code": "1010",      "detail": "error message",      "status": "400"    }  ],  "message": "Unauthorized"}
401 Unauthorized
// Status 401 Unauthorized
{  "errors": [    {      "code": "1001",      "detail": "error message",      "status": "401"    }  ],  "message": "Unauthorized"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "errors": [    {      "code": "1050",      "detail": "error message",      "status": "500"    }  ],  "message": "Server Error"}

Show Bundle by UUID

  • GET /api/services/zis/registry/{integration}/bundles/{uuid}

Returns information about an uploaded bundle.

Parameters

Name Type In Required Description
integration string Path true The name of the integration. integration can be up to 64 characters long. It can only include lower-case letters (a-z), numbers, dash (-), and underscore (_) characters
uuid string Path true The UUID of the bundle

Code Samples

cURL
curl https://{subdomain}.zendesk.com/api/services/zis/registry/{integration}/bundles/{uuid} \-H "Authorization: Bearer {access_token}"
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://support.zendesk.com/api/services/zis/registry/my_integration/bundles/543a30ec-c7af-4385-a516-7d05e446c12c"	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/services/zis/registry/my_integration/bundles/543a30ec-c7af-4385-a516-7d05e446c12c")		.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/services/zis/registry/my_integration/bundles/543a30ec-c7af-4385-a516-7d05e446c12c',  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/services/zis/registry/my_integration/bundles/543a30ec-c7af-4385-a516-7d05e446c12c"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/services/zis/registry/my_integration/bundles/543a30ec-c7af-4385-a516-7d05e446c12c")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
{  "description": "this is an example bundle",  "integration": "my_integration",  "name": "example bundle",  "resources": {    "example_flow": {      "properties": {        "definition": {          "StartAt": "HelloWorld",          "States": {            "HelloWorld": {              "End": true,              "Result": "Hello World!",              "ResultPath": "$.messages",              "Type": "Pass"            }          }        },        "name": "my_flow"      },      "type": "ZIS::Flow"    },    "example_job_spec": {      "properties": {        "event_source": "support",        "event_type": "ticket.TicketCreated",        "flow_name": "zis:example:flow:my_flow",        "name": "my_job_Spec"      },      "type": "ZIS::JobSpec"    }  },  "uuid": "5c722550-4180-4b64-9bcd-f8e38baac15d",  "zis_template_version": "2019-10-14"}
400 Bad Request
// Status 400 Bad Request
{  "errors": [    {      "code": "1010",      "detail": "error message",      "status": "400"    }  ],  "message": "Unauthorized"}
401 Unauthorized
// Status 401 Unauthorized
{  "errors": [    {      "code": "1001",      "detail": "error message",      "status": "401"    }  ],  "message": "Unauthorized"}
500 Internal Server Error
// Status 500 Internal Server Error
{  "errors": [    {      "code": "1050",      "detail": "error message",      "status": "500"    }  ],  "message": "Server Error"}