curl "https://api.signalmd.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/attempts/f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}', 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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}",
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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}"
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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}")
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{
"object": "attempt",
"id": "f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c",
"runId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"testId": "3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"testRevision": 2,
"persona": "@source",
"attempt": 1,
"version": 8,
"result": "passed",
"reason": null,
"noFixture": [],
"providerGrader": {
"status": null,
"explanation": null
},
"models": {
"simulator": "caller-setup-a",
"judge": "review-setup-a",
"judgePromptHash": "9f2c1a7e",
"scorerVersion": "2026-09-18"
},
"cost": {
"retellUsd": 0.15,
"signalUsd": 0.02
},
"rescoredAt": null,
"startedAt": "2026-10-02T11:01:15.000Z",
"finishedAt": "2026-10-02T11:02:40.000Z"
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}Get an attempt
One simulated call: its transcript, the verdict on each criterion with who decided it, what SignalMD’s own checks found, caller drift, and what played and scored it.
curl "https://api.signalmd.dev/v1/agents/6f1d2c3b-4a5e-4f60-8b7a-9c0d1e2f3a4b/attempts/f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c" \
-H "Authorization: Bearer $SIGNAL_API_KEY"import requests
url = "https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}', 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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}",
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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}"
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.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.signalmd.dev/v1/agents/{agentId}/attempts/{attemptId}")
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{
"object": "attempt",
"id": "f9a0b1c2-d3e4-4f5a-8b6c-7d8e9f0a1b2c",
"runId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
"testId": "3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"testRevision": 2,
"persona": "@source",
"attempt": 1,
"version": 8,
"result": "passed",
"reason": null,
"noFixture": [],
"providerGrader": {
"status": null,
"explanation": null
},
"models": {
"simulator": "caller-setup-a",
"judge": "review-setup-a",
"judgePromptHash": "9f2c1a7e",
"scorerVersion": "2026-09-18"
},
"cost": {
"retellUsd": 0.15,
"signalUsd": 0.02
},
"rescoredAt": null,
"startedAt": "2026-10-02T11:01:15.000Z",
"finishedAt": "2026-10-02T11:02:40.000Z"
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}{
"error": {
"type": "not_found_error",
"code": "agent_not_found",
"message": "Agent not found.",
"param": null,
"requestId": "req_8c1f0e2b4a6d9e3f7a5c1b0d"
}
}Authorizations
An API key (sig_...), or a session token from the web app.
Path Parameters
The agent's id.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
The attempt's id.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
Response
The attempt.
attempt ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
The run it belongs to.
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
The test revision it ran. Null on attempts stored before revisions.
The persona slug played, or @source for the test's own caller.
1 for the first try; 2 for the rerun of a failure; 2 and 3 for the repeats of a cell that runs three times.
The agent version played.
This attempt's own result. The cell's combined result, including flaky, is in the run's result document.
passed, failed, error, drift, null Why, in one line.
Tools that answered with the fixed 'not available' error.
The voice platform's own grader result.
Show child attributes
Show child attributes
What played and scored it.
Show child attributes
Show child attributes
Estimated cost of the attempt: Retell's share and SignalMD's.
Show child attributes
Show child attributes
Set when it was scored again from its transcript.
"2026-10-02T14:03:07.120Z"
"2026-10-02T14:03:07.120Z"
"2026-10-02T14:03:07.120Z"
Show child attributes
Show child attributes
Problems SignalMD's own checks found on the transcript (code, title, severity, detail), whatever the criteria say.
Show child attributes
Show child attributes
Whether the simulated caller stayed the source caller (drifted, reasons, notes). Null: no source to compare with.
Show child attributes
Show child attributes
Earlier scores of this attempt, oldest first, each with the epoch it was scored in.
Show child attributes
Show child attributes
Live watches of the agent on this transcript, reported beside the verdict. A watch never changes the verdict.
Show child attributes
Show child attributes
The conversation as the voice platform returned it, tool calls included. Its shape is the platform's, not normalised.
Was this page helpful?