ComfyUI/docs/api.md

7.5 KiB

API Documentation

This document provides detailed information about the ComfyUI API for developers wanting to integrate with or automate ComfyUI.

Table of Contents

API Overview

ComfyUI provides a comprehensive API that allows for:

  • Executing workflows
  • Retrieving generated images
  • Managing models
  • Monitoring task status
  • Controlling the server

The API is accessible via HTTP REST endpoints and WebSocket for real-time updates.

REST API Endpoints

Server Information

Get System Stats

GET /system_stats

Returns system information including RAM, VRAM, Python version, and PyTorch version.

Get Object Info

GET /object_info

Returns information about all available nodes.

Get Object Info for Specific Node

GET /object_info/{node_class}

Returns information about a specific node class.

Workflow Execution

Execute Workflow

POST /prompt

Execute a workflow with the given prompt.

Request Body:

{
  "prompt": {
    // Workflow JSON
  },
  "client_id": "optional_client_id"
}

Response:

{
  "prompt_id": "uuid",
  "number": 1,
  "node_errors": {}
}

Get Execution History

GET /history

Returns execution history.

Get Specific Execution

GET /history/{prompt_id}

Returns details of a specific execution.

Queue Management

Get Queue

GET /queue

Returns the current execution queue.

Modify Queue

POST /queue

Modify the execution queue (clear or delete items).

Request Body:

{
  "clear": true,
  "delete": ["prompt_id1", "prompt_id2"]
}

Interrupt Processing

POST /interrupt

Interrupts the current processing task.

Model Management

Get Available Models

GET /models

Returns a list of available model types.

Get Models of a Specific Type

GET /models/{folder}

Returns a list of available models in the specified folder.

View Model Metadata

GET /view_metadata/{folder_name}?filename=model.safetensors

Returns metadata for a specific model file.

File Operations

Upload Image

POST /upload/image

Upload an image to use in workflows.

View Image

GET /view?filename=image.png&type=output

Returns an image file from the specified location.

WebSocket API

ComfyUI provides real-time updates via WebSocket connection at /ws.

Connection

Connect to the WebSocket endpoint:

const socket = new WebSocket('ws://localhost:8188/ws');

Message Types

The WebSocket API sends messages with the following types:

Status Update

{
  "type": "status",
  "data": {
    "status": {
      "exec_info": {
        "queue_remaining": 0
      }
    },
    "sid": "session_id"
  }
}

Execution Started

{
  "type": "execution_start",
  "data": {
    "prompt_id": "uuid"
  }
}

Executing Node

{
  "type": "executing",
  "data": {
    "node": "node_id",
    "prompt_id": "uuid"
  }
}

Progress Update

{
  "type": "progress",
  "data": {
    "value": 1,
    "max": 100,
    "prompt_id": "uuid",
    "node": "node_id"
  }
}

Execution Complete

{
  "type": "executed",
  "data": {
    "node": "node_id",
    "output": {
      "images": [
        {
          "filename": "image.png",
          "subfolder": "outputs",
          "type": "output"
        }
      ]
    },
    "prompt_id": "uuid"
  }
}

Execution Error

{
  "type": "execution_error",
  "data": {
    "prompt_id": "uuid",
    "node_id": "node_id",
    "exception_message": "Error message",
    "exception_type": "Exception type",
    "traceback": ["Traceback lines"]
  }
}

Python SDK

ComfyUI provides a Python SDK for easier integration with Python applications.

Installation

uv pip install comfyui-client

Basic Usage

from comfyui_client import ComfyUIClient

# Initialize client
client = ComfyUIClient(host="localhost", port=8188)

# Load a workflow from file
workflow = client.load_workflow("my_workflow.json")

# Execute workflow
result = client.execute_workflow(workflow)

# Get generated images
images = client.get_images(result)

# Save images
for i, img in enumerate(images):
    img.save(f"result_{i}.png")

Examples

Execute a Simple Workflow with cURL

curl -X POST http://localhost:8188/prompt -H "Content-Type: application/json" -d @- << 'EOF'
{
  "prompt": {
    "3": {
      "inputs": {
        "seed": 1234,
        "steps": 20,
        "cfg": 7,
        "sampler_name": "euler_ancestral",
        "scheduler": "normal",
        "denoise": 1,
        "model": ["4", 0],
        "positive": ["6", 0],
        "negative": ["7", 0],
        "latent_image": ["5", 0]
      },
      "class_type": "KSampler"
    },
    "4": {
      "inputs": {
        "ckpt_name": "dreamshaper_8.safetensors"
      },
      "class_type": "CheckpointLoaderSimple"
    },
    "5": {
      "inputs": {
        "width": 512,
        "height": 512,
        "batch_size": 1
      },
      "class_type": "EmptyLatentImage"
    },
    "6": {
      "inputs": {
        "text": "beautiful landscape, mountains, lake, sunset, detailed, realistic",
        "clip": ["4", 1]
      },
      "class_type": "CLIPTextEncode"
    },
    "7": {
      "inputs": {
        "text": "blurry, bad quality, low resolution, ugly",
        "clip": ["4", 1]
      },
      "class_type": "CLIPTextEncode"
    },
    "8": {
      "inputs": {
        "samples": ["3", 0],
        "vae": ["4", 2]
      },
      "class_type": "VAEDecode"
    },
    "9": {
      "inputs": {
        "filename_prefix": "output",
        "images": ["8", 0]
      },
      "class_type": "SaveImage"
    }
  }
}
EOF

JavaScript WebSocket Example

const socket = new WebSocket('ws://localhost:8188/ws');

socket.onopen = () => {
  console.log('Connected to ComfyUI');
};

socket.onmessage = (event) => {
  const message = JSON.parse(event.data);
  
  switch (message.type) {
    case 'status':
      console.log('Status update:', message.data);
      break;
    case 'progress':
      console.log(`Progress: ${message.data.value}/${message.data.max}`);
      break;
    case 'executed':
      console.log('Node executed:', message.data);
      if (message.data.output && message.data.output.images) {
        const imagePath = message.data.output.images[0].filename;
        console.log('Image generated:', imagePath);
      }
      break;
    case 'execution_error':
      console.error('Error:', message.data.exception_message);
      break;
  }
};

// Execute a workflow
fetch('/prompt', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ prompt: workflow })
});

Best Practices

Performance

  • Use batching for multiple related generations
  • Avoid polling, use WebSocket for real-time updates
  • Reuse model loading nodes across executions

Error Handling

  • Always check for and handle error responses
  • Implement retries with backoff for transient errors
  • Monitor WebSocket for execution_error messages

Security

  • Validate all inputs before sending to the API
  • Use TLS when exposing ComfyUI outside your network
  • Consider implementing authentication for public instances

Resource Management

  • Monitor system resources via /system_stats endpoint
  • Implement server-side queue limits for multi-user setups
  • Use the /free endpoint to release memory when needed