curl --request POST \
--url https://api.qa.tech/v1/run \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"actor": "<string>",
"branch": "<string>",
"commitHash": "<string>",
"commitMessage": "<string>",
"repository": "<string>",
"repositoryUrl": "<string>",
"testPlanShortId": "<string>",
"testCaseIds": [
"<string>"
],
"applications": [
{
"applicationShortId": "<string>",
"devicePresetShortId": "<string>",
"environment": {
"url": "<string>",
"name": "<string>",
"customHeaders": [
{
"domains": [
"<string>"
],
"headers": {}
}
]
}
}
],
"notifications": [
{
"type": "slack",
"channel": "<string>",
"enabled": true
}
],
"parameters": {
"configs": {},
"configsByEnvironment": {}
},
"projectShortId": "<string>"
}
'import requests
url = "https://api.qa.tech/v1/run"
payload = {
"actor": "<string>",
"branch": "<string>",
"commitHash": "<string>",
"commitMessage": "<string>",
"repository": "<string>",
"repositoryUrl": "<string>",
"testPlanShortId": "<string>",
"testCaseIds": ["<string>"],
"applications": [
{
"applicationShortId": "<string>",
"devicePresetShortId": "<string>",
"environment": {
"url": "<string>",
"name": "<string>",
"customHeaders": [
{
"domains": ["<string>"],
"headers": {}
}
]
}
}
],
"notifications": [
{
"type": "slack",
"channel": "<string>",
"enabled": True
}
],
"parameters": {
"configs": {},
"configsByEnvironment": {}
},
"projectShortId": "<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({
actor: '<string>',
branch: '<string>',
commitHash: '<string>',
commitMessage: '<string>',
repository: '<string>',
repositoryUrl: '<string>',
testPlanShortId: '<string>',
testCaseIds: ['<string>'],
applications: [
{
applicationShortId: '<string>',
devicePresetShortId: '<string>',
environment: {
url: '<string>',
name: '<string>',
customHeaders: [{domains: ['<string>'], headers: {}}]
}
}
],
notifications: [{type: 'slack', channel: '<string>', enabled: true}],
parameters: {configs: {}, configsByEnvironment: {}},
projectShortId: '<string>'
})
};
fetch('https://api.qa.tech/v1/run', 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.qa.tech/v1/run",
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([
'actor' => '<string>',
'branch' => '<string>',
'commitHash' => '<string>',
'commitMessage' => '<string>',
'repository' => '<string>',
'repositoryUrl' => '<string>',
'testPlanShortId' => '<string>',
'testCaseIds' => [
'<string>'
],
'applications' => [
[
'applicationShortId' => '<string>',
'devicePresetShortId' => '<string>',
'environment' => [
'url' => '<string>',
'name' => '<string>',
'customHeaders' => [
[
'domains' => [
'<string>'
],
'headers' => [
]
]
]
]
]
],
'notifications' => [
[
'type' => 'slack',
'channel' => '<string>',
'enabled' => true
]
],
'parameters' => [
'configs' => [
],
'configsByEnvironment' => [
]
],
'projectShortId' => '<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.qa.tech/v1/run"
payload := strings.NewReader("{\n \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<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.qa.tech/v1/run")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/run")
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 \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"run": {
"id": "<string>",
"shortId": "<string>",
"url": "<string>",
"testCount": 123,
"testPlan": {
"name": "<string>",
"shortId": "<string>"
}
}
}Start test run
Execute a run for a given project. Supports API, GITHUB, or GITLAB trigger. For version-control triggers, provide actor, branch, commitHash, commitMessage, and repository. For GITLAB, also provide repositoryUrl so links work with GitLab.com and self-hosted instances. Use applications to override environment or device preset per run.
curl --request POST \
--url https://api.qa.tech/v1/run \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"actor": "<string>",
"branch": "<string>",
"commitHash": "<string>",
"commitMessage": "<string>",
"repository": "<string>",
"repositoryUrl": "<string>",
"testPlanShortId": "<string>",
"testCaseIds": [
"<string>"
],
"applications": [
{
"applicationShortId": "<string>",
"devicePresetShortId": "<string>",
"environment": {
"url": "<string>",
"name": "<string>",
"customHeaders": [
{
"domains": [
"<string>"
],
"headers": {}
}
]
}
}
],
"notifications": [
{
"type": "slack",
"channel": "<string>",
"enabled": true
}
],
"parameters": {
"configs": {},
"configsByEnvironment": {}
},
"projectShortId": "<string>"
}
'import requests
url = "https://api.qa.tech/v1/run"
payload = {
"actor": "<string>",
"branch": "<string>",
"commitHash": "<string>",
"commitMessage": "<string>",
"repository": "<string>",
"repositoryUrl": "<string>",
"testPlanShortId": "<string>",
"testCaseIds": ["<string>"],
"applications": [
{
"applicationShortId": "<string>",
"devicePresetShortId": "<string>",
"environment": {
"url": "<string>",
"name": "<string>",
"customHeaders": [
{
"domains": ["<string>"],
"headers": {}
}
]
}
}
],
"notifications": [
{
"type": "slack",
"channel": "<string>",
"enabled": True
}
],
"parameters": {
"configs": {},
"configsByEnvironment": {}
},
"projectShortId": "<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({
actor: '<string>',
branch: '<string>',
commitHash: '<string>',
commitMessage: '<string>',
repository: '<string>',
repositoryUrl: '<string>',
testPlanShortId: '<string>',
testCaseIds: ['<string>'],
applications: [
{
applicationShortId: '<string>',
devicePresetShortId: '<string>',
environment: {
url: '<string>',
name: '<string>',
customHeaders: [{domains: ['<string>'], headers: {}}]
}
}
],
notifications: [{type: 'slack', channel: '<string>', enabled: true}],
parameters: {configs: {}, configsByEnvironment: {}},
projectShortId: '<string>'
})
};
fetch('https://api.qa.tech/v1/run', 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.qa.tech/v1/run",
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([
'actor' => '<string>',
'branch' => '<string>',
'commitHash' => '<string>',
'commitMessage' => '<string>',
'repository' => '<string>',
'repositoryUrl' => '<string>',
'testPlanShortId' => '<string>',
'testCaseIds' => [
'<string>'
],
'applications' => [
[
'applicationShortId' => '<string>',
'devicePresetShortId' => '<string>',
'environment' => [
'url' => '<string>',
'name' => '<string>',
'customHeaders' => [
[
'domains' => [
'<string>'
],
'headers' => [
]
]
]
]
]
],
'notifications' => [
[
'type' => 'slack',
'channel' => '<string>',
'enabled' => true
]
],
'parameters' => [
'configs' => [
],
'configsByEnvironment' => [
]
],
'projectShortId' => '<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.qa.tech/v1/run"
payload := strings.NewReader("{\n \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<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.qa.tech/v1/run")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/run")
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 \"actor\": \"<string>\",\n \"branch\": \"<string>\",\n \"commitHash\": \"<string>\",\n \"commitMessage\": \"<string>\",\n \"repository\": \"<string>\",\n \"repositoryUrl\": \"<string>\",\n \"testPlanShortId\": \"<string>\",\n \"testCaseIds\": [\n \"<string>\"\n ],\n \"applications\": [\n {\n \"applicationShortId\": \"<string>\",\n \"devicePresetShortId\": \"<string>\",\n \"environment\": {\n \"url\": \"<string>\",\n \"name\": \"<string>\",\n \"customHeaders\": [\n {\n \"domains\": [\n \"<string>\"\n ],\n \"headers\": {}\n }\n ]\n }\n }\n ],\n \"notifications\": [\n {\n \"type\": \"slack\",\n \"channel\": \"<string>\",\n \"enabled\": true\n }\n ],\n \"parameters\": {\n \"configs\": {},\n \"configsByEnvironment\": {}\n },\n \"projectShortId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"run": {
"id": "<string>",
"shortId": "<string>",
"url": "<string>",
"testCount": 123,
"testPlan": {
"name": "<string>",
"shortId": "<string>"
}
}
}Body
Request body for triggering a test run. Supports GitHub and GitLab trigger fields, application overrides, and optional parameters for config overrides (merged into the blueprint).
API, GITHUB, GITLAB Username that triggered the CI job. Example: octocat.
Branch the run was triggered from. Example: main or refs/heads/main.
Full commit SHA the run was triggered for. Used to link the run back to the commit.
Commit message subject for the triggering commit.
Repository the run was triggered from, as owner/name. Example: QAdottech/qatech.
Base repository URL for GitLab, including the origin and project path. Supports self-hosted GitLab instances.
^https?:\x2f\x2f^pln(-.+_.+|_.+)$Show child attributes
Show child attributes
Per-run notification override. Use type none to suppress all notifications for the run, including project defaults.
- Option 1
- Option 2
- Option 3
- Option 4
Show child attributes
Show child attributes
Optional run-time parameter overrides merged into the blueprint (after test plan defaults). Use configs to replace full config payloads by config short id (map keys are strings such as cfg_... or human-readable slugs); use configsByEnvironment for environment-specific overrides (outer key is environment UUID).
Show child attributes
Show child attributes
Target a specific project by its prefixed short ID (proj-slug_shortId or proj_shortId), as returned by the projects API. Required for organization-scoped API keys; project-scoped keys may only pass their own project's short ID.
^proj(-.+_.+|_.+)$Was this page helpful?