Compare deployment performance
curl --request GET \
--url https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"workload": {
"id": "<string>",
"name": "<string>"
},
"query": {
"baselineId": "<string>",
"candidateId": "<string>",
"windowMinutes": 123,
"warmupMinutes": 123,
"regressionPercent": 123,
"minimumCoveragePercent": 123,
"statistic": "average",
"cpuFloorCores": 123,
"memoryFloorMiB": 123
},
"stepSeconds": 123,
"baseline": {
"deployment": {
"id": "<string>",
"commitSha": "<string>",
"serverId": "<string>",
"kind": "deploy",
"finishedAt": "<string>",
"configDigest": "<string>",
"imageDigest": "<string>"
},
"startAt": "<string>",
"endAt": "<string>",
"windowComplete": true,
"historyExpired": true,
"restarts": 123,
"restartCoveragePercent": 123,
"points": [
{
"offsetSeconds": 123,
"metrics": {}
}
]
},
"candidate": {
"deployment": {
"id": "<string>",
"commitSha": "<string>",
"serverId": "<string>",
"kind": "deploy",
"finishedAt": "<string>",
"configDigest": "<string>",
"imageDigest": "<string>"
},
"startAt": "<string>",
"endAt": "<string>",
"windowComplete": true,
"historyExpired": true,
"restarts": 123,
"restartCoveragePercent": 123,
"points": [
{
"offsetSeconds": 123,
"metrics": {}
}
]
},
"metrics": [
{
"baseline": {
"average": 123,
"peak": 123,
"coveragePercent": 123,
"samples": 123
},
"candidate": {
"average": 123,
"peak": 123,
"coveragePercent": 123,
"samples": 123
},
"delta": 123,
"deltaPercent": 123,
"assessment": "insufficient_data",
"metric": "cpuPercent",
"label": "<string>",
"unit": "bytes",
"regression": true,
"absoluteFloor": 123
}
],
"restarts": {
"baseline": 123,
"candidate": 123,
"assessment": "<string>"
},
"warnings": [
"<string>"
],
"localization": {
"dateFormat": "day-short-month-year",
"timeFormat": "24-hour",
"timeZone": "<string>",
"timestamps": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}Compare deployment performance
Compare deployment performance through the Towbar REST API.
GET
/
workloads
/
{deployableId}
/
deployment-comparison
Compare deployment performance
curl --request GET \
--url https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/api/workloads/{deployableId}/deployment-comparison")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"workload": {
"id": "<string>",
"name": "<string>"
},
"query": {
"baselineId": "<string>",
"candidateId": "<string>",
"windowMinutes": 123,
"warmupMinutes": 123,
"regressionPercent": 123,
"minimumCoveragePercent": 123,
"statistic": "average",
"cpuFloorCores": 123,
"memoryFloorMiB": 123
},
"stepSeconds": 123,
"baseline": {
"deployment": {
"id": "<string>",
"commitSha": "<string>",
"serverId": "<string>",
"kind": "deploy",
"finishedAt": "<string>",
"configDigest": "<string>",
"imageDigest": "<string>"
},
"startAt": "<string>",
"endAt": "<string>",
"windowComplete": true,
"historyExpired": true,
"restarts": 123,
"restartCoveragePercent": 123,
"points": [
{
"offsetSeconds": 123,
"metrics": {}
}
]
},
"candidate": {
"deployment": {
"id": "<string>",
"commitSha": "<string>",
"serverId": "<string>",
"kind": "deploy",
"finishedAt": "<string>",
"configDigest": "<string>",
"imageDigest": "<string>"
},
"startAt": "<string>",
"endAt": "<string>",
"windowComplete": true,
"historyExpired": true,
"restarts": 123,
"restartCoveragePercent": 123,
"points": [
{
"offsetSeconds": 123,
"metrics": {}
}
]
},
"metrics": [
{
"baseline": {
"average": 123,
"peak": 123,
"coveragePercent": 123,
"samples": 123
},
"candidate": {
"average": 123,
"peak": 123,
"coveragePercent": 123,
"samples": 123
},
"delta": 123,
"deltaPercent": 123,
"assessment": "insufficient_data",
"metric": "cpuPercent",
"label": "<string>",
"unit": "bytes",
"regression": true,
"absoluteFloor": 123
}
],
"restarts": {
"baseline": 123,
"candidate": 123,
"assessment": "<string>"
},
"warnings": [
"<string>"
],
"localization": {
"dateFormat": "day-short-month-year",
"timeFormat": "24-hour",
"timeZone": "<string>",
"timestamps": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"requestId": "<string>"
}
}Required permissions: alert.read. Personal keys are capped by their owner’s current team role.
See request conventions and automation workflows. MCP clients use the task-oriented tool catalogue.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Query Parameters
Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Pattern:
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Required range:
5 <= x <= 1440Required range:
0 <= x <= 60Required range:
0 <= x <= 500Required range:
0 <= x <= 100Available options:
average, peak Required range:
0 <= x <= 1024Required range:
0 <= x <= 1048576Response
Equal relative observation windows, aligned metrics, sample coverage, changes and comparison limitations.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Last modified on September 6, 2026
