Access and beta
Is ComfyUI Deploy generally available?
Is ComfyUI Deploy generally available?
How do I get access?
How do I get access?
My API call returns 403 COMFYUI_DEPLOY_BETA_NOT_ENABLED. Why?
My API call returns 403 COMFYUI_DEPLOY_BETA_NOT_ENABLED. Why?
403 with the error code COMFYUI_DEPLOY_BETA_NOT_ENABLED. Read endpoints (listing and fetching workflows) are not gated. The gate also applies when you try to run another organization’s public workflow, so being able to see a workflow does not by itself let you run it. Request access in the dashboard, and the same calls will succeed once you are enrolled.My organization is in the beta. Does that cover my whole team?
My organization is in the beta. Does that cover my whole team?
Install and setup
I installed the plugin but there is no Runflow category in the node picker.
I installed the plugin but there is no Runflow category in the node picker.
custom_nodes/ directory, or you only refreshed the browser tab. A browser refresh is not enough: the Python process has to re-exec. Confirm the plugin is under custom_nodes/, then fully restart the ComfyUI server process. After the restart a Runflow category appears in the node picker.Where do I put my API key, and why not on the Deploy node?
Where do I put my API key, and why not on the Deploy node?
Runflow.ApiKey field). That storage is local to your machine and is never written into a workflow file. The Deploy node also exposes host and api_key widgets, but ComfyUI persists widget values into the workflow JSON, so a key typed there travels with every export, screenshot, and paste. Leave those widgets empty for normal use.What API key scopes do I need?
What API key scopes do I need?
comfyui-workflows:read plus comfyui-workflows:create. Redeploying to the same slug from the same client also needs comfyui-workflows:edit. Deleting endpoints needs comfyui-workflows:delete. The Deploy button uses read to detect an existing slug, then create (new) or edit (replace). Issue the narrowest set you need: edit lets a key replace the graph of any existing endpoint your organization owns, so rotate the key on any suspicion of a leak. Dispatching a run (calling your deployed endpoint) uses the standard runs:create scope, the same as any model run, which is separate from the comfyui-workflows:* deploy and manage scopes above. Create a key.Should I pin a plugin version?
Should I pin a plugin version?
main. If you need a hard guarantee against future renames of node classes, widgets, or settings, pin the commit SHA after you clone. Watch the releases page for breaking changes.Deploying your workflow
How is my endpoint slug derived from the name?
How is my endpoint slug derived from the name?
endpoint_name: lowercased, whitespace mapped to -, and anything outside a-z, 0-9, -, _ stripped. So Background Removal v2.1 becomes background-removal-v21 (the . is dropped). The default name is default, so rename it before deploying or you will publish to a slug literally called default. Pick a name without surprises.I renamed my endpoint and now there is a duplicate, or my old one is gone.
I renamed my endpoint and now there is a duplicate, or my old one is gone.
endpoint_name changes the slug, which creates a new endpoint rather than updating the old one. To replace an existing endpoint, keep the same name and rely on the comfyui-workflows:edit scope so the deploy overwrites the same slug in place.Deploy failed. What do the common errors mean?
Deploy failed. What do the common errors mean?
- Alert about an unconfigured key or URL.
Runflow.ApiKeyis blank in Settings (and the node’sapi_keywidget is also blank), orRunflow.ApiUrlwas cleared. Save the key under Settings and deploy again. - A
failedalert citing401or an invalid key. The key is missing, revoked, or for the wrong environment. Reissue it and re-save under Settings. lookup failedor403on redeploy. Deploy first looks up the existing slug, then replaces it. A key withcreatebut noreadfails at the lookup; a key withreadbut noeditfails at the replace. Useread,create, andedittogether for iterative deploys.endpoint_name must be URL-safe. The slug came out empty after stripping characters. Pick a name with at least one letter or number.
Can I deploy or manage workflows without the plugin (CI or automation)?
Can I deploy or manage workflows without the plugin (CI or automation)?
POST to the workflows collection, replace the graph or swap GPU mode with a PATCH, and soft-delete with a DELETE. See ComfyUI workflows API for the full endpoint list and request bodies.How do I take down an endpoint, and what happens to its runs?
How do I take down an endpoint, and what happens to its runs?
DELETE /v1/comfyui-workflows/{id} (needs the comfyui-workflows:delete scope). The delete is a soft delete: new runs are rejected with 404 on the dispatch route, but the workflow’s historical runs stay reachable through GET /v1/runs/{id}.Calling your deployed workflow
What URL do I call to run my deployed workflow?
What URL do I call to run my deployed workflow?
your-org is your organization slug (shown at the top of the dashboard, derived from your API key) and your-endpoint is what endpoint_name slugified to:{ "run_id": "...", "status": "queued" }. Track the run by polling GET /v1/runs/{id} until its status_code reaches a terminal state (succeeded or failed), or by passing a callback_url. See ComfyUI workflows API for the request body fields.How do I pass inputs, and which input types are supported?
How do I pass inputs, and which input types are supported?
input object is keyed by the input_id of each Runflow Input node in your workflow. The plugin ships typed input nodes: Runflow Input (String), (Int), (Float), (Boolean), (Image), and (File). Set a meaningful input_id on each one in your workflow; two inputs of the same type that keep the default id will collide. Send values under those same keys at call time.How do I send an image or a file as input?
How do I send an image or a file as input?
Runflow Input (Image) or Runflow Input (File) node, then send its value as either a runflow://assets/{uuid} reference to a previously uploaded asset or any https:// URL (plain http:// is rejected). A runflow:// asset used for an image input must be a PNG, JPEG, WebP, or GIF; a Runflow Input (File) accepts any file type. Runflow does not fetch or size-check an external URL when you submit the run; the worker downloads it at run time, so an unreachable or wrong-type URL surfaces as a run failure rather than a submit error.What does the response look like, and how do I get my outputs?
What does the response look like, and how do I get my outputs?
output carries kind: "comfyui_outputs" and an outputs array — one entry per emitted artifact file, each labeled by the output_id of the Runflow Output node that produced it. A node that emits several files (a batch, say) yields several entries that share one output_id, so treat output_id as a node label, not a unique key:output_id when you need per-node outputs. Each entry’s url is presigned and time-limited; download or copy outputs to your own storage on receipt. If a URL expires before you fetch it, re-request the run with GET /v1/runs/{id} and Runflow returns freshly signed URLs.Is the API synchronous, or do I poll? What about callbacks?
Is the API synchronous, or do I poll? What about callbacks?
callback_url and Runflow POSTs the terminal run to it once the run reaches a final state, or omit it and poll GET /v1/runs/{id} until the status is terminal. See Runs for the lifecycle and Callbacks plus Verify callback signatures for the webhook pattern.GPUs and billing
How is ComfyUI Deploy billed?
How is ComfyUI Deploy billed?
Which GPU does my workflow run on? Can I choose?
Which GPU does my workflow run on? Can I choose?
gpu_mode. In auto (the default) the platform routes each run to the cheapest GPU that fits the workflow’s memory needs and promotes to a larger one if a run runs out of memory. In explicit the workflow is pinned to a chosen set of GPU models. You can switch gpu_mode with a PATCH to the workflow (owner only); changing the specific set of GPUs an explicit workflow is pinned to is done by redeploying it. The GPU types currently available and their rates are on runflow.io/pricing.What are the exact per-GPU rates, and how much will a run cost?
What are the exact per-GPU rates, and how much will a run cost?
GET /v1/runs/{id}, then multiply by your expected volume.If my run fails, am I still charged?
If my run fails, am I still charged?
Why was my run rejected before it even started?
Why was my run rejected before it even started?
402. A workflow pinned to a GPU that is inactive or unpriced is rejected with 422; redeploy it with an available GPU. These checks run before any work starts, so a rejected run is never charged.Why is my first run after a quiet period slow (cold start)?
Why is my first run after a quiet period slow (cold start)?
Where do I see the GPU seconds and cost for a run?
Where do I see the GPU seconds and cost for a run?
GET /v1/runs/{id} returns the cost and a cost breakdown for completed ComfyUI runs, including the GPU models used and the GPU seconds consumed per model. The webhook delivery payload does not carry cost — it has the run’s status, output, and duration_ms — so call GET /v1/runs/{id} for the cost and the per-GPU breakdown. To attribute spend per pipeline, set a metadata object when you create the run; it is echoed back on both the webhook and the run record.Is there a maximum run duration?
Is there a maximum run duration?
Limits and behavior
Can I use private or gated models, or private custom nodes?
Can I use private or gated models, or private custom nodes?
422. At run time Runflow rejects a custom node that has no pinned commit or whose origin is not https:// (a short allowlist of Runflow-internal origins aside), and rejects a model with no sha256 (the worker resolves model weights by that hash from its cache, so a public download URL is not required). ComfyUI itself must report an origin and commit. In practice this means public, pinned dependencies: a private repository the worker cannot clone fails the run. Local working-copy edits are recorded for audit but do not by themselves block a run.My workflow runs locally but fails on Runflow. Why?
My workflow runs locally but fails on Runflow. Why?
git clone and pip install from URLs declared by the workflow). Models declared as download URLs in the workflow’s properties.models deploy without a local copy, but each still needs a sha256 to run: a URL-only entry with no hash is rejected at run time with an invalid_sha error. Widget-selected models must exist locally or carry a URL fallback, and likewise need a sha256.Is it safe to redeploy while runs are in flight?
Is it safe to redeploy while runs are in flight?
Is my deployed workflow private, or can other people see and run it?
Is my deployed workflow private, or can other people see and run it?
is_public is false on create). A private workflow’s graph and endpoint are not visible or runnable by other organizations. Making a workflow public lets anyone who has its exact owner and slug load and run it by direct link, but it does not appear in Runflow’s browseable catalog unless the Runflow team approves it for listing. Either way, callers still need their own beta access and credits to run it.Are there rate limits?
Are there rate limits?
429 with the error code RATE_LIMITED. Retry with backoff (exponential backoff is a safe default). Separately, when all suitable GPU workers are busy, a dispatched run waits in queued until one frees up rather than being rejected. See Rate limits for more, and use the contact link there if you need a higher limit.Can I cancel a run that is already in progress?
Can I cancel a run that is already in progress?
How do I keep my own ComfyUI server secure?
How do I keep my own ComfyUI server secure?
Getting help
I'm stuck or think I found a bug. Where do I get help?
I'm stuck or think I found a bug. Where do I get help?