You can use the Incremental Skill-based Routing API to export data on the creation, update, and deletion of skill types, skills, and instance values. To learn more about the feature, see Using skills-based routing in the Support Help Center.

In this API, skill types are named attributes and skills are named attribute values.

Skill-based routing is only available on the Enterprise plan and above.

JSON Format

The exported items are represented as JSON objects. The format depends on the exported resource, but all have the following additional common attributes:

NameTypeComment
end_timeintegerThe most recent resource creation time present in this result set in Unix epoch time
next_pagestringThe URL that should be called to get the next set of results
countintegerThe number of results returned for the current request

For complete lists of attributes, see the JSON format sections below.

Pagination

The endpoints of the skill-based routing API return a maximum of 3000 records per page.

When the response exceeds the per-page maximum, you can paginate to the next page via the next_page URL in the response body:

{  "instance_values": [ ... ],  "count": 1234,  "end_time": "1535671451"  "next_page": "https://{subdomain}.zendesk.com/api/v2/incremental/routing/instance_values.json?cursor=cccf1b69-acab-11e8-9d65-f1b3d4e2d609"}

Stop paging when the count attribute is 0.

The pagination for skill-based incremental export endpoints works slightly differently from other endpoints. The per_page parameter doesn't apply because of the time-based way these endpoints return records. The limit parameter doesn't apply because of the way a single record can generate multiple events.

Unlike other endpoints, skill-based incremental export endpoints uses cursor-based pagination. The cursor parameter is a non-human-readable argument you can use to move forward or backward in time. The cursor is a read-only URL parameter that's only available in API responses.

JSON Format for Routing Attributes

A routing attribute is a skill type. Routing attributes have the following format:

NameTypeComment
idstringAutomatically assigned when an attribute is created
namestringThe name of the attribute
timedateThe time the attribute was created, updated, or deleted
typestringOne of "create", "update", or "delete"

Example

{  "id":   "7c43bca9-8c7b-11e8-b808-b99aed889f62",  "name": "Languages",  "time": "2018-07-21T07:17:42Z",  "type": "create"}

JSON Format for Routing Attribute Values

A routing attribute value is a skill. Routing attribute values have the following format:

NameTypeComment
idstringAutomatically assigned when an attribute value is created
attribute_idstringId of the associated attribute
namestringThe name of the attribute value
timedateThe time the attribute value was created, updated, or deleted
typestringOne of "create", "update", or "delete"

Example

{  "id": "19ed17fb-7326-11e8-b07e-9de44e7e7f20",  "attribute_id": "7c43bca9-8c7b-11e8-b808-b99aed889f62",  "name": "English",  "time": "2018-06-19T01:33:26Z",  "type": "create"}

JSON Format for Routing Instance Values

Routing instance values have the following format:

NameTypeComment
idstringAutomatically assigned when an instance value is created
attribute_value_idstringId of the associated attribute value
instance_idstringId of the associated agent or ticket
timedateThe time the instance value was created or deleted
typestringOne of "associate_agent", "unassociate_agent", "associate_ticket", or "unassociate_ticket"

Example

{  "id": "62055cad-7326-11e8-b07e-73653560136b",  "attribute_value_id": "19ed17fb-7326-11e8-b07e-9de44e7e7f20",  "instance_id": "10001",  "time": "2018-06-19T01:35:27Z",  "type": "associate_agent"}

Incremental Attributes Export

  • GET /api/v2/incremental/routing/attributes

Returns a stream of changes that occurred on routing attributes.

Allowed For

  • Admins

Parameters

Optional

NameTypeComment
cursorstringThe cursor parameter is a non-human-readable argument you can use to move forward or backward in time. The cursor is a read-only URL parameter that's only available in API responses. See Pagination.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/incremental/routing/attributes.json \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://example.zendesk.com/api/v2/incremental/routing/attributes"	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://example.zendesk.com/api/v2/incremental/routing/attributes")		.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://example.zendesk.com/api/v2/incremental/routing/attributes',  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://example.zendesk.com/api/v2/incremental/routing/attributes"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://example.zendesk.com/api/v2/incremental/routing/attributes")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
{  "attributes": [    {      "id": "15821cba-7326-11e8-b07e-950ba849aa27",      "name": "Languages",      "time": "2018-06-19T01:33:19Z",      "type": "create"    }  ],  "count": 1200,  "end_time": 1533266020,  "next_page": "https://{subdomain}.zendesk.com/api/v2/incremental/routing/attributes.json?cursor=7d724c71-3911-11e8-9621-836b8c683dc6"}

Incremental Attributes Values Export

  • GET /api/v2/incremental/routing/attribute_values

Returns a stream of changes that occurred on routing attribute values.

Allowed For

  • Admins

Parameters

Optional

NameTypeComment
cursorstringThe cursor parameter is a non-human-readable argument you can use to move forward or backward in time. The cursor is a read-only URL parameter that's only available in API responses. See Pagination.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/incremental/routing/attribute_values.json \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://example.zendesk.com/api/v2/incremental/routing/attribute_values"	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://example.zendesk.com/api/v2/incremental/routing/attribute_values")		.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://example.zendesk.com/api/v2/incremental/routing/attribute_values',  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://example.zendesk.com/api/v2/incremental/routing/attribute_values"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://example.zendesk.com/api/v2/incremental/routing/attribute_values")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
{  "attribute_values": [    {      "attribute_id": "15821cba-7326-11e8-b07e-950ba849aa27",      "id": "19ed17fb-7326-11e8-b07e-9de44e7e7f20",      "name": "English",      "time": "2018-06-19T01:33:26Z",      "type": "create"    }  ],  "count": 1200,  "end_time": 1533266020,  "next_page": "https://{subdomain}.zendesk.com/api/v2/incremental/routing/attribute_values.json?cursor=7d724c71-3911-11e8-9621-836b8c683dc6"}

Incremental Instance Values Export

  • GET /api/v2/incremental/routing/instance_values

Returns a stream of changes that occurred on routing instance values. Changes are grouped by attribute_value_id, with unassociate type events listed with associate type events by the associate event’s timestamp.

Allowed For

  • Admins

Parameters

Optional

NameTypeComment
cursorstringThe cursor parameter is a non-human-readable argument you can use to move forward or backward in time. The cursor is a read-only URL parameter that's only available in API responses. See Pagination.

Code Samples

curl
curl https://{subdomain}.zendesk.com/api/v2/incremental/routing/instance_values.json \  -v -u {email_address}:{password}
Go
import (	"fmt"	"io"	"net/http")
func main() {	url := "https://example.zendesk.com/api/v2/incremental/routing/instance_values"	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://example.zendesk.com/api/v2/incremental/routing/instance_values")		.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://example.zendesk.com/api/v2/incremental/routing/instance_values',  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://example.zendesk.com/api/v2/incremental/routing/instance_values"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://example.zendesk.com/api/v2/incremental/routing/instance_values")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
{  "count": 1200,  "end_time": 1533266020,  "instance_values": [    {      "attribute_value_id": "19ed17fb-7326-11e8-b07e-9ab44e7e7f28",      "id": "62055cad-7326-11e8-b07e-73653560136b",      "instance_id": "10001",      "time": "2019-06-19T01:35:27Z",      "type": "associate_agent"    },    {      "attribute_value_id": "19ed17fb-7326-11e8-b07e-9ab44e7e7f28",      "id": "62055cad-7326-11e8-b07e-cf1082b7e6d4",      "instance_id": "11375",      "time": "2019-06-19T01:35:27Z",      "type": "associate_agent"    },    {      "attribute_value_id": "19ed17fb-7326-11e8-b07e-9ab44e7e7f28",      "id": "62055cad-7326-11e8-b07e-5b8483a47e24",      "instance_id": "14187",      "time": "2020-11-14T16:32:22Z",      "type": "unassociate_agent"    }  ],  "next_page": "https://{subdomain}.zendesk.com/api/v2/incremental/routing/instance_values.json?cursor=62055cad-7326-11e8-b07e-73653560136b"}