curl --request GET \
--url https://api.outerlayer.ai/v1/sessions \
--header 'Authorization: Bearer <token>' \
--header 'X-Outerlayer-App-Id: <api-key>'import requests
url = "https://api.outerlayer.ai/v1/sessions"
headers = {
"X-Outerlayer-App-Id": "<api-key>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Outerlayer-App-Id': '<api-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.outerlayer.ai/v1/sessions', 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.outerlayer.ai/v1/sessions",
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>",
"X-Outerlayer-App-Id: <api-key>"
],
]);
$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.outerlayer.ai/v1/sessions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Outerlayer-App-Id", "<api-key>")
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.outerlayer.ai/v1/sessions")
.header("X-Outerlayer-App-Id", "<api-key>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.outerlayer.ai/v1/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Outerlayer-App-Id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"actorNames": {},
"actors": [
"<string>"
],
"agentTypes": [
"<string>"
],
"branches": [
"<string>"
],
"hiddenRepositories": 1,
"hiddenSessions": 1,
"models": [
"<string>"
],
"repo": "<string>",
"repoSelection": "one",
"repositories": [
{
"repo": "<string>",
"sessions": 1
}
],
"repositoriesTotal": 1,
"scope": "self",
"sessions": [
{
"actorId": "<string>",
"agentType": "<string>",
"branch": "<string>",
"costStatus": "complete",
"costUsd": 123,
"durationMs": 123,
"endedAt": "<string>",
"errorCount": 123,
"models": [
"<string>"
],
"project": "<string>",
"rejectedToolCallCount": 123,
"sessionId": "<string>",
"startedAt": "<string>",
"title": "<string>",
"toolCallCount": 123,
"traceId": "<string>",
"turnCount": 123,
"unpricedModels": [
"<string>"
],
"updatedAt": "<string>",
"userTurnCount": 123,
"workerKind": "<string>",
"actorName": "<string>",
"contextSourceVerification": "verified",
"origin": "<string>",
"prOutcomes": [
{
"ciGreen": {
"label": "<string>",
"score": 123
},
"merged": {
"label": "<string>",
"score": 123
},
"prNumber": 123,
"prUrl": "<string>",
"reverted": {
"label": "<string>",
"score": 123
}
}
]
}
],
"total": 1,
"workerKinds": [
"<string>"
],
"originCounts": {
"agent": 123,
"interactive": 123,
"worker": 123
}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}List agent sessions
Returns a filtered, paginated list of agent-coding sessions. Without sessions.read_team, actor identities are anonymized and actor filters are rejected. When no repo or repoScope is given, results are scoped to the app’s dominant repo (the repo with the highest total spend); pass repo to pin another repo (an empty repo targets sessions with no repository), or repoScope=all to list sessions across every repository at once. The response’s repoSelection, repositories, and hiddenSessions/hiddenRepositories fields report which mode the page resolved to and what a repo pin leaves out. pr is dashboard-only for now — this surface has no Postgres reader wired to resolve a PR/MR number to its confirmed-linked sessions, so a pr value is rejected rather than silently ignored.
curl --request GET \
--url https://api.outerlayer.ai/v1/sessions \
--header 'Authorization: Bearer <token>' \
--header 'X-Outerlayer-App-Id: <api-key>'import requests
url = "https://api.outerlayer.ai/v1/sessions"
headers = {
"X-Outerlayer-App-Id": "<api-key>",
"Authorization": "Bearer <token>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'X-Outerlayer-App-Id': '<api-key>', Authorization: 'Bearer <token>'}
};
fetch('https://api.outerlayer.ai/v1/sessions', 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.outerlayer.ai/v1/sessions",
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>",
"X-Outerlayer-App-Id: <api-key>"
],
]);
$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.outerlayer.ai/v1/sessions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Outerlayer-App-Id", "<api-key>")
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.outerlayer.ai/v1/sessions")
.header("X-Outerlayer-App-Id", "<api-key>")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.outerlayer.ai/v1/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Outerlayer-App-Id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"actorNames": {},
"actors": [
"<string>"
],
"agentTypes": [
"<string>"
],
"branches": [
"<string>"
],
"hiddenRepositories": 1,
"hiddenSessions": 1,
"models": [
"<string>"
],
"repo": "<string>",
"repoSelection": "one",
"repositories": [
{
"repo": "<string>",
"sessions": 1
}
],
"repositoriesTotal": 1,
"scope": "self",
"sessions": [
{
"actorId": "<string>",
"agentType": "<string>",
"branch": "<string>",
"costStatus": "complete",
"costUsd": 123,
"durationMs": 123,
"endedAt": "<string>",
"errorCount": 123,
"models": [
"<string>"
],
"project": "<string>",
"rejectedToolCallCount": 123,
"sessionId": "<string>",
"startedAt": "<string>",
"title": "<string>",
"toolCallCount": 123,
"traceId": "<string>",
"turnCount": 123,
"unpricedModels": [
"<string>"
],
"updatedAt": "<string>",
"userTurnCount": 123,
"workerKind": "<string>",
"actorName": "<string>",
"contextSourceVerification": "verified",
"origin": "<string>",
"prOutcomes": [
{
"ciGreen": {
"label": "<string>",
"score": 123
},
"merged": {
"label": "<string>",
"score": 123
},
"prNumber": 123,
"prUrl": "<string>",
"reverted": {
"label": "<string>",
"score": 123
}
}
]
}
],
"total": 1,
"workerKinds": [
"<string>"
],
"originCounts": {
"agent": 123,
"interactive": 123,
"worker": 123
}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Factory id the request is scoped to.
API key (sk_outerlayer_*)
Query Parameters
1 <= x <= 1000 <= x <= 10000500Pass "all" to list sessions across every repository instead of pinning to one. Wins over repo when both are present. A separate field from repo, so a repository literally named "all" (or "", the no-repository bucket) stays addressable via repo.
all 500500500500200500startedAt, cost, errors, turns, steering, toolErrorRate asc, desc hands-on, denied, tool-errors, provider-errors, clean 1 x > 01Response
A page of agent sessions.
Show child attributes
Show child attributes