curl --request GET \
--url https://api.getdialed.ai/v1/flows/executions/{execution_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/flows/executions/{execution_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/flows/executions/{execution_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.getdialed.ai/v1/flows/executions/{execution_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 => [
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/flows/executions/{execution_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/flows/executions/{execution_id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/flows/executions/{execution_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"batch_id": "batch_55667788",
"completed_at": "2026-07-09T18:00:03Z",
"created_at": "2026-07-09T17:59:59Z",
"definition_id": "def_a1b2c3d4",
"id": "exec_99aabbcc",
"input_data": {
"phone": "+15555550100"
},
"job_id": "job_99aabbcc",
"org_id": "org_a1b2c3d4",
"result": {
"records_loaded": 1
},
"started_at": "2026-07-09T18:00:00Z",
"status": "completed",
"trigger_id": "trigger_44556677",
"trigger_type": "api_call",
"updated_at": "2026-07-09T18:00:03Z",
"workflow_id": "acme/exec-exec_99aabbcc"
}{
"detail": "Authentication required"
}{
"detail": "Execution not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Get an execution
Fetch a single execution by id, with per-step run detail EMBEDDED as a bounded steps array (one call renders the whole run detail — no pagination and no per-step endpoint). steps_source is the availability discriminator: live (folded from live step.* events), snapshot (durable terminal summary on the execution doc), or unavailable (pre-phase run / expired events). Cross-tenant access returns 404.
curl --request GET \
--url https://api.getdialed.ai/v1/flows/executions/{execution_id} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.getdialed.ai/v1/flows/executions/{execution_id}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.getdialed.ai/v1/flows/executions/{execution_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.getdialed.ai/v1/flows/executions/{execution_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 => [
"X-API-Key: <api-key>"
],
]);
$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.getdialed.ai/v1/flows/executions/{execution_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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.getdialed.ai/v1/flows/executions/{execution_id}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getdialed.ai/v1/flows/executions/{execution_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"batch_id": "batch_55667788",
"completed_at": "2026-07-09T18:00:03Z",
"created_at": "2026-07-09T17:59:59Z",
"definition_id": "def_a1b2c3d4",
"id": "exec_99aabbcc",
"input_data": {
"phone": "+15555550100"
},
"job_id": "job_99aabbcc",
"org_id": "org_a1b2c3d4",
"result": {
"records_loaded": 1
},
"started_at": "2026-07-09T18:00:00Z",
"status": "completed",
"trigger_id": "trigger_44556677",
"trigger_type": "api_call",
"updated_at": "2026-07-09T18:00:03Z",
"workflow_id": "acme/exec-exec_99aabbcc"
}{
"detail": "Authentication required"
}{
"detail": "Execution not found"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Rate limit exceeded: 100 per 1 minute"
}Authorizations
Path Parameters
Response
Successful Response
pending, running, waiting, completed, failed, cancelled Show child attributes
Show child attributes
Indicates where the steps array on an execution detail comes from.
Always present on GET /executions/{id} so a client can distinguish a run
that genuinely has no steps from one whose step detail is unavailable.
live, snapshot, unavailable Why a run's next message is waiting, when it is waiting for the clock.
Text messages may only be sent during daytime hours in the recipient's own
local time. A message outside that window is held and sent when the window
opens, and this object is how a run says so: it is present on
GET /executions/{id} only while such a hold is in force, and its presence
is what distinguishes waiting for a legal hour from waiting for a person.
Show child attributes
Show child attributes