curl --request POST \
--url https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {},
"task_name": "wait_for_validation",
"task_execution_idx": 0
}
'import requests
url = "https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data"
payload = {
"data": {},
"task_name": "wait_for_validation",
"task_execution_idx": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({data: {}, task_name: 'wait_for_validation', task_execution_idx: 0})
};
fetch('https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data', 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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data",
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' => [
],
'task_name' => 'wait_for_validation',
'task_execution_idx' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data"
payload := strings.NewReader("{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "received"
}Submit webhook data for a waiting task
Push data to a flow execution’s waiting “Wait for Webhook” task.
The flow pauses when it reaches a webhook receiver task and resumes with
the submitted data as the task’s output. Data may also be submitted
before the flow reaches the task; it is stored and picked up when the task
runs.
Delivery contract:
- A 2xx response means the data is durably stored and will not be lost.
- Retrying with the identical body is safe and idempotent (returns status ‘duplicate’).
- Retry on 5xx. Do not retry 4xx unchanged: 422 means the data does not match the task’s schema; 409 with different data means the first delivery already won.
Context:
- The target task is addressed by
task_namein the request body; a flow may contain multiple webhook receiver tasks. - Authenticate with an organization API key (X-API-Key) or a user JWT.
Tasks that run more than once:
- A receiver whose
run_afterpoints at a task that processes a collection item by item runs once per upstream item, and each of those executions waits for a delivery of its own. - Address them with
task_execution_idx(0-based, in upstream item order). Omitting it targets execution 0 — the only execution a task that does not fan out ever has. - Executions are independent: the same
datasent to two different indices is two first deliveries rather than a duplicate, and ‘first write wins’ applies per execution, not per task. - The number of executions is not reported by this API. A payload is accepted before the task has run at all, so there is nothing to enumerate at delivery time; carry a correlation value (typically the index itself) in whatever outbound call notifies the external system and have it echoed back here.
curl --request POST \
--url https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {},
"task_name": "wait_for_validation",
"task_execution_idx": 0
}
'import requests
url = "https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data"
payload = {
"data": {},
"task_name": "wait_for_validation",
"task_execution_idx": 0
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({data: {}, task_name: 'wait_for_validation', task_execution_idx: 0})
};
fetch('https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data', 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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data",
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' => [
],
'task_name' => 'wait_for_validation',
'task_execution_idx' => 0
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data"
payload := strings.NewReader("{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}")
req, _ := http.NewRequest("POST", url, payload)
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://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://flows.super.ai/api/flow-executions/{flow_execution_id}/webhook-data")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {},\n \"task_name\": \"wait_for_validation\",\n \"task_execution_idx\": 0\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "received"
}Authorizations
JWT Bearer token authentication. Include your access token in the Authorization header as: Bearer YOUR_ACCESS_TOKEN
Example:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Path Parameters
Body
Payload submitted by an external system for a waiting webhook_receiver task.
The data for the task. Must match the task's output model (defined by its fields parameter); unknown fields or type mismatches are rejected with 422. Note that field values are compared exactly for duplicate detection — re-sending the identical body is acknowledged idempotently, while a different body for the same task execution is rejected with 409. Duplicate detection is per execution, so the same data may legitimately be delivered to different task_execution_idx values.
Name of the webhook_receiver task in the flow that waits for this data.
"wait_for_validation"
Which execution of the task this payload is for. Defaults to 0, the only execution a task has unless it fans out: a receiver whose run_after points at a vectorized task runs once per upstream item, and each execution waits for its own delivery. Executions are indexed from 0 in upstream item order.
x >= 00
Response
Webhook data durably stored ('received') or already stored ('duplicate')