curl --request POST \
--url https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"data": {
"reason": "<string>"
}
}
'import requests
url = "https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun"
payload = { "data": { "reason": "<string>" } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({data: {reason: '<string>'}})
};
fetch('https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun', 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.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'reason' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun"
payload := strings.NewReader("{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"runKey": "RUN-123",
"status": "requested",
"requestedAt": "<string>"
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}Rerun a workflow run
Rerun a finished, manually started live production run, including canceled runs. Use its exact runKey or universally unique identifier (UUID). Requires a user operator with workflow_runs.write; service-account API keys cannot rerun. The new run uses the current published version and original input. To recover an accepted rerun, retry the same source and request with the same Idempotency-Key. Key and UUID references are interchangeable. Use a new key for a different request.
curl --request POST \
--url https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"data": {
"reason": "<string>"
}
}
'import requests
url = "https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun"
payload = { "data": { "reason": "<string>" } }
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({data: {reason: '<string>'}})
};
fetch('https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun', 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.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'reason' => '<string>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun"
payload := strings.NewReader("{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.letsflow.ai/v1/workflow_runs/{workflowRunId}/actions/rerun")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"reason\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"runKey": "RUN-123",
"status": "requested",
"requestedAt": "<string>"
},
"meta": {
"request_id": "<string>",
"correlation_id": "<string>",
"operation": "<string>",
"resource": "<string>"
}
}{
"type": "https://app.letsflow.ai/problems/access-grant-not-found",
"title": "<string>",
"status": 123,
"code": "access_grant_admin_extension_required",
"detail": "<string>",
"instance": "<string>",
"request_id": "<string>",
"correlation_id": "<string>",
"retryable": true,
"auth_failure_reason": "<string>",
"availability_reason": "capability_disabled",
"re_auth_required": true,
"violations": [
{
"field": "<string>",
"message": "<string>",
"capability": "<string>",
"details": {}
}
],
"diagnostics": [
{
"code": "<string>",
"severity": "info",
"message": "<string>",
"fixHint": "<string>",
"location": {
"file": "<string>",
"line": 2,
"column": 2,
"stepId": "<string>"
}
}
]
}Authorizations
OAuth Bearer access tokens or Flow API keys with the required Flow scope families for the route.
Headers
Required idempotency key for retry-safe workflow actions. The same key plus the same request fingerprint replays the accepted result with meta.replayed=true in the response body. Stored HTTP responses for create requests in the customer API retain their original success status, including 201 Created and 202 Accepted. An in-progress key returns 409 idempotency_key_in_progress. A reused key with a different request fingerprint returns 409 idempotency_key_reused.
255Optional caller-supplied correlation identifier propagated into canonical workflow handles.
Optional W3C trace context header accepted by shared request-context middleware.
Optional source-surface hint. When both this header and a request body source_surface_kind are present, they must match.
api, cli, browser, email Path Parameters
Exact org-scoped runKey returned by the API (for example RUN-123), or the run's universally unique identifier (UUID). Preserve the returned key, including a historical FLOW-RUN-123 prefix.
Body
Show child attributes
Show child attributes