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",
"focused": true,
"sequentially": true,
"text": "<string>",
"assertion": "<string>",
"role": "<string>",
"name": "<string>",
"durationMs": 1,
"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>"
}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",
"focused": true,
"sequentially": true,
"text": "<string>",
"assertion": "<string>",
"role": "<string>",
"name": "<string>",
"durationMs": 1,
"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
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 Non-default mobile device variant within the run platform (e.g. ipad on iOS). Null means the platform default phone-sized device; explicitly requested defaults are stored as null.
iphone, ipad, null Run source
api, github_action, github_app, scheduled, webhook, structured_test, null Linked project ID
Run output when completed or skipped
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