curl --request POST \
--url http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--header 'X-QA-Lab-Admin-Id: <x-qa-lab-admin-id>' \
--header 'X-QA-Lab-Nonce: <x-qa-lab-nonce>' \
--header 'X-QA-Lab-Permission: <x-qa-lab-permission>' \
--header 'X-QA-Lab-Signature: <api-key>' \
--header 'X-QA-Lab-Timestamp: <x-qa-lab-timestamp>' \
--data '
{
"trigger_key": "availability.confirm",
"trigger_version": 1,
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers"
payload = {
"trigger_key": "availability.confirm",
"trigger_version": 1,
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-API-KEY": "<api-key>",
"X-QA-Lab-Admin-Id": "<x-qa-lab-admin-id>",
"X-QA-Lab-Timestamp": "<x-qa-lab-timestamp>",
"X-QA-Lab-Nonce": "<x-qa-lab-nonce>",
"X-QA-Lab-Permission": "<x-qa-lab-permission>",
"X-QA-Lab-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'X-QA-Lab-Admin-Id': '<x-qa-lab-admin-id>',
'X-QA-Lab-Timestamp': '<x-qa-lab-timestamp>',
'X-QA-Lab-Nonce': '<x-qa-lab-nonce>',
'X-QA-Lab-Permission': '<x-qa-lab-permission>',
'X-QA-Lab-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
trigger_key: 'availability.confirm',
trigger_version: 1,
idempotency_key: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers', 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 => "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers",
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([
'trigger_key' => 'availability.confirm',
'trigger_version' => 1,
'idempotency_key' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>",
"X-QA-Lab-Admin-Id: <x-qa-lab-admin-id>",
"X-QA-Lab-Nonce: <x-qa-lab-nonce>",
"X-QA-Lab-Permission: <x-qa-lab-permission>",
"X-QA-Lab-Signature: <api-key>",
"X-QA-Lab-Timestamp: <x-qa-lab-timestamp>"
],
]);
$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 := "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers"
payload := strings.NewReader("{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-QA-Lab-Admin-Id", "<x-qa-lab-admin-id>")
req.Header.Add("X-QA-Lab-Timestamp", "<x-qa-lab-timestamp>")
req.Header.Add("X-QA-Lab-Nonce", "<x-qa-lab-nonce>")
req.Header.Add("X-QA-Lab-Permission", "<x-qa-lab-permission>")
req.Header.Add("X-QA-Lab-Signature", "<api-key>")
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("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers")
.header("X-API-KEY", "<api-key>")
.header("X-QA-Lab-Admin-Id", "<x-qa-lab-admin-id>")
.header("X-QA-Lab-Timestamp", "<x-qa-lab-timestamp>")
.header("X-QA-Lab-Nonce", "<x-qa-lab-nonce>")
.header("X-QA-Lab-Permission", "<x-qa-lab-permission>")
.header("X-QA-Lab-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-QA-Lab-Admin-Id"] = '<x-qa-lab-admin-id>'
request["X-QA-Lab-Timestamp"] = '<x-qa-lab-timestamp>'
request["X-QA-Lab-Nonce"] = '<x-qa-lab-nonce>'
request["X-QA-Lab-Permission"] = '<x-qa-lab-permission>'
request["X-QA-Lab-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_bodyRun a declared post-generation test action
Runs only an action declared by the run’s registered scenario definition. The run must belong to the signed administrator. Trigger identity and idempotency are enforced by the backend.
curl --request POST \
--url http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--header 'X-QA-Lab-Admin-Id: <x-qa-lab-admin-id>' \
--header 'X-QA-Lab-Nonce: <x-qa-lab-nonce>' \
--header 'X-QA-Lab-Permission: <x-qa-lab-permission>' \
--header 'X-QA-Lab-Signature: <api-key>' \
--header 'X-QA-Lab-Timestamp: <x-qa-lab-timestamp>' \
--data '
{
"trigger_key": "availability.confirm",
"trigger_version": 1,
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers"
payload = {
"trigger_key": "availability.confirm",
"trigger_version": 1,
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
headers = {
"X-API-KEY": "<api-key>",
"X-QA-Lab-Admin-Id": "<x-qa-lab-admin-id>",
"X-QA-Lab-Timestamp": "<x-qa-lab-timestamp>",
"X-QA-Lab-Nonce": "<x-qa-lab-nonce>",
"X-QA-Lab-Permission": "<x-qa-lab-permission>",
"X-QA-Lab-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-API-KEY': '<api-key>',
'X-QA-Lab-Admin-Id': '<x-qa-lab-admin-id>',
'X-QA-Lab-Timestamp': '<x-qa-lab-timestamp>',
'X-QA-Lab-Nonce': '<x-qa-lab-nonce>',
'X-QA-Lab-Permission': '<x-qa-lab-permission>',
'X-QA-Lab-Signature': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
trigger_key: 'availability.confirm',
trigger_version: 1,
idempotency_key: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers', 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 => "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers",
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([
'trigger_key' => 'availability.confirm',
'trigger_version' => 1,
'idempotency_key' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>",
"X-QA-Lab-Admin-Id: <x-qa-lab-admin-id>",
"X-QA-Lab-Nonce: <x-qa-lab-nonce>",
"X-QA-Lab-Permission: <x-qa-lab-permission>",
"X-QA-Lab-Signature: <api-key>",
"X-QA-Lab-Timestamp: <x-qa-lab-timestamp>"
],
]);
$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 := "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers"
payload := strings.NewReader("{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("X-QA-Lab-Admin-Id", "<x-qa-lab-admin-id>")
req.Header.Add("X-QA-Lab-Timestamp", "<x-qa-lab-timestamp>")
req.Header.Add("X-QA-Lab-Nonce", "<x-qa-lab-nonce>")
req.Header.Add("X-QA-Lab-Permission", "<x-qa-lab-permission>")
req.Header.Add("X-QA-Lab-Signature", "<api-key>")
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("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers")
.header("X-API-KEY", "<api-key>")
.header("X-QA-Lab-Admin-Id", "<x-qa-lab-admin-id>")
.header("X-QA-Lab-Timestamp", "<x-qa-lab-timestamp>")
.header("X-QA-Lab-Nonce", "<x-qa-lab-nonce>")
.header("X-QA-Lab-Permission", "<x-qa-lab-permission>")
.header("X-QA-Lab-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/triggers")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["X-QA-Lab-Admin-Id"] = '<x-qa-lab-admin-id>'
request["X-QA-Lab-Timestamp"] = '<x-qa-lab-timestamp>'
request["X-QA-Lab-Nonce"] = '<x-qa-lab-nonce>'
request["X-QA-Lab-Permission"] = '<x-qa-lab-permission>'
request["X-QA-Lab-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"trigger_key\": \"availability.confirm\",\n \"trigger_version\": 1,\n \"idempotency_key\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Server-to-Server API Key for internal/lambda/cron calls
HMAC-SHA256 signature for a one-use, short-lived Back Office administrator envelope. Used together with the dedicated X-API-KEY credential and the signed administrator, timestamp, nonce, and permission headers.
Headers
Dedicated QA Scenario Lab service credential.
Positive initiating Back Office administrator ID included in the signature.
x >= 142
Ten-digit Unix timestamp. Default maximum age is 300 seconds.
1791194024
One-use UUID included in the signature.
Signed permission claim.
qa_scenario_lab Lowercase hexadecimal HMAC-SHA256 of the canonical request envelope.
64^[a-f0-9]{64}$Path Parameters
Body
Response
Saved trigger attempt and its evidence.