Runs
Get a run
One run: its status, the step it waits on and the question the reviewers have, the decisions so far and the result. With wait, the call holds until the run has finished or that many seconds have passed (max 60), so you can poll without hammering the API.
GET
/
api
/
executions
/
{id}
Get a run
curl --request GET \
--url https://api.hitl.sh/v1/api/executions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hitl.sh/v1/api/executions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hitl.sh/v1/api/executions/{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{
"data": {
"id": "6af2ceb8c6a9f1dc71efd5dc",
"workflow_id": "6af2ce4e8207961501f59472",
"workflow_name": "Refund approval",
"status": "completed",
"finished": true,
"input": {
"amount": 249,
"currency": "USD",
"customer": {
"email": "ada@example.com",
"name": "Ada Lovelace"
},
"order_id": "ORD-48213",
"reason": "Arrived with a cracked screen."
},
"result": "approve",
"decisions": [
{
"node_id": "review-1",
"reviewer_id": "6af2ce48967ce8777084a293",
"reviewer_name": "Priya Shah",
"platform": "web_portal",
"decision": "approve",
"responded_at": "2026-11-10T07:58:52.241Z",
"response_time_seconds": 2.532943375
}
],
"action_results": [
{
"node_id": "action-1",
"type": "webhook",
"status": "success",
"response": "200: {\"json\": {\"amount\": 249, \"approved_by\": \"Priya Shah\", \"order_id\": \"ORD-48213\"}}",
"executed_at": "2026-11-10T07:58:53.482Z"
}
],
"trail": [
{
"node_id": "trigger-1",
"status": "done",
"at": "2026-11-10T07:58:49.604Z"
},
{
"node_id": "review-1",
"status": "waiting",
"at": "2026-11-10T07:58:49.817Z"
},
{
"node_id": "review-1",
"status": "done",
"at": "2026-11-10T07:58:53.482Z"
},
{
"node_id": "condition-1",
"status": "done",
"at": "2026-11-10T07:58:53.482Z"
},
{
"node_id": "action-1",
"status": "done",
"at": "2026-11-10T07:58:53.847Z"
},
{
"node_id": "end-1",
"status": "done",
"at": "2026-11-10T07:58:53.847Z"
}
],
"triggered_via": "api",
"callback_url": "https://httpbin.org/post",
"callback": {
"state": "delivered",
"attempts": 1,
"last_status": 200,
"last_attempt_at": "2026-11-10T07:58:54.938Z",
"delivered_at": "2026-11-10T07:58:54.938Z"
},
"started_at": "2026-11-10T07:58:48.493Z",
"completed_at": "2026-11-10T07:58:53.847Z",
"duration_seconds": 5.354
},
"error": false,
"msg": "Execution retrieved"
}{
"error": true,
"msg": "Invalid execution id"
}{
"error": true,
"msg": "Invalid API key"
}{
"error": true,
"msg": "Workflow not found"
}{
"error": true,
"msg": "Rate limit exceeded"
}Authorizations
Your API key: hitl_live_…
Path Parameters
The execution id
Example:
"6af2cf07c6a9f1dc71efd5e7"
Query Parameters
Seconds to wait for the run to finish, up to 60
Example:
30
⌘I
Get a run
curl --request GET \
--url https://api.hitl.sh/v1/api/executions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.hitl.sh/v1/api/executions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{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://api.hitl.sh/v1/api/executions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hitl.sh/v1/api/executions/{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{
"data": {
"id": "6af2ceb8c6a9f1dc71efd5dc",
"workflow_id": "6af2ce4e8207961501f59472",
"workflow_name": "Refund approval",
"status": "completed",
"finished": true,
"input": {
"amount": 249,
"currency": "USD",
"customer": {
"email": "ada@example.com",
"name": "Ada Lovelace"
},
"order_id": "ORD-48213",
"reason": "Arrived with a cracked screen."
},
"result": "approve",
"decisions": [
{
"node_id": "review-1",
"reviewer_id": "6af2ce48967ce8777084a293",
"reviewer_name": "Priya Shah",
"platform": "web_portal",
"decision": "approve",
"responded_at": "2026-11-10T07:58:52.241Z",
"response_time_seconds": 2.532943375
}
],
"action_results": [
{
"node_id": "action-1",
"type": "webhook",
"status": "success",
"response": "200: {\"json\": {\"amount\": 249, \"approved_by\": \"Priya Shah\", \"order_id\": \"ORD-48213\"}}",
"executed_at": "2026-11-10T07:58:53.482Z"
}
],
"trail": [
{
"node_id": "trigger-1",
"status": "done",
"at": "2026-11-10T07:58:49.604Z"
},
{
"node_id": "review-1",
"status": "waiting",
"at": "2026-11-10T07:58:49.817Z"
},
{
"node_id": "review-1",
"status": "done",
"at": "2026-11-10T07:58:53.482Z"
},
{
"node_id": "condition-1",
"status": "done",
"at": "2026-11-10T07:58:53.482Z"
},
{
"node_id": "action-1",
"status": "done",
"at": "2026-11-10T07:58:53.847Z"
},
{
"node_id": "end-1",
"status": "done",
"at": "2026-11-10T07:58:53.847Z"
}
],
"triggered_via": "api",
"callback_url": "https://httpbin.org/post",
"callback": {
"state": "delivered",
"attempts": 1,
"last_status": 200,
"last_attempt_at": "2026-11-10T07:58:54.938Z",
"delivered_at": "2026-11-10T07:58:54.938Z"
},
"started_at": "2026-11-10T07:58:48.493Z",
"completed_at": "2026-11-10T07:58:53.847Z",
"duration_seconds": 5.354
},
"error": false,
"msg": "Execution retrieved"
}{
"error": true,
"msg": "Invalid execution id"
}{
"error": true,
"msg": "Invalid API key"
}{
"error": true,
"msg": "Workflow not found"
}{
"error": true,
"msg": "Rate limit exceeded"
}