curl --request POST \
--url https://api.qa.tech/v1/runs/{runShortId}/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectShortId": "<string>",
"includeVideos": true
}
'import requests
url = "https://api.qa.tech/v1/runs/{runShortId}/exports"
payload = {
"projectShortId": "<string>",
"includeVideos": True
}
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({projectShortId: '<string>', includeVideos: true})
};
fetch('https://api.qa.tech/v1/runs/{runShortId}/exports', 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/runs/{runShortId}/exports",
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([
'projectShortId' => '<string>',
'includeVideos' => true
]),
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/runs/{runShortId}/exports"
payload := strings.NewReader("{\n \"projectShortId\": \"<string>\",\n \"includeVideos\": true\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/runs/{runShortId}/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"projectShortId\": \"<string>\",\n \"includeVideos\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/runs/{runShortId}/exports")
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 \"projectShortId\": \"<string>\",\n \"includeVideos\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"runShortId": "<string>",
"status": "pending",
"includeVideos": true,
"sizeBytes": 123,
"sha256": "<string>",
"fileCount": 123,
"error": "<string>",
"createdAt": "<string>",
"completedAt": "<string>",
"downloadUrl": "<string>",
"downloadUrlExpiresAt": "<string>"
}Export run test record
Start building a test record archive for a finished run: a zip with a README in a regulatory test record layout (EU MDR, IEC 62304, ISO 13485, ISO/IEC/IEEE 29119-3), every test step and action with screenshots and recordings, the raw logs, JUnit XML and a manifest with the SHA-256 of every file. The archive holds no links back to QA.tech.
Returns 202 with the export. When a completed export with the same options
exists for the run’s latest results, or one is already being built, that
export is returned instead of starting another. Returns 409 while the run
is still in progress. Poll get_run_export until status is completed,
then download downloadUrl.
curl --request POST \
--url https://api.qa.tech/v1/runs/{runShortId}/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"projectShortId": "<string>",
"includeVideos": true
}
'import requests
url = "https://api.qa.tech/v1/runs/{runShortId}/exports"
payload = {
"projectShortId": "<string>",
"includeVideos": True
}
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({projectShortId: '<string>', includeVideos: true})
};
fetch('https://api.qa.tech/v1/runs/{runShortId}/exports', 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/runs/{runShortId}/exports",
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([
'projectShortId' => '<string>',
'includeVideos' => true
]),
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/runs/{runShortId}/exports"
payload := strings.NewReader("{\n \"projectShortId\": \"<string>\",\n \"includeVideos\": true\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/runs/{runShortId}/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"projectShortId\": \"<string>\",\n \"includeVideos\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qa.tech/v1/runs/{runShortId}/exports")
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 \"projectShortId\": \"<string>\",\n \"includeVideos\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"runShortId": "<string>",
"status": "pending",
"includeVideos": true,
"sizeBytes": 123,
"sha256": "<string>",
"fileCount": 123,
"error": "<string>",
"createdAt": "<string>",
"completedAt": "<string>",
"downloadUrl": "<string>",
"downloadUrlExpiresAt": "<string>"
}Path Parameters
Body
Request body for exporting a run's test record.
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(-.+_.+|_.+)$Include session recordings in the archive. Defaults to true. Recordings make the archive much larger.
Response
The request has been accepted for processing, but processing has not yet completed.
A test record export of a run: one zip with a README in a regulatory test record layout, every test step and recorded action with screenshots and recordings, the raw logs and a manifest with the SHA-256 of every file.
Export ID. Pass it to get_run_export to poll.
Short ID of the exported run.
pending and running while the archive is built; then completed or failed.
pending, running, completed, failed Whether session recordings are included.
Size of the zip in bytes, once completed.
SHA-256 of the zip (hex), once completed. Verify the download against it.
Number of files in the zip, once completed.
Why the export failed, when status is failed.
When the export was requested (ISO 8601).
When the export finished (ISO 8601).
Signed URL for the zip, valid for one hour. Minted on every request once completed; null otherwise.
When downloadUrl stops working (ISO 8601).
Was this page helpful?