curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/release-health/compare \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/release-health/compare"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.apsio.io/v1/projects/{projectId}/release-health/compare', 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.apsio.io/v1/projects/{projectId}/release-health/compare",
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.apsio.io/v1/projects/{projectId}/release-health/compare"
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.apsio.io/v1/projects/{projectId}/release-health/compare")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/release-health/compare")
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{
"app_id": "<string>",
"from": "2026-10-04T10:15:00.431000000Z",
"to": "2026-10-04T10:15:00.431000000Z",
"a": {
"release": "<string>",
"sessions": 123,
"crashed_sessions": 123,
"abnormal_exit_sessions": 123,
"crash_free_sessions_rate": 123,
"users": 123,
"crashed_users": 123,
"crash_free_users_rate": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"adoption": {
"sessions_share": 123,
"users_share": 123
}
},
"b": {
"release": "<string>",
"sessions": 123,
"crashed_sessions": 123,
"abnormal_exit_sessions": 123,
"crash_free_sessions_rate": 123,
"users": 123,
"crashed_users": 123,
"crash_free_users_rate": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"adoption": {
"sessions_share": 123,
"users_share": 123
}
},
"change": {
"crash_free_sessions_rate": 123,
"crash_free_users_rate": 123
},
"new_issues": [
{
"id": "3f9a0c2e7d1b4a6c8e0f1a2b3c4d5e6f",
"kind": "crash",
"app_id": "<string>",
"type": "<string>",
"message": "<string>",
"occurrences": 123,
"users": 123,
"sessions": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"releases": [
"<string>"
],
"symbolicated": true,
"grouping": {
"version": 123,
"reason": "in_app_frames"
}
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Compare two releases
Release a (the baseline) and release b of one app over the same time range (default: the last 30 days): crash-free sessions and users, adoption, the change from a to b, and the issues with occurrences in b and none in a in that range, most users first.
curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/release-health/compare \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/release-health/compare"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.apsio.io/v1/projects/{projectId}/release-health/compare', 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.apsio.io/v1/projects/{projectId}/release-health/compare",
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.apsio.io/v1/projects/{projectId}/release-health/compare"
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.apsio.io/v1/projects/{projectId}/release-health/compare")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/release-health/compare")
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{
"app_id": "<string>",
"from": "2026-10-04T10:15:00.431000000Z",
"to": "2026-10-04T10:15:00.431000000Z",
"a": {
"release": "<string>",
"sessions": 123,
"crashed_sessions": 123,
"abnormal_exit_sessions": 123,
"crash_free_sessions_rate": 123,
"users": 123,
"crashed_users": 123,
"crash_free_users_rate": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"adoption": {
"sessions_share": 123,
"users_share": 123
}
},
"b": {
"release": "<string>",
"sessions": 123,
"crashed_sessions": 123,
"abnormal_exit_sessions": 123,
"crash_free_sessions_rate": 123,
"users": 123,
"crashed_users": 123,
"crash_free_users_rate": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"adoption": {
"sessions_share": 123,
"users_share": 123
}
},
"change": {
"crash_free_sessions_rate": 123,
"crash_free_users_rate": 123
},
"new_issues": [
{
"id": "3f9a0c2e7d1b4a6c8e0f1a2b3c4d5e6f",
"kind": "crash",
"app_id": "<string>",
"type": "<string>",
"message": "<string>",
"occurrences": 123,
"users": 123,
"sessions": 123,
"first_seen": "2026-10-04T10:15:00.431000000Z",
"last_seen": "2026-10-04T10:15:00.431000000Z",
"releases": [
"<string>"
],
"symbolicated": true,
"grouping": {
"version": 123,
"reason": "in_app_frames"
}
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Authorizations
A project token (apsio_pt_v0...), which reads exactly one project, or an OAuth access token issued for the API, which reads what its user can. Access tokens issued for Apsio's MCP server are accepted only from the MCP server itself.
Path Parameters
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"0192f3a4-0000-7000-8000-00000000a101"
Query Parameters
Start of the time range, inclusive (RFC 3339). Defaults to the range end minus the default length.
"2026-10-01T00:00:00Z"
End of the time range, exclusive (RFC 3339). Defaults to now.
"2026-10-08T00:00:00Z"
The app both releases belong to.
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$The baseline release.
1 - 128"4.11.2"
The release to compare.
1 - 128"4.12.0"
At most this many new issues, 1 to 50.
1 <= x <= 50Response
The comparison.
RFC 3339 time in UTC with up to nanosecond precision.
"2026-10-04T10:15:00.431000000Z"
RFC 3339 time in UTC with up to nanosecond precision.
"2026-10-04T10:15:00.431000000Z"
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Issues with occurrences in b and none in a, with their counts in b.
Show child attributes
Show child attributes