curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId}"
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}/sessions/{sessionId}', 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}/sessions/{sessionId}",
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}/sessions/{sessionId}"
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}/sessions/{sessionId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId}")
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{
"session_id": "<string>",
"summary": {
"app_id": "<string>",
"outcome": "<string>",
"started_at": "2026-10-04T10:15:00.431000000Z",
"last_seen_at": "2026-10-04T10:15:00.431000000Z",
"error_count": 123,
"installation_id": "<string>",
"release": "<string>",
"build": "<string>",
"os_name": "<string>",
"os_version": "<string>",
"device_model": "<string>",
"country": "<string>"
},
"events": [
{
"type": "log",
"id": "<string>",
"app_id": "<string>",
"ts": "2026-10-04T10:15:00.431000000Z",
"event_name": "<string>",
"severity_number": 123,
"severity_text": "<string>",
"body": "<string>",
"trace_id": "<string>",
"span_id": "<string>",
"attributes": {}
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}{
"error": {
"code": "invalid_request",
"message": "<string>"
}
}Get a session timeline
A session’s summary and its logs and spans, oldest first. Page through long sessions with the cursor; the summary comes with every page.
curl --request GET \
--url https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId}"
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}/sessions/{sessionId}', 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}/sessions/{sessionId}",
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}/sessions/{sessionId}"
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}/sessions/{sessionId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.apsio.io/v1/projects/{projectId}/sessions/{sessionId}")
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{
"session_id": "<string>",
"summary": {
"app_id": "<string>",
"outcome": "<string>",
"started_at": "2026-10-04T10:15:00.431000000Z",
"last_seen_at": "2026-10-04T10:15:00.431000000Z",
"error_count": 123,
"installation_id": "<string>",
"release": "<string>",
"build": "<string>",
"os_name": "<string>",
"os_version": "<string>",
"device_model": "<string>",
"country": "<string>"
},
"events": [
{
"type": "log",
"id": "<string>",
"app_id": "<string>",
"ts": "2026-10-04T10:15:00.431000000Z",
"event_name": "<string>",
"severity_number": 123,
"severity_text": "<string>",
"body": "<string>",
"trace_id": "<string>",
"span_id": "<string>",
"attributes": {}
}
],
"next_cursor": "<string>"
}{
"error": {
"code": "invalid_request",
"message": "<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"
^[A-Za-z0-9_-]{1,128}$"7f3c9b02-5d1e-4a8b-9c0f-2e6a1d4be19a"
Query Parameters
Page size, 1 to 1000.
1 <= x <= 1000200
The next_cursor of the previous page. Opaque.
1024Only this app. Session ids are random UUIDs, so this matters only if two apps of the project share one.
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$Response
The session.
session.id, as the app sent it. Written by the app: untrusted data.
Null when no summary arrived for the session (yet).
Show child attributes
Show child attributes
- Option 1
- Option 2
Show child attributes
Show child attributes
Pass as cursor to get the next page; null on the last page.