Worked request and response samples
Copy a request body as written, substitute your own ids, and compare the response envelope. Errors follow Devotel Orbit’s{ error, meta } envelope, shown once below under Error envelope.
Create a ticket
POST /api/v1/inbox/ticketscURL
curl -X POST "https://api.orbit.devotel.io/api/v1/inbox/tickets" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
}'
Node.js
import { Orbit } from '@devotel-orbit/node'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://api.orbit.devotel.io/api/v1/inbox/tickets', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://api.orbit.devotel.io/api/v1/inbox/tickets", headers=headers, json={
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://api.orbit.devotel.io/api/v1/inbox/tickets", bytes.NewBuffer([]byte(`{
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://api.orbit.devotel.io/api/v1/inbox/tickets')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://api.orbit.devotel.io/api/v1/inbox/tickets');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"subject": "Refund request",
"channel": "email",
"contact_id": "contact_4d2f6a8c1e3b5d7f9a1c3e5b",
"priority": "normal"
}
JSON);
echo curl_exec($ch);
{
"data": {
"id": "tick_9e8d7c6b5a4f3021e5d6c7b8",
"subject": "Refund request",
"status": "open"
},
"meta": {
"request_id": "req_ticket",
"timestamp": "2026-08-01T12:00:00.000Z"
}
}
Add a comment to a ticket
POST /api/v1/inbox/tickets/{id}/commentscURL
curl -X POST "https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
}'
Node.js
import { Orbit } from '@devotel-orbit/node'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments", headers=headers, json={
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments", bytes.NewBuffer([]byte(`{
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/comments');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"body": "We'll refund the difference within 2 business days.",
"kind": "public"
}
JSON);
echo curl_exec($ch);
{
"data": {
"id": "cmt_5d6c7e8f9a1b2c3d4e5f6a7b",
"kind": "public",
"body": "We'll refund the difference within 2 business days."
},
"meta": {
"request_id": "req_comment",
"timestamp": "2026-08-01T12:01:00.000Z"
}
}
List a ticket’s related tickets
GET /api/v1/inbox/tickets/{id}/linksstring
Optional edge-kind filter, e.g.
related or duplicate.cURL
curl -X GET "https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links" \
-H "X-API-Key: dv_live_sk_your_key_here"
Node.js
import { Orbit } from '@devotel-orbit/node'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links', {
method: 'GET',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
},
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
r = requests.get("https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links", headers=headers)
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links", nil)
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links')
req = Net::HTTP::Get.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://api.orbit.devotel.io/api/v1/inbox/tickets/{id}/links');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
]);
echo curl_exec($ch);
{
"data": [
{
"from": "tick_9e8d7c6b5a4f3021e5d6c7b8",
"to": "tick_2b3c4d5e6f7081a2b3c4d5",
"kind": "related"
}
],
"meta": {
"request_id": "req_links",
"timestamp": "2026-08-01T11:59:00.000Z"
}
}
Error envelope
422
{
"error": {
"code": "VALIDATION_ERROR",
"status": 422,
"message": "subject: Required"
},
"meta": {
"request_id": "req_...",
"timestamp": "2026-08-01T12:00:00.000Z"
}
}