Three credentials, three jobs
Never pass the License Key or a provider credential as an execution token, and never put any of them in the SDK config.
Generate one
--expires-in for a non-expiring service credential; use it for temporary access you would rather not have to remember to revoke.
A token belongs to the SDK, not one version. It works with every active or deprecated version, while each version still enforces its own operation scope.
--expires-in limits time, not which operations the token may call.--allow flag on an SDK token. That exists on MCP tokens, where narrowing an agent’s reach is the common case. If you need two audiences with different capability, publish two SDKs rather than trying to split one token.
Flags
sdk token generate
Use
--json in automation. Do not parse the token out of human-readable apply text.
The token the first apply gives you
The first successfulsdk apply returns an execution token once, in the response where the Engine created it. In JSON output it appears as execution_token on that one response only. An idempotent re-apply will not return it again.
If you lose it, generate a new named token rather than re-applying and hoping.
After an Engine reset
The Registry is not an SDK configuration archive and cannot restore SDKs after an Engine database reset. Recovery is: reapply your local SDK config, then issue a new execution token. This is a good reason to keep.fused/ in source control.
Permissions
Generating, listing, and revoking tokens all requireapp.tokens.manage. That is deliberately separate from app.manage — a team can own and update an SDK without being able to mint credentials for it, or the reverse.
Run an operation
With a token in hand, call an operation and confirm the whole path works.