curl --request POST \
--url https://api.mobileboost.io/tests/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"organisationId": "<string>",
"testIds": [
"<string>"
],
"uploadId": "<string>",
"bundleId": "<string>",
"platform": "<string>",
"testsRepo": "<string>",
"usePhysicalDevice": true,
"verificationRounds": 123,
"tunnelName": "<string>"
}
'import requests
url = "https://api.mobileboost.io/tests/generate"
payload = {
"organisationId": "<string>",
"testIds": ["<string>"],
"uploadId": "<string>",
"bundleId": "<string>",
"platform": "<string>",
"testsRepo": "<string>",
"usePhysicalDevice": True,
"verificationRounds": 123,
"tunnelName": "<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({
organisationId: '<string>',
testIds: ['<string>'],
uploadId: '<string>',
bundleId: '<string>',
platform: '<string>',
testsRepo: '<string>',
usePhysicalDevice: true,
verificationRounds: 123,
tunnelName: '<string>'
})
};
fetch('https://api.mobileboost.io/tests/generate', 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.mobileboost.io/tests/generate",
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([
'organisationId' => '<string>',
'testIds' => [
'<string>'
],
'uploadId' => '<string>',
'bundleId' => '<string>',
'platform' => '<string>',
'testsRepo' => '<string>',
'usePhysicalDevice' => true,
'verificationRounds' => 123,
'tunnelName' => '<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://api.mobileboost.io/tests/generate"
payload := strings.NewReader("{\n \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<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://api.mobileboost.io/tests/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mobileboost.io/tests/generate")
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 \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"started": [
{
"runId": "b1111111df174791a93e560390ea7e65",
"platform": "android"
}
],
"queued": [
"ios"
]
}Generate test automation
Write the automation code for a test that has a description but no working test file yet. Explores the app on a device, writes the test, verifies it by running it several times in a row, and commits it to the organisation’s test repository, after which the test is runnable via POST /tests/execute. By default this targets the newest build uploaded for every platform the organisation has one for, writing the platforms one after the other: the first creates the file, the next extends it with its own selectors. Pass uploadId, bundleId, or platform to narrow that. Generation is fire-and-forget: it queues on the organisation’s existing device slots and the response returns as soon as the work is dispatched, not once it finishes; follow it under platforms on GET /tests.
Retrying one platform. When GET /tests shows a test ready on one platform and failed or blocked on the other, call this with platform set to the one that needs writing again. The existing file is kept and extended for that platform. Both platforms share one file, so a test has one agent at a time: a request while either platform is still generating is refused with 409, naming the busy platform.
curl --request POST \
--url https://api.mobileboost.io/tests/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"organisationId": "<string>",
"testIds": [
"<string>"
],
"uploadId": "<string>",
"bundleId": "<string>",
"platform": "<string>",
"testsRepo": "<string>",
"usePhysicalDevice": true,
"verificationRounds": 123,
"tunnelName": "<string>"
}
'import requests
url = "https://api.mobileboost.io/tests/generate"
payload = {
"organisationId": "<string>",
"testIds": ["<string>"],
"uploadId": "<string>",
"bundleId": "<string>",
"platform": "<string>",
"testsRepo": "<string>",
"usePhysicalDevice": True,
"verificationRounds": 123,
"tunnelName": "<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({
organisationId: '<string>',
testIds: ['<string>'],
uploadId: '<string>',
bundleId: '<string>',
platform: '<string>',
testsRepo: '<string>',
usePhysicalDevice: true,
verificationRounds: 123,
tunnelName: '<string>'
})
};
fetch('https://api.mobileboost.io/tests/generate', 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.mobileboost.io/tests/generate",
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([
'organisationId' => '<string>',
'testIds' => [
'<string>'
],
'uploadId' => '<string>',
'bundleId' => '<string>',
'platform' => '<string>',
'testsRepo' => '<string>',
'usePhysicalDevice' => true,
'verificationRounds' => 123,
'tunnelName' => '<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://api.mobileboost.io/tests/generate"
payload := strings.NewReader("{\n \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<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://api.mobileboost.io/tests/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mobileboost.io/tests/generate")
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 \"organisationId\": \"<string>\",\n \"testIds\": [\n \"<string>\"\n ],\n \"uploadId\": \"<string>\",\n \"bundleId\": \"<string>\",\n \"platform\": \"<string>\",\n \"testsRepo\": \"<string>\",\n \"usePhysicalDevice\": true,\n \"verificationRounds\": 123,\n \"tunnelName\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"started": [
{
"runId": "b1111111df174791a93e560390ea7e65",
"platform": "android"
}
],
"queued": [
"ios"
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Your MobileBoost organisation ID.
IDs of existing test cases to write automation for. Each test must already have a description, since generation writes code for the described behaviour rather than inventing one.
Write the automation against a specific uploaded build instead of the organisation's newest one.
Write the automation against the app already installed on your reserved device, instead of an uploaded build. May omit platform, which is then taken from the reserved device.
Restrict generation to one platform (ios or android). Taken from the upload when omitted with uploadId; with neither uploadId nor bundleId, omitting this generates against every platform the organisation has a build for. Also how you retry a single platform: after GET /tests reports platforms.android.state as failed, generate again with platform: "android" and the existing file is extended for Android only.
Override the organisation's managed test repository. Normally left unset, since generation resolves the repo automatically and creates one if the organisation doesn't have one yet.
Run the generation on a physical device instead of a simulator/emulator. Forced on automatically for iOS .ipa builds and for bundle-only (buildless) generation.
How many consecutive passing runs the generated test must produce before it is committed. Defaults to 3. Raising this increases confidence at the cost of one full test run per extra round.
Name of the tunnel to route the device through, for apps whose flow touches an internal/non-public host.
Response
Successful response
One entry per test whose generation was dispatched, for the first platform.
Show child attributes
Show child attributes
Platforms queued to start once the first platform's generation finishes (only present when a test needs automation on more than one platform).
Only present when some, but not all, of the requested tests could not be started. Each entry names the test and the reason.
Show child attributes
Show child attributes

