curl --request GET \
--url https://tester.army/api/v1/runs/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://tester.army/api/v1/runs/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://tester.army/api/v1/runs/{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": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "ci",
"status": "queued",
"input": {},
"createdAt": "2023-11-07T05:31:56Z",
"platform": "web",
"deviceModel": "iphone",
"source": "api",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"output": {
"featureName": "<string>",
"result": "PASS",
"description": "<string>",
"screenshots": [
"<string>"
],
"blockedReason": {
"category": "environment",
"summary": "<string>",
"errorCodes": [
"AUTH_CREDENTIAL_UNAVAILABLE"
]
},
"issues": [],
"steps": [
{
"stepIndex": 123,
"title": "<string>",
"status": "passed",
"type": "act",
"summary": "<string>",
"error": "<string>",
"errorCode": "AUTH_CREDENTIAL_UNAVAILABLE",
"startedAtMs": 123,
"completedAtMs": 123,
"reusableActionTrace": {
"version": 1,
"stepKey": "<string>",
"stepTitle": "<string>",
"actions": [
{
"order": 1,
"toolName": "<string>",
"summary": "<string>",
"gap": true,
"navigated": true,
"target": {
"kind": "role",
"role": "<string>",
"name": "<string>",
"nth": 1,
"selector": "<string>",
"element": "<string>",
"type": "<string>",
"identifier": "<string>",
"label": "<string>",
"matchCount": 1
},
"source": {
"kind": "role",
"role": "<string>",
"name": "<string>",
"nth": 1,
"selector": "<string>",
"element": "<string>",
"type": "<string>",
"identifier": "<string>",
"label": "<string>",
"matchCount": 1
},
"input": {
"url": "<string>",
"field": "username",
"option": "<string>",
"key": "<string>",
"direction": "up",
"amount": 123,
"deltaX": 123,
"deltaY": 123,
"targetPosition": "center",
"fromEdge": true,
"focused": true,
"sequentially": true,
"text": "<string>",
"assertion": "<string>",
"role": "<string>",
"name": "<string>",
"durationMs": 123,
"latitude": 123,
"longitude": 123,
"state": "offline"
}
}
],
"confidence": "medium",
"stepType": "act",
"truncated": true,
"startPath": "<string>",
"startScreen": "<string>",
"startScreenSignature": "<string>"
}
}
],
"uiActionIntervals": [
{
"startMs": 1,
"endMs": 1,
"kind": "click"
}
],
"recording": {
"storageKey": "<string>",
"fileName": "<string>",
"mediaType": "<string>"
}
},
"testPlan": {
"instructions": "<string>",
"focusAreas": [
"<string>"
],
"complexity": "simple",
"changeType": "frontend",
"steps": [
{
"title": "<string>",
"type": "act"
}
],
"executionConfig": {
"viewport": {
"width": 2080,
"height": 1200
}
}
},
"error": {
"code": "<string>",
"message": "<string>",
"stage": "<string>",
"retryable": true
},
"durationMs": 123,
"webhookUrl": "<string>",
"webhookStatus": "pending",
"testId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stepResults": [
{
"stepIndex": 123,
"status": "pending",
"startedAt": "<string>",
"completedAt": "<string>",
"error": "<string>",
"retried": true,
"errorCode": "AUTH_CREDENTIAL_UNAVAILABLE",
"summary": "<string>",
"startedAtMs": 123,
"completedAtMs": 123
}
],
"userName": "<string>",
"externalRef": {},
"executionMode": "fast",
"autoRetryCount": 123,
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Get test run status
Retrieve the current status and result of a test run. Poll this endpoint to check for completion.
curl --request GET \
--url https://tester.army/api/v1/runs/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://tester.army/api/v1/runs/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{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://tester.army/api/v1/runs/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://tester.army/api/v1/runs/{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": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "ci",
"status": "queued",
"input": {},
"createdAt": "2023-11-07T05:31:56Z",
"platform": "web",
"deviceModel": "iphone",
"source": "api",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"output": {
"featureName": "<string>",
"result": "PASS",
"description": "<string>",
"screenshots": [
"<string>"
],
"blockedReason": {
"category": "environment",
"summary": "<string>",
"errorCodes": [
"AUTH_CREDENTIAL_UNAVAILABLE"
]
},
"issues": [],
"steps": [
{
"stepIndex": 123,
"title": "<string>",
"status": "passed",
"type": "act",
"summary": "<string>",
"error": "<string>",
"errorCode": "AUTH_CREDENTIAL_UNAVAILABLE",
"startedAtMs": 123,
"completedAtMs": 123,
"reusableActionTrace": {
"version": 1,
"stepKey": "<string>",
"stepTitle": "<string>",
"actions": [
{
"order": 1,
"toolName": "<string>",
"summary": "<string>",
"gap": true,
"navigated": true,
"target": {
"kind": "role",
"role": "<string>",
"name": "<string>",
"nth": 1,
"selector": "<string>",
"element": "<string>",
"type": "<string>",
"identifier": "<string>",
"label": "<string>",
"matchCount": 1
},
"source": {
"kind": "role",
"role": "<string>",
"name": "<string>",
"nth": 1,
"selector": "<string>",
"element": "<string>",
"type": "<string>",
"identifier": "<string>",
"label": "<string>",
"matchCount": 1
},
"input": {
"url": "<string>",
"field": "username",
"option": "<string>",
"key": "<string>",
"direction": "up",
"amount": 123,
"deltaX": 123,
"deltaY": 123,
"targetPosition": "center",
"fromEdge": true,
"focused": true,
"sequentially": true,
"text": "<string>",
"assertion": "<string>",
"role": "<string>",
"name": "<string>",
"durationMs": 123,
"latitude": 123,
"longitude": 123,
"state": "offline"
}
}
],
"confidence": "medium",
"stepType": "act",
"truncated": true,
"startPath": "<string>",
"startScreen": "<string>",
"startScreenSignature": "<string>"
}
}
],
"uiActionIntervals": [
{
"startMs": 1,
"endMs": 1,
"kind": "click"
}
],
"recording": {
"storageKey": "<string>",
"fileName": "<string>",
"mediaType": "<string>"
}
},
"testPlan": {
"instructions": "<string>",
"focusAreas": [
"<string>"
],
"complexity": "simple",
"changeType": "frontend",
"steps": [
{
"title": "<string>",
"type": "act"
}
],
"executionConfig": {
"viewport": {
"width": 2080,
"height": 1200
}
}
},
"error": {
"code": "<string>",
"message": "<string>",
"stage": "<string>",
"retryable": true
},
"durationMs": 123,
"webhookUrl": "<string>",
"webhookStatus": "pending",
"testId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"stepResults": [
{
"stepIndex": 123,
"status": "pending",
"startedAt": "<string>",
"completedAt": "<string>",
"error": "<string>",
"retried": true,
"errorCode": "AUTH_CREDENTIAL_UNAVAILABLE",
"summary": "<string>",
"startedAtMs": 123,
"completedAtMs": 123
}
],
"userName": "<string>",
"externalRef": {},
"executionMode": "fast",
"autoRetryCount": 123,
"startedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
API key authentication using Bearer token format. The CLI's ta auth access tokens are also accepted; because they name a user rather than a workspace, a user in several workspaces selects one with the x-testerarmy-team header (workspace id or slug).
Path Parameters
Test run ID
Response
Run details
Unique run identifier
Run type
ci, test, discovery Current run status
queued, running, completed, failed, cancelled Original request input
Show child attributes
Show child attributes
When the run was created
Target platform
web, ios, android, null Mobile device the run used (iOS: iphone | ipad). Null for web runs and platforms without device variants.
iphone, ipad, null Run source
api, github_action, github_app, scheduled, webhook, structured_test, null Linked project ID
Run output when completed or skipped
- Option 1
- Option 2
Show child attributes
Show child attributes
Generated test plan (CI runs only)
Show child attributes
Show child attributes
Error details when failed
Show child attributes
Show child attributes
Execution time in milliseconds
Webhook delivery URL
Webhook delivery status
pending, delivered, failed, null Linked test ID
Step-level results for structured test runs
Show child attributes
Show child attributes
Display name of the user who triggered the run
External integration metadata (e.g. GitHub PR/deployment IDs)
Show child attributes
Show child attributes
Execution mode used for this run
fast, deep, null Number of times the run was automatically retried after a temporary failure. Failed attempts are not counted toward usage.
When execution started
When execution finished