curl --request POST \
--url http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup \
--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 '
{
"dry_run": true
}
'import requests
url = "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup"
payload = { "dry_run": True }
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({dry_run: true})
};
fetch('http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup', 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}/cleanup",
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([
'dry_run' => true
]),
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}/cleanup"
payload := strings.NewReader("{\n \"dry_run\": true\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}/cleanup")
.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 \"dry_run\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup")
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 \"dry_run\": true\n}"
response = http.request(request)
puts response.read_bodyPreview or apply ownership-safe cleanup for one DEV run
DEV-only and repeat-safe. The run must belong to the signed administrator. Referenced accounts and shared resources are protected; only entities recorded as created and still attributable to this run are removed.
curl --request POST \
--url http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup \
--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 '
{
"dry_run": true
}
'import requests
url = "http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup"
payload = { "dry_run": True }
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({dry_run: true})
};
fetch('http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup', 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}/cleanup",
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([
'dry_run' => true
]),
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}/cleanup"
payload := strings.NewReader("{\n \"dry_run\": true\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}/cleanup")
.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 \"dry_run\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost/mogl/mogl-backend/api/internal/qa-scenario-lab/runs/{run}/cleanup")
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 \"dry_run\": true\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
true
Response
Per-run cleanup result and aggregate counts.