curl --request GET \
--url https://api.exec.com/rest/v1/sessions/{session_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/sessions/{session_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/sessions/{session_id}', 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.exec.com/rest/v1/sessions/{session_id}",
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.exec.com/rest/v1/sessions/{session_id}"
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.exec.com/rest/v1/sessions/{session_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/sessions/{session_id}")
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{
"id": "abc123def456",
"user": {
"id": "u1a2b3c4d5e6",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith"
},
"scenario": {
"id": "s1a2b3c4d5e6",
"name": "Procurement Discovery",
"slug": "procurement-discovery"
},
"score": 82.5,
"rank": "gold",
"duration_seconds": 347,
"is_valid_attempt": true,
"outcome_feedback": "Strong discovery questioning with good rapport building.",
"positive_feedback": "Excellent use of open-ended questions to uncover needs.",
"constructive_feedback": "Consider probing deeper into budget constraints.",
"created_at": "2026-03-15T14:30:00Z",
"transcript": [
{
"speaker": "ai",
"text": "Hi, I'm the procurement lead at Globex. Thanks for meeting with me today.",
"seconds_from_start": 0
},
{
"speaker": "user",
"text": "Thanks for your time. I'd love to learn more about your current process.",
"seconds_from_start": 4.2
}
],
"evaluations": [
{
"criterion_name": "Communication Skills",
"items": [
{
"name": "Discovery Questions",
"grade": "good",
"feedback": "Asked targeted questions about pain points and current workflow.",
"feedback_examples": [
{
"quote": "Tell me about your current procurement process.",
"feedback": "Great open-ended discovery question.",
"suggestion_quote": null,
"grade": "good",
"salience": "high"
}
]
}
]
},
{
"criterion_name": "Objection Handling",
"items": [
{
"name": "Budget Concerns",
"grade": "mid",
"feedback": "Addressed the budget concern but could have reframed value more clearly.",
"feedback_examples": []
}
]
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}{
"error": {
"type": "not_found",
"message": "Scenario not found: abc123"
}
}Get session detail
Returns full detail for a single roleplay session, including score, rank, duration, and feedback.
Use the include parameter to fetch optional heavy fields like the full conversation
transcript or evaluation criteria with grades. These are omitted by default to keep
responses lean.
curl --request GET \
--url https://api.exec.com/rest/v1/sessions/{session_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exec.com/rest/v1/sessions/{session_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exec.com/rest/v1/sessions/{session_id}', 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.exec.com/rest/v1/sessions/{session_id}",
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.exec.com/rest/v1/sessions/{session_id}"
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.exec.com/rest/v1/sessions/{session_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exec.com/rest/v1/sessions/{session_id}")
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{
"id": "abc123def456",
"user": {
"id": "u1a2b3c4d5e6",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith"
},
"scenario": {
"id": "s1a2b3c4d5e6",
"name": "Procurement Discovery",
"slug": "procurement-discovery"
},
"score": 82.5,
"rank": "gold",
"duration_seconds": 347,
"is_valid_attempt": true,
"outcome_feedback": "Strong discovery questioning with good rapport building.",
"positive_feedback": "Excellent use of open-ended questions to uncover needs.",
"constructive_feedback": "Consider probing deeper into budget constraints.",
"created_at": "2026-03-15T14:30:00Z",
"transcript": [
{
"speaker": "ai",
"text": "Hi, I'm the procurement lead at Globex. Thanks for meeting with me today.",
"seconds_from_start": 0
},
{
"speaker": "user",
"text": "Thanks for your time. I'd love to learn more about your current process.",
"seconds_from_start": 4.2
}
],
"evaluations": [
{
"criterion_name": "Communication Skills",
"items": [
{
"name": "Discovery Questions",
"grade": "good",
"feedback": "Asked targeted questions about pain points and current workflow.",
"feedback_examples": [
{
"quote": "Tell me about your current procurement process.",
"feedback": "Great open-ended discovery question.",
"suggestion_quote": null,
"grade": "good",
"salience": "high"
}
]
}
]
},
{
"criterion_name": "Objection Handling",
"items": [
{
"name": "Budget Concerns",
"grade": "mid",
"feedback": "Addressed the budget concern but could have reframed value more clearly.",
"feedback_examples": []
}
]
}
]
}{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "Invalid or inactive API key"
}
}{
"error": {
"type": "not_found",
"message": "Scenario not found: abc123"
}
}Authorizations
API key created in Settings > API.
Format: exec_live_ followed by 40 alphanumeric characters.
Path Parameters
The session's unique identifier (UUID)
Query Parameters
Comma-separated list of optional sections to include in the response.
Available values: transcript (conversation lines), evaluations (rubric criteria with grades).
"transcript,evaluations"
Response
Session detail
Full roleplay session detail with optional transcript and evaluations.
Unique session identifier
Show child attributes
Show child attributes
A compact scenario reference for embedding in other responses.
Show child attributes
Show child attributes
Session score (0-100 scale)
Performance rank based on score
gold, silver, bronze, unranked Session duration in seconds
Whether this session counts as a valid graded attempt. A session is valid when it was completed (not abandoned), received AI grading, and has a score. Use valid attempts for analytics; non-valid sessions may be incomplete or ungraded.
Overall outcome summary from the AI evaluator
What the participant did well
Areas for improvement
Conversation transcript lines, excluding system messages (only included when requested via ?include=transcript)
Show child attributes
Show child attributes
Evaluation criteria with grades (only included when requested via ?include=evaluations)
Show child attributes
Show child attributes
When the session was created