Check one run
curl --request GET \
--url https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}', 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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}",
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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}"
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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}")
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{
"runId": "1786945498854-80788d",
"automation": "invoice-extract",
"status": "done",
"source": "manual",
"startedAt": "2026-08-17T05:44:58.854Z",
"endedAt": "2026-08-17T05:45:09.132Z",
"duration": 10277,
"steps": 1,
"error": null
}{
"error": "unauthorized"
}{
"error": "No such automation"
}{
"error": "rate limited"
}Endpoints
Check one run
Whether a run finished, and how long it took. This is the one to poll: it stays the same small answer however large the thing the automation produced.
GET
/
api
/
automations
/
{automationId}
/
runs
/
{runId}
Check one run
curl --request GET \
--url https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}', 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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}",
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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}"
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://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.rundesert.com/p/{workspaceId}/api/automations/{automationId}/runs/{runId}")
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{
"runId": "1786945498854-80788d",
"automation": "invoice-extract",
"status": "done",
"source": "manual",
"startedAt": "2026-08-17T05:44:58.854Z",
"endedAt": "2026-08-17T05:45:09.132Z",
"duration": 10277,
"steps": 1,
"error": null
}{
"error": "unauthorized"
}{
"error": "No such automation"
}{
"error": "rate limited"
}Authorizations
bearerAuthapiKeyHeader
Your workspace's API key, from Settings → API. Sent as Authorization: Bearer dk_....
Path Parameters
The automation's id, as returned by GET /api/automations.
A run id. A run is only readable through the automation that produced it.
Response
The run.
running means it has not finished. error means it finished badly, and error on the run says why.
Available options:
running, done, error What started it: manual, schedule, webhook, email.
Null while it is still going.
Milliseconds. Null while it is still going.
How many progress steps it reported.