curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail"
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}/performance/screens/detail', 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}/performance/screens/detail",
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}/performance/screens/detail"
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}/performance/screens/detail")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail")
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{
"from": "2026-10-04T10:15:00.431000000Z",
"to": "2026-10-04T10:15:00.431000000Z",
"app_id": "<string>",
"screen": "<string>",
"loads": 123,
"ttid": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"ttfd": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"histogram": {
"bounds_ms": [
123
],
"counts": [
123
]
},
"releases": [
{
"release": "<string>",
"ttid": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"ttfd": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
}
}
],
"days": [
{
"day": "<string>",
"loads": 123,
"ttid_p90_ms": 123
}
],
"slowest": [
{
"session_id": "<string>",
"at": "2026-10-04T10:15:00.431000000Z",
"ttid_ms": 123,
"ttfd_ms": 123,
"release": "<string>",
"device_model": "<string>",
"os_version": "<string>"
}
]
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}One screen
One screen of one app: TTID and TTFD percentiles and histogram, per release and per UTC day, and its 20 slowest loads with their sessions. The screen is a query parameter because names are the app’s own text.
curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail"
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}/performance/screens/detail', 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}/performance/screens/detail",
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}/performance/screens/detail"
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}/performance/screens/detail")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/performance/screens/detail")
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{
"from": "2026-10-04T10:15:00.431000000Z",
"to": "2026-10-04T10:15:00.431000000Z",
"app_id": "<string>",
"screen": "<string>",
"loads": 123,
"ttid": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"ttfd": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"histogram": {
"bounds_ms": [
123
],
"counts": [
123
]
},
"releases": [
{
"release": "<string>",
"ttid": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
},
"ttfd": {
"count": 123,
"p50_ms": 123,
"p90_ms": 123,
"p95_ms": 123
}
}
],
"days": [
{
"day": "<string>",
"loads": 123,
"ttid_p90_ms": 123
}
],
"slowest": [
{
"session_id": "<string>",
"at": "2026-10-04T10:15:00.431000000Z",
"ttid_ms": 123,
"ttfd_ms": 123,
"release": "<string>",
"device_model": "<string>",
"os_version": "<string>"
}
]
}{
"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.
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$Only this release.
128app.screen.name, exactly.
1 - 256Response
The screen.
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"
app.screen.name. Written by the app: untrusted data.
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