curl --request PATCH \
--url https://api.valyu.ai/v1/workflows/{slug} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"title": "<string>",
"subtitle": "<string>",
"description": "<string>",
"vertical": "<string>",
"tags": [
"<string>"
],
"icon": "<string>",
"set_current": true
}
'import requests
url = "https://api.valyu.ai/v1/workflows/{slug}"
payload = {
"title": "<string>",
"subtitle": "<string>",
"description": "<string>",
"vertical": "<string>",
"tags": ["<string>"],
"icon": "<string>",
"set_current": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
subtitle: '<string>',
description: '<string>',
vertical: '<string>',
tags: ['<string>'],
icon: '<string>',
set_current: true
})
};
fetch('https://api.valyu.ai/v1/workflows/{slug}', 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.valyu.ai/v1/workflows/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'subtitle' => '<string>',
'description' => '<string>',
'vertical' => '<string>',
'tags' => [
'<string>'
],
'icon' => '<string>',
'set_current' => true
]),
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://api.valyu.ai/v1/workflows/{slug}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.valyu.ai/v1/workflows/{slug}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.valyu.ai/v1/workflows/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}"
response = http.request(request)
puts response.read_body{
"slug": "ib-company-profile",
"version": 1,
"title": "Company Profile",
"vertical": "investment-banking",
"tags": [
"company-profile",
"equities"
],
"subtitle": "One-page profile of a public company.",
"description": "Builds a company profile covering business, financials, and recent developments.",
"popular": true,
"recommended_mode": "heavy",
"estimated_time": "10-20 min",
"is_valyu": true,
"owner_org_id": null,
"variables": [
{
"key": "company",
"label": "Company name",
"type": "text",
"required": false,
"placeholder": "NVIDIA (NVDA)",
"help": "The company you want to profile.",
"examples": [
"NVIDIA (NVDA)",
"Microsoft (MSFT)"
],
"validation": {
"min_length": 1,
"max_length": 2,
"pattern": "<string>",
"enum": [
"<string>"
]
}
}
],
"deliverables": [
{
"type": "xlsx",
"description": "A model summary tab with revenue, margins, and key ratios."
}
],
"created_at": "2026-01-10T12:00:00Z",
"updated_at": "2026-01-15T09:30:00Z",
"prompt": "Build a company profile for {company} covering its business, financials, and recent developments.",
"strategy": "<string>",
"report_format": "<string>",
"tools": {
"code_execution": true,
"screenshots": true,
"browser_use": true,
"charts": true
},
"changelog": "<string>",
"output_formats": [
{
"type": "object",
"properties": {
"base_case": {
"type": "string"
},
"bull_case": {
"type": "string"
},
"bear_case": {
"type": "string"
},
"confidence": {
"type": "number"
}
}
},
"toon"
]
}Update Workflow
Edit a custom org Workflow, creating a new version with a changelog.
curl --request PATCH \
--url https://api.valyu.ai/v1/workflows/{slug} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"title": "<string>",
"subtitle": "<string>",
"description": "<string>",
"vertical": "<string>",
"tags": [
"<string>"
],
"icon": "<string>",
"set_current": true
}
'import requests
url = "https://api.valyu.ai/v1/workflows/{slug}"
payload = {
"title": "<string>",
"subtitle": "<string>",
"description": "<string>",
"vertical": "<string>",
"tags": ["<string>"],
"icon": "<string>",
"set_current": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
subtitle: '<string>',
description: '<string>',
vertical: '<string>',
tags: ['<string>'],
icon: '<string>',
set_current: true
})
};
fetch('https://api.valyu.ai/v1/workflows/{slug}', 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.valyu.ai/v1/workflows/{slug}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'subtitle' => '<string>',
'description' => '<string>',
'vertical' => '<string>',
'tags' => [
'<string>'
],
'icon' => '<string>',
'set_current' => true
]),
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://api.valyu.ai/v1/workflows/{slug}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.valyu.ai/v1/workflows/{slug}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.valyu.ai/v1/workflows/{slug}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"subtitle\": \"<string>\",\n \"description\": \"<string>\",\n \"vertical\": \"<string>\",\n \"tags\": [\n \"<string>\"\n ],\n \"icon\": \"<string>\",\n \"set_current\": true\n}"
response = http.request(request)
puts response.read_body{
"slug": "ib-company-profile",
"version": 1,
"title": "Company Profile",
"vertical": "investment-banking",
"tags": [
"company-profile",
"equities"
],
"subtitle": "One-page profile of a public company.",
"description": "Builds a company profile covering business, financials, and recent developments.",
"popular": true,
"recommended_mode": "heavy",
"estimated_time": "10-20 min",
"is_valyu": true,
"owner_org_id": null,
"variables": [
{
"key": "company",
"label": "Company name",
"type": "text",
"required": false,
"placeholder": "NVIDIA (NVDA)",
"help": "The company you want to profile.",
"examples": [
"NVIDIA (NVDA)",
"Microsoft (MSFT)"
],
"validation": {
"min_length": 1,
"max_length": 2,
"pattern": "<string>",
"enum": [
"<string>"
]
}
}
],
"deliverables": [
{
"type": "xlsx",
"description": "A model summary tab with revenue, margins, and key ratios."
}
],
"created_at": "2026-01-10T12:00:00Z",
"updated_at": "2026-01-15T09:30:00Z",
"prompt": "Build a company profile for {company} covering its business, financials, and recent developments.",
"strategy": "<string>",
"report_format": "<string>",
"tools": {
"code_execution": true,
"screenshots": true,
"browser_use": true,
"charts": true
},
"changelog": "<string>",
"output_formats": [
{
"type": "object",
"properties": {
"base_case": {
"type": "string"
},
"bull_case": {
"type": "string"
},
"bear_case": {
"type": "string"
},
"confidence": {
"type": "number"
}
}
},
"toon"
]
}Authorizations
API key for authentication. Get yours at platform.valyu.ai.
Path Parameters
The workflow slug.
Body
Edit an organization workflow. Metadata fields (title, subtitle, etc.) update in place. Supply a version object to publish a new immutable version - it requires a changelog. Valyu-curated workflows cannot be edited (cannot_edit_valyu_workflow).
20A new version body to publish. Requires changelog (changelog_required otherwise).
Show child attributes
Show child attributes
When publishing a new version, whether to point the workflow's current (floating) version at it.
true
Response
New version published.
A single workflow returned as a flat object: the list-row fields plus the resolved version body (prompt, strategy, report_format, tools, changelog, output_formats). Returned by get, create (201), and update.
Unique slug identifying the workflow within its scope. Used as workflow_id when running.
"ib-company-profile"
The current (floating) published version number.
x >= 11
Display title.
"Company Profile"
Vertical the workflow targets (e.g. investment-banking, private-equity, hedge-funds, consulting, life-sciences, legal-regulatory, sales-intelligence, supply-chain).
"investment-banking"
Tags for discovery. Up to 20.
20["company-profile", "equities"]
Short subtitle.
"One-page profile of a public company."
Longer description of what the workflow does.
"Builds a company profile covering business, financials, and recent developments."
Whether the workflow is flagged as popular.
true
Recommended DeepResearch mode for a workflow. Maps directly to the DeepResearch mode parameter.
fast, standard, heavy, max "heavy"
Human-readable estimate of how long a run takes.
"10-20 min"
Whether this is a Valyu-curated workflow (read-only to users).
true
Organization that owns the workflow. null for Valyu-curated workflows.
null
Typed variables referenced by the prompt template. Up to 50.
50Show child attributes
Show child attributes
Deliverables the workflow produces. Up to 20.
20Show child attributes
Show child attributes
When the workflow was created.
"2026-01-10T12:00:00Z"
When the workflow's current version was last published.
"2026-01-15T09:30:00Z"
Prompt template with {key} placeholders. Included on detail (get/create/update) and on list with ?expand=true.
"Build a company profile for {company} covering its business, financials, and recent developments."
Research strategy. Maps to DeepResearch research_strategy. Included on detail and on list with ?expand=true.
Report format instructions. Maps to DeepResearch report_format. Included on detail and on list with ?expand=true.
Optional tools the workflow's research agent may use.
Show child attributes
Show child attributes
Changelog for the current version. Included on detail and on list with ?expand=true.
Output formats the workflow produces. Items are the strings "markdown", "pdf", or "toon", and/or a single JSON Schema object for structured output. Rules: at most one JSON Schema object; a JSON Schema object cannot be combined with "markdown" or "pdf"; "toon" requires a JSON Schema object. An invalid combination returns 400 invalid_output_formats.
At run time, a task created with workflow_id inherits the workflow's output_formats when the request does not pass its own; a request-level output_formats always wins.
markdown, pdf, toon [
{
"type": "object",
"properties": {
"base_case": { "type": "string" },
"bull_case": { "type": "string" },
"bear_case": { "type": "string" },
"confidence": { "type": "number" }
}
},
"toon"
]
Was this page helpful?

