Get Workflow Draft API
Read the stored draft definition and its current revision, the compare-and-set token used when saving.
curl --request GET \
--url https://api.bolna.ai/workflows/{workflow_id}/draft \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bolna.ai/workflows/{workflow_id}/draft"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bolna.ai/workflows/{workflow_id}/draft', 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.bolna.ai/workflows/{workflow_id}/draft",
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.bolna.ai/workflows/{workflow_id}/draft"
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.bolna.ai/workflows/{workflow_id}/draft")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bolna.ai/workflows/{workflow_id}/draft")
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{
"definition": {
"entry_node_id": "n_start",
"on_no_match": "n_end_unhandled",
"nodes": [
{
"id": "n_start",
"type": "start",
"config": {
"trigger": {
"kind": "manual"
}
},
"cases": [
{
"when": {
"always": true
},
"then": {
"to": "n_call1"
}
}
]
},
{
"id": "n_call1",
"type": "agent",
"name": "Qualify",
"config": {
"agent_id": "123e4567-e89b-12d3-a456-426655440000",
"timeout_s": 3600
},
"cases": [
{
"when": {
"cmp": "==",
"left": {
"var": "call.status"
},
"right": {
"const": "completed"
}
},
"then": {
"to": "n_end_done"
}
}
]
},
{
"id": "n_end_done",
"type": "end",
"config": {
"label": "reached",
"outcome": "success"
}
},
{
"id": "n_end_unhandled",
"type": "end",
"config": {
"label": "unhandled",
"outcome": "failure"
}
}
]
},
"revision": 123
}{
"detail": {
"code": "revision_conflict",
"message": "<string>"
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The unique id of the workflow
Response
The draft definition and revision
The workflow graph. nodes is a flat list of node envelopes — {id, type, name, config, cases} — where type is one of start, agent, extraction, api, time, retry, aisensy_whatsapp or end. Each node's cases array routes to the next node via condition expressions (time nodes use a single to instead, end nodes have neither). See Nodes and Conditions and variables for the full schema, and the Node Types API for every config parameter with defaults and bounds.
Show child attributes
Show child attributes
{
"entry_node_id": "n_start",
"on_no_match": "n_end_unhandled",
"nodes": [
{
"id": "n_start",
"type": "start",
"config": { "trigger": { "kind": "manual" } },
"cases": [
{
"when": { "always": true },
"then": { "to": "n_call1" }
}
]
},
{
"id": "n_call1",
"type": "agent",
"name": "Qualify",
"config": {
"agent_id": "123e4567-e89b-12d3-a456-426655440000",
"timeout_s": 3600
},
"cases": [
{
"when": {
"cmp": "==",
"left": { "var": "call.status" },
"right": { "const": "completed" }
},
"then": { "to": "n_end_done" }
}
]
},
{
"id": "n_end_done",
"type": "end",
"config": { "label": "reached", "outcome": "success" }
},
{
"id": "n_end_unhandled",
"type": "end",
"config": {
"label": "unhandled",
"outcome": "failure"
}
}
]
}
Current draft revision — send it back as expected_revision when saving.
Was this page helpful?
curl --request GET \
--url https://api.bolna.ai/workflows/{workflow_id}/draft \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.bolna.ai/workflows/{workflow_id}/draft"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bolna.ai/workflows/{workflow_id}/draft', 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.bolna.ai/workflows/{workflow_id}/draft",
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.bolna.ai/workflows/{workflow_id}/draft"
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.bolna.ai/workflows/{workflow_id}/draft")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bolna.ai/workflows/{workflow_id}/draft")
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{
"definition": {
"entry_node_id": "n_start",
"on_no_match": "n_end_unhandled",
"nodes": [
{
"id": "n_start",
"type": "start",
"config": {
"trigger": {
"kind": "manual"
}
},
"cases": [
{
"when": {
"always": true
},
"then": {
"to": "n_call1"
}
}
]
},
{
"id": "n_call1",
"type": "agent",
"name": "Qualify",
"config": {
"agent_id": "123e4567-e89b-12d3-a456-426655440000",
"timeout_s": 3600
},
"cases": [
{
"when": {
"cmp": "==",
"left": {
"var": "call.status"
},
"right": {
"const": "completed"
}
},
"then": {
"to": "n_end_done"
}
}
]
},
{
"id": "n_end_done",
"type": "end",
"config": {
"label": "reached",
"outcome": "success"
}
},
{
"id": "n_end_unhandled",
"type": "end",
"config": {
"label": "unhandled",
"outcome": "failure"
}
}
]
},
"revision": 123
}{
"detail": {
"code": "revision_conflict",
"message": "<string>"
}
}
