Exit codes
The CLI usessysexits.h-style exit codes so scripts can branch on failure type without parsing strings.
Common errors
not signed in — run \runcomfy login` first`
Exit code 77. No token in RUNCOMFY_TOKEN env, no token file at <config_dir>/token.json, no legacy macOS file. Run runcomfy login or set RUNCOMFY_TOKEN.
authentication failed — token rejected by server
Exit code 77. Server returned 401 — the token was once valid but isn’t anymore (revoked, rotated, or wrong). Run runcomfy login to mint a fresh one, or rotate RUNCOMFY_TOKEN to a current value from your Profile.
model xxx not found. Verify the model_id at https://www.runcomfy.com/models
Exit code 65. The Model API doesn’t have a model at that path. Common causes:
- Typo (e.g.
flux-1-kontext-pro/editvsflux-1-kontext/pro/edit— note the slash placement) - Stale model_id from a tutorial; the model was renamed or removed
input did not match the model's schema
Exit code 65. API returned 422 / 400. The CLI sends the JSON body verbatim to the Model API; if a required field is missing or a value is the wrong type, the server rejects it. The error message includes the server’s response body (capped at 300 chars).
Open the model’s API tab — it lists the Input schema with required fields, types, and defaults. Adjust your --input JSON to match.
rate limited; retry in a moment
Exit code 75. API returned 429. Retry after a short sleep. RunComfy free-tier accounts share rate limits; pro plans have higher caps.
is not a valid model_id (expected slash-separated)
Exit code 65. Caught client-side before the request goes out. model_id must contain at least one / — that’s how Model API paths work. Example: openai/gpt-image-2/text-to-image.
prompt too long / unexpected truncation
Most models have a token limit (often 512 or “a few thousand”). The CLI doesn’t enforce this — the model server does. Trim your prompt or check the model page for the exact limit.
pass --overrides / --overrides-file ... or --workflow-file
Exit code 65. Caught client-side: the Serverless inference endpoint rejects an empty body, so deployments run needs the inputs to send. Run runcomfy deployments get <id> --include-payload to see the workflow’s node IDs, input names, and default overrides, then key your --overrides by node ID.
training job ... did not finish
Exit code 75. A training job reported STOPPED, but its step progress stopped short of the total or its result carried an error — typically a spot preemption or a reclaimed server. The checkpoints produced so far are still available via train result; continue from the latest one with train resume <job_id>, which reuses the same job id.
refusing to delete ... without confirmation
Exit code 64. deployments delete and datasets delete are permanent, so in a non-interactive shell (CI, a pipe, an agent) they refuse unless you pass --yes. On a terminal they prompt instead.
Skipped N URL(s) outside trusted hosts
Not an error — the run succeeded. The CLI only downloads from RunComfy CDN hosts (*.runcomfy.net, *.runcomfy.com), including across redirects, so that a compromised or adversarial model output can’t make it fetch arbitrary content. Any other URL in the result is printed but not fetched; copy it yourself if you trust it.
request cancelled (after Ctrl-C)
Exit code 1. Expected when you Ctrl-C during runcomfy run or deployments run. The CLI also tries to cancel the remote request before exiting — if the cancel call itself failed, or the request was already running (the Model API only cancels queued requests), you’ll see a line saying so, with the id to retry or to fetch later with runcomfy result <id>.
train submit --wait and datasets upload --wait behave differently on purpose: Ctrl-C there stops watching but leaves the remote work running, so an accidental keystroke can’t throw away hours of training.
Behind a corporate proxy
reqwest (the HTTP client) honors the standard HTTP_PROXY / HTTPS_PROXY env vars automatically. If your proxy intercepts traffic with a custom CA, set SSL_CERT_FILE=/path/to/ca-bundle.pem.
To force-bypass the proxy (e.g. for direct LAN access):
model-api.runcomfy.net while behind a local proxy (ClashX, Surge, etc.) usually means the proxy is interfering — retry, or temporarily set NO_PROXY=* for the call.
Pipe and CI gotchas
- Use
--output jsonfor any script. Pretty mode emits emoji that manglejqparsing. - In non-TTY (piped, CI logs), the CLI auto-replaces emoji with
[tag]— but progress lines still go to stderr.runcomfy ... 2>/dev/nullis fine. NO_COLOR=1andTERM=dumbboth turn off all color and emoji.RUNCOMFY_TOKENenv wins over the token file. Forgetting to unset it locally after testing CI flows is a common foot-gun.
Verbose / trace logging
Checking the version
unknown instead of a sha, you installed from a tarball or cargo install — that’s fine, just include --version output verbatim when reporting issues.
Reporting bugs
- Repo: runcomfy-com/runcomfy-cli
- Include:
runcomfy --versionoutput, full command, full stderr, OS/arch (uname -a).
