curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id}"
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/{run_id}', 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/{run_id}",
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/{run_id}"
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/{run_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id}")
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,
"ai_analysis": "The email step failed because the recipient address was missing from the trigger payload.",
"steps": [
{
"completed_at": "2026-08-25T09:12:46Z",
"duration_ms": 1840,
"error_message": "",
"started_at": "2026-08-25T09:12:44Z",
"status": "completed",
"task_name": "send_email",
"task_type": "call"
}
],
"credits_consumed": 0.5,
"status_reason": "",
"definition_version_id": "9f2c1a7b3e5d84f60c1b2a9e7d4f8c3b6a5e2d1f0c9b8a7e6d5c4b3a2f1e0d9c"
}Get workflow run
Returns the specified run with its step-by-step log.
The steps field walks the tasks the run executed in order, each with its status, timing, and error if it failed. The definition_version_id field names the version the run executed, which can be older than the workflow’s current one.
Each step also carries the data that went into it and came out of it. Those fields are not documented here because their shape is whatever your workflow passes around, but they are in the response.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id}"
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/{run_id}', 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/{run_id}",
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/{run_id}"
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/{run_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/workflows/{workflow_id}/runs/{run_id}")
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,
"ai_analysis": "The email step failed because the recipient address was missing from the trigger payload.",
"steps": [
{
"completed_at": "2026-08-25T09:12:46Z",
"duration_ms": 1840,
"error_message": "",
"started_at": "2026-08-25T09:12:44Z",
"status": "completed",
"task_name": "send_email",
"task_type": "call"
}
],
"credits_consumed": 0.5,
"status_reason": "",
"definition_version_id": "9f2c1a7b3e5d84f60c1b2a9e7d4f8c3b6a5e2d1f0c9b8a7e6d5c4b3a2f1e0d9c"
}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.
Path Parameters
ID of the app whose workflows you want to work with.
ID of the workflow, as returned in id by List workflows.
ID of the run, as returned in run_id by List runs for a workflow.
Response
The run and its steps.
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.
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 rather than by its trigger.
false
Stored failure explanation, once Analyze a failed workflow run has generated one. This is null until then.
"The email step failed because the recipient address was missing from the trigger payload."
The tasks the run executed, in order. Each carries task_name, task_type, status, started_at, completed_at, duration_ms and error_message, plus the data that went into and came out of the step, whose shape is whatever your workflow passes around.
[
{
"completed_at": "2026-08-25T09:12:46Z",
"duration_ms": 1840,
"error_message": "",
"started_at": "2026-08-25T09:12:44Z",
"status": "completed",
"task_name": "send_email",
"task_type": "call"
}
]
Credits the run used.
0.5
Why the run failed or was cancelled. Empty on runs that finished successfully.
""
Version the run executed, which can be older than the workflow's current one. Read it with Get workflow version.
"9f2c1a7b3e5d84f60c1b2a9e7d4f8c3b6a5e2d1f0c9b8a7e6d5c4b3a2f1e0d9c"
Was this page helpful?