Two paths
The CLI accepts two kinds of credentials:| Path | Best for | How |
|---|---|---|
| Device-flow OAuth | Humans at a terminal. Tokens auto-refresh; no manual rotation. | ekso auth login --tenant <subdomain> |
| API key | CI, agents, scripts, anything headless. Static; rotate on a policy. | --api-key <key> flag or EKSO_API_KEY env var |
Client marker (Cli for device-flow tokens, Sdk for API keys) to gate operations that should not be scriptable — see CLI/SDK marker.
Device-flow login
Run:ekso ... calls skip the login step.
auth login until the refresh token itself expires (~7 days of inactivity).
API-key auth
API keys live in the admin surface — mint one withekso api-key create --name "ci-deploy". The response contains the raw key exactly once (ek_...); store it immediately.
Pass it on every call via --api-key:
ekso api-key delete <id> (the key stops working immediately).
Precedence
When both are present,--api-key (or EKSO_API_KEY) wins. Stored device-flow tokens are ignored. This makes CI overrides simple — set EKSO_API_KEY in the runner and the same ekso ... invocations a developer uses locally now run headless.
The full resolution order, highest priority first:
--api-key <KEY>flagEKSO_API_KEYenvironment variable- Stored device-flow credentials for
--tenant/EKSO_TENANT - Otherwise — exit code
3(auth error) with a “runekso auth login” hint.
Logging out
acme doesn’t affect other tenants you may also have signed into.
Local development
If you’re running the backend locally (e.g. onhttps://localhost:7070), point the CLI at it with --base-url:
EKSO_BASE_URL). Stored credentials are scoped to the tenant + base URL pair, so dev and prod creds don’t collide.