Get a test run
curl --request GET \
--url https://api.getdecipher.com/api/v1/test-runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getdecipher.com/api/v1/test-runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getdecipher.com/api/v1/test-runs/{runId}', 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.getdecipher.com/api/v1/test-runs/{runId}",
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.getdecipher.com/api/v1/test-runs/{runId}"
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.getdecipher.com/api/v1/test-runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdecipher.com/api/v1/test-runs/{runId}")
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": "testRun",
"id": 123,
"testId": 123,
"testName": "<string>",
"testUrl": "https://app.getdecipher.com/tests/456",
"runUrl": "https://app.getdecipher.com/tests/456/runs/789",
"status": "passed",
"startTime": "<string>",
"endTime": "<string>",
"durationMs": 123,
"triggeredBy": "<string>",
"createdAt": "<string>",
"summary": {
"oneLineSummary": "<string>",
"overallReasoning": "<string>",
"firstFailedStepNumber": 123
},
"steps": [
{
"stepNumber": 1,
"description": "Navigate to login page",
"actionType": "navigate",
"success": true,
"durationMs": 1200,
"failure": {
"type": "element_not_found",
"source": "execution",
"description": "<string>",
"reasoning": "<string>",
"expectedOutcome": "<string>",
"actualOutcome": "<string>"
},
"hasScreenshots": true,
"screenshots": {
"before": "<string>",
"after": "<string>"
}
}
],
"globalErrors": [
{
"stepNumber": 123,
"stepDescription": "<string>",
"screenshotType": "before",
"errorText": "<string>",
"errorLocation": "<string>",
"isBugIssue": true
}
],
"suggestedFixes": [
{
"title": "<string>",
"description": "<string>",
"affectedStepNumbers": [
123
],
"confidence": "high"
}
],
"screenshotsExpiresAt": "<string>"
}{
"error": {
"type": "authentication_error",
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
}{
"error": {
"type": "authentication_error",
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
}Testing
Get a test run
Retrieve detailed information about a specific test run, including step-by-step execution results, failure analysis, and AI-generated fix suggestions.
GET
/
api
/
v1
/
test-runs
/
{runId}
Get a test run
curl --request GET \
--url https://api.getdecipher.com/api/v1/test-runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.getdecipher.com/api/v1/test-runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.getdecipher.com/api/v1/test-runs/{runId}', 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.getdecipher.com/api/v1/test-runs/{runId}",
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.getdecipher.com/api/v1/test-runs/{runId}"
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.getdecipher.com/api/v1/test-runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdecipher.com/api/v1/test-runs/{runId}")
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": "testRun",
"id": 123,
"testId": 123,
"testName": "<string>",
"testUrl": "https://app.getdecipher.com/tests/456",
"runUrl": "https://app.getdecipher.com/tests/456/runs/789",
"status": "passed",
"startTime": "<string>",
"endTime": "<string>",
"durationMs": 123,
"triggeredBy": "<string>",
"createdAt": "<string>",
"summary": {
"oneLineSummary": "<string>",
"overallReasoning": "<string>",
"firstFailedStepNumber": 123
},
"steps": [
{
"stepNumber": 1,
"description": "Navigate to login page",
"actionType": "navigate",
"success": true,
"durationMs": 1200,
"failure": {
"type": "element_not_found",
"source": "execution",
"description": "<string>",
"reasoning": "<string>",
"expectedOutcome": "<string>",
"actualOutcome": "<string>"
},
"hasScreenshots": true,
"screenshots": {
"before": "<string>",
"after": "<string>"
}
}
],
"globalErrors": [
{
"stepNumber": 123,
"stepDescription": "<string>",
"screenshotType": "before",
"errorText": "<string>",
"errorLocation": "<string>",
"isBugIssue": true
}
],
"suggestedFixes": [
{
"title": "<string>",
"description": "<string>",
"affectedStepNumbers": [
123
],
"confidence": "high"
}
],
"screenshotsExpiresAt": "<string>"
}{
"error": {
"type": "authentication_error",
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
}{
"error": {
"type": "authentication_error",
"code": "<string>",
"message": "<string>",
"field": "<string>"
}
}Authorizations
API key authentication. Use your Decipher API key as the bearer token.
Path Parameters
The ID of the test run
Example:
"12345"
Query Parameters
Pass "screenshots" to inline signed screenshot URLs into each step
Available options:
screenshots Response
Test run details
Available options:
testRun Decipher dashboard link for the test
Example:
"https://app.getdecipher.com/tests/456"
Decipher dashboard link for this run
Example:
"https://app.getdecipher.com/tests/456/runs/789"
Available options:
passed, failed, running Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
ISO timestamp when screenshot URLs expire (~3h). Only present when ?include=screenshots is set.