ComfyUI/openapi.yaml
Cursor Agent 8ceea24bdd
feat: add width and height fields to Asset schema
Add nullable integer fields 'width' and 'height' to the Asset schema
in openapi.yaml. These expose original image dimensions in pixels for
clients that need pre-thumbnail size info. Both fields are null for
non-image assets or assets ingested before dimension extraction.

Co-authored-by: Matt Miller <MillerMedia@users.noreply.github.com>
2026-05-07 00:25:09 +00:00

8209 lines
240 KiB
YAML

openapi: 3.1.0
info:
title: ComfyUI API
description: |
API for ComfyUI - A powerful and modular stable diffusion GUI and backend.
This API allows you to interact with ComfyUI programmatically, including:
- Submitting and managing workflow executions
- Querying node/object information
- Uploading and viewing files
- Managing user settings and data
- Asset management (feature-gated)
## Dual-path routing
Every route registered via `self.routes` in the ComfyUI server is available at
both its bare path (e.g. `/prompt`) and an `/api`-prefixed path (e.g. `/api/prompt`).
This spec uses the `/api`-prefixed versions as canonical.
## Multi-user mode
When ComfyUI is started with `--multi-user`, the `Comfy-User` header identifies
the active user for settings, userdata, and history isolation. This is **not** a
security mechanism — it is an organisational convenience with no authentication
or authorisation behind it.
version: 1.0.0
license:
name: GNU General Public License v3.0
url: https://github.com/comfyanonymous/ComfyUI/blob/master/LICENSE
servers:
- url: /
description: Default ComfyUI server (typically http://127.0.0.1:8188)
tags:
- name: prompt
description: Workflow submission and prompt info
- name: queue
description: Queue inspection and management
- name: history
description: Execution history
- name: upload
description: File upload endpoints
- name: view
description: File viewing / download
- name: system
description: System stats and feature flags
- name: node
description: Node / object_info definitions
- name: model
description: Model folder and file listing
- name: user
description: User management (multi-user mode)
- name: userdata
description: Per-user file storage
- name: settings
description: Per-user settings
- name: extensions
description: Frontend extension JS files
- name: subgraph
description: Global subgraph blueprints
- name: internal
description: Internal / debug endpoints
- name: assets
description: Asset management (feature-gated behind enable-assets)
- name: auth
description: Authentication and session management (cloud-only)
- name: billing
description: Billing, subscriptions, and payment management (cloud-only)
- name: workspace
description: Workspace and team management (cloud-only)
- name: hub
description: "ComfyUI Hub: profiles, shared workflows, and labels (cloud-only)"
- name: workflows
description: Cloud workflow management and versioning (cloud-only)
- name: task
description: Background task management (cloud-only)
paths:
# ---------------------------------------------------------------------------
# WebSocket
# ---------------------------------------------------------------------------
/ws:
get:
operationId: connectWebSocket
tags: [system]
summary: WebSocket connection for real-time updates
description: |
Upgrades to a WebSocket connection that streams execution progress,
node status, and output messages. The server sends an initial `status`
message with the session ID (SID) on connect.
## Message types (server → client)
The server sends JSON messages with a `type` field. See the
`x-websocket-messages` list below for the schema of each message type.
parameters:
- name: clientId
in: query
required: false
schema:
type: string
description: Client identifier. If omitted the server assigns one.
responses:
"101":
description: WebSocket upgrade successful
x-websocket-messages:
- type: status
schema:
$ref: "#/components/schemas/StatusWsMessage"
- type: progress
schema:
$ref: "#/components/schemas/ProgressWsMessage"
- type: progress_text
schema:
$ref: "#/components/schemas/ProgressTextWsMessage"
- type: progress_state
schema:
$ref: "#/components/schemas/ProgressStateWsMessage"
- type: executing
schema:
$ref: "#/components/schemas/ExecutingWsMessage"
- type: executed
schema:
$ref: "#/components/schemas/ExecutedWsMessage"
- type: execution_start
schema:
$ref: "#/components/schemas/ExecutionStartWsMessage"
- type: execution_success
schema:
$ref: "#/components/schemas/ExecutionSuccessWsMessage"
- type: execution_cached
schema:
$ref: "#/components/schemas/ExecutionCachedWsMessage"
- type: execution_interrupted
schema:
$ref: "#/components/schemas/ExecutionInterruptedWsMessage"
- type: execution_error
schema:
$ref: "#/components/schemas/ExecutionErrorWsMessage"
- type: logs
schema:
$ref: "#/components/schemas/LogsWsMessage"
- type: notification
schema:
$ref: "#/components/schemas/NotificationWsMessage"
- type: feature_flags
schema:
$ref: "#/components/schemas/FeatureFlagsWsMessage"
- type: asset_download
schema:
$ref: "#/components/schemas/AssetDownloadWsMessage"
- type: asset_export
schema:
$ref: "#/components/schemas/AssetExportWsMessage"
# ---------------------------------------------------------------------------
# Prompt
# ---------------------------------------------------------------------------
/api/prompt:
get:
operationId: getPromptInfo
tags: [prompt]
summary: Get queue status
description: Returns how many items remain in the execution queue.
responses:
"200":
description: Queue info
content:
application/json:
schema:
$ref: "#/components/schemas/PromptInfo"
post:
operationId: executePrompt
tags: [prompt]
summary: Submit a workflow for execution
description: Submits a workflow for execution. The server validates the graph, assigns a `prompt_id`, and enqueues it. Clients listen on `/ws` for execution progress and output messages.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/PromptRequest"
responses:
"200":
description: Prompt accepted
content:
application/json:
schema:
$ref: "#/components/schemas/PromptResponse"
"400":
description: Validation or node errors
content:
application/json:
schema:
$ref: "#/components/schemas/PromptErrorResponse"
# ---------------------------------------------------------------------------
# Queue
# ---------------------------------------------------------------------------
/api/queue:
get:
operationId: getQueue
tags: [queue]
summary: Get running and pending queue items
description: Returns the server's current execution queue, split into the currently-running prompt and the list of pending prompts.
responses:
"200":
description: Queue contents
content:
application/json:
schema:
$ref: "#/components/schemas/QueueInfo"
post:
operationId: manageQueue
tags: [queue]
summary: Clear or delete items from the queue
description: Mutates the execution queue. Supports clearing all queued prompts or deleting individual prompts by ID.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/QueueManageRequest"
responses:
"200":
description: Queue updated
/api/interrupt:
post:
operationId: interruptExecution
tags: [queue]
summary: Interrupt current execution
description: Interrupts the prompt that is currently executing. The next queued prompt (if any) will start immediately after.
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
prompt_id:
type: string
format: uuid
description: "If provided, only interrupts this specific running prompt. Otherwise interrupts all."
responses:
"200":
description: Interrupt signal sent
/api/free:
post:
operationId: freeMemory
tags: [queue]
summary: Free GPU memory and/or unload models
description: Frees GPU memory by unloading models and/or freeing the resident model cache, controlled by the request flags.
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
unload_models:
type: boolean
description: Unload all models from VRAM/RAM
free_memory:
type: boolean
description: Run garbage collection and free cached memory
responses:
"200":
description: Memory freed
# ---------------------------------------------------------------------------
# Jobs
# ---------------------------------------------------------------------------
/api/jobs:
get:
operationId: listJobs
tags: [queue]
summary: List jobs with filtering and pagination
description: Returns a paginated list of completed prompt executions, newest first.
parameters:
- name: status
in: query
schema:
type: string
description: Filter by job status
- name: workflow_id
in: query
schema:
type: string
description: Filter by workflow ID
- name: sort_by
in: query
schema:
type: string
description: Field to sort by
- name: sort_order
in: query
schema:
type: string
enum: [asc, desc]
description: Sort direction
- name: limit
in: query
schema:
type: integer
description: Maximum number of results (default is unlimited/None)
- name: offset
in: query
schema:
type: integer
default: 0
description: Pagination offset
responses:
"200":
description: Jobs list
content:
application/json:
schema:
type: object
properties:
jobs:
type: array
items:
$ref: "#/components/schemas/JobEntry"
pagination:
$ref: "#/components/schemas/PaginationInfo"
/api/jobs/{job_id}:
get:
operationId: getJob
tags: [queue]
summary: Get a single job by ID
description: Returns the full record for a single completed prompt execution, including its outputs, status, and metadata.
parameters:
- name: job_id
in: path
description: The job (prompt) ID to fetch.
required: true
schema:
type: string
format: uuid
responses:
"200":
description: Job detail
content:
application/json:
schema:
$ref: "#/components/schemas/JobDetailResponse"
"404":
description: Job not found
# ---------------------------------------------------------------------------
# History
# ---------------------------------------------------------------------------
/api/history:
get:
operationId: getHistory
tags: [history]
summary: Get execution history
deprecated: true
description: |
**Deprecated.** Superseded by `GET /api/jobs`, which returns the same
execution records in a paginated, filterable format. Planned for removal
no earlier than a future major release; sunset timeline TBD.
Returns a dictionary keyed by prompt_id. Each value is a HistoryEntry
containing prompt metadata, outputs, status, and node meta.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: max_items
in: query
schema:
type: integer
description: Maximum number of history entries to return
- name: offset
in: query
schema:
type: integer
description: Pagination offset (number of entries to skip)
responses:
"200":
description: History dictionary keyed by prompt_id
content:
application/json:
schema:
type: object
additionalProperties:
$ref: "#/components/schemas/HistoryEntry"
post:
operationId: manageHistory
tags: [history]
summary: Clear or delete history entries
deprecated: true
description: |
**Deprecated.** Superseded by the forthcoming job-management endpoints
under `/api/jobs`. Planned for removal no earlier than a future major
release; sunset timeline TBD.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/HistoryManageRequest"
responses:
"200":
description: History updated
/api/history/{prompt_id}:
get:
operationId: getHistoryByPromptId
tags: [history]
summary: Get history for a specific prompt
deprecated: true
description: |
**Deprecated.** Superseded by `GET /api/jobs/{job_id}`, which returns
the same execution record. Planned for removal no earlier than a future
major release; sunset timeline TBD.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: prompt_id
in: path
description: The prompt ID to fetch history for.
required: true
schema:
type: string
format: uuid
responses:
"200":
description: Single-entry history dictionary. Returns an empty object `{}` if the prompt_id is not found.
content:
application/json:
schema:
type: object
additionalProperties:
$ref: "#/components/schemas/HistoryEntry"
# ---------------------------------------------------------------------------
# Upload
# ---------------------------------------------------------------------------
/api/upload/image:
post:
operationId: uploadImage
tags: [upload]
summary: Upload an image file
description: Uploads an image file into one of the input/output/temp directories so it can be referenced by workflow nodes.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- image
properties:
image:
type: string
format: binary
description: Image file to upload
type:
type: string
enum: [input, temp, output]
default: input
description: Target directory type
overwrite:
type: string
description: 'Set to "true" to overwrite existing files'
subfolder:
type: string
description: Subfolder within the target directory
responses:
"200":
description: Upload result
content:
application/json:
schema:
$ref: "#/components/schemas/UploadResult"
"400":
description: No file provided or invalid request
/api/upload/mask:
post:
operationId: uploadMask
tags: [upload]
summary: Upload a mask image
description: Uploads a mask image associated with a previously-uploaded reference image.
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- image
- original_ref
properties:
image:
type: string
format: binary
description: Mask image (alpha channel is used)
original_ref:
type: object
description: Reference to the original image file
required:
- filename
properties:
filename:
type: string
description: Filename of the original image
additionalProperties: true
type:
type: string
enum: [input, temp, output]
default: input
description: Target directory type
overwrite:
type: string
description: 'Set to "true" to overwrite existing files'
subfolder:
type: string
description: Subfolder within the target directory
responses:
"200":
description: Upload result
content:
application/json:
schema:
$ref: "#/components/schemas/UploadResult"
"400":
description: No file provided or invalid request
# ---------------------------------------------------------------------------
# View
# ---------------------------------------------------------------------------
/api/view:
get:
operationId: viewFile
tags: [view]
summary: View or download a file
description: Serves a file (image, audio, or video) from the input/output/temp directory identified by the query parameters.
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Name of the file to view
- name: type
in: query
schema:
type: string
enum: [input, output, temp]
default: output
description: Directory type
- name: subfolder
in: query
schema:
type: string
description: Subfolder within the directory
- name: preview
in: query
schema:
type: string
description: Preview format hint (e.g. "webp;90")
- name: channel
in: query
schema:
type: string
enum: [rgba, rgb, a]
description: Channel extraction mode
responses:
"200":
description: File content
content:
image/*:
schema:
type: string
format: binary
video/*:
schema:
type: string
format: binary
audio/*:
schema:
type: string
format: binary
application/octet-stream:
schema:
type: string
format: binary
"404":
description: File not found
/api/view_metadata/{folder_name}:
get:
operationId: viewMetadata
tags: [view]
summary: Get metadata for a file (e.g. safetensors header)
description: Returns embedded metadata parsed from a file in the given folder — for example, the header of a safetensors model.
parameters:
- name: folder_name
in: path
required: true
schema:
type: string
description: Folder type (output, input, temp, etc.)
- name: filename
in: query
required: true
schema:
type: string
description: Filename to read metadata from
responses:
"200":
description: File metadata
content:
application/json:
schema:
type: object
additionalProperties: true
"404":
description: File or metadata not found
# ---------------------------------------------------------------------------
# System
# ---------------------------------------------------------------------------
/api/system_stats:
get:
operationId: getSystemStats
tags: [system]
summary: Get system statistics
description: Returns hardware, Python, VRAM, and runtime statistics for the running ComfyUI process.
responses:
"200":
description: System stats
content:
application/json:
schema:
$ref: "#/components/schemas/SystemStatsResponse"
/api/features:
get:
operationId: getFeatures
tags: [system]
summary: Get enabled feature flags
description: Returns a dictionary of feature flag names to their enabled state. Cloud deployments may include additional typed fields alongside the boolean flags.
responses:
"200":
description: Feature flags
content:
application/json:
schema:
type: object
additionalProperties:
type: boolean
properties:
max_upload_size:
type: integer
format: int64
minimum: 0
description: "Maximum file upload size in bytes."
free_tier_credits:
type: integer
format: int32
minimum: 0
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Credits available to free-tier users. Local ComfyUI returns null."
posthog_api_host:
type: string
format: uri
nullable: true
x-runtime: [cloud]
description: "[cloud-only] PostHog analytics proxy URL for frontend telemetry. Local ComfyUI returns null."
max_concurrent_jobs:
type: integer
format: int32
minimum: 0
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Maximum concurrent jobs the authenticated user can run. Local ComfyUI returns null."
workflow_templates_version:
type: string
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Version identifier for the workflow templates bundle. Local ComfyUI returns null."
workflow_templates_source:
type: string
nullable: true
enum: [dynamic_config_override, workflow_templates_version_json]
x-runtime: [cloud]
description: "[cloud-only] How the templates version was resolved. Local ComfyUI returns null."
# ---------------------------------------------------------------------------
# Node / Object Info
# ---------------------------------------------------------------------------
/api/object_info:
get:
operationId: getObjectInfo
tags: [node]
summary: Get all node definitions
description: |
Returns a dictionary of every registered node class, keyed by class name.
Each value is a NodeInfo object describing inputs, outputs, category, etc.
responses:
"200":
description: All node definitions
content:
application/json:
schema:
type: object
additionalProperties:
$ref: "#/components/schemas/NodeInfo"
/api/object_info/{node_class}:
get:
operationId: getObjectInfoByClass
tags: [node]
summary: Get a single node definition
description: Returns the `NodeInfo` definition for a single registered node class.
parameters:
- name: node_class
in: path
required: true
schema:
type: string
description: Node class name (e.g. "KSampler")
responses:
"200":
description: Single node definition
content:
application/json:
schema:
type: object
additionalProperties:
$ref: "#/components/schemas/NodeInfo"
"404":
description: Node class not found
/api/embeddings:
get:
operationId: getEmbeddings
tags: [node]
summary: List available embedding names
description: Returns the list of text-encoder embeddings available on disk.
responses:
"200":
description: Embedding names
content:
application/json:
schema:
type: array
items:
type: string
# ---------------------------------------------------------------------------
# Models
# ---------------------------------------------------------------------------
/api/models:
get:
operationId: getModelTypes
tags: [model]
summary: List model folder type names
description: Returns an array of model type names (e.g. checkpoints, loras, vae).
responses:
"200":
description: Model type names
content:
application/json:
schema:
type: array
items:
type: string
/api/models/{folder}:
get:
operationId: getModelsByFolder
tags: [model]
summary: List model filenames in a folder
description: Returns the names of model files in the given folder. This endpoint predates `/api/experiment/models/{folder}` and returns names only — prefer the experiment endpoint for new integrations.
parameters:
- name: folder
in: path
required: true
schema:
type: string
description: Model folder type name
responses:
"200":
description: Model filenames
content:
application/json:
schema:
type: array
items:
type: string
"404":
description: Unknown folder type
/api/experiment/models:
get:
operationId: getExperimentModels
tags: [model]
summary: List model folders with paths
description: Returns an array of model folder objects with name and folder paths.
responses:
"200":
description: Model folders
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ModelFolder"
/api/experiment/models/{folder}:
get:
operationId: getExperimentModelsByFolder
tags: [model]
summary: List model files with metadata
description: Returns the model files in the given folder with richer metadata (path index, mtime, size) than the legacy `/api/models/{folder}` endpoint.
parameters:
- name: folder
in: path
required: true
schema:
type: string
description: Model folder type name
responses:
"200":
description: Model files with metadata
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/ModelFile"
"404":
description: Unknown folder type
/api/experiment/models/preview/{folder}/{path_index}/{filename}:
get:
operationId: getModelPreview
tags: [model]
summary: Get model preview image
description: Returns the preview image associated with a model file, if one exists alongside the model on disk.
parameters:
- name: folder
in: path
required: true
schema:
type: string
description: Model folder type name
- name: path_index
in: path
required: true
schema:
type: integer
description: Path index within the folder
- name: filename
in: path
required: true
schema:
type: string
description: Model filename
responses:
"200":
description: Preview image (WebP)
content:
image/webp:
schema:
type: string
format: binary
"404":
description: Preview not found
# ---------------------------------------------------------------------------
# Users
# ---------------------------------------------------------------------------
/api/users:
get:
operationId: getUsers
tags: [user]
summary: Get user storage info
description: |
Returns user storage configuration. In single-user mode returns
`{"storage": "server", "migrated": true/false}`. In multi-user mode
returns `{"storage": "server", "users": {"user_id": "user_dir", ...}}`.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
responses:
"200":
description: User info
content:
application/json:
schema:
type: object
properties:
storage:
type: string
description: Storage backend type (always "server")
migrated:
type: boolean
description: Whether migration from browser storage is complete (single-user)
users:
type: object
additionalProperties:
type: string
description: Map of user_id to directory name (multi-user)
post:
operationId: createUser
tags: [user]
summary: Create a new user (multi-user mode)
description: Creates a new user entry. Only meaningful when ComfyUI is running in multi-user mode.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- username
properties:
username:
type: string
description: Username for the new user
responses:
"200":
description: Created user ID
content:
application/json:
schema:
type: string
description: The generated user_id
"400":
description: Username already exists or invalid
# ---------------------------------------------------------------------------
# Userdata
# ---------------------------------------------------------------------------
/api/userdata:
get:
operationId: listUserdata
tags: [userdata]
summary: List files in a userdata directory
description: Lists files in the authenticated user's data directory. Returns either filename strings or full objects depending on the `full_info` query parameter.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: dir
in: query
required: true
schema:
type: string
description: Directory path relative to the user's data folder
- name: recurse
in: query
schema:
type: boolean
description: Recurse into subdirectories
- name: full_info
in: query
schema:
type: boolean
description: Return full file info objects instead of just names
- name: split
in: query
schema:
type: boolean
description: Split paths into directory components
responses:
"200":
description: File listing
content:
application/json:
schema:
$ref: "#/components/schemas/ListUserdataResponse"
"404":
description: Directory not found
/api/v2/userdata:
get:
operationId: listUserdataV2
tags: [userdata]
summary: List files in userdata (v2 format)
description: Lists files in the authenticated user's data directory using the v2 response shape, which always returns full objects.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: path
in: query
schema:
type: string
description: Directory path relative to user data root
responses:
"200":
description: File listing with metadata
content:
application/json:
schema:
type: array
items:
type: object
properties:
name:
type: string
path:
type: string
type:
type: string
enum: [file, directory]
size:
type: integer
modified:
type: number
description: Unix timestamp
/api/userdata/{file}:
get:
operationId: getUserdataFile
tags: [userdata]
summary: Read a userdata file
description: Reads the contents of a file from the authenticated user's data directory.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: file
in: path
required: true
schema:
type: string
description: File path relative to user data directory
responses:
"200":
description: File content
content:
application/octet-stream:
schema:
type: string
format: binary
"404":
description: File not found
post:
operationId: writeUserdataFile
tags: [userdata]
summary: Write or create a userdata file
description: Writes (creates or replaces) a file in the authenticated user's data directory.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: file
in: path
required: true
schema:
type: string
description: File path relative to user data directory
- name: overwrite
in: query
schema:
type: boolean
description: Allow overwriting existing files
- name: full_info
in: query
schema:
type: boolean
description: Return full file info in response
requestBody:
required: true
content:
application/octet-stream:
schema:
type: string
format: binary
application/json:
schema: {}
responses:
"200":
description: File written
content:
application/json:
schema:
$ref: "#/components/schemas/UserDataResponse"
"409":
description: File exists and overwrite not set
delete:
operationId: deleteUserdataFile
tags: [userdata]
summary: Delete a userdata file
description: Deletes a file from the authenticated user's data directory.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: file
in: path
required: true
schema:
type: string
description: File path relative to user data directory
responses:
"204":
description: File deleted
"404":
description: File not found
/api/userdata/{file}/move/{dest}:
post:
operationId: moveUserdataFile
tags: [userdata]
summary: Move or rename a userdata file
description: Renames or moves a file within the authenticated user's data directory.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: file
in: path
required: true
schema:
type: string
description: Source file path
- name: dest
in: path
required: true
schema:
type: string
description: Destination file path
- name: overwrite
in: query
schema:
type: boolean
description: Allow overwriting at destination
- name: full_info
in: query
schema:
type: boolean
description: Return full file info in response
responses:
"200":
description: File moved
content:
application/json:
schema:
$ref: "#/components/schemas/UserDataResponse"
"404":
description: Source file not found
"409":
description: Destination exists and overwrite not set
# ---------------------------------------------------------------------------
# Settings
# ---------------------------------------------------------------------------
/api/settings:
get:
operationId: getSettings
tags: [settings]
summary: Get all user settings
description: Returns all settings for the authenticated user.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
responses:
"200":
description: Settings object
content:
application/json:
schema:
type: object
additionalProperties: true
post:
operationId: updateSettings
tags: [settings]
summary: Update user settings (partial merge)
description: Replaces the authenticated user's settings with the provided object.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: true
description: Partial settings to merge
responses:
"200":
description: Settings updated
/api/settings/{id}:
get:
operationId: getSetting
tags: [settings]
summary: Get a single setting by key
description: Returns the value of a single setting, identified by key.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: id
in: path
required: true
schema:
type: string
description: Setting key
responses:
"200":
description: Setting value (null if the setting does not exist)
content:
application/json:
schema:
nullable: true
description: The setting value (any JSON type), or null if not set
post:
operationId: updateSetting
tags: [settings]
summary: Set a single setting value
description: Sets the value of a single setting, identified by key.
parameters:
- $ref: "#/components/parameters/ComfyUserHeader"
- name: id
in: path
required: true
schema:
type: string
description: Setting key
requestBody:
required: true
content:
application/json:
schema:
description: The setting value (any JSON type)
responses:
"200":
description: Setting updated
# ---------------------------------------------------------------------------
# Extensions / Templates / i18n
# ---------------------------------------------------------------------------
/api/extensions:
get:
operationId: getExtensions
tags: [extensions]
summary: List frontend extension JS file paths
description: Returns the list of frontend extension JS URLs registered by custom nodes, to be loaded by the frontend on startup.
responses:
"200":
description: Array of JS file paths
content:
application/json:
schema:
type: array
items:
type: string
description: Relative path to extension JS file
/api/workflow_templates:
get:
operationId: getWorkflowTemplates
tags: [extensions]
summary: Get workflow template mappings
description: Returns a map of custom node names to their provided workflow template names.
responses:
"200":
description: Template mappings
content:
application/json:
schema:
type: object
additionalProperties:
type: array
items:
type: string
description: Map of node pack name to array of template names
/api/i18n:
get:
operationId: getI18n
tags: [extensions]
summary: Get internationalisation translation strings
description: Returns the URLs of translation files contributed by custom nodes, keyed by locale.
responses:
"200":
description: Translation map
content:
application/json:
schema:
type: object
additionalProperties: true
description: Nested map of locale to translation key-value pairs
# ---------------------------------------------------------------------------
# Subgraphs
# ---------------------------------------------------------------------------
/api/global_subgraphs:
get:
operationId: getGlobalSubgraphs
tags: [subgraph]
summary: List global subgraph blueprints
description: Returns a dictionary of subgraph IDs to their metadata.
responses:
"200":
description: Subgraph metadata dictionary
content:
application/json:
schema:
type: object
additionalProperties:
$ref: "#/components/schemas/GlobalSubgraphInfo"
/api/global_subgraphs/{id}:
get:
operationId: getGlobalSubgraph
tags: [subgraph]
summary: Get a global subgraph with full data
description: Returns the blueprint for a globally-registered subgraph, used by the frontend to materialize the subgraph node.
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Subgraph identifier
responses:
"200":
description: Full subgraph data
content:
application/json:
schema:
$ref: "#/components/schemas/GlobalSubgraphData"
"404":
description: Subgraph not found
# ---------------------------------------------------------------------------
# Node Replacements
# ---------------------------------------------------------------------------
/api/node_replacements:
get:
operationId: getNodeReplacements
tags: [node]
summary: Get node replacement mappings
description: |
Returns a dictionary mapping deprecated or replaced node class names
to their replacement node information.
responses:
"200":
description: Replacement mappings
content:
application/json:
schema:
type: object
additionalProperties: true
# ---------------------------------------------------------------------------
# Internal (x-internal: true)
# ---------------------------------------------------------------------------
/internal/logs:
get:
operationId: getInternalLogs
tags: [internal]
summary: Get server logs as text
description: Returns structured ComfyUI log entries from the in-memory log buffer.
x-internal: true
responses:
"200":
description: Log text
content:
text/plain:
schema:
type: string
/internal/logs/raw:
get:
operationId: getInternalLogsRaw
tags: [internal]
summary: Get raw structured log entries
description: Returns the raw ComfyUI log buffer as text, together with metadata about the current size limit.
x-internal: true
responses:
"200":
description: Structured log data
content:
application/json:
schema:
type: object
properties:
entries:
type: array
items:
type: object
properties:
t:
type: number
description: Timestamp
m:
type: string
description: Message
size:
type: object
properties:
cols:
type: integer
rows:
type: integer
/internal/logs/subscribe:
patch:
operationId: subscribeToLogs
tags: [internal]
summary: Subscribe or unsubscribe a WebSocket client to log streaming
description: Subscribes or unsubscribes the current client from live log streaming over the WebSocket.
x-internal: true
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- clientId
- enabled
properties:
clientId:
type: string
description: WebSocket client ID
enabled:
type: boolean
description: Enable or disable log streaming for this client
responses:
"200":
description: Subscription updated
/internal/folder_paths:
get:
operationId: getInternalFolderPaths
tags: [internal]
summary: Get configured folder paths
description: Returns the filesystem paths ComfyUI is configured to load models and other assets from, keyed by folder type.
x-internal: true
responses:
"200":
description: Dictionary of folder type to paths
content:
application/json:
schema:
type: object
additionalProperties:
type: array
items:
type: array
items:
type: string
description: Map of folder type name to list of [path, ...] entries
/internal/files/{directory_type}:
get:
operationId: getInternalFiles
tags: [internal]
summary: List files in a directory type
description: Lists the files present in one of ComfyUI's known directories (input, output, or temp).
x-internal: true
parameters:
- name: directory_type
in: path
required: true
schema:
type: string
description: Directory type (e.g. output, input, temp)
responses:
"200":
description: Array of filenames
content:
application/json:
schema:
type: array
items:
type: string
# ---------------------------------------------------------------------------
# Assets (x-feature-gate: enable-assets)
# ---------------------------------------------------------------------------
/api/assets/hash/{hash}:
head:
operationId: checkAssetByHash
tags: [assets]
summary: Check if an asset with the given hash exists
description: Returns 204 if an asset with the given content hash already exists, 404 otherwise. Used by clients to deduplicate uploads before transferring bytes.
x-feature-gate: enable-assets
parameters:
- name: hash
in: path
required: true
schema:
type: string
description: "Blake3 hash of the asset (e.g. blake3:abc123...)"
responses:
"200":
description: Asset exists
"404":
description: No asset with this hash
/api/assets:
get:
operationId: listAssets
tags: [assets]
summary: List assets with filtering and pagination
description: Returns a paginated list of assets, optionally filtered by tags, name, or other query parameters.
x-feature-gate: enable-assets
parameters:
- name: limit
in: query
schema:
type: integer
default: 50
- name: offset
in: query
schema:
type: integer
default: 0
- name: include_tags
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Tags that assets must have (AND logic)
- name: exclude_tags
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Tags that assets must not have
- name: name_contains
in: query
schema:
type: string
description: Filter assets whose name contains this substring
- name: metadata_filter
in: query
schema:
type: string
description: JSON-encoded metadata key/value filter
- name: sort
in: query
schema:
type: string
description: Field to sort by
- name: order
in: query
schema:
type: string
enum: [asc, desc]
description: Sort direction
- name: job_ids
in: query
schema:
type: string
x-runtime: [cloud]
description: "[cloud-only] Comma-separated UUIDs to filter assets by associated job."
- name: include_public
in: query
schema:
type: boolean
x-runtime: [cloud]
description: "[cloud-only] Include workspace-public assets in addition to the caller's own."
- name: asset_hash
in: query
schema:
type: string
x-runtime: [cloud]
description: "[cloud-only] Filter by exact content hash."
responses:
"200":
description: Asset list
content:
application/json:
schema:
$ref: "#/components/schemas/ListAssetsResponse"
post:
operationId: createAsset
tags: [assets]
summary: Upload a new asset
description: Uploads a new asset (binary content plus metadata) and registers it in the asset database.
x-feature-gate: enable-assets
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
required:
- file
properties:
file:
type: string
format: binary
description: Asset file to upload
name:
type: string
description: Display name for the asset
tags:
type: string
description: Comma-separated tags
user_metadata:
type: string
description: JSON-encoded user metadata
hash:
type: string
description: "Blake3 hash of the file content (e.g. blake3:abc123...)"
mime_type:
type: string
description: MIME type of the file (overrides auto-detected type)
preview_id:
type: string
format: uuid
description: ID of an existing asset to use as the preview image
id:
type: string
format: uuid
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Client-supplied asset ID for idempotent creation. If an asset with this ID already exists, the existing asset is returned."
application/json:
schema:
type: object
x-runtime: [cloud]
description: "[cloud-only] URL-based asset upload. Caller supplies a URL instead of a file body; the server fetches the content."
required:
- url
properties:
url:
type: string
format: uri
description: "[cloud-only] URL of the file to import as an asset"
name:
type: string
description: Display name for the asset
tags:
type: string
description: Comma-separated tags
user_metadata:
type: string
description: JSON-encoded user metadata
hash:
type: string
description: "Blake3 hash of the file content (e.g. blake3:abc123...)"
mime_type:
type: string
description: MIME type of the file (overrides auto-detected type)
preview_id:
type: string
format: uuid
description: ID of an existing asset to use as the preview image
id:
type: string
format: uuid
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Client-supplied asset ID for idempotent creation. If an asset with this ID already exists, the existing asset is returned."
responses:
"201":
description: Asset created
content:
application/json:
schema:
$ref: "#/components/schemas/AssetCreated"
/api/assets/from-hash:
post:
operationId: createAssetFromHash
tags: [assets]
summary: Create an asset reference from an existing hash
description: Registers a new asset that references existing content by hash, without re-uploading the bytes.
x-feature-gate: enable-assets
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- hash
- name
properties:
hash:
type: string
description: Blake3 hash of existing content
name:
type: string
description: Display name
tags:
type: array
items:
type: string
user_metadata:
type: object
additionalProperties: true
mime_type:
type: string
nullable: true
x-runtime: [cloud]
description: "[cloud-only] MIME type of the content, so the type is preserved without re-inspecting content. Ignored by local ComfyUI."
responses:
"201":
description: Asset created from hash
content:
application/json:
schema:
$ref: "#/components/schemas/AssetCreated"
/api/assets/{id}:
get:
operationId: getAsset
tags: [assets]
summary: Get asset metadata
description: Returns the metadata for a single asset.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
responses:
"200":
description: Asset metadata
content:
application/json:
schema:
$ref: "#/components/schemas/Asset"
"404":
description: Asset not found
put:
operationId: updateAsset
tags: [assets]
summary: Update asset metadata
description: Updates the mutable metadata of an asset (name, tags, etc.). Binary content is immutable.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: New display name for the asset
user_metadata:
type: object
additionalProperties: true
description: Custom user metadata to set
preview_id:
type: string
format: uuid
description: ID of the asset to use as the preview
mime_type:
type: string
nullable: true
x-runtime: [cloud]
description: "[cloud-only] MIME type override when auto-detection was wrong. Ignored by local ComfyUI."
responses:
"200":
description: Asset updated
content:
application/json:
schema:
$ref: "#/components/schemas/AssetUpdated"
delete:
operationId: deleteAsset
tags: [assets]
summary: Delete an asset
description: Removes an asset entry. Depending on the server configuration, the underlying content may also be deleted.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
- name: delete_content
in: query
schema:
type: boolean
description: Also delete the underlying content file
responses:
"204":
description: Asset deleted
/api/assets/{id}/content:
get:
operationId: getAssetContent
tags: [assets]
summary: Download asset file content
description: Returns the binary content of an asset. Supports range requests.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
responses:
"200":
description: Asset file content
content:
application/octet-stream:
schema:
type: string
format: binary
"404":
description: Asset not found
/api/assets/{id}/tags:
post:
operationId: addAssetTags
tags: [assets]
summary: Add tags to an asset
description: Adds one or more tags to an asset.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- tags
properties:
tags:
type: array
items:
type: string
responses:
"200":
description: Tags added
content:
application/json:
schema:
$ref: "#/components/schemas/TagsModificationResponse"
delete:
operationId: removeAssetTags
tags: [assets]
summary: Remove tags from an asset
description: Removes one or more tags from an asset.
x-feature-gate: enable-assets
parameters:
- name: id
in: path
description: The asset ID.
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- tags
properties:
tags:
type: array
items:
type: string
responses:
"200":
description: Tags removed
content:
application/json:
schema:
$ref: "#/components/schemas/TagsModificationResponse"
/api/tags:
get:
operationId: listTags
tags: [assets]
summary: List all known tags with counts
description: Returns the list of all tags known to the asset database, with counts.
x-feature-gate: enable-assets
parameters:
- name: limit
in: query
schema:
type: integer
- name: offset
in: query
schema:
type: integer
- name: search
in: query
schema:
type: string
description: Search term for tag name
responses:
"200":
description: Tag list
content:
application/json:
schema:
$ref: "#/components/schemas/ListTagsResponse"
/api/assets/tags/refine:
get:
operationId: refineAssetTags
tags: [assets]
summary: Get tag counts for assets matching current filters
description: Returns suggested additional tags that would refine a filtered asset query, together with the count of assets each tag would select.
x-feature-gate: enable-assets
parameters:
- name: include_tags
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Tags that assets must have (AND logic)
- name: exclude_tags
in: query
schema:
type: array
items:
type: string
style: form
explode: true
description: Tags that assets must not have
- name: name_contains
in: query
schema:
type: string
description: Filter assets whose name contains this substring
- name: metadata_filter
in: query
schema:
type: string
description: JSON-encoded metadata key/value filter
- name: limit
in: query
schema:
type: integer
- name: offset
in: query
schema:
type: integer
- name: sort
in: query
schema:
type: string
description: Field to sort by
- name: order
in: query
schema:
type: string
enum: [asc, desc]
description: Sort direction
responses:
"200":
description: Tag histogram
content:
application/json:
schema:
$ref: "#/components/schemas/AssetTagHistogramResponse"
/api/assets/seed:
post:
operationId: seedAssets
tags: [assets]
summary: Trigger asset scan/seed from filesystem
description: Starts a background job that scans the configured directories and registers any assets not yet present in the asset database.
x-feature-gate: enable-assets
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
roots:
type: array
items:
type: string
description: Root folder paths to scan (if omitted, scans all)
responses:
"200":
description: Seed started
content:
application/json:
schema:
type: object
properties:
status:
type: string
/api/assets/seed/status:
get:
operationId: getAssetSeedStatus
tags: [assets]
summary: Get asset scan progress
description: Returns the progress and status of the most recently-started asset seed job.
x-feature-gate: enable-assets
responses:
"200":
description: Scan progress
content:
application/json:
schema:
type: object
additionalProperties: true
description: Scan progress details (files scanned, total, status, etc.)
/api/assets/seed/cancel:
post:
operationId: cancelAssetSeed
tags: [assets]
summary: Cancel an in-progress asset scan
description: Requests cancellation of the currently-running asset seed job.
x-feature-gate: enable-assets
responses:
"200":
description: Scan cancelled
content:
application/json:
schema:
type: object
properties:
status:
type: string
/api/assets/prune:
post:
operationId: pruneAssets
tags: [assets]
summary: Mark assets whose backing files no longer exist on disk
description: Starts a background job that removes asset entries whose underlying content no longer exists on disk.
x-feature-gate: enable-assets
responses:
"200":
description: Prune result
content:
application/json:
schema:
type: object
properties:
status:
type: string
marked:
type: integer
description: Number of assets marked as missing
# ===========================================================================
# Cloud-runtime FE-facing operations
#
# These operations are served by the cloud runtime. The local runtime returns
# 404 for all of these paths. Each operation is tagged x-runtime: [cloud].
# ===========================================================================
# ---------------------------------------------------------------------------
# Jobs / prompts (cloud)
# ---------------------------------------------------------------------------
/api/jobs/{job_id}/cancel:
post:
operationId: cancelJob
tags: [queue]
summary: Cancel a running or pending job
description: "[cloud-only] Requests cancellation of a job. If the job is currently executing, execution is interrupted. If it is pending in the queue, it is removed."
x-runtime: [cloud]
parameters:
- name: job_id
in: path
required: true
schema:
type: string
format: uuid
description: The job ID to cancel.
responses:
"200":
description: Cancellation accepted
content:
application/json:
schema:
$ref: "#/components/schemas/CloudJobStatus"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/job/{job_id}:
get:
operationId: getCloudJob
tags: [queue]
summary: Get a single cloud job by ID
description: "[cloud-only] Returns the full cloud job record, including workflow, outputs, and execution metadata."
x-runtime: [cloud]
parameters:
- name: job_id
in: path
required: true
schema:
type: string
format: uuid
description: The job ID to fetch.
responses:
"200":
description: Cloud job detail
content:
application/json:
schema:
$ref: "#/components/schemas/CloudJob"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/job/{job_id}/outputs:
get:
operationId: getCloudJobOutputs
tags: [queue]
summary: Get outputs for a cloud job
description: "[cloud-only] Returns the output assets produced by a cloud job execution."
x-runtime: [cloud]
parameters:
- name: job_id
in: path
required: true
schema:
type: string
format: uuid
description: The job ID to fetch outputs for.
responses:
"200":
description: Job outputs
content:
application/json:
schema:
$ref: "#/components/schemas/CloudJobOutputs"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/job/{job_id}/status:
get:
operationId: getCloudJobStatus
tags: [queue]
summary: Get status of a cloud job
description: "[cloud-only] Returns the current execution status of a cloud job."
x-runtime: [cloud]
parameters:
- name: job_id
in: path
required: true
schema:
type: string
format: uuid
description: The job ID to check status for.
responses:
"200":
description: Job status
content:
application/json:
schema:
$ref: "#/components/schemas/CloudJobStatus"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/prompt/{prompt_id}:
get:
operationId: getCloudPrompt
tags: [prompt]
summary: Get a cloud prompt by ID
description: "[cloud-only] Returns the full prompt record for a cloud-executed prompt, including the submitted workflow graph and execution metadata."
x-runtime: [cloud]
parameters:
- name: prompt_id
in: path
required: true
schema:
type: string
format: uuid
description: The prompt ID to fetch.
responses:
"200":
description: Cloud prompt detail
content:
application/json:
schema:
$ref: "#/components/schemas/CloudPrompt"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/history_v2:
get:
operationId: getHistoryV2
tags: [history]
summary: Get paginated execution history (v2)
description: "[cloud-only] Returns a paginated list of execution history entries in the v2 format, with richer metadata than the legacy history endpoint."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
default: 20
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
default: 0
description: Pagination offset
- name: status
in: query
schema:
type: string
description: Filter by execution status
responses:
"200":
description: History list
content:
application/json:
schema:
$ref: "#/components/schemas/HistoryV2Response"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/history_v2/{prompt_id}:
get:
operationId: getHistoryV2ByPromptId
tags: [history]
summary: Get v2 history for a specific prompt
description: "[cloud-only] Returns the v2 history entry for a specific prompt execution."
x-runtime: [cloud]
parameters:
- name: prompt_id
in: path
required: true
schema:
type: string
format: uuid
description: The prompt ID to fetch history for.
responses:
"200":
description: History entry
content:
application/json:
schema:
$ref: "#/components/schemas/HistoryV2Entry"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/logs:
get:
operationId: getCloudLogs
tags: [system]
summary: Get cloud execution logs
description: "[cloud-only] Returns execution logs for the authenticated user's cloud jobs."
x-runtime: [cloud]
parameters:
- name: job_id
in: query
schema:
type: string
description: Filter logs by job ID
- name: limit
in: query
schema:
type: integer
default: 100
description: Maximum number of log entries
- name: offset
in: query
schema:
type: integer
default: 0
description: Pagination offset
responses:
"200":
description: Log entries
content:
application/json:
schema:
$ref: "#/components/schemas/CloudLogsResponse"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
# ---------------------------------------------------------------------------
# Assets extensions (cloud)
# ---------------------------------------------------------------------------
/api/assets/download:
post:
operationId: downloadAssets
tags: [assets]
summary: Download assets to cloud runtime
description: "[cloud-only] Initiates a download of one or more assets to the cloud runtime environment. Returns a task ID for tracking download progress via WebSocket."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- assets
properties:
assets:
type: array
items:
$ref: "#/components/schemas/AssetDownloadRequest"
description: Assets to download
responses:
"200":
description: Download initiated
content:
application/json:
schema:
type: object
properties:
task_id:
type: string
description: Task ID for tracking progress via WebSocket
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/assets/export:
post:
operationId: exportAssets
tags: [assets]
summary: Export assets as a downloadable archive
description: "[cloud-only] Initiates a bulk export of assets. Returns a task ID for tracking progress via WebSocket. When complete, the export can be downloaded via the exports endpoint."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- asset_ids
properties:
asset_ids:
type: array
items:
type: string
format: uuid
description: IDs of assets to export
export_name:
type: string
description: Name for the export archive
responses:
"200":
description: Export initiated
content:
application/json:
schema:
type: object
properties:
task_id:
type: string
export_name:
type: string
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/assets/exports/{exportName}:
get:
operationId: getAssetExport
tags: [assets]
summary: Download a completed asset export
description: "[cloud-only] Returns the archive file for a completed asset export."
x-runtime: [cloud]
parameters:
- name: exportName
in: path
required: true
schema:
type: string
description: Name of the export to download
responses:
"200":
description: Export archive file
content:
application/zip:
schema:
type: string
format: binary
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/assets/from-workflow:
post:
operationId: createAssetsFromWorkflow
tags: [assets]
summary: Create asset records from a workflow execution
description: "[cloud-only] Registers output files from a workflow execution as assets in the asset database."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- prompt_id
properties:
prompt_id:
type: string
format: uuid
description: Prompt ID whose outputs should be registered as assets
tags:
type: array
items:
type: string
description: Tags to apply to the created assets
responses:
"201":
description: Assets created
content:
application/json:
schema:
type: object
properties:
assets:
type: array
items:
$ref: "#/components/schemas/Asset"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/assets/import:
post:
operationId: importAssets
tags: [assets]
summary: Import assets from external URLs
description: "[cloud-only] Imports one or more assets from external URLs into the cloud asset store."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- imports
properties:
imports:
type: array
items:
$ref: "#/components/schemas/AssetImportRequest"
description: Assets to import
responses:
"200":
description: Import initiated
content:
application/json:
schema:
type: object
properties:
assets:
type: array
items:
$ref: "#/components/schemas/Asset"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/assets/remote-metadata:
get:
operationId: getAssetRemoteMetadata
tags: [assets]
summary: Fetch metadata for a remote asset URL
description: "[cloud-only] Fetches and returns metadata (content type, size, filename) for a remote URL without downloading the full content."
x-runtime: [cloud]
parameters:
- name: url
in: query
required: true
schema:
type: string
format: uri
description: URL to inspect
responses:
"200":
description: Remote metadata
content:
application/json:
schema:
$ref: "#/components/schemas/RemoteAssetMetadata"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
# ---------------------------------------------------------------------------
# Custom nodes / hub (cloud)
# ---------------------------------------------------------------------------
/api/experiment/nodes:
get:
operationId: listCloudNodes
tags: [node]
summary: List installed custom nodes
description: "[cloud-only] Returns the list of custom node packages installed in the cloud runtime."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
responses:
"200":
description: Custom node list
content:
application/json:
schema:
$ref: "#/components/schemas/CloudNodeList"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: installCloudNode
tags: [node]
summary: Install a custom node package
description: "[cloud-only] Installs a custom node package in the cloud runtime by ID or repository URL."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- id
properties:
id:
type: string
description: Node package ID or repository URL
version:
type: string
description: Specific version to install
responses:
"200":
description: Node installed
content:
application/json:
schema:
$ref: "#/components/schemas/CloudNode"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/experiment/nodes/{id}:
get:
operationId: getCloudNode
tags: [node]
summary: Get details of an installed custom node
description: "[cloud-only] Returns details about a specific installed custom node package."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Custom node package ID
responses:
"200":
description: Node detail
content:
application/json:
schema:
$ref: "#/components/schemas/CloudNode"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: uninstallCloudNode
tags: [node]
summary: Uninstall a custom node package
description: "[cloud-only] Removes a custom node package from the cloud runtime."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: Custom node package ID
responses:
"204":
description: Node uninstalled
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/assets/upload-url:
post:
operationId: getHubAssetUploadUrl
tags: [hub]
summary: Get a pre-signed upload URL for a hub asset
description: "[cloud-only] Returns a pre-signed URL that can be used to upload an asset file directly to storage."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- filename
- content_type
properties:
filename:
type: string
description: Name of the file to upload
content_type:
type: string
description: MIME type of the file
size:
type: integer
format: int64
description: File size in bytes
responses:
"200":
description: Upload URL
content:
application/json:
schema:
type: object
properties:
upload_url:
type: string
format: uri
description: Pre-signed upload URL
asset_url:
type: string
format: uri
description: Public URL after upload completes
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/labels:
get:
operationId: listHubLabels
tags: [hub]
summary: List available hub labels
description: "[cloud-only] Returns the list of labels/categories available for tagging hub content."
x-runtime: [cloud]
responses:
"200":
description: Label list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/HubLabel"
/api/hub/profiles:
get:
operationId: listHubProfiles
tags: [hub]
summary: List hub user profiles
description: "[cloud-only] Returns a paginated list of public hub user profiles."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
- name: search
in: query
schema:
type: string
description: Search by username or display name
responses:
"200":
description: Profile list
content:
application/json:
schema:
type: object
properties:
profiles:
type: array
items:
$ref: "#/components/schemas/HubProfile"
total:
type: integer
has_more:
type: boolean
post:
operationId: createHubProfile
tags: [hub]
summary: Create a Hub profile
description: "[cloud-only] Creates a hub profile for the specified workspace. Username is immutable after creation."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/CreateHubProfileRequest"
responses:
"201":
description: Hub profile created
content:
application/json:
schema:
$ref: "#/components/schemas/HubProfile"
"400":
description: Bad request (e.g. invalid username)
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"409":
description: Username already taken or profile already exists
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/profiles/{username}:
get:
operationId: getHubProfile
tags: [hub]
summary: Get a hub profile by username
description: "[cloud-only] Returns the public hub profile for the given username."
x-runtime: [cloud]
parameters:
- name: username
in: path
required: true
schema:
type: string
description: Hub username
responses:
"200":
description: Profile
content:
application/json:
schema:
$ref: "#/components/schemas/HubProfile"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/profiles/check:
get:
operationId: checkHubProfileUsername
tags: [hub]
summary: Check if a hub username is available
description: "[cloud-only] Returns whether the given username is available for registration."
x-runtime: [cloud]
parameters:
- name: username
in: query
required: true
schema:
type: string
description: Username to check
responses:
"200":
description: Availability result
content:
application/json:
schema:
type: object
properties:
available:
type: boolean
username:
type: string
/api/hub/profiles/me:
get:
operationId: getMyHubProfile
tags: [hub]
summary: Get the authenticated user's hub profile
description: "[cloud-only] Returns the hub profile of the currently authenticated user."
x-runtime: [cloud]
responses:
"200":
description: Profile
content:
application/json:
schema:
$ref: "#/components/schemas/HubProfile"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
put:
operationId: updateMyHubProfile
tags: [hub]
summary: Update the authenticated user's hub profile
description: "[cloud-only] Updates the hub profile of the currently authenticated user."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
username:
type: string
display_name:
type: string
bio:
type: string
avatar_url:
type: string
format: uri
links:
type: array
items:
type: string
format: uri
responses:
"200":
description: Updated profile
content:
application/json:
schema:
$ref: "#/components/schemas/HubProfile"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"409":
description: Conflict
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/workflows:
get:
operationId: listHubWorkflows
tags: [hub]
summary: List published hub workflows
description: "[cloud-only] Returns a paginated list of publicly shared workflows on the hub."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
- name: sort
in: query
schema:
type: string
description: Sort field (e.g. created_at, likes)
- name: order
in: query
schema:
type: string
enum: [asc, desc]
description: Sort direction
- name: search
in: query
schema:
type: string
description: Search by title or description
- name: labels
in: query
schema:
type: string
description: Filter by label IDs (comma-separated)
responses:
"200":
description: Hub workflow list
content:
application/json:
schema:
$ref: "#/components/schemas/HubWorkflowList"
post:
operationId: publishHubWorkflow
tags: [hub]
summary: Publish a workflow to the hub
description: "[cloud-only] Publishes a workflow to the hub with metadata, thumbnail, and sample images."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/PublishHubWorkflowRequest"
responses:
"200":
description: Workflow published to hub
content:
application/json:
schema:
$ref: "#/components/schemas/HubWorkflowDetail"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Workflow or profile not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/workflows/{share_id}:
get:
operationId: getHubWorkflow
tags: [hub]
summary: Get a published hub workflow by share ID
description: "[cloud-only] Returns the full details of a published workflow on the hub."
x-runtime: [cloud]
parameters:
- name: share_id
in: path
required: true
schema:
type: string
description: Workflow share ID
responses:
"200":
description: Hub workflow
content:
application/json:
schema:
$ref: "#/components/schemas/HubWorkflow"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: deleteHubWorkflow
tags: [hub]
summary: Unpublish a workflow from the hub
description: "[cloud-only] Removes a workflow from the hub listing."
x-runtime: [cloud]
parameters:
- name: share_id
in: path
required: true
schema:
type: string
description: Workflow share ID
responses:
"204":
description: Successfully unpublished
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Workflow not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/hub/workflows/index:
get:
operationId: getHubWorkflowIndex
tags: [hub]
summary: Get the hub workflow index
description: "[cloud-only] Returns the lightweight index of all hub workflows for client-side search and navigation."
x-runtime: [cloud]
responses:
"200":
description: Workflow index
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/HubWorkflowIndexEntry"
# ---------------------------------------------------------------------------
# Workflows (cloud)
# ---------------------------------------------------------------------------
/api/workflows:
get:
operationId: listCloudWorkflows
tags: [workflows]
summary: List cloud workflows
description: "[cloud-only] Returns a paginated list of the authenticated user's cloud workflows."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
- name: sort
in: query
schema:
type: string
description: Sort field
- name: order
in: query
schema:
type: string
enum: [asc, desc]
description: Sort direction
- name: search
in: query
schema:
type: string
description: Search by workflow name
responses:
"200":
description: Workflow list
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflowList"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createCloudWorkflow
tags: [workflows]
summary: Create a new cloud workflow
description: "[cloud-only] Creates a new cloud workflow with the provided name and optional initial content."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
description: Workflow name
description:
type: string
description: Workflow description
content:
type: object
additionalProperties: true
description: Initial workflow graph JSON
responses:
"201":
description: Workflow created
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflow"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workflows/{workflow_id}:
get:
operationId: getCloudWorkflow
tags: [workflows]
summary: Get a cloud workflow by ID
description: "[cloud-only] Returns the metadata for a cloud workflow."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
responses:
"200":
description: Workflow detail
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflow"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
patch:
operationId: updateCloudWorkflow
tags: [workflows]
summary: Update a cloud workflow
description: "[cloud-only] Updates the metadata (name, description) of an existing cloud workflow."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description:
type: string
responses:
"200":
description: Workflow updated
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflow"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: deleteCloudWorkflow
tags: [workflows]
summary: Delete a cloud workflow
description: "[cloud-only] Deletes a cloud workflow and all its versions."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
responses:
"204":
description: Workflow deleted
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workflows/{workflow_id}/content:
get:
operationId: getCloudWorkflowContent
tags: [workflows]
summary: Get the content of a cloud workflow
description: "[cloud-only] Returns the full workflow graph JSON for the latest version of a cloud workflow."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
- name: version_id
in: query
schema:
type: string
description: Specific version ID to fetch
responses:
"200":
description: Workflow content
content:
application/json:
schema:
type: object
additionalProperties: true
description: The full workflow graph JSON
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
put:
operationId: updateCloudWorkflowContent
tags: [workflows]
summary: Update the content of a cloud workflow
description: "[cloud-only] Saves new workflow graph JSON as a new version of the cloud workflow."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: true
description: The workflow graph JSON to save
responses:
"200":
description: Content updated
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflowVersion"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workflows/{workflow_id}/fork:
post:
operationId: forkCloudWorkflow
tags: [workflows]
summary: Fork a cloud workflow
description: "[cloud-only] Creates a copy of a cloud workflow under the authenticated user's account."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID to fork.
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: Name for the forked workflow (defaults to original name)
responses:
"201":
description: Forked workflow
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflow"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workflows/{workflow_id}/versions:
get:
operationId: listCloudWorkflowVersions
tags: [workflows]
summary: List versions of a cloud workflow
description: "[cloud-only] Returns the version history of a cloud workflow."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
responses:
"200":
description: Version list
content:
application/json:
schema:
type: object
properties:
versions:
type: array
items:
$ref: "#/components/schemas/CloudWorkflowVersion"
total:
type: integer
has_more:
type: boolean
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createCloudWorkflowVersion
tags: [workflows]
summary: Create a new cloud workflow version
description: "[cloud-only] Creates a new workflow version with updated workflow JSON. Uses optimistic concurrency via base_version."
x-runtime: [cloud]
parameters:
- name: workflow_id
in: path
required: true
schema:
type: string
format: uuid
description: The workflow ID.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/CreateWorkflowVersionRequest"
responses:
"201":
description: Version created
content:
application/json:
schema:
$ref: "#/components/schemas/WorkflowVersionResponse"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden — not the workflow owner
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"409":
description: Version conflict — base_version does not match latest
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workflows/published/{share_id}:
get:
operationId: getPublishedWorkflow
tags: [workflows]
summary: Get a published workflow by share ID
description: "[cloud-only] Returns a publicly published cloud workflow by its share identifier."
x-runtime: [cloud]
parameters:
- name: share_id
in: path
required: true
schema:
type: string
description: The workflow share ID.
responses:
"200":
description: Published workflow
content:
application/json:
schema:
$ref: "#/components/schemas/CloudWorkflow"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
# ---------------------------------------------------------------------------
# Auth / session (cloud)
# ---------------------------------------------------------------------------
/api/auth/session:
get:
operationId: getAuthSession
tags: [auth]
summary: Get the current authentication session
description: "[cloud-only] Returns the current session state for the authenticated user, including user identity and active workspace."
x-runtime: [cloud]
responses:
"200":
description: Session info
content:
application/json:
schema:
$ref: "#/components/schemas/AuthSession"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createAuthSession
tags: [auth]
summary: Create a session cookie
description: "[cloud-only] Creates a session cookie from the bearer token in the Authorization header. Returns a Set-Cookie header with a secure HttpOnly session cookie. Cookie authentication is not allowed for this endpoint."
x-runtime: [cloud]
responses:
"200":
description: Session created
content:
application/json:
schema:
$ref: "#/components/schemas/CreateSessionResponse"
"400":
description: Bad request — invalid or expired ID token
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: deleteAuthSession
tags: [auth]
summary: Delete session cookie (logout)
description: "[cloud-only] Clears the session cookie and optionally revokes the session on the server."
x-runtime: [cloud]
responses:
"200":
description: Session deleted
content:
application/json:
schema:
$ref: "#/components/schemas/DeleteSessionResponse"
/api/auth/token:
post:
operationId: createAuthToken
tags: [auth]
summary: Exchange credentials for an access token
description: "[cloud-only] Exchanges authentication credentials (e.g. an authorization code) for an access token."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- grant_type
properties:
grant_type:
type: string
enum: [authorization_code, refresh_token]
description: OAuth2 grant type
code:
type: string
description: Authorization code (for authorization_code grant)
refresh_token:
type: string
description: Refresh token (for refresh_token grant)
redirect_uri:
type: string
format: uri
description: Redirect URI used in the authorization request
responses:
"200":
description: Token response
content:
application/json:
schema:
$ref: "#/components/schemas/AuthTokenResponse"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/.well-known/jwks.json:
get:
operationId: getJwks
tags: [auth]
summary: Get JSON Web Key Set
description: "[cloud-only] Returns the JSON Web Key Set (JWKS) used to verify JWTs issued by the cloud authentication service."
x-runtime: [cloud]
responses:
"200":
description: JWKS
content:
application/json:
schema:
$ref: "#/components/schemas/JwksResponse"
# ---------------------------------------------------------------------------
# Billing (cloud)
# ---------------------------------------------------------------------------
/api/billing/balance:
get:
operationId: getBillingBalance
tags: [billing]
summary: Get current credit balance
description: "[cloud-only] Returns the authenticated user's current credit balance and usage summary."
x-runtime: [cloud]
responses:
"200":
description: Balance info
content:
application/json:
schema:
$ref: "#/components/schemas/BillingBalance"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/events:
get:
operationId: listBillingEvents
tags: [billing]
summary: List billing events
description: "[cloud-only] Returns a paginated list of billing events (charges, credits, refunds) for the authenticated user."
x-runtime: [cloud]
parameters:
- name: limit
in: query
schema:
type: integer
description: Maximum number of results
- name: offset
in: query
schema:
type: integer
description: Pagination offset
- name: type
in: query
schema:
type: string
description: Filter by event type
responses:
"200":
description: Billing events
content:
application/json:
schema:
$ref: "#/components/schemas/BillingEventList"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/ops/{id}:
get:
operationId: getBillingOp
tags: [billing]
summary: Get a billing operation by ID
description: "[cloud-only] Returns details of a specific billing operation."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The billing operation ID.
responses:
"200":
description: Billing operation
content:
application/json:
schema:
$ref: "#/components/schemas/BillingOp"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/payment-portal:
post:
operationId: createPaymentPortalSession
tags: [billing]
summary: Create a payment portal session
description: "[cloud-only] Creates a Stripe customer portal session for managing payment methods and invoices. Returns a URL to redirect the user to."
x-runtime: [cloud]
responses:
"200":
description: Portal session
content:
application/json:
schema:
type: object
properties:
url:
type: string
format: uri
description: Stripe portal URL
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/plans:
get:
operationId: listBillingPlans
tags: [billing]
summary: List available billing plans
description: "[cloud-only] Returns the list of available subscription plans and their pricing."
x-runtime: [cloud]
responses:
"200":
description: Plan list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/BillingPlan"
/api/billing/preview-subscribe:
post:
operationId: previewSubscription
tags: [billing]
summary: Preview a subscription change
description: "[cloud-only] Returns a preview of what a subscription change would cost, including prorations."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- plan_id
properties:
plan_id:
type: string
description: ID of the plan to preview
responses:
"200":
description: Subscription preview
content:
application/json:
schema:
$ref: "#/components/schemas/SubscriptionPreview"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/status:
get:
operationId: getBillingStatus
tags: [billing]
summary: Get billing status
description: "[cloud-only] Returns the authenticated user's current billing and subscription status."
x-runtime: [cloud]
responses:
"200":
description: Billing status
content:
application/json:
schema:
$ref: "#/components/schemas/BillingStatus"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/subscribe:
post:
operationId: createSubscription
tags: [billing]
summary: Subscribe to a billing plan
description: "[cloud-only] Creates a new subscription to the specified billing plan."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- plan_id
properties:
plan_id:
type: string
description: ID of the plan to subscribe to
payment_method_id:
type: string
description: Stripe payment method ID
responses:
"200":
description: Subscription created
content:
application/json:
schema:
$ref: "#/components/schemas/BillingSubscription"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/subscription/cancel:
post:
operationId: cancelSubscription
tags: [billing]
summary: Cancel the active subscription
description: "[cloud-only] Cancels the authenticated user's active subscription. The subscription remains active until the end of the current billing period."
x-runtime: [cloud]
responses:
"200":
description: Subscription cancelled
content:
application/json:
schema:
$ref: "#/components/schemas/BillingSubscription"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/subscription/resubscribe:
post:
operationId: resubscribe
tags: [billing]
summary: Resubscribe after cancellation
description: "[cloud-only] Reactivates a subscription that was previously cancelled but has not yet expired."
x-runtime: [cloud]
responses:
"200":
description: Subscription reactivated
content:
application/json:
schema:
$ref: "#/components/schemas/BillingSubscription"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/billing/topup:
post:
operationId: topUpCredits
tags: [billing]
summary: Purchase additional credits
description: "[cloud-only] Purchases a one-time credit top-up using the user's payment method on file."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- amount
properties:
amount:
type: integer
description: Number of credits to purchase
responses:
"200":
description: Top-up successful
content:
application/json:
schema:
$ref: "#/components/schemas/BillingBalance"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
# ---------------------------------------------------------------------------
# Workspace (cloud)
# ---------------------------------------------------------------------------
/api/workspace/api-keys:
get:
operationId: listWorkspaceApiKeys
tags: [workspace]
summary: List workspace API keys
description: "[cloud-only] Returns the list of API keys for the current workspace."
x-runtime: [cloud]
responses:
"200":
description: API key list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceApiKey"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createWorkspaceApiKey
tags: [workspace]
summary: Create a workspace API key
description: "[cloud-only] Creates a new API key for the current workspace."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
description: Display name for the API key
responses:
"201":
description: API key created
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceApiKeyCreated"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/api-keys/{id}:
delete:
operationId: deleteWorkspaceApiKey
tags: [workspace]
summary: Delete a workspace API key
description: "[cloud-only] Revokes and deletes a workspace API key."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The API key ID.
responses:
"204":
description: API key deleted
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/invites:
get:
operationId: listWorkspaceInvites
tags: [workspace]
summary: List pending workspace invites
description: "[cloud-only] Returns the list of pending invitations for the current workspace."
x-runtime: [cloud]
responses:
"200":
description: Invite list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceInvite"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createWorkspaceInvite
tags: [workspace]
summary: Invite a user to the workspace
description: "[cloud-only] Creates an invitation for a user to join the current workspace."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- email
properties:
email:
type: string
format: email
description: Email address to invite
role:
type: string
enum: [admin, member]
description: Role to assign
responses:
"201":
description: Invite created
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceInvite"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"409":
description: Conflict
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/invites/{inviteId}:
delete:
operationId: deleteWorkspaceInvite
tags: [workspace]
summary: Cancel a workspace invite
description: "[cloud-only] Cancels a pending workspace invitation."
x-runtime: [cloud]
parameters:
- name: inviteId
in: path
required: true
schema:
type: string
description: The invite ID.
responses:
"204":
description: Invite cancelled
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/leave:
post:
operationId: leaveWorkspace
tags: [workspace]
summary: Leave the current workspace
description: "[cloud-only] Removes the authenticated user from the current workspace."
x-runtime: [cloud]
responses:
"204":
description: Left workspace
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/members:
get:
operationId: listWorkspaceMembers
tags: [workspace]
summary: List workspace members
description: "[cloud-only] Returns the list of members in the current workspace."
x-runtime: [cloud]
responses:
"200":
description: Member list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceMember"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/members/{user_id}/api-keys:
get:
operationId: listMemberApiKeys
tags: [workspace]
summary: List API keys for a workspace member
description: "[cloud-only] Returns the API keys belonging to a specific workspace member. Requires admin role."
x-runtime: [cloud]
parameters:
- name: user_id
in: path
required: true
schema:
type: string
description: The member's user ID.
responses:
"200":
description: API key list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/WorkspaceApiKey"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: bulkRevokeMemberApiKeys
tags: [workspace]
summary: Bulk revoke a member's API keys
description: "[cloud-only] Revokes all active API keys for a specific workspace member. Only workspace owners can perform this action."
x-runtime: [cloud]
parameters:
- name: user_id
in: path
required: true
schema:
type: string
minLength: 1
description: The member's user ID.
responses:
"200":
description: Keys revoked
content:
application/json:
schema:
$ref: "#/components/schemas/BulkRevokeAPIKeysResponse"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden — must be workspace owner
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspace/members/{userId}:
patch:
operationId: updateWorkspaceMember
tags: [workspace]
summary: Update a workspace member's role
description: "[cloud-only] Updates the role of a workspace member. Requires admin role."
x-runtime: [cloud]
parameters:
- name: userId
in: path
required: true
schema:
type: string
description: The member's user ID.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- role
properties:
role:
type: string
enum: [admin, member]
description: New role to assign
responses:
"200":
description: Member updated
content:
application/json:
schema:
$ref: "#/components/schemas/WorkspaceMember"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: removeWorkspaceMember
tags: [workspace]
summary: Remove a member from the workspace
description: "[cloud-only] Removes a member from the current workspace. Requires admin role."
x-runtime: [cloud]
parameters:
- name: userId
in: path
required: true
schema:
type: string
description: The member's user ID.
responses:
"204":
description: Member removed
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspaces:
get:
operationId: listWorkspaces
tags: [workspace]
summary: List workspaces the user belongs to
description: "[cloud-only] Returns the list of workspaces the authenticated user is a member of."
x-runtime: [cloud]
responses:
"200":
description: Workspace list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/Workspace"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createWorkspace
tags: [workspace]
summary: Create a new workspace
description: "[cloud-only] Creates a new workspace. The authenticated user becomes the owner."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
description: Workspace name
responses:
"201":
description: Workspace created
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/workspaces/{id}:
get:
operationId: getWorkspace
tags: [workspace]
summary: Get a workspace by ID
description: "[cloud-only] Returns details of a workspace the user is a member of."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The workspace ID.
responses:
"200":
description: Workspace detail
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
patch:
operationId: updateWorkspace
tags: [workspace]
summary: Update workspace settings
description: "[cloud-only] Updates the name or settings of a workspace. Requires admin role."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The workspace ID.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: New workspace name
responses:
"200":
description: Workspace updated
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: deleteWorkspace
tags: [workspace]
summary: Delete a workspace
description: "[cloud-only] Soft-deletes a workspace. Requires owner role. Personal workspaces cannot be deleted."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The workspace ID.
responses:
"204":
description: Workspace deleted
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"403":
description: Forbidden — must be workspace owner
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
# ---------------------------------------------------------------------------
# User / settings / misc (cloud)
# ---------------------------------------------------------------------------
/api/feedback:
post:
operationId: submitFeedback
tags: [user]
summary: Submit user feedback
description: "[cloud-only] Submits feedback from the user about their experience with the cloud runtime."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- message
properties:
message:
type: string
description: Feedback message
rating:
type: integer
minimum: 1
maximum: 5
description: Optional satisfaction rating
context:
type: object
additionalProperties: true
description: Additional context metadata
responses:
"200":
description: Feedback submitted
content:
application/json:
schema:
type: object
properties:
id:
type: string
status:
type: string
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/files/mask-layers:
get:
operationId: getMaskLayers
tags: [assets]
summary: Get related mask layer filenames
description: "[cloud-only] Given a mask file (any of the 4 layers), returns all related mask layer filenames. Used by the mask editor to load the paint, mask, and painted layers when reopening a previously edited mask."
x-runtime: [cloud]
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Hash filename of any mask layer file
responses:
"200":
description: Related mask layers
content:
application/json:
schema:
type: object
properties:
mask:
type: string
description: Filename of the mask layer
nullable: true
paint:
type: string
description: Filename of the paint strokes layer
nullable: true
painted:
type: string
description: Filename of the painted image layer
nullable: true
painted_masked:
type: string
description: Filename of the final composite layer
nullable: true
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: File not found or not a mask file
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/internal/cloud_analytics:
post:
operationId: postCloudAnalytics
tags: [internal]
summary: Post client analytics events
description: "[cloud-only] Receives analytics events from the frontend for processing by the cloud analytics pipeline."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- events
properties:
events:
type: array
items:
type: object
required:
- event_name
properties:
event_name:
type: string
timestamp:
type: string
format: date-time
properties:
type: object
additionalProperties: true
responses:
"200":
description: Events accepted
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/invites/{token}/accept:
post:
operationId: acceptInvite
tags: [workspace]
summary: Accept a workspace invitation
description: "[cloud-only] Accepts a workspace invitation using the invite token. The authenticated user is added to the workspace."
x-runtime: [cloud]
parameters:
- name: token
in: path
required: true
schema:
type: string
description: The invitation token.
responses:
"200":
description: Invite accepted
content:
application/json:
schema:
$ref: "#/components/schemas/Workspace"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/secrets:
get:
operationId: listSecrets
tags: [settings]
summary: List user secrets
description: "[cloud-only] Returns the list of secrets (API keys for third-party services) stored for the authenticated user. Secret values are redacted."
x-runtime: [cloud]
responses:
"200":
description: Secret list
content:
application/json:
schema:
type: array
items:
$ref: "#/components/schemas/SecretMeta"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: createSecret
tags: [settings]
summary: Create or update a secret
description: "[cloud-only] Stores a new secret or updates an existing one. Secrets are encrypted at rest."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
- value
properties:
name:
type: string
description: Secret name (unique per user)
value:
type: string
description: Secret value
responses:
"201":
description: Secret created
content:
application/json:
schema:
$ref: "#/components/schemas/SecretMeta"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/secrets/{id}:
get:
operationId: getSecret
tags: [settings]
summary: Get secret metadata
description: "[cloud-only] Returns metadata for a specific secret. Does not return the plaintext secret value."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: The secret ID.
responses:
"200":
description: Secret metadata
content:
application/json:
schema:
$ref: "#/components/schemas/SecretMeta"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
patch:
operationId: updateSecret
tags: [settings]
summary: Update a secret
description: "[cloud-only] Updates an existing secret's name and/or value. Both fields are optional; only provided fields are updated."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: The secret ID.
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateSecretRequest"
responses:
"200":
description: Secret updated
content:
application/json:
schema:
$ref: "#/components/schemas/SecretMeta"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"409":
description: Conflict — a secret with this name already exists
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
delete:
operationId: deleteSecret
tags: [settings]
summary: Delete a secret
description: "[cloud-only] Permanently deletes a stored secret."
x-runtime: [cloud]
parameters:
- name: id
in: path
required: true
schema:
type: string
description: The secret ID.
responses:
"204":
description: Secret deleted
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/user:
get:
operationId: getCloudUser
tags: [user]
summary: Get the authenticated cloud user
description: "[cloud-only] Returns the profile and account information for the currently authenticated user."
x-runtime: [cloud]
responses:
"200":
description: User profile
content:
application/json:
schema:
$ref: "#/components/schemas/CloudUser"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
put:
operationId: updateCloudUser
tags: [user]
summary: Update the authenticated cloud user profile
description: "[cloud-only] Updates the profile information for the currently authenticated user."
x-runtime: [cloud]
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
display_name:
type: string
avatar_url:
type: string
format: uri
responses:
"200":
description: Updated profile
content:
application/json:
schema:
$ref: "#/components/schemas/CloudUser"
"400":
description: Bad request
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/userdata/{file}/publish:
get:
operationId: getUserdataFilePublish
tags: [userdata]
summary: Get publish info for a userdata file
description: "[cloud-only] Returns the publish status and share info for a userdata workflow file."
x-runtime: [cloud]
parameters:
- name: file
in: path
required: true
schema:
type: string
description: File path relative to user data directory
responses:
"200":
description: Publish info (publish_time is null if never published)
content:
application/json:
schema:
$ref: "#/components/schemas/WorkflowPublishInfo"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Workflow not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
post:
operationId: publishUserdataFile
tags: [userdata]
summary: Publish a userdata file to the cloud
description: "[cloud-only] Makes a userdata file available via a public URL for sharing or embedding."
x-runtime: [cloud]
parameters:
- name: file
in: path
required: true
schema:
type: string
description: File path relative to user data directory
responses:
"200":
description: Published file URL
content:
application/json:
schema:
type: object
properties:
url:
type: string
format: uri
description: Public URL of the published file
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/vhs/queryvideo:
get:
operationId: queryVhsVideo
tags: [view]
summary: Query VHS video metadata
description: "[cloud-only] Returns metadata about a video file processed by the VHS (Video Helper Suite) integration."
x-runtime: [cloud]
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Video filename
- name: type
in: query
schema:
type: string
enum: [input, output, temp]
description: Directory type
- name: subfolder
in: query
schema:
type: string
description: Subfolder within the directory
responses:
"200":
description: Video metadata
content:
application/json:
schema:
type: object
additionalProperties: true
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/vhs/viewaudio:
get:
operationId: viewVhsAudio
tags: [view]
summary: View or download VHS audio
description: "[cloud-only] Returns audio content from a VHS-processed file."
x-runtime: [cloud]
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Audio filename
- name: type
in: query
schema:
type: string
enum: [input, output, temp]
description: Directory type
- name: subfolder
in: query
schema:
type: string
description: Subfolder within the directory
responses:
"200":
description: Audio content
content:
audio/*:
schema:
type: string
format: binary
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/vhs/viewvideo:
get:
operationId: viewVhsVideo
tags: [view]
summary: View or download VHS video
description: "[cloud-only] Returns video content from a VHS-processed file."
x-runtime: [cloud]
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Video filename
- name: type
in: query
schema:
type: string
enum: [input, output, temp]
description: Directory type
- name: subfolder
in: query
schema:
type: string
description: Subfolder within the directory
responses:
"200":
description: Video content
content:
video/*:
schema:
type: string
format: binary
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/viewvideo:
get:
operationId: viewVideo
tags: [view]
summary: View or download a video file
description: "[cloud-only] Serves a video file from the output directory. Used by the frontend video player."
x-runtime: [cloud]
parameters:
- name: filename
in: query
required: true
schema:
type: string
description: Video filename
- name: type
in: query
schema:
type: string
enum: [input, output, temp]
description: Directory type
- name: subfolder
in: query
schema:
type: string
description: Subfolder within the directory
responses:
"200":
description: Video content
content:
video/*:
schema:
type: string
format: binary
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/tasks:
get:
operationId: listTasks
tags: [task]
summary: List background tasks
description: "[cloud-only] Retrieve a paginated list of background tasks for the authenticated user. Supports filtering by task type, status, and creation time."
x-runtime: [cloud]
parameters:
- name: task_name
in: query
schema:
type: string
description: Filter by task type name (exact match).
- name: idempotency_key
in: query
schema:
type: string
description: Filter by idempotency key (exact match).
- name: status
in: query
schema:
type: string
description: Filter by one or more statuses (comma-separated).
- name: created_after
in: query
schema:
type: string
format: date-time
description: Filter tasks created after this timestamp.
- name: created_before
in: query
schema:
type: string
format: date-time
description: Filter tasks created before this timestamp.
- name: sort_order
in: query
schema:
type: string
enum: [asc, desc]
default: desc
description: Sort direction by create_time.
- name: offset
in: query
schema:
type: integer
minimum: 0
default: 0
description: Pagination offset (0-based).
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 20
description: Maximum items per page (1-100).
responses:
"200":
description: Tasks retrieved
content:
application/json:
schema:
$ref: "#/components/schemas/TasksListResponse"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"422":
description: Validation error
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
/api/tasks/{task_id}:
get:
operationId: getTask
tags: [task]
summary: Get task details
description: "[cloud-only] Retrieve full details for a specific background task."
x-runtime: [cloud]
parameters:
- name: task_id
in: path
required: true
schema:
type: string
format: uuid
description: Task identifier (UUID).
responses:
"200":
description: Task details
content:
application/json:
schema:
$ref: "#/components/schemas/TaskResponse"
"401":
description: Unauthorized
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
"404":
description: Task not found
content:
application/json:
schema:
$ref: "#/components/schemas/CloudError"
components:
parameters:
ComfyUserHeader:
name: Comfy-User
in: header
required: false
schema:
type: string
description: |
Identifies the active user in multi-user mode. Used for settings,
userdata, and history isolation. This is not a security mechanism —
it is an organisational convenience with no authentication behind it.
schemas:
# -------------------------------------------------------------------
# Prompt
# -------------------------------------------------------------------
PromptRequest:
type: object
description: A workflow submission. Wraps the prompt graph plus optional client identifier and extra per-request data.
required:
- prompt
properties:
prompt:
type: object
description: |
The workflow graph to execute. Keys are node IDs (strings);
values are objects with class_type and inputs.
additionalProperties: true
number:
type: number
description: Priority number for the queue (lower numbers have higher priority)
front:
type: boolean
description: If true, adds the prompt to the front of the queue
extra_data:
type: object
description: Extra data associated with the prompt (e.g. extra_pnginfo)
additionalProperties: true
client_id:
type: string
description: WebSocket client ID to receive progress updates
prompt_id:
type: string
format: uuid
description: "Client-supplied prompt ID. Server generates a UUID if omitted."
partial_execution_targets:
type: array
items:
type: string
description: List of node IDs to execute (partial graph execution)
workflow_id:
type: string
format: uuid
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Cloud workflow entity ID for tracking and gallery association. Ignored by local ComfyUI."
workflow_version_id:
type: string
format: uuid
nullable: true
x-runtime: [cloud]
description: "[cloud-only] Cloud workflow version ID for pinning execution to a specific version. Ignored by local ComfyUI."
PromptResponse:
type: object
description: Server acknowledgement of a workflow submission. Includes the assigned `prompt_id` and current queue position.
properties:
prompt_id:
type: string
format: uuid
description: Unique identifier for the prompt execution
number:
type: number
description: Priority number in the queue
node_errors:
type: object
description: Validation errors keyed by node ID
additionalProperties:
$ref: "#/components/schemas/NodeError"
error:
description: Top-level prompt error (string message or structured error)
oneOf:
- type: string
- $ref: "#/components/schemas/PromptError"
PromptErrorResponse:
type: object
description: Error response when prompt validation fails
additionalProperties: true
PromptError:
type: object
description: Structured prompt validation error
properties:
type:
type: string
message:
type: string
details:
type: string
Error:
type: object
description: Detailed node-level error
properties:
type:
type: string
message:
type: string
details:
type: string
extra_info:
type: object
properties:
input_name:
type: string
additionalProperties: true
NodeError:
type: object
description: Error details for a single node
properties:
errors:
type: array
items:
$ref: "#/components/schemas/Error"
class_type:
type: string
description: The node's class type
dependent_outputs:
type: array
items: {}
PromptInfo:
type: object
description: Summary of a queued or recently-executed prompt, as returned by the queue and history endpoints.
properties:
exec_info:
type: object
properties:
queue_remaining:
type: integer
description: Number of items remaining in the queue
# -------------------------------------------------------------------
# Queue
# -------------------------------------------------------------------
QueueInfo:
type: object
description: Queue information with pending and running items
properties:
queue_running:
type: array
description: Currently running queue items
items:
type: array
description: |
Queue item tuple: [number, prompt_id, prompt, extra_data, outputs_to_execute, sensitive]
items: {}
prefixItems:
- type: number
description: Priority number
- type: string
format: uuid
description: prompt_id
- type: object
description: prompt graph
additionalProperties: true
- type: object
description: extra_data
additionalProperties: true
- type: array
description: outputs_to_execute (list of output node IDs)
items:
type: string
- type: object
description: sensitive data (may be omitted)
additionalProperties: true
queue_pending:
type: array
description: Pending queue items (oldest first)
items:
type: array
description: |
Queue item tuple: [number, prompt_id, prompt, extra_data, outputs_to_execute, sensitive]
items: {}
prefixItems:
- type: number
description: Priority number
- type: string
format: uuid
description: prompt_id
- type: object
description: prompt graph
additionalProperties: true
- type: object
description: extra_data
additionalProperties: true
- type: array
description: outputs_to_execute (list of output node IDs)
items:
type: string
- type: object
description: sensitive data (may be omitted)
additionalProperties: true
QueueManageRequest:
type: object
description: Request to clear or delete from queue
properties:
clear:
type: boolean
description: If true, clear all pending items
delete:
type: array
items:
type: string
description: Array of prompt IDs to delete from queue
# -------------------------------------------------------------------
# History
# -------------------------------------------------------------------
HistoryEntry:
type: object
description: A single execution history entry
properties:
prompt:
type: array
description: |
Prompt tuple: [number, prompt_id, prompt_graph, extra_data, output_node_ids]
items: {}
outputs:
type: object
description: Output data from execution keyed by node ID
additionalProperties: true
status:
type: object
description: Execution status (status_str, completed, messages, etc.)
additionalProperties: true
meta:
type: object
description: Metadata about the execution and nodes
additionalProperties: true
HistoryManageRequest:
type: object
description: Request to clear or delete history entries
properties:
clear:
type: boolean
description: If true, clear all history
delete:
type: array
items:
type: string
description: Array of prompt IDs to delete from history
# -------------------------------------------------------------------
# Jobs
# -------------------------------------------------------------------
JobEntry:
type: object
description: Lightweight job data for list views
required:
- id
- status
properties:
id:
type: string
format: uuid
description: Unique job identifier (same as prompt_id)
status:
type: string
description: Current job status
create_time:
type: number
description: Job creation timestamp
execution_start_time:
type: number
description: Workflow execution start timestamp
execution_end_time:
type: number
description: Workflow execution end timestamp
preview_output:
type: object
additionalProperties: true
description: Primary preview output
outputs_count:
type: integer
description: Total number of output files
JobDetailResponse:
type: object
description: Full job details including workflow and outputs
required:
- id
- status
properties:
id:
type: string
format: uuid
status:
type: string
workflow:
type: object
additionalProperties: true
description: Full ComfyUI workflow
outputs:
type: object
additionalProperties: true
description: Full outputs object from execution
execution_error:
$ref: "#/components/schemas/ExecutionError"
create_time:
type: number
update_time:
type: number
execution_start_time:
type: number
execution_end_time:
type: number
preview_output:
type: object
additionalProperties: true
outputs_count:
type: integer
execution_status:
type: object
additionalProperties: true
execution_meta:
type: object
additionalProperties: true
ExecutionError:
type: object
description: Detailed execution error from ComfyUI
properties:
node_id:
type: string
description: ID of the node that failed
node_type:
type: string
description: Type name of the node
exception_message:
type: string
description: Human-readable error message
exception_type:
type: string
description: Python exception type
traceback:
type: array
items:
type: string
description: Traceback lines
current_inputs:
type: object
additionalProperties: true
current_outputs:
type: object
additionalProperties: true
PaginationInfo:
type: object
description: Pagination metadata returned alongside list responses.
properties:
offset:
type: integer
limit:
type: integer
total:
type: integer
has_more:
type: boolean
# -------------------------------------------------------------------
# Upload / View
# -------------------------------------------------------------------
UploadResult:
type: object
description: Response body returned by the image/mask upload endpoints, describing where the uploaded file now lives.
properties:
name:
type: string
description: Saved filename (may be renamed to avoid collisions)
subfolder:
type: string
description: Subfolder the file was saved to
type:
type: string
description: Directory type (input, temp)
# -------------------------------------------------------------------
# System
# -------------------------------------------------------------------
DeviceStats:
type: object
description: GPU/compute device statistics
required:
- name
- type
- index
properties:
name:
type: string
description: Device name
type:
type: string
description: Device type (cuda, mps, cpu, etc.)
index:
type: number
nullable: true
description: |
Device index within its type (e.g. CUDA ordinal for `cuda:0`,
`cuda:1`). `null` for devices with no index, including the CPU
device returned in `--cpu` mode (PyTorch's `torch.device('cpu').index`
is `None`).
vram_total:
type: number
description: Total VRAM in bytes
vram_free:
type: number
description: Free VRAM in bytes
torch_vram_total:
type: number
description: Total PyTorch-managed VRAM in bytes
torch_vram_free:
type: number
description: Free PyTorch-managed VRAM in bytes
SystemStatsResponse:
type: object
description: Hardware, VRAM, Python, and ComfyUI version information for the running process.
required:
- system
- devices
properties:
system:
type: object
required:
- os
- python_version
- embedded_python
- comfyui_version
- pytorch_version
- argv
- ram_total
- ram_free
properties:
os:
type: string
description: Operating system
python_version:
type: string
description: Python version
embedded_python:
type: boolean
description: Whether using embedded Python
comfyui_version:
type: string
description: ComfyUI version string
pytorch_version:
type: string
description: PyTorch version
required_frontend_version:
type: string
description: Required frontend version
argv:
type: array
items:
type: string
description: Command line arguments
ram_total:
type: number
description: Total RAM in bytes
ram_free:
type: number
description: Free RAM in bytes
installed_templates_version:
type: string
nullable: true
description: Version of the currently installed workflow templates
required_templates_version:
type: string
nullable: true
description: Minimum required workflow templates version for this ComfyUI build
devices:
type: array
items:
$ref: "#/components/schemas/DeviceStats"
# -------------------------------------------------------------------
# Node / Object Info
# -------------------------------------------------------------------
NodeInfo:
type: object
description: 'Definition of a registered node class: its inputs, outputs, category, and display metadata.'
properties:
input:
type: object
description: Input specifications (required and optional groups)
additionalProperties: true
input_order:
type: object
description: Ordered input names per group
additionalProperties:
type: array
items:
type: string
output:
type: array
items:
type: string
description: Output type names
output_is_list:
type: array
items:
type: boolean
description: Whether each output is a list
output_name:
type: array
items:
type: string
description: Display names of outputs
name:
type: string
description: Internal class name
display_name:
type: string
description: Human-readable display name
description:
type: string
description: Node description
python_module:
type: string
description: Python module implementing the node
category:
type: string
description: Node category path
output_node:
type: boolean
description: Whether this is an output node
output_tooltips:
type: array
items:
type: string
description: Tooltips for each output
deprecated:
type: boolean
description: Whether the node is deprecated
experimental:
type: boolean
description: Whether the node is experimental
api_node:
type: boolean
description: Whether this is an API node
is_input_list:
type: boolean
description: Whether the node accepts list inputs
dev_only:
type: boolean
description: Whether the node is developer-only (hidden in production UI)
has_intermediate_output:
type: boolean
description: Whether the node emits intermediate output during execution
search_aliases:
type: array
items:
type: string
description: Alternative search terms for finding this node
essentials_category:
type: string
nullable: true
description: |
Category override used by the essentials pack. The
`essentials_category` key may be present with a string value,
present and `null`, or absent entirely:
- V1 nodes: `essentials_category` is **omitted** when the node
class doesn't define an `ESSENTIALS_CATEGORY` attribute, and
**`null`** if the attribute is explicitly set to `None`.
- V3 nodes (`comfy_api.latest.io`): `essentials_category` is
**always present**, and **`null`** for nodes whose `Schema`
doesn't populate it.
# -------------------------------------------------------------------
# Models
# -------------------------------------------------------------------
ModelFolder:
type: object
description: A configured model folder and the list of disk paths it resolves to.
required:
- name
- folders
properties:
name:
type: string
description: Model folder type name (e.g. "checkpoints")
folders:
type: array
items:
type: string
description: Filesystem paths for this model type
ModelFile:
type: object
description: A single model file in a folder, with filesystem metadata.
required:
- name
- pathIndex
properties:
name:
type: string
description: Model filename
pathIndex:
type: integer
description: Index into the folder's paths array
modified:
type: number
description: File modification timestamp
created:
type: number
description: File creation timestamp
size:
type: integer
format: int64
description: File size in bytes
# -------------------------------------------------------------------
# Subgraphs
# -------------------------------------------------------------------
GlobalSubgraphInfo:
type: object
description: Metadata for a global subgraph blueprint (without full data)
required:
- source
- name
- info
properties:
source:
type: string
description: Source type ("templates" or "custom_node")
name:
type: string
description: Display name of the subgraph blueprint
info:
type: object
description: Additional information about the subgraph
required:
- node_pack
properties:
node_pack:
type: string
description: The node pack/module providing this subgraph
data:
type: string
description: The full subgraph JSON data (may be empty in list view)
GlobalSubgraphData:
type: object
description: Full data for a global subgraph blueprint
required:
- source
- name
- info
- data
properties:
source:
type: string
description: Source type ("templates" or "custom_node")
name:
type: string
description: Display name of the subgraph blueprint
info:
type: object
description: Additional information about the subgraph
required:
- node_pack
properties:
node_pack:
type: string
description: The node pack/module providing this subgraph
data:
type: string
description: The full subgraph JSON data as a string
# -------------------------------------------------------------------
# Userdata
# -------------------------------------------------------------------
UserDataResponse:
description: |
Response body for the POST endpoints `/api/userdata/{file}` and
`/api/userdata/{file}/move/{dest}`. Returns a single item whose
shape depends on the `full_info` query parameter.
x-variant-selector:
full_info=true: file-info object (`GetUserDataResponseFullFile`)
default: relative path string
oneOf:
- $ref: "#/components/schemas/GetUserDataResponseFullFile"
- type: string
description: Relative path of the written or moved file. Returned when `full_info` is absent or false.
ListUserdataResponse:
description: |
Response body for `GET /api/userdata`. The array item shape is
determined by the `full_info` and `split` query parameters.
x-variant-selector:
full_info=true: array of file-info objects (`GetUserDataResponseFullFile`)
split=true: array of `[relative_path, ...path_components]` arrays
default: array of relative path strings
oneOf:
- type: array
items:
$ref: "#/components/schemas/GetUserDataResponseFullFile"
description: Returned when `full_info=true`.
- type: array
items:
type: array
items:
type: string
minItems: 2
description: |
Returned when `split=true` and `full_info=false`. Each inner
array is `[relative_path, ...path_components]`.
- type: array
items:
type: string
description: Default shape — array of file paths relative to the user data root.
GetUserDataResponseFullFile:
type: object
description: A single entry in a full-info user data listing.
properties:
path:
type: string
description: File name or path relative to the user directory
created:
type: number
description: Unix timestamp of file creation
size:
type: integer
description: File size in bytes
modified:
type: integer
format: int64
description: Unix timestamp of last modification in milliseconds
# -------------------------------------------------------------------
# Assets
# -------------------------------------------------------------------
Asset:
type: object
description: A registered asset — an input/output file tracked in the asset database with content hash and metadata.
required:
- id
- name
- size
- created_at
- updated_at
properties:
id:
type: string
format: uuid
description: Unique identifier for the asset
name:
type: string
description: Name of the asset file
hash:
type: string
nullable: true
description: Blake3 content hash of the asset (preferred over asset_hash)
pattern: "^blake3:[a-f0-9]{64}$"
asset_hash:
type: string
nullable: true
deprecated: true
description: "Deprecated: use `hash` instead. Blake3 hash of the asset content."
pattern: "^blake3:[a-f0-9]{64}$"
size:
type: integer
format: int64
description: Size of the asset in bytes
width:
type: integer
nullable: true
description: "Original image width in pixels. Null for non-image assets or assets ingested before dimension extraction."
height:
type: integer
nullable: true
description: "Original image height in pixels. Null for non-image assets or assets ingested before dimension extraction."
mime_type:
type: string
description: MIME type of the asset
tags:
type: array
items:
type: string
description: Tags associated with the asset
user_metadata:
type: object
description: Custom user metadata
additionalProperties: true
metadata:
type: object
description: System-managed metadata (read-only)
additionalProperties: true
readOnly: true
preview_url:
type: string
format: uri
description: URL for asset preview/thumbnail
preview_id:
type: string
format: uuid
description: ID of the preview asset if available
prompt_id:
type: string
format: uuid
nullable: true
deprecated: true
description: "Deprecated: use job_id instead. ID of the prompt that created this asset."
job_id:
type: string
format: uuid
nullable: true
description: ID of the job that created this asset
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
last_access_time:
type: string
format: date-time
is_immutable:
type: boolean
description: Whether this asset is immutable
AssetCreated:
description: Response body returned after successfully registering a new asset.
allOf:
- $ref: "#/components/schemas/Asset"
- type: object
required:
- created_new
properties:
created_new:
type: boolean
description: Whether this was a new creation (true) or returned existing (false)
AssetUpdated:
type: object
description: Response body returned after updating an asset's metadata.
required:
- id
- updated_at
properties:
id:
type: string
format: uuid
name:
type: string
hash:
type: string
nullable: true
description: Blake3 content hash of the asset (preferred over asset_hash)
pattern: "^blake3:[a-f0-9]{64}$"
asset_hash:
type: string
nullable: true
deprecated: true
description: "Deprecated: use `hash` instead. Blake3 hash of the asset content."
pattern: "^blake3:[a-f0-9]{64}$"
tags:
type: array
items:
type: string
mime_type:
type: string
user_metadata:
type: object
additionalProperties: true
prompt_id:
type: string
format: uuid
nullable: true
deprecated: true
description: "Deprecated: use job_id instead. ID of the prompt that created this asset."
job_id:
type: string
format: uuid
nullable: true
description: ID of the job that created this asset
updated_at:
type: string
format: date-time
ListAssetsResponse:
type: object
description: Paginated list of assets.
required:
- assets
- total
- has_more
properties:
assets:
type: array
items:
$ref: "#/components/schemas/Asset"
total:
type: integer
has_more:
type: boolean
TagInfo:
type: object
description: A tag known to the asset database, with the number of assets bearing it.
required:
- name
- count
properties:
name:
type: string
count:
type: integer
ListTagsResponse:
type: object
description: Flat list of all tags, with counts.
required:
- tags
- total
- has_more
properties:
tags:
type: array
items:
$ref: "#/components/schemas/TagInfo"
total:
type: integer
has_more:
type: boolean
AssetTagHistogramResponse:
type: object
description: Tags that would refine a filtered asset query, with the count of assets each tag would additionally select.
required:
- tag_counts
properties:
tag_counts:
type: object
additionalProperties:
type: integer
description: Map of tag names to occurrence counts
TagsModificationResponse:
type: object
description: Response body returned after adding or removing tags on an asset.
required:
- total_tags
properties:
added:
type: array
items:
type: string
description: Tags successfully added
removed:
type: array
items:
type: string
description: Tags successfully removed
already_present:
type: array
items:
type: string
description: Tags already present (for add)
not_present:
type: array
items:
type: string
description: Tags not present (for remove)
total_tags:
type: array
items:
type: string
description: All tags on the asset after the operation
# -------------------------------------------------------------------
# Result / Output types
# -------------------------------------------------------------------
ResultItem:
type: object
description: A single output file reference
properties:
filename:
type: string
subfolder:
type: string
type:
type: string
enum: [input, output, temp]
display_name:
type: string
NodeOutputs:
type: object
description: |
Outputs from a single node execution. Known keys are listed below,
but custom nodes may add arbitrary keys (additionalProperties).
properties:
images:
type: array
items:
$ref: "#/components/schemas/ResultItem"
audio:
type: array
items:
$ref: "#/components/schemas/ResultItem"
video:
type: array
items:
$ref: "#/components/schemas/ResultItem"
animated:
type: array
items:
type: boolean
text:
oneOf:
- type: string
- type: array
items:
type: string
additionalProperties: true
TerminalSize:
type: object
description: Terminal dimensions
properties:
cols:
type: number
row:
type: number
LogEntry:
type: object
description: A single log entry
properties:
t:
type: string
description: Timestamp
m:
type: string
description: Log message
StatusWsMessageStatus:
type: object
description: Inner payload of a `status` WebSocket message, describing the execution queue state.
properties:
exec_info:
type: object
required:
- queue_remaining
properties:
queue_remaining:
type: integer
StatusWsMessage:
type: object
description: Initial status message sent on connect + queue status updates
properties:
status:
$ref: "#/components/schemas/StatusWsMessageStatus"
sid:
type: string
description: Session ID assigned by the server
ProgressWsMessage:
type: object
description: Node execution progress (step N of M)
required:
- value
- max
- prompt_id
- node
properties:
value:
type: integer
description: Current step
max:
type: integer
description: Total steps
prompt_id:
type: string
node:
type: string
description: Node ID currently executing
ProgressTextWsMessage:
type: object
description: Text-based progress update from a node
properties:
nodeId:
type: string
text:
type: string
prompt_id:
type: string
NodeProgressState:
type: object
description: Progress state for a single node
properties:
value:
type: number
max:
type: number
state:
type: string
enum: [pending, running, finished, error]
node_id:
type: string
prompt_id:
type: string
display_node_id:
type: string
parent_node_id:
type: string
real_node_id:
type: string
ProgressStateWsMessage:
type: object
description: Bulk progress state for all nodes in a prompt
required:
- prompt_id
- nodes
properties:
prompt_id:
type: string
nodes:
type: object
description: Map of node ID to progress state
additionalProperties:
$ref: "#/components/schemas/NodeProgressState"
ExecutingWsMessage:
type: object
description: Fired when a node begins execution
required:
- node
- display_node
- prompt_id
properties:
node:
type: string
description: Node ID
display_node:
type: string
description: Display node ID (may differ for subgraphs)
prompt_id:
type: string
ExecutedWsMessage:
type: object
description: Fired when a node completes execution with output
required:
- node
- display_node
- prompt_id
- output
properties:
node:
type: string
display_node:
type: string
prompt_id:
type: string
output:
$ref: "#/components/schemas/NodeOutputs"
merge:
type: boolean
description: Whether to merge with existing output
ExecutionWsMessageBase:
type: object
description: Base fields for execution lifecycle messages
required:
- prompt_id
- timestamp
properties:
prompt_id:
type: string
timestamp:
type: integer
description: Unix timestamp in milliseconds
ExecutionStartWsMessage:
allOf:
- $ref: "#/components/schemas/ExecutionWsMessageBase"
description: Fired when prompt execution begins
ExecutionSuccessWsMessage:
allOf:
- $ref: "#/components/schemas/ExecutionWsMessageBase"
description: Fired when prompt execution completes successfully
ExecutionCachedWsMessage:
allOf:
- $ref: "#/components/schemas/ExecutionWsMessageBase"
- type: object
properties:
nodes:
type: array
items:
type: string
description: List of node IDs that were cached
description: Fired when nodes are served from cache
ExecutionInterruptedWsMessage:
allOf:
- $ref: "#/components/schemas/ExecutionWsMessageBase"
- type: object
properties:
node_id:
type: string
node_type:
type: string
executed:
type: array
items:
type: string
description: Node IDs that completed before interruption
description: Fired when execution is interrupted by user
ExecutionErrorWsMessage:
allOf:
- $ref: "#/components/schemas/ExecutionWsMessageBase"
- type: object
properties:
node_id:
type: string
node_type:
type: string
executed:
type: array
items:
type: string
exception_message:
type: string
exception_type:
type: string
traceback:
type: array
items:
type: string
current_inputs: {}
current_outputs: {}
description: Fired when a node throws an exception during execution
LogsWsMessage:
type: object
description: Streaming log entries from the server
properties:
size:
$ref: "#/components/schemas/TerminalSize"
entries:
type: array
items:
$ref: "#/components/schemas/LogEntry"
NotificationWsMessage:
type: object
description: Server notification (e.g. model download complete)
properties:
value:
type: string
id:
type: string
FeatureFlagsWsMessage:
type: object
description: Feature flags sent on connect
additionalProperties: true
AssetDownloadWsMessage:
type: object
description: Asset download progress
required:
- task_id
- asset_name
- bytes_total
- bytes_downloaded
- progress
- status
properties:
task_id:
type: string
asset_name:
type: string
bytes_total:
type: number
bytes_downloaded:
type: number
progress:
type: number
description: 0.0 to 1.0
status:
type: string
enum: [created, running, completed, failed]
asset_id:
type: string
error:
type: string
AssetExportWsMessage:
type: object
description: Bulk asset export progress
required:
- task_id
- assets_total
- assets_attempted
- assets_failed
- bytes_total
- bytes_processed
- progress
- status
properties:
task_id:
type: string
export_name:
type: string
assets_total:
type: number
assets_attempted:
type: number
assets_failed:
type: number
bytes_total:
type: number
bytes_processed:
type: number
progress:
type: number
description: 0.0 to 1.0
status:
type: string
enum: [created, running, completed, failed]
error:
type: string
# -------------------------------------------------------------------
# Cloud-runtime schemas
#
# These schemas are exclusively referenced by cloud-runtime operations.
# Tagged x-runtime: [cloud].
# -------------------------------------------------------------------
CloudError:
type: object
x-runtime: [cloud]
description: "[cloud-only] Standard error response from cloud endpoints."
required:
- error
properties:
error:
type: string
description: Error message
code:
type: string
description: Machine-readable error code
details:
type: object
additionalProperties: true
description: Additional error context
CloudJob:
type: object
x-runtime: [cloud]
description: "[cloud-only] Full cloud job record including workflow and execution metadata."
required:
- id
- status
properties:
id:
type: string
format: uuid
status:
type: string
enum: [pending, running, completed, failed, cancelled]
workflow:
type: object
additionalProperties: true
description: Submitted workflow graph
outputs:
type: object
additionalProperties: true
description: Execution outputs keyed by node ID
created_at:
type: string
format: date-time
started_at:
type: string
format: date-time
nullable: true
completed_at:
type: string
format: date-time
nullable: true
workflow_id:
type: string
format: uuid
nullable: true
machine_id:
type: string
nullable: true
error:
type: string
nullable: true
description: Error message if the job failed
CloudJobStatus:
type: object
x-runtime: [cloud]
description: "[cloud-only] Status of a cloud job."
required:
- id
- status
properties:
id:
type: string
format: uuid
status:
type: string
enum: [pending, running, completed, failed, cancelled]
progress:
type: number
minimum: 0
maximum: 1
description: "Execution progress (0.0 to 1.0)"
started_at:
type: string
format: date-time
nullable: true
completed_at:
type: string
format: date-time
nullable: true
CloudJobOutputs:
type: object
x-runtime: [cloud]
description: "[cloud-only] Output assets produced by a cloud job execution."
properties:
outputs:
type: object
additionalProperties: true
description: Output data keyed by node ID
assets:
type: array
items:
$ref: "#/components/schemas/Asset"
description: Asset records created from job outputs
CloudPrompt:
type: object
x-runtime: [cloud]
description: "[cloud-only] A cloud-executed prompt record."
required:
- id
- status
properties:
id:
type: string
format: uuid
status:
type: string
workflow:
type: object
additionalProperties: true
outputs:
type: object
additionalProperties: true
created_at:
type: string
format: date-time
completed_at:
type: string
format: date-time
nullable: true
HistoryV2Response:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated execution history in v2 format."
required:
- items
- total
- has_more
properties:
items:
type: array
items:
$ref: "#/components/schemas/HistoryV2Entry"
total:
type: integer
has_more:
type: boolean
HistoryV2Entry:
type: object
x-runtime: [cloud]
description: "[cloud-only] A single execution history entry in v2 format."
required:
- id
- status
properties:
id:
type: string
format: uuid
status:
type: string
workflow:
type: object
additionalProperties: true
outputs:
type: object
additionalProperties: true
created_at:
type: string
format: date-time
started_at:
type: string
format: date-time
nullable: true
completed_at:
type: string
format: date-time
nullable: true
preview_output:
type: object
additionalProperties: true
CloudLogsResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated cloud execution logs."
required:
- entries
properties:
entries:
type: array
items:
type: object
properties:
timestamp:
type: string
format: date-time
level:
type: string
enum: [debug, info, warn, error]
message:
type: string
job_id:
type: string
format: uuid
total:
type: integer
has_more:
type: boolean
AssetDownloadRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] A single asset to download to the cloud runtime."
required:
- asset_id
properties:
asset_id:
type: string
format: uuid
description: ID of the asset to download
target_path:
type: string
description: Target path on the runtime filesystem
AssetImportRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] A single asset to import from an external URL."
required:
- url
properties:
url:
type: string
format: uri
description: URL of the asset to import
name:
type: string
description: Display name for the imported asset
tags:
type: array
items:
type: string
RemoteAssetMetadata:
type: object
x-runtime: [cloud]
description: "[cloud-only] Metadata fetched from a remote asset URL."
properties:
content_type:
type: string
description: MIME type of the remote file
content_length:
type: integer
format: int64
description: Size in bytes
filename:
type: string
description: Suggested filename from Content-Disposition or URL
CloudNode:
type: object
x-runtime: [cloud]
description: "[cloud-only] An installed custom node package in the cloud runtime."
required:
- id
- name
properties:
id:
type: string
name:
type: string
version:
type: string
description:
type: string
author:
type: string
repository:
type: string
format: uri
installed_at:
type: string
format: date-time
enabled:
type: boolean
CloudNodeList:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of installed custom node packages."
required:
- nodes
properties:
nodes:
type: array
items:
$ref: "#/components/schemas/CloudNode"
total:
type: integer
has_more:
type: boolean
HubLabel:
type: object
x-runtime: [cloud]
description: "[cloud-only] A label/category used for tagging hub content."
required:
- id
- name
properties:
id:
type: string
name:
type: string
description:
type: string
color:
type: string
description: Hex color code for the label
HubProfile:
type: object
x-runtime: [cloud]
description: "[cloud-only] A public user profile on the ComfyUI Hub."
required:
- username
properties:
username:
type: string
display_name:
type: string
bio:
type: string
avatar_url:
type: string
format: uri
links:
type: array
items:
type: string
format: uri
workflow_count:
type: integer
created_at:
type: string
format: date-time
HubWorkflow:
type: object
x-runtime: [cloud]
description: "[cloud-only] A published workflow on the ComfyUI Hub."
required:
- share_id
- name
properties:
share_id:
type: string
name:
type: string
description:
type: string
author:
$ref: "#/components/schemas/HubProfile"
labels:
type: array
items:
$ref: "#/components/schemas/HubLabel"
thumbnail_url:
type: string
format: uri
content:
type: object
additionalProperties: true
description: Workflow graph JSON
likes:
type: integer
views:
type: integer
forks:
type: integer
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
HubWorkflowList:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of hub workflows."
required:
- workflows
- total
- has_more
properties:
workflows:
type: array
items:
$ref: "#/components/schemas/HubWorkflow"
total:
type: integer
has_more:
type: boolean
HubWorkflowIndexEntry:
type: object
x-runtime: [cloud]
description: "[cloud-only] Lightweight entry in the hub workflow index for client-side search."
required:
- share_id
- name
properties:
share_id:
type: string
name:
type: string
author_username:
type: string
labels:
type: array
items:
type: string
likes:
type: integer
updated_at:
type: string
format: date-time
CloudWorkflow:
type: object
x-runtime: [cloud]
description: "[cloud-only] A cloud-managed workflow with version history."
required:
- id
- name
properties:
id:
type: string
format: uuid
name:
type: string
description:
type: string
share_id:
type: string
nullable: true
description: Public share identifier if published
latest_version_id:
type: string
format: uuid
nullable: true
thumbnail_url:
type: string
format: uri
nullable: true
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
CloudWorkflowList:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of cloud workflows."
required:
- workflows
- total
- has_more
properties:
workflows:
type: array
items:
$ref: "#/components/schemas/CloudWorkflow"
total:
type: integer
has_more:
type: boolean
CloudWorkflowVersion:
type: object
x-runtime: [cloud]
description: "[cloud-only] A version of a cloud workflow."
required:
- id
- workflow_id
properties:
id:
type: string
format: uuid
workflow_id:
type: string
format: uuid
version_number:
type: integer
created_at:
type: string
format: date-time
AuthSession:
type: object
x-runtime: [cloud]
description: "[cloud-only] Current authentication session state."
required:
- user
properties:
user:
$ref: "#/components/schemas/CloudUser"
workspace:
$ref: "#/components/schemas/Workspace"
expires_at:
type: string
format: date-time
AuthTokenResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] OAuth2 token response."
required:
- access_token
- token_type
properties:
access_token:
type: string
token_type:
type: string
description: Always "Bearer"
expires_in:
type: integer
description: Token lifetime in seconds
refresh_token:
type: string
nullable: true
scope:
type: string
JwksResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] JSON Web Key Set for JWT verification."
required:
- keys
properties:
keys:
type: array
items:
type: object
required:
- kty
- kid
- use
properties:
kty:
type: string
description: Key type (e.g. RSA)
kid:
type: string
description: Key ID
use:
type: string
description: Key use (e.g. sig)
alg:
type: string
description: Algorithm (e.g. RS256)
n:
type: string
description: RSA modulus (base64url)
e:
type: string
description: RSA exponent (base64url)
additionalProperties: true
BillingBalance:
type: object
x-runtime: [cloud]
description: "[cloud-only] Current credit balance and usage summary."
required:
- credits_remaining
properties:
credits_remaining:
type: integer
description: Available credits
credits_used:
type: integer
description: Credits used in current billing period
credits_total:
type: integer
description: Total credits allocated in current period
BillingEvent:
type: object
x-runtime: [cloud]
description: "[cloud-only] A billing event (charge, credit, refund)."
required:
- id
- type
- amount
- created_at
properties:
id:
type: string
type:
type: string
enum: [charge, credit, refund, topup, subscription]
amount:
type: integer
description: Amount in credits
description:
type: string
job_id:
type: string
format: uuid
nullable: true
created_at:
type: string
format: date-time
BillingEventList:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of billing events."
required:
- events
- total
- has_more
properties:
events:
type: array
items:
$ref: "#/components/schemas/BillingEvent"
total:
type: integer
has_more:
type: boolean
BillingOp:
type: object
x-runtime: [cloud]
description: "[cloud-only] A billing operation record."
required:
- id
- status
properties:
id:
type: string
status:
type: string
enum: [pending, completed, failed]
type:
type: string
amount:
type: integer
created_at:
type: string
format: date-time
completed_at:
type: string
format: date-time
nullable: true
BillingPlan:
type: object
x-runtime: [cloud]
description: "[cloud-only] A subscription plan with pricing details."
required:
- id
- name
properties:
id:
type: string
name:
type: string
description:
type: string
credits_per_month:
type: integer
price_cents:
type: integer
description: Monthly price in cents (USD)
currency:
type: string
default: usd
features:
type: array
items:
type: string
description: List of plan features
BillingStatus:
type: object
x-runtime: [cloud]
description: "[cloud-only] Overall billing and subscription status."
properties:
subscription:
$ref: "#/components/schemas/BillingSubscription"
balance:
$ref: "#/components/schemas/BillingBalance"
has_payment_method:
type: boolean
BillingSubscription:
type: object
x-runtime: [cloud]
description: "[cloud-only] Active subscription details."
required:
- id
- status
- plan_id
properties:
id:
type: string
status:
type: string
enum: [active, cancelled, past_due, trialing]
plan_id:
type: string
plan_name:
type: string
current_period_start:
type: string
format: date-time
current_period_end:
type: string
format: date-time
cancel_at_period_end:
type: boolean
SubscriptionPreview:
type: object
x-runtime: [cloud]
description: "[cloud-only] Preview of a subscription change including prorations."
properties:
plan_id:
type: string
plan_name:
type: string
amount_due:
type: integer
description: Amount due in cents
proration_amount:
type: integer
description: Proration adjustment in cents
currency:
type: string
next_billing_date:
type: string
format: date-time
Workspace:
type: object
x-runtime: [cloud]
description: "[cloud-only] A cloud workspace for team collaboration."
required:
- id
- name
properties:
id:
type: string
name:
type: string
owner_id:
type: string
member_count:
type: integer
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
WorkspaceMember:
type: object
x-runtime: [cloud]
description: "[cloud-only] A member of a cloud workspace."
required:
- user_id
- role
properties:
user_id:
type: string
email:
type: string
format: email
display_name:
type: string
avatar_url:
type: string
format: uri
role:
type: string
enum: [owner, admin, member]
joined_at:
type: string
format: date-time
WorkspaceInvite:
type: object
x-runtime: [cloud]
description: "[cloud-only] A pending workspace invitation."
required:
- id
- email
- role
properties:
id:
type: string
email:
type: string
format: email
role:
type: string
enum: [admin, member]
invited_by:
type: string
created_at:
type: string
format: date-time
expires_at:
type: string
format: date-time
WorkspaceApiKey:
type: object
x-runtime: [cloud]
description: "[cloud-only] A workspace API key (secret value redacted)."
required:
- id
- name
properties:
id:
type: string
name:
type: string
prefix:
type: string
description: First few characters of the key for identification
created_at:
type: string
format: date-time
last_used_at:
type: string
format: date-time
nullable: true
created_by:
type: string
WorkspaceApiKeyCreated:
type: object
x-runtime: [cloud]
description: "[cloud-only] A newly created workspace API key, including the full secret value (shown only once)."
required:
- id
- name
- key
properties:
id:
type: string
name:
type: string
key:
type: string
description: Full API key value (only returned on creation)
prefix:
type: string
created_at:
type: string
format: date-time
CloudUser:
type: object
x-runtime: [cloud]
description: "[cloud-only] A cloud-authenticated user profile."
required:
- id
- email
properties:
id:
type: string
email:
type: string
format: email
display_name:
type: string
avatar_url:
type: string
format: uri
created_at:
type: string
format: date-time
SecretMeta:
type: object
x-runtime: [cloud]
description: "[cloud-only] Metadata for a stored secret (value is never returned)."
required:
- id
- name
properties:
id:
type: string
name:
type: string
provider:
type: string
description: "[cloud-only] Provider identifier (e.g., huggingface, civitai)."
x-runtime: [cloud]
last_used_at:
type: string
format: date-time
description: "[cloud-only] When the secret was last used for decryption."
x-runtime: [cloud]
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
UpdateSecretRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] Request body for updating an existing user secret."
properties:
name:
type: string
description: New name for the secret
secret_value:
type: string
description: New secret value (API key, token, etc.)
CreateSessionResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Response after creating a session cookie."
required:
- success
properties:
success:
type: boolean
expiresIn:
type: integer
description: Session expiration time in seconds.
DeleteSessionResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Response after deleting a session cookie."
required:
- success
properties:
success:
type: boolean
CreateHubProfileRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] Request body for creating a new Hub profile."
required:
- workspace_id
- username
properties:
workspace_id:
type: string
username:
type: string
description: Unique URL-safe slug. Immutable after creation.
display_name:
type: string
description:
type: string
avatar_token:
type: string
website_urls:
type: array
items:
type: string
PublishHubWorkflowRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] Request body for publishing or updating a workflow on the Hub."
required:
- username
- name
- workflow_filename
- asset_ids
properties:
username:
type: string
name:
type: string
workflow_filename:
type: string
asset_ids:
type: array
items:
type: string
description:
type: string
tags:
type: array
items:
type: string
models:
type: array
items:
type: string
custom_nodes:
type: array
items:
type: string
tutorial_url:
type: string
metadata:
type: object
additionalProperties: true
thumbnail_type:
type: string
enum: [image, video, image_comparison]
thumbnail_token_or_url:
type: string
thumbnail_comparison_token_or_url:
type: string
sample_image_tokens_or_urls:
type: array
items:
type: string
HubWorkflowDetail:
type: object
x-runtime: [cloud]
description: "[cloud-only] Full Hub workflow detail including versions, assets, and statistics."
required:
- share_id
- workflow_id
- name
- workflow_json
- assets
- profile
- status
properties:
share_id:
type: string
workflow_id:
type: string
name:
type: string
status:
type: string
enum: [pending, approved, rejected, deprecated]
description:
type: string
thumbnail_type:
type: string
enum: [image, video, image_comparison]
thumbnail_url:
type: string
thumbnail_comparison_url:
type: string
tutorial_url:
type: string
metadata:
type: object
additionalProperties: true
sample_image_urls:
type: array
items:
type: string
publish_time:
type: string
format: date-time
nullable: true
workflow_json:
type: object
additionalProperties: true
assets:
type: array
items:
$ref: "#/components/schemas/AssetInfo"
profile:
$ref: "#/components/schemas/HubProfile"
AssetInfo:
type: object
x-runtime: [cloud]
description: "[cloud-only] Lightweight asset reference used in workflow publishing payloads."
required:
- id
- filename
properties:
id:
type: string
filename:
type: string
mime_type:
type: string
size_bytes:
type: integer
format: int64
BulkRevokeAPIKeysResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Response after bulk-revoking API keys for a workspace member."
required:
- revoked_count
properties:
revoked_count:
type: integer
minimum: 0
CreateWorkflowVersionRequest:
type: object
x-runtime: [cloud]
description: "[cloud-only] Request body for creating a new version of a saved workflow."
required:
- base_version
- workflow_json
properties:
base_version:
type: integer
description: Version number this change is based on (for optimistic concurrency).
workflow_json:
type: object
additionalProperties: true
WorkflowVersionResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Metadata for a single workflow version."
required:
- id
- version
- latest_version
- created_by
- created_at
properties:
id:
type: string
version:
type: integer
latest_version:
type: integer
created_by:
type: string
created_at:
type: string
format: date-time
WorkflowPublishInfo:
type: object
x-runtime: [cloud]
description: "[cloud-only] Publishing metadata for a workflow shared to the Hub."
required:
- workflow_id
- share_id
- listed
- assets
properties:
workflow_id:
type: string
share_id:
type: string
publish_time:
type: string
format: date-time
nullable: true
listed:
type: boolean
assets:
type: array
items:
$ref: "#/components/schemas/AssetInfo"
TaskEntry:
type: object
x-runtime: [cloud]
description: "[cloud-only] Task data for list views."
required:
- id
- task_name
- status
- create_time
properties:
id:
type: string
format: uuid
task_name:
type: string
status:
type: string
enum: [created, running, completed, failed]
create_time:
type: string
format: date-time
started_at:
type: string
format: date-time
completed_at:
type: string
format: date-time
TaskResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Full task details including payload and result."
required:
- id
- idempotency_key
- task_name
- payload
- status
- create_time
- update_time
properties:
id:
type: string
format: uuid
idempotency_key:
type: string
task_name:
type: string
payload:
type: object
additionalProperties: true
status:
type: string
enum: [created, running, completed, failed]
result:
type: object
additionalProperties: true
create_time:
type: string
format: date-time
update_time:
type: string
format: date-time
started_at:
type: string
format: date-time
completed_at:
type: string
format: date-time
error:
type: string
TasksListResponse:
type: object
x-runtime: [cloud]
description: "[cloud-only] Paginated list of background tasks for the authenticated user."
required:
- tasks
- pagination
properties:
tasks:
type: array
items:
$ref: "#/components/schemas/TaskEntry"
pagination:
$ref: "#/components/schemas/PaginationInfo"