Skip to main content

Connection error

The CLI couldn’t reach JoyStream. The message names the URL it tried, which is usually the fastest clue. Check your network and any proxy or VPN between you and the internet, then retry:
If the URL in the message is not https://api.joystream.ai, something is overriding it — most often a config.toml left behind by a local development setup. Move it aside and try again:
The CLI needs no configuration to reach JoyStream, so a missing config file is never the cause.

Session expired

Your token was rejected or has expired. The CLI refreshes proactively when a token is within 60 seconds of expiring; this appears when the refresh didn’t happen or the server rejected the token.
If it recurs immediately after logging in and you use JOYSTREAM_CONFIG_DIR for separate profiles, confirm you set the same value for both the login and the failing command — otherwise you’re signing in to one profile and running against another.

Permission errors

A 403 shows the status and detail rather than a login message. That is intentional — you are signed in, but not permitted. Common causes: Signing in again won’t help. Check your role:

Could not determine active workspace

Commands that operate on a workspace need one, either from --workspace or from your context.
Some commands require --workspace explicitly rather than defaulting — the connection group is the main one, because credential resolution depends on which workspace is asking.

Requires an interactive terminal

The planning chat won’t run in a pipe, in CI, or with captured output. There is no line-mode fallback. Run it in a normal terminal, or create the draft non-interactively:

Specify a form: —new or an id

You ran a bare jstm agent plan. Creating an agent is always explicit.
This exits 2, not 1 — it’s a usage error.

Ambiguous workspace handle

Team handles are unique within an organization, not across all of them.
Use the fully qualified form, acme-corp/platform, to be unambiguous.

Multiple credentials for a provider

If several credentials exist, the command asks you to name one rather than guessing. List them and pass --id:

Seeing the full error

This logs the full traceback to stderr. Because diagnostics go to stderr and results to stdout, you can debug and pipe at the same time:

See also