curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs"
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}/workflows/{workflow_id}/runs', 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}/workflows/{workflow_id}/runs",
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}/workflows/{workflow_id}/runs"
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}/workflows/{workflow_id}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs")
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[
{
"run_id": "0195f2a1-4c3e-7b21-9f0d-2a5c8e1b4d77",
"workflow_id": "68b1c0d4e7b91d003c45a1f2",
"status": "completed",
"workflow_name": "Email me new signups",
"trigger_type": "scheduled",
"started_at": "2026-08-25T09:12:44Z",
"completed_at": "2026-08-25T09:12:46Z",
"duration_ms": 1840,
"steps_count": 3,
"error_message": "The email step failed because the recipient address was missing.",
"is_test_run": false,
"credits_consumed": 0.5,
"status_reason": ""
}
]{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}List runs for a workflow
Returns the workflow’s runs, newest first.
Use status to keep only runs in one state, since to keep only runs after a moment in time, and limit with offset to page.
Manual runs started through Run a workflow now appear here with is_test_run set to true.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs"
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}/workflows/{workflow_id}/runs', 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}/workflows/{workflow_id}/runs",
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}/workflows/{workflow_id}/runs"
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}/workflows/{workflow_id}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs")
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[
{
"run_id": "0195f2a1-4c3e-7b21-9f0d-2a5c8e1b4d77",
"workflow_id": "68b1c0d4e7b91d003c45a1f2",
"status": "completed",
"workflow_name": "Email me new signups",
"trigger_type": "scheduled",
"started_at": "2026-08-25T09:12:44Z",
"completed_at": "2026-08-25T09:12:46Z",
"duration_ms": 1840,
"steps_count": 3,
"error_message": "The email step failed because the recipient address was missing.",
"is_test_run": false,
"credits_consumed": 0.5,
"status_reason": ""
}
]{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app whose workflows you want to work with.
ID of the workflow, as returned in id by List workflows.
Query Parameters
Most runs to return.
1 <= x <= 200How many runs to skip, for paging.
x >= 0Keep only runs in this state, for example failed.
Keep only runs that started at or after this ISO 8601 datetime.
Response
The workflow's runs, newest first.
ID of the run.
"0195f2a1-4c3e-7b21-9f0d-2a5c8e1b4d77"
ID of the workflow that ran.
"68b1c0d4e7b91d003c45a1f2"
How the run is going: running, completed, failed, or cancelled. See Workflow status for how this compares to the workflow's own status.
"completed"
Name of that workflow at the time of the run.
"Email me new signups"
What started the run: scheduled, entity, connector, in_app_agent, app_user_auth, app_publish, app_payment, webhook, or goal_file. See Triggers for what each one fires on. A run started through Run a workflow now with no payload to replay reports manual instead.
"scheduled"
When the run started, as an ISO 8601 UTC timestamp.
"2026-08-25T09:12:44Z"
When the run finished, as an ISO 8601 UTC timestamp. This is null while it is still running.
"2026-08-25T09:12:46Z"
How long the run took, in milliseconds. This is 0 while it is still running.
1840
Steps the run executed.
3
Why the run failed. This is null when it did not fail.
"The email step failed because the recipient address was missing."
This is true when the run was started by hand through Run a workflow now, rather than by its trigger.
false
Credits the run used.
0.5
Why the run failed or was cancelled. Empty on runs that finished successfully.
""
Was this page helpful?