User testing
List a scenario's sessions
What visitors did, as summaries. Project members only — this route is deliberately absent from the guest allowlist, so a share-link visitor can never read other visitors’ sessions.
GET
/
projects
/
{projectId}
/
user-testing
/
scenarios
/
{scenarioId}
/
sessions
List a scenario's sessions
curl --request GET \
--url https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/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://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "<string>",
"chatSessionId": "<string>",
"messageCount": 123,
"preview": "<string>",
"visitor": {
"displayName": "<string>",
"segment": "<string>",
"deviceKind": "<string>",
"language": "<string>"
},
"feedback": {
"rating": 123,
"comment": "<string>",
"count": 123
},
"startedAt": 123,
"lastActivityAt": 123,
"modelId": "<string>",
"toolCallCount": 123,
"authInterrupted": true,
"theme": {
"id": "<string>",
"label": "<string>",
"keywords": [
"<string>"
]
}
}
],
"nextCursor": "<string>"
}
Authorizations
MCPJam API key (sk_…). Create one at Settings → API keys. Guest sessions cannot use the API, and API keys cannot manage other API keys.
Path Parameters
ID of the hosted project that contains the server.
Scenario ID, as returned by publishing an environment or by the project's scenario reads.
Body
application/json
Optional pagination cursor.
Opaque pagination cursor from a previous response's nextCursor. Don't parse it.
Was this page helpful?
⌘I
List a scenario's sessions
curl --request GET \
--url https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/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://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("GET", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.mcpjam.com/api/v1/projects/{projectId}/user-testing/scenarios/{scenarioId}/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"items": [
{
"id": "<string>",
"chatSessionId": "<string>",
"messageCount": 123,
"preview": "<string>",
"visitor": {
"displayName": "<string>",
"segment": "<string>",
"deviceKind": "<string>",
"language": "<string>"
},
"feedback": {
"rating": 123,
"comment": "<string>",
"count": 123
},
"startedAt": 123,
"lastActivityAt": 123,
"modelId": "<string>",
"toolCallCount": 123,
"authInterrupted": true,
"theme": {
"id": "<string>",
"label": "<string>",
"keywords": [
"<string>"
]
}
}
],
"nextCursor": "<string>"
}

