Skip to main content
PUT
/
workflows
/
{workflowID}
/
versions
/
{versionID}
Create or update workflow version
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

X-API-Key
string
header
required

API key for authentication

Path Parameters

workflowID
string
required

Unique workflow identifier

Example:

"wf_abc123"

versionID
string
required

Version identifier (e.g., "v1", "v2")

Example:

"v1"

Body

application/json
version_id
string
required

Version identifier (e.g., "v1", "v2", "v1.1")

Example:

"v2"

definition
object
required

The complete workflow definition for this version. This follows the workflow DSL format and must include all steps.

locked
boolean
default:false

Whether to lock this version from further modifications

production
boolean
default:false

Whether this is a production version

allowed_to_share
boolean
default:false

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_id
string
required

Version identifier

Example:

"v1"

slug
string
required

Workflow slug (inherited from parent workflow)

Example:

"text-to-image-generator"

locked
boolean

Whether this version is locked from modifications

Example:

false

production
boolean

Whether this is a production version

Example:

true

allowed_to_share
boolean

True if version is unlisted (accessible via direct link but hidden from public listings).

Example:

false

trigger_count
integer

Number of times this specific version has been triggered

Example:

15

created_at
string<date-time>

RFC3339 timestamp when version was created

Example:

"2025-12-01T10:00:00Z"

updated_at
string<date-time>

RFC3339 timestamp when version was last updated

Example:

"2025-12-05T14:20:00Z"

status
enum<string>

Version lifecycle status

Available options:
active,
archived,
deleted
Example:

"active"

definition
object

The complete workflow definition (only included in detail responses). Contains steps, input schema, and metadata.

Last modified on May 28, 2026