List Automation Runs
curl --request GET \
--url https://api.example.com/automations/runsimport requests
url = "https://api.example.com/automations/runs"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/automations/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://api.example.com/automations/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.example.com/automations/runs"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/automations/runs")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/automations/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyAutomations
List Automation Runs
List runs across every agent in a workspace, including failed-node detail, for external stalled/failed-job checks.
GET
/
automations
/
runs
List Automation Runs
curl --request GET \
--url https://api.example.com/automations/runsimport requests
url = "https://api.example.com/automations/runs"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/automations/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://api.example.com/automations/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.example.com/automations/runs"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/automations/runs")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/automations/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReturns runs for a whole workspace (not just one agent) with the nodes that failed inside each run. Pair it with List Ingest Batches to cover the full path from upload through processing.
Request
curl -X GET "https://api.mosaic.so/automations/runs?status=failed&limit=100" \
-H "Authorization: Bearer mk_your_api_key" \
-H "x-workspace-id: [workspace_id]"
Query Parameters
| Field | Type | Required | Description |
|---|---|---|---|
since | string | No | ISO timestamp lower bound on run created_at (default: 14 days ago). |
status | string | No | Comma-separated run statuses (for example failed,cancelled). |
agent_id | string | No | Restrict results to one agent. |
production_id | string | No | Restrict results to one production. |
batch_key | string | No | Restrict results to one batch key. |
limit | number | No | Page size (1-500, default 200). |
offset | number | No | Number of rows to skip for pagination. |
Response
{
"runs": [
{
"id": "7f8d9c2b-4a6e-8b3f-1d5c-9e2f3a4b5c6d",
"agent_id": "123e4567-e89b-12d3-a456-789012345678",
"agent_name": "Transcoding Pipeline",
"status": "failed",
"status_message": null,
"created_at": "2026-10-13T18:05:00Z",
"trigger": {
"type": "storage_trigger",
"batch_key": "PROD-001",
"production_id": null,
"source_folder_path": "/Uploads/PROD-001",
"batch_window_id": "6b1f2c3d-0000-4a00-8f00-000000000001"
},
"node_count": 6,
"failed_node_count": 1,
"failed_nodes": [
{
"id": "9cb911f5-7e2e-473d-8de0-9f5e2b7c95c1",
"name": "Google Drive Trigger",
"status_message": "Drive download failed"
}
]
}
],
"next_offset": null
}
failed_nodes[] names each tile that failed with its status message. A run that stays in running or queued past your expectation is your stalled signal; failed with failed_nodes tells you which step broke.Was this page helpful?