Relationship Records
Relationship records create associations between object records based on a pre-defined relationship type. For more information, see Relationship Records in the Custom objects handbook.
For example, a car rental company could create the following relationship records after creating object records for its locations and cars:
-
Associate the Minnesota Motors location to a specific Duesenberg car based on the pre-defined relationship type that specifies a rental location can have many cars
-
Associate the Duesenberg to a Zendesk user based on the pre-defined relationship type that specifies a car can be rented to many Zendesk users
Once created, a relationship record can't be modified because the relationship_type
property of a relationship record has fundamental implications on how associations between two object records are stored.
JSON format
Relationships are represented as JSON objects with the following properties:
Name | Type | Read-only | Mandatory | Description |
---|---|---|---|---|
created_at | string | true | false | The time the relationship record was created |
id | string | true | false | Automatically assigned when the relationship record is created |
relationship_type | string | false | true | The key of the relationship type that defines the relationship record |
source | string | false | true | The id of the object record that's the source of the relationship |
target | string | false | true | The id of the object record that's the target of the relationship. |
Example
{
"created_at": "2019-01-01T10:20:30Z",
"id": "6ea29370-a224-11e7-b1f0-191589292d4f",
"relationship_type": "zen_users",
"source": "e5f3f5b2-536a-4f1d-bca2-985c454362bb",
"target": "zen:user:10002"
}
List Relationship Records by Type
GET /api/sunshine/relationships/records?type={type}
Returns all the relationship records of the specified relationship type. For the type, specify a relationship type key.
The response includes a links
object with "previous" and "next" url properties for pagination. See Pagination in the Zendesk v2 API documentation.
Allowed for
- Everyone
Parameters
Name | Type | In | Required | Description |
---|---|---|---|---|
order | string | Query | false | Order of the items (by creation time). Default is ascending. Allowed values are "asc", or "desc". |
per_page | string | Query | false | Number of items returned per page from 1 to 1000 |
type | string | Query | true | See relationship type key |
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/sunshine/relationships/records?type={relationship_type} \
-v -u {email_address}:{password}
Go
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://support.zendesk.com/api/sunshine/relationships/records?order=desc&per_page=1&type=zen_users"
method := "GET"
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
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/sunshine/relationships/records")
.newBuilder()
.addQueryParameter("order", "desc")
.addQueryParameter("per_page", "1")
.addQueryParameter("type", "zen_users");
Request request = new Request.Builder()
.url(urlBuilder.build())
.method("GET", null)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {
method: 'GET',
url: 'https://support.zendesk.com/api/sunshine/relationships/records',
headers: {
'Content-Type': 'application/json',
},
params: {
'order': 'desc',
'per_page': '1',
'type': 'zen_users',
},
};
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/sunshine/relationships/records?order=desc&per_page=1&type=zen_users"
headers = {
"Content-Type": "application/json",
}
response = requests.request(
"GET",
url,
headers=headers
)
print(response.text)
Ruby
require "net/http"
uri = URI("https://support.zendesk.com/api/sunshine/relationships/records")
uri.query = URI.encode_www_form("order": "desc", "per_page": "1", "type": "zen_users")
request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")
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
{
"data": [
{
"created_at": "2019-01-01T10:20:30Z",
"id": "6ea29370-a224-11e7-b1f0-191589292d4f",
"relationship_type": "zen_users",
"source": "e5f3f5b2-536a-4f1d-bca2-985c454362bb",
"target": "zen:user:10002"
},
{
"created_at": "2019-01-01T10:20:35Z",
"id": "890dfe2f-a223-11e7-b1f0-4316e017a51a",
"relationship_type": "zen_users",
"source": "e5f3f5b2-536a-4f1d-bca2-985c454362bb",
"target": "zen:user:10002"
}
],
"links": {
"next": null,
"previous": null
}
}
List Relationship Records by Object Record
GET /api/sunshine/objects/records/{object_record_id}/relationships/{relationship_type_key}
The record id must be the relationship record's source record id, not its target record id.
For example, a car rental company could be creating relationship records based on a relationship type that specifies that each car can be rented by many Zendesk users. The company could use the API to list the relationship records of a specific car -- in other words, to list the users who rented the car.
Each relationship record in the response has the following properties:
id
- the id of the relationship recordtarget
- the id of the target object record, which may be a custom or Zendesk object recordref
- the API url of the target object record for the Show Object Record endpoint
In the example, the targets are users who rented the car.
The response also includes a links
object with previous
and next
url properties for pagination. See Pagination in the Zendesk v2 API documentation.
Allowed for
- Everyone
Parameters
Name | Type | In | Required | Description |
---|---|---|---|---|
order | string | Query | false | Order of the items (by creation time). Default is ascending. Allowed values are "asc", or "desc". |
per_page | string | Query | false | Number of items returned per page from 1 to 1000 |
object_record_id | string | Path | true | The ID of the object record |
relationship_type_key | string | Path | true | The key of the relationship type |
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/sunshine/objects/records/{object_record_id}/relationships/{relationship_type_key} \
-v -u {email_address}:{password}
Go
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://support.zendesk.com/api/sunshine/objects/records/14c6c4be-cb64-4678-ba73-296e3d2c32cf/relationships/suppliers?order=desc&per_page=1"
method := "GET"
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
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/sunshine/objects/records/14c6c4be-cb64-4678-ba73-296e3d2c32cf/relationships/suppliers")
.newBuilder()
.addQueryParameter("order", "desc")
.addQueryParameter("per_page", "1");
Request request = new Request.Builder()
.url(urlBuilder.build())
.method("GET", null)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {
method: 'GET',
url: 'https://support.zendesk.com/api/sunshine/objects/records/14c6c4be-cb64-4678-ba73-296e3d2c32cf/relationships/suppliers',
headers: {
'Content-Type': 'application/json',
},
params: {
'order': 'desc',
'per_page': '1',
},
};
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/sunshine/objects/records/14c6c4be-cb64-4678-ba73-296e3d2c32cf/relationships/suppliers?order=desc&per_page=1"
headers = {
"Content-Type": "application/json",
}
response = requests.request(
"GET",
url,
headers=headers
)
print(response.text)
Ruby
require "net/http"
uri = URI("https://support.zendesk.com/api/sunshine/objects/records/14c6c4be-cb64-4678-ba73-296e3d2c32cf/relationships/suppliers")
uri.query = URI.encode_www_form("order": "desc", "per_page": "1")
request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")
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
{
"data": [
{
"id": "eae75774-18a6-448f-bca7-dda5c11bb125",
"ref": "/api/sunshine/objects/records/f2771449-861e-43f0-8936-e16c3bd492d2",
"target": "f2771449-861e-43f0-8936-e16c3bd492d2"
},
{
"id": "517e916a-7099-11e7-8cf7-a6006ad3dba0",
"ref": "/api/v2/users/849294839",
"target": "849294839"
}
],
"links": {
"next": null,
"previous": null
}
}
Show Relationship Record
GET /api/sunshine/relationships/records/{relationship_record_id}
Returns a relationship record specified by id.
Allowed for
- Everyone
Parameters
Name | Type | In | Required | Description |
---|---|---|---|---|
relationship_record_id | string | Path | true | The ID of the relationship record |
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/sunshine/relationships/records/{id} \
-v -u {email_address}:{password}
Go
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125"
method := "GET"
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
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/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125")
.newBuilder();
Request request = new Request.Builder()
.url(urlBuilder.build())
.method("GET", null)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {
method: 'GET',
url: 'https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125',
headers: {
'Content-Type': 'application/json',
},
};
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/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125"
headers = {
"Content-Type": "application/json",
}
response = requests.request(
"GET",
url,
headers=headers
)
print(response.text)
Ruby
require "net/http"
uri = URI("https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125")
request = Net::HTTP::Get.new(uri, "Content-Type": "application/json")
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
{
"data": {
"created_at": "2019-03-12T17:15:41.807Z",
"id": "1a034055-6485-11ea-a338-a7395da450f1",
"relationship_type": "zen_users",
"source": "fa6dec91-6484-11ea-a338-6d0d189da5e0",
"target": "fc7925e3-6484-11ea-a338-19eb2b9d27d1"
}
}
Create Relationship Record
POST /api/sunshine/relationships/records
Creates a relationship record between two object records based on a relationship type. The relationship type defines the object types of the two object records.
You can create relationship records between two custom object records, a custom object record and a Zendesk object record, or two Zendesk object records.
Allowed for
- Everyone
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/sunshine/relationships/records \
-d '{"data": {"relationship_type": "zen_users", "source": "e5f3f5b2-536a-4f1d-bca2-985c454362bb", "target": "zen:user:10002"}}' \
-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/sunshine/relationships/records"
method := "POST"
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
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/sunshine/relationships/records")
.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")
.build();
Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {
method: 'POST',
url: 'https://support.zendesk.com/api/sunshine/relationships/records',
headers: {
'Content-Type': 'application/json',
},
};
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/sunshine/relationships/records"
headers = {
"Content-Type": "application/json",
}
response = requests.request(
"POST",
url,
headers=headers
)
print(response.text)
Ruby
require "net/http"
uri = URI("https://support.zendesk.com/api/sunshine/relationships/records")
request = Net::HTTP::Post.new(uri, "Content-Type": "application/json")
response = Net::HTTP.start uri.hostname, uri.port, use_ssl: true do |http|
http.request(request)
end
Example response(s)
201 Created
// Status 201 Created
{
"data": {
"created_at": "2019-01-01T10:20:30Z",
"id": "eae75774-18a6-448f-bca7-dda5c11bb125",
"relationship_type": "zen_users",
"source": "e5f3f5b2-536a-4f1d-bca2-985c454362bb",
"target": "zen:user:10002"
}
}
Delete Relationship Record
DELETE /api/sunshine/relationships/records/{relationship_record_id}
Deletes the specified relationship record.
Allowed for
- Everyone
Parameters
Name | Type | In | Required | Description |
---|---|---|---|---|
relationship_record_id | string | Path | true | The ID of the relationship record |
Code Samples
curl
curl https://{subdomain}.zendesk.com/api/sunshine/relationships/records/{id} \
-X DELETE \
-v -u {email_address}:{password}
Go
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125"
method := "DELETE"
req, err := http.NewRequest(method, url, nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
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/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125")
.newBuilder();
Request request = new Request.Builder()
.url(urlBuilder.build())
.method("DELETE", null)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
Nodejs
var axios = require('axios');
var config = {
method: 'DELETE',
url: 'https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125',
headers: {
'Content-Type': 'application/json',
},
};
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/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125"
headers = {
"Content-Type": "application/json",
}
response = requests.request(
"DELETE",
url,
headers=headers
)
print(response.text)
Ruby
require "net/http"
uri = URI("https://support.zendesk.com/api/sunshine/relationships/records/eae75774-18a6-448f-bca7-dda5c11bb125")
request = Net::HTTP::Delete.new(uri, "Content-Type": "application/json")
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