curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/testing-agent/executions \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/testing-agent/executions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/testing-agent/executions', 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://app.base44.com/api/apps/{app_id}/testing-agent/executions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/testing-agent/executions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/testing-agent/executions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/testing-agent/executions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": "68a1c9b7f0b3d9001a7e5d04",
"app_id": "6820f3a4e7b91d003c45a1f2",
"flow_id": "68a1c2e4f0b3d9001a7e5c21",
"flow_goal": "Sign up, create a project called Launch, and check that it appears on the dashboard.",
"flow_role": "admin",
"site_url": "https://preview-6820f3a4e7b91d003c45a1f2.base44.app/?_preview_token=FH-j7wHS7IR_fC1tUh4wCd_fNV1XGC479cuqNSYi9mA",
"status": "success",
"actions": [
{
"step_summary": "Clicked Sign up in the header to reach the registration form.",
"step_title": "Opened the sign-up form"
}
],
"result_message": "Created the project and found it on the dashboard.",
"goal_accomplished": true,
"live_status": "Analyzing results",
"analysis_status": "completed",
"failure_reason": "app",
"credits_charged": 1.5,
"started_at": "2026-09-28T10:16:02+00:00",
"completed_at": "2026-09-28T10:18:40+00:00",
"created_date": "2026-09-28T10:16:00+00:00",
"updated_date": "2026-09-28T10:18:40+00:00"
}
]{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}List test runs
Returns the app’s 100 most recent test runs, newest first. Set flow_id to get only one test’s runs. Older runs can’t be listed.
This is limited to 6000 requests per minute per caller for each app. Some workspaces have a different limit.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/testing-agent/executions \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/testing-agent/executions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/testing-agent/executions', 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://app.base44.com/api/apps/{app_id}/testing-agent/executions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/testing-agent/executions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/testing-agent/executions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/testing-agent/executions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"id": "68a1c9b7f0b3d9001a7e5d04",
"app_id": "6820f3a4e7b91d003c45a1f2",
"flow_id": "68a1c2e4f0b3d9001a7e5c21",
"flow_goal": "Sign up, create a project called Launch, and check that it appears on the dashboard.",
"flow_role": "admin",
"site_url": "https://preview-6820f3a4e7b91d003c45a1f2.base44.app/?_preview_token=FH-j7wHS7IR_fC1tUh4wCd_fNV1XGC479cuqNSYi9mA",
"status": "success",
"actions": [
{
"step_summary": "Clicked Sign up in the header to reach the registration form.",
"step_title": "Opened the sign-up form"
}
],
"result_message": "Created the project and found it on the dashboard.",
"goal_accomplished": true,
"live_status": "Analyzing results",
"analysis_status": "completed",
"failure_reason": "app",
"credits_charged": 1.5,
"started_at": "2026-09-28T10:16:02+00:00",
"completed_at": "2026-09-28T10:18:40+00:00",
"created_date": "2026-09-28T10:16:00+00:00",
"updated_date": "2026-09-28T10:18:40+00:00"
}
]{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Scopes
Response
The runs, newest first.
Where the run is. pending, running and analyzing mean it's still going. success means the browser session finished, and failed means it didn't. timeout, cancelled and paused mean the run stopped early. The test passed when goal_accomplished is true and failure_reason isn't platform or internal.
pending, running, analyzing, success, failed, timeout, cancelled, paused "success"
Progress of the run's report. completed means Get test run report has it. null before the run reaches analysis.
pending, completed, failed "completed"
Why the run didn't pass, or null when no reason was recorded. app is a problem in your app. platform and internal are problems on Base44's side, so rerun the test. out_of_credits comes with status paused.
app, platform, internal, out_of_credits "app"
Was this page helpful?