Skip to main content
These endpoints run asynchronous inference jobs against a Serverless API (ComfyUI) Deployment. The pattern is always the same:
  1. Submit a job → get a request_id immediately
  2. Poll status (or use webhooks) until the run completes
  3. Fetch results (hosted URLs) or handle failures
  4. Optionally cancel a queued/running job
Tip: The Serverless API (LoRA) uses the same request-id pattern—only the request schema differs. See Serverless API (LoRA).
Base URL: https://api.runcomfy.net

Queue endpoints

EndpointMethodDescription
/prod/v1/deployments/{deployment_id}/inferencePOSTSubmit a request
/prod/v1/deployments/{deployment_id}/requests/{request_id}/statusGETCheck request status
/prod/v1/deployments/{deployment_id}/requests/{request_id}/resultGETRetrieve request results
/prod/v1/deployments/{deployment_id}/requests/{request_id}/cancelPOSTCancel a queued request

Common path parameters

  • deployment_id (string, required): The deployment you want to call.
  • request_id (string, required for status/result/cancel): Returned by the submit call.

Submit a request

POST /prod/v1/deployments/{deployment_id}/inference
You can submit requests in two ways:
  • Use the deployment’s cloud-saved workflow (most common): send an overrides object to change only specific node inputs.
  • Send a full workflow at request time (advanced): include workflow_api_json inline to run a different workflow without updating the deployment.

Use cloud-saved workflow

When a workflow is deployed, RunComfy stores its workflow_api.json. At request time, you usually send only:
  • overrides: a partial object keyed by node ID (as strings)
  • optional webhook fields (webhook, webhook_intermediate_status)

What overrides reference

Overrides must match the deployed workflow_api.json:
  • node IDs must exist
  • input keys must exist under the node’s inputs
  • values should match each node’s schema (see object_info.json)
See: Workflow Files For example, in workflow_api.json, node "6" is a CLIPTextEncode node that has a text input:
{
  "6": {
    "inputs": {
      "text": "Add ASCII style text only the single word \"Kontext\" no additional letters to the display",
      "speak_and_recognation": {
        "__value__": [
          false,
          true
        ]
      },
      "clip": [
        "38",
        0
      ]
    },
    "class_type": "CLIPTextEncode",
    "_meta": {
      "title": "CLIP Text Encode (Positive Prompt)"
    }
  },
  "31": {
    "inputs": {
      "seed": 736220757721744,
      "steps": 20,
      "cfg": 1,
      "sampler_name": "euler",
      "scheduler": "simple",
      "denoise": 1,
      "model": [
        "37",
        0
      ],
      "positive": [
        "35",
        0
      ],
      "negative": [
        "135",
        0
      ],
      "latent_image": [
        "124",
        0
      ]
    },
    "class_type": "KSampler",
    "_meta": {
      "title": "KSampler"
    }
  }
}
A matching override updates that node’s inputs:
{
  "overrides": {
    "6": {
      "inputs": {
        "text": "futuristic cityscape"
      }
    },
    "31": {
      "inputs": {
        "seed": 987654321
      }
    }
  }
}
Anything you omit keeps the default from the stored workflow_api.json.

Request example (basic)

curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/inference \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer <token>" \
  --data '{
    "overrides": {
      "31": {
        "inputs": {
          "seed": 987654321
        }
      },
      "6": {
        "inputs": {
          "text": "futuristic cityscape"
        }
      }
    }
  }'

Request example (image/video via URL)

Use a publicly accessible HTTPS URL that returns the raw file via an unauthenticated GET request (no cookies, no login pages). Avoid expiring links.
curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/inference \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer <token>" \
  --data '{
    "overrides": {
      "189": {
        "inputs": {
          "image": "https://example.com/new-image.jpg"
        }
      }
    }
  }'

Request example (image/video via Base64)

curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/inference \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer <token>" \
  --data '{
    "overrides": {
      "189": {
        "inputs": {
          "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD..."
        }
      }
    }
  }'

Request example (API nodes)

If your workflow uses ComfyUI Core API nodes (for example, nodes that require a Comfy API key), include your Comfy Org API key(always starts with ‘comfyui-’) in the request body:
curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/inference \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer <token>" \
  --data '{
    "overrides": {
      "10": {
        "inputs": {
          "prompt": "a golden retriever playing in a park"
        }
      }
    },
    "extra_data": {
      "api_key_comfy_org": "<comfy_org_api_key> starts with comfyui-xxxxx"
    }
  }'

Response example

{
  "request_id": "{request_id}",
  "status_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/status",
  "result_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/result",
  "cancel_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/cancel"
}
Successful requests return 200 OK with:
  • request_id: unique identifier for your job
  • status_url: poll this to track progress
  • result_url: fetch final outputs
  • cancel_url: cancel if still cancellable

Send dynamic workflow (or any workflow_api.json)

Use this when you want to run a different workflow without changing the deployment’s stored workflow. In this mode:
  • include workflow_api_json in the request body
  • omit overrides (or keep it empty)
  • the job runs the workflow you sent
curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/inference \
  --header "Content-Type: application/json" \
  --header "Authorization: Bearer <token>" \
  --data '{
    "workflow_api_json": {your-full-workflow-api-json-here}
  }'

Response example (dynamic workflow)

{
  "request_id": "{request_id}",
  "status_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/status",
  "result_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/result",
  "cancel_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/cancel"
}

Monitor request status

GET /prod/v1/deployments/{deployment_id}/requests/{request_id}/status
Use this endpoint to poll queue progress and determine when results are ready. A typical lifecycle is in_queuein_progresscompleted (or cancelled).

Request example

curl --request GET \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/status \
  --header "Authorization: Bearer <token>"

Response example

{
  "request_id": "{request_id}",
  "status": "in_queue",
  "queue_position": 0,
  "result_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/result",
  "status_url": "https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/status",
  "instance_id": "{instance_id}"
}
Fields you may see:
  • status: in_queue, in_progress, completed, or cancelled
  • queue_position: present while in_queue
  • instance_id: present once an instance is running your job (useful for the instance proxy)
Want to call ComfyUI backend endpoints on the live instance? See Instance Proxy Endpoints.

Retrieve request results

GET /prod/v1/deployments/{deployment_id}/requests/{request_id}/result
When the request completes successfully, this endpoint returns the final outputs. Generated assets (images/videos) are hosted on temporary storage for convenience. Hosted output URLs remain available for up to 7 days after success; after that, they are automatically removed. If you need longer retention, download outputs or copy them into your own storage.

Request example

curl --request GET \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/result \
  --header "Authorization: Bearer <token>"

Response example

{
  "request_id": "{request_id}",
  "status": "succeeded",
  "outputs": {
    "136": {
      "images": [
        {
          "url": "https://example.com/ComfyUI_00001_.png",
          "filename": "ComfyUI_00001_.png",
          "subfolder": "",
          "type": "output"
        }
      ]
    }
  },
  "created_at": "2025-07-22T13:05:16.143086",
  "finished_at": "2025-07-22T13:13:03.624471",
  "instance_id": "{instance_id}"
}
Result payload notes:
  • For succeeded, outputs contains node outputs (usually hosted URLs)
  • For failed, you’ll receive an error object describing why the run failed
  • For cancelled, finished_at indicates when it was cancelled

Cancel a request

POST /prod/v1/deployments/{deployment_id}/requests/{request_id}/cancel
Use this endpoint to cancel a queued or running job.

Request example

curl --request POST \
  --url https://api.runcomfy.net/prod/v1/deployments/{deployment_id}/requests/{request_id}/cancel \
  --header "Authorization: Bearer <token>"

Response example

{
  "request_id": "{request_id}",
  "status": "completed",
  "outcome": "cancelled"
}
Successful requests return a 202 Accepted status with a JSON object containing the cancellation outcome.
  • outcome (string): cancelled if accepted; not_cancellable if the job is completed or otherwise cannot be cancelled.

Webhooks reduce polling and give you automatic updates. See Webhooks.