curl --request PUT \
--url https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"version_id": "v2",
"definition": {
"version": "v2",
"steps": [
{
"step_id": "generate_text",
"type": "model",
"model": "openai-chatgpt-5",
"params": {
"system_prompt": "You are a helpful assistant",
"user_prompt": "{{inputs.prompt}}"
}
},
{
"step_id": "generate_image",
"type": "model",
"model": "flux-dev",
"params": {
"prompt": "{{generate_text.output}}",
"num_images": 2
},
"fallback": {
"enabled": true,
"model": "flux-1-1-pro",
"params": {
"prompt": "{{generate_text.output}}",
"guidance_scale": 7.5
}
}
}
],
"input_schema": {},
"metadata": {}
},
"locked": false,
"production": false,
"allowed_to_share": false
}
'import requests
url = "https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}"
payload = {
"version_id": "v2",
"definition": {
"version": "v2",
"steps": [
{
"step_id": "generate_text",
"type": "model",
"model": "openai-chatgpt-5",
"params": {
"system_prompt": "You are a helpful assistant",
"user_prompt": "{{inputs.prompt}}"
}
},
{
"step_id": "generate_image",
"type": "model",
"model": "flux-dev",
"params": {
"prompt": "{{generate_text.output}}",
"num_images": 2
},
"fallback": {
"enabled": True,
"model": "flux-1-1-pro",
"params": {
"prompt": "{{generate_text.output}}",
"guidance_scale": 7.5
}
}
}
],
"input_schema": {},
"metadata": {}
},
"locked": False,
"production": False,
"allowed_to_share": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
version_id: 'v2',
definition: {
version: 'v2',
steps: [
{
step_id: 'generate_text',
type: 'model',
model: 'openai-chatgpt-5',
params: {system_prompt: 'You are a helpful assistant', user_prompt: '{{inputs.prompt}}'}
},
{
step_id: 'generate_image',
type: 'model',
model: 'flux-dev',
params: {prompt: '{{generate_text.output}}', num_images: 2},
fallback: {
enabled: true,
model: 'flux-1-1-pro',
params: {prompt: '{{generate_text.output}}', guidance_scale: 7.5}
}
}
],
input_schema: {},
metadata: {}
},
locked: false,
production: false,
allowed_to_share: false
})
};
fetch('https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}', 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://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'version_id' => 'v2',
'definition' => [
'version' => 'v2',
'steps' => [
[
'step_id' => 'generate_text',
'type' => 'model',
'model' => 'openai-chatgpt-5',
'params' => [
'system_prompt' => 'You are a helpful assistant',
'user_prompt' => '{{inputs.prompt}}'
]
],
[
'step_id' => 'generate_image',
'type' => 'model',
'model' => 'flux-dev',
'params' => [
'prompt' => '{{generate_text.output}}',
'num_images' => 2
],
'fallback' => [
'enabled' => true,
'model' => 'flux-1-1-pro',
'params' => [
'prompt' => '{{generate_text.output}}',
'guidance_scale' => 7.5
]
]
]
],
'input_schema' => [
],
'metadata' => [
]
],
'locked' => false,
'production' => false,
'allowed_to_share' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}"
payload := strings.NewReader("{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}"
response = http.request(request)
puts response.read_body{
"version_id": "v1",
"slug": "text-to-image-generator",
"locked": false,
"production": true,
"allowed_to_share": false,
"trigger_count": 15,
"created_at": "2025-12-01T10:00:00Z",
"updated_at": "2025-12-05T14:20:00Z",
"status": "active",
"definition": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Create or update workflow version
Create a new workflow version or update an existing one.
This operation will:
- Create/update the version in the database
- Generate or update the AWS Step Functions state machine
- Set this version as the latest version for the workflow
Important: Once a version is locked, it cannot be modified.
curl --request PUT \
--url https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"version_id": "v2",
"definition": {
"version": "v2",
"steps": [
{
"step_id": "generate_text",
"type": "model",
"model": "openai-chatgpt-5",
"params": {
"system_prompt": "You are a helpful assistant",
"user_prompt": "{{inputs.prompt}}"
}
},
{
"step_id": "generate_image",
"type": "model",
"model": "flux-dev",
"params": {
"prompt": "{{generate_text.output}}",
"num_images": 2
},
"fallback": {
"enabled": true,
"model": "flux-1-1-pro",
"params": {
"prompt": "{{generate_text.output}}",
"guidance_scale": 7.5
}
}
}
],
"input_schema": {},
"metadata": {}
},
"locked": false,
"production": false,
"allowed_to_share": false
}
'import requests
url = "https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}"
payload = {
"version_id": "v2",
"definition": {
"version": "v2",
"steps": [
{
"step_id": "generate_text",
"type": "model",
"model": "openai-chatgpt-5",
"params": {
"system_prompt": "You are a helpful assistant",
"user_prompt": "{{inputs.prompt}}"
}
},
{
"step_id": "generate_image",
"type": "model",
"model": "flux-dev",
"params": {
"prompt": "{{generate_text.output}}",
"num_images": 2
},
"fallback": {
"enabled": True,
"model": "flux-1-1-pro",
"params": {
"prompt": "{{generate_text.output}}",
"guidance_scale": 7.5
}
}
}
],
"input_schema": {},
"metadata": {}
},
"locked": False,
"production": False,
"allowed_to_share": False
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
version_id: 'v2',
definition: {
version: 'v2',
steps: [
{
step_id: 'generate_text',
type: 'model',
model: 'openai-chatgpt-5',
params: {system_prompt: 'You are a helpful assistant', user_prompt: '{{inputs.prompt}}'}
},
{
step_id: 'generate_image',
type: 'model',
model: 'flux-dev',
params: {prompt: '{{generate_text.output}}', num_images: 2},
fallback: {
enabled: true,
model: 'flux-1-1-pro',
params: {prompt: '{{generate_text.output}}', guidance_scale: 7.5}
}
}
],
input_schema: {},
metadata: {}
},
locked: false,
production: false,
allowed_to_share: false
})
};
fetch('https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}', 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://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'version_id' => 'v2',
'definition' => [
'version' => 'v2',
'steps' => [
[
'step_id' => 'generate_text',
'type' => 'model',
'model' => 'openai-chatgpt-5',
'params' => [
'system_prompt' => 'You are a helpful assistant',
'user_prompt' => '{{inputs.prompt}}'
]
],
[
'step_id' => 'generate_image',
'type' => 'model',
'model' => 'flux-dev',
'params' => [
'prompt' => '{{generate_text.output}}',
'num_images' => 2
],
'fallback' => [
'enabled' => true,
'model' => 'flux-1-1-pro',
'params' => [
'prompt' => '{{generate_text.output}}',
'guidance_scale' => 7.5
]
]
]
],
'input_schema' => [
],
'metadata' => [
]
],
'locked' => false,
'production' => false,
'allowed_to_share' => false
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}"
payload := strings.NewReader("{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.put("https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://workflows.eachlabs.run/api/v1/workflows/{workflowID}/versions/{versionID}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"version_id\": \"v2\",\n \"definition\": {\n \"version\": \"v2\",\n \"steps\": [\n {\n \"step_id\": \"generate_text\",\n \"type\": \"model\",\n \"model\": \"openai-chatgpt-5\",\n \"params\": {\n \"system_prompt\": \"You are a helpful assistant\",\n \"user_prompt\": \"{{inputs.prompt}}\"\n }\n },\n {\n \"step_id\": \"generate_image\",\n \"type\": \"model\",\n \"model\": \"flux-dev\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"num_images\": 2\n },\n \"fallback\": {\n \"enabled\": true,\n \"model\": \"flux-1-1-pro\",\n \"params\": {\n \"prompt\": \"{{generate_text.output}}\",\n \"guidance_scale\": 7.5\n }\n }\n }\n ],\n \"input_schema\": {},\n \"metadata\": {}\n },\n \"locked\": false,\n \"production\": false,\n \"allowed_to_share\": false\n}"
response = http.request(request)
puts response.read_body{
"version_id": "v1",
"slug": "text-to-image-generator",
"locked": false,
"production": true,
"allowed_to_share": false,
"trigger_count": 15,
"created_at": "2025-12-01T10:00:00Z",
"updated_at": "2025-12-05T14:20:00Z",
"status": "active",
"definition": {}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
API key for authentication
Path Parameters
Unique workflow identifier
"wf_abc123"
Version identifier (e.g., "v1", "v2")
"v1"
Body
Version identifier (e.g., "v1", "v2", "v1.1")
"v2"
The complete workflow definition for this version. This follows the workflow DSL format and must include all steps.
Show child attributes
Show child attributes
Whether to lock this version from further modifications
Whether this is a production version
Toggle unlisted sharing for this version.
true→ Makes version "unlisted" (accessible via link, hidden from public listings)false→ Makes version "private" (organization only)- No effect on public versions
- New versions default to private when omitted
Response
Workflow version created or updated successfully
Summary information about a workflow version
Version identifier
"v1"
Workflow slug (inherited from parent workflow)
"text-to-image-generator"
Whether this version is locked from modifications
false
Whether this is a production version
true
True if version is unlisted (accessible via direct link but hidden from public listings).
false
Number of times this specific version has been triggered
15
RFC3339 timestamp when version was created
"2025-12-01T10:00:00Z"
RFC3339 timestamp when version was last updated
"2025-12-05T14:20:00Z"
Version lifecycle status
active, archived, deleted "active"
The complete workflow definition (only included in detail responses). Contains steps, input schema, and metadata.