curl --request POST \
--url https://tester.army/api/v1/projects/{projectId}/discovery-runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"goal": "<string>",
"targetUrl": "<string>",
"appId": "<string>"
}
'import requests
url = "https://tester.army/api/v1/projects/{projectId}/discovery-runs"
payload = {
"goal": "<string>",
"targetUrl": "<string>",
"appId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({goal: '<string>', targetUrl: '<string>', appId: '<string>'})
};
fetch('https://tester.army/api/v1/projects/{projectId}/discovery-runs', 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/projects/{projectId}/discovery-runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'goal' => '<string>',
'targetUrl' => '<string>',
'appId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tester.army/api/v1/projects/{projectId}/discovery-runs"
payload := strings.NewReader("{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tester.army/api/v1/projects/{projectId}/discovery-runs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tester.army/api/v1/projects/{projectId}/discovery-runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "queued",
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"platform": "web"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Queue a free-roam discovery run: the QA agent gets only a goal, decides what to test itself, and reports every bug it finds. Supports web, iOS, and Android; mobile platforms explore the uploaded app. FAILED means bugs were found.
curl --request POST \
--url https://tester.army/api/v1/projects/{projectId}/discovery-runs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"goal": "<string>",
"targetUrl": "<string>",
"appId": "<string>"
}
'import requests
url = "https://tester.army/api/v1/projects/{projectId}/discovery-runs"
payload = {
"goal": "<string>",
"targetUrl": "<string>",
"appId": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({goal: '<string>', targetUrl: '<string>', appId: '<string>'})
};
fetch('https://tester.army/api/v1/projects/{projectId}/discovery-runs', 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/projects/{projectId}/discovery-runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'goal' => '<string>',
'targetUrl' => '<string>',
'appId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://tester.army/api/v1/projects/{projectId}/discovery-runs"
payload := strings.NewReader("{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://tester.army/api/v1/projects/{projectId}/discovery-runs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tester.army/api/v1/projects/{projectId}/discovery-runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"goal\": \"<string>\",\n \"targetUrl\": \"<string>\",\n \"appId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "queued",
"runId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"platform": "web"
}{
"error": "<string>",
"message": "<string>"
}{
"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
Project ID or shortId
Body
The exploration goal for the free-roam QA agent, e.g. "Explore the checkout flow and find bugs". The agent decides what to test; there is no predefined step list.
8 - 2000Optional URL to explore instead of the project's production URL. Web only.
Target platform; defaults to web. Mobile platforms explore the uploaded app.
web, ios, android Uploaded mobile app ID to explore. Defaults to the project's latest app for the platform.
Mobile device variant within the platform (e.g. ipad on iOS). Omit for the default phone-sized device.
iphone, ipad