Deliver a signal to a run
Delivers a signal to a run. The signal name comes from action_required.signal_name on a non-terminal run; the review signal is human_review_decision.
One route, two behaviours, and the response says which. If the run is parked on a review step, this delivers the signal and the workflow advances - "result": "signal_delivered". If the run has already finished, it records an annotation and nothing advances - "result": "review_recorded". Never infer which happened from the run's state; read result.
The verdict is the run's - there is no node_id, and sending one is a 400, not an ignored field. Re-deciding is allowed and overwrites the previous verdict. Recording a verdict does not change status or completed_at, does not re-run anything, and fires no webhook.
Both credential types work on this route: client-id + x-api-key, or a dashboard Bearer token.
curl -X POST "https://api.deepvue.link/v1/signals/123e4567-e89b-12d3-a456-426614174000/human_review_decision" \
-H "Content-Type: application/json" \
-H "client-id: YOUR_API_KEY" \
-H "x-api-key: YOUR_API_KEY" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"payload": {
"decision": "reject",
"notes": "KYB docs verified manually"
}
}'
import requests
import json
url = "https://api.deepvue.link/v1/signals/123e4567-e89b-12d3-a456-426614174000/human_review_decision"
headers = {
"Content-Type": "application/json",
"client-id": "YOUR_API_KEY",
"x-api-key": "YOUR_API_KEY",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"payload": {
"decision": "reject",
"notes": "KYB docs verified manually"
}
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.deepvue.link/v1/signals/123e4567-e89b-12d3-a456-426614174000/human_review_decision", {
method: "POST",
headers: {
"Content-Type": "application/json",
"client-id": "YOUR_API_KEY",
"x-api-key": "YOUR_API_KEY",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"payload": {
"decision": "reject",
"notes": "KYB docs verified manually"
}
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"payload": {
"decision": "reject",
"notes": "KYB docs verified manually"
}
}`)
req, err := http.NewRequest("POST", "https://api.deepvue.link/v1/signals/123e4567-e89b-12d3-a456-426614174000/human_review_decision", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("client-id", "YOUR_API_KEY")
req.Header.Set("x-api-key", "YOUR_API_KEY")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.deepvue.link/v1/signals/123e4567-e89b-12d3-a456-426614174000/human_review_decision')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['client-id'] = 'YOUR_API_KEY'
request['x-api-key'] = 'YOUR_API_KEY'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"payload": {
"decision": "reject",
"notes": "KYB docs verified manually"
}
}'
response = http.request(request)
puts response.body
{
"ok": true,
"result": "review_recorded",
"decision": "reject"
}
{
"error": "payload.node_id is no longer accepted: a review decision applies to the whole run"
}
{
"error": "payload rejected: decision must be "approve" or "reject""
}
{
"error": "missing credentials: send client-id + x-api-key headers"
}
{
"error": "invalid Deepvue credentials"
}
{
"error": "no open signal human_review_decision for this run"
}
/v1/signals/{run_id}/{signal_name}Target server for requests. Edit to use your own host.
Your Deepvue client identifier.
Your Deepvue API key. Secret - keep it server-side.
A dashboard Bearer token. Accepted on the signals route only.
e.g. human_review_decision, or the signal_name from action_required.
The media type of the request body
For human_review_decision: decision is required and must be approve or reject; notes is optional operator text.
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Your Deepvue client identifier.
API Key for authentication. Your Deepvue API key. Secret - keep it server-side.
Bearer token. A dashboard Bearer token. Accepted on the signals route only.
Path Parameters
e.g. human_review_decision, or the signal_name from action_required.
human_review_decisionBody
For human_review_decision: decision is required and must be approve or reject; notes is optional operator text.
Responses
signal_delivered - the run was parked on a review step and the workflow advanced. review_recorded - the run had already finished and an annotation was recorded.
signal_deliveredreview_recordedapprovereject