SecretRef Credential Surface: Supported and Unsupported Fields
Learn which user-supplied credentials accept SecretRef references in OpenClaw. This reference is for developers and operators validating credential configuration.
Read this when
- Verifying SecretRef credential coverage
- Auditing whether a credential is eligible for `secrets configure` or `secrets apply`
- Verifying why a credential is outside the supported surface
This page describes the canonical SecretRef credential surface, detailing which credential fields accept a SecretRef (a reference backed by env, file, exec, or store) in place of a raw secret value.
Scope:
- In scope: only user-supplied credentials that OpenClaw neither generates nor rotates.
- Out of scope: credentials that are runtime-generated or rotated, OAuth refresh material, and session-like artifacts.
The following lists derive from the source target registry and are validated against docs/reference/secretref-user-supplied-credentials-matrix.json in CI; avoid manual edits to entries.
Supported credentials
openclaw.json targets (secrets configure + secrets apply + secrets audit)
models.providers.*.apiKeymodels.providers.*.headers.*models.providers.*.request.auth.tokenmodels.providers.*.request.auth.valuemodels.providers.*.request.headers.*models.providers.*.request.proxy.tls.camodels.providers.*.request.proxy.tls.certmodels.providers.*.request.proxy.tls.keymodels.providers.*.request.proxy.tls.passphrasemodels.providers.*.request.tls.camodels.providers.*.request.tls.certmodels.providers.*.request.tls.keymodels.providers.*.request.tls.passphraseskills.entries.*.apiKeymemory.search.remote.apiKeyagents.entries.*.tts.providers.*.apiKeyagents.entries.*.memory.search.remote.apiKeytalk.providers.*.apiKeytalk.realtime.providers.*.apiKeytts.providers.*.apiKeyplugins.entries.acpx.config.mcpServers.*.env.*plugins.entries.brave.config.webSearch.apiKeyplugins.entries.codex.config.appServer.authTokenplugins.entries.codex.config.appServer.headers.*plugins.entries.exa.config.webSearch.apiKeyplugins.entries.firecrawl.config.webFetch.apiKeyplugins.entries.google-meet.config.realtime.providers.*.apiKeyplugins.entries.google.config.webSearch.apiKeyplugins.entries.google.config.webSearch.headers.*plugins.entries.xai.config.webSearch.apiKeyplugins.entries.moonshot.config.webSearch.apiKeyplugins.entries.perplexity.config.webSearch.apiKeyplugins.entries.firecrawl.config.webSearch.apiKeyplugins.entries.minimax.config.webSearch.apiKeyplugins.entries.tavily.config.webSearch.apiKeyplugins.entries.parallel.config.webSearch.apiKeyplugins.entries.voice-call.config.realtime.providers.*.apiKeyplugins.entries.voice-call.config.streaming.providers.*.apiKeyplugins.entries.voice-call.config.tts.providers.*.apiKeyplugins.entries.voice-call.config.twilio.authTokenplugins.entries.webhooks.config.routes.*.secretgateway.auth.passwordgateway.auth.tokengateway.remote.tokengateway.remote.passwordcron.webhookTokenchannels.telegram.botTokenchannels.telegram.webhookSecretchannels.telegram.accounts.*.botTokenchannels.telegram.accounts.*.webhookSecretchannels.slack.botTokenchannels.slack.appTokenchannels.slack.relay.authTokenchannels.slack.userTokenchannels.slack.signingSecretchannels.slack.accounts.*.botTokenchannels.slack.accounts.*.appTokenchannels.slack.accounts.*.relay.authTokenchannels.slack.accounts.*.userTokenchannels.slack.accounts.*.signingSecretchannels.sms.authTokenchannels.sms.accounts.*.authTokenchannels.buzz.authTagchannels.buzz.privateKeychannels.clickclack.tokenchannels.clickclack.accounts.*.tokenchannels.discord.tokenchannels.discord.pluralkit.tokenchannels.discord.voice.tts.providers.*.apiKeychannels.discord.accounts.*.tokenchannels.discord.accounts.*.pluralkit.tokenchannels.discord.accounts.*.voice.tts.providers.*.apiKeychannels.irc.passwordchannels.irc.nickserv.passwordchannels.irc.accounts.*.passwordchannels.irc.accounts.*.nickserv.passwordchannels.feishu.appSecretchannels.feishu.encryptKeychannels.feishu.verificationTokenchannels.feishu.accounts.*.appSecretchannels.feishu.accounts.*.encryptKeychannels.feishu.accounts.*.verificationTokenchannels.qqbot.clientSecretchannels.qqbot.accounts.*.clientSecretchannels.msteams.appPasswordchannels.mattermost.botTokenchannels.mattermost.accounts.*.botTokenchannels.matrix.accessTokenchannels.matrix.passwordchannels.matrix.accounts.*.accessTokenchannels.matrix.accounts.*.passwordchannels.nextcloud-talk.botSecretchannels.nextcloud-talk.apiPasswordchannels.nextcloud-talk.accounts.*.botSecretchannels.nextcloud-talk.accounts.*.apiPasswordchannels.zalo.botTokenchannels.zalo.webhookSecretchannels.zalo.accounts.*.botTokenchannels.zalo.accounts.*.webhookSecretchannels.googlechat.serviceAccountchannels.googlechat.accounts.*.serviceAccount
auth-profiles.json targets (secrets configure + secrets apply + secrets audit)
profiles.*.keyRef(type: "api_key"; not supported whenauth.profiles.<id>.mode = "oauth")profiles.*.tokenRef(type: "token"; not supported whenauth.profiles.<id>.mode = "oauth")
Notes: --- END REWRITE ---
- Store references are named according to
^[A-Z][A-Z0-9_]{0,127}$and, in this release, can only be resolved from the Gateway-wide team scope. A common example looks like{"source":"store","provider":"default","id":"OPENAI_API_KEY"}. - For auth-profile plan targets,
agentIdis mandatory; plan entries point toprofiles.*.key/profiles.*.tokenand create sibling references (keyRef/tokenRef). Auth-profile references fall under both runtime resolution and audit coverage. - Within
openclaw.json, SecretRefs must take structured object form, such as{"source":"env","provider":"default","id":"DISCORD_BOT_TOKEN"}. The oldersecretref-env:<ENV_VAR>marker strings are not accepted on SecretRef credential paths; runopenclaw doctor --fixto convert any valid markers. - OAuth policy restriction:
auth.profiles.<id>.mode = "oauth"is incompatible with SecretRef inputs for that profile. Both startup/reload and auth-profile resolution stop immediately if this policy is breached. - For model providers managed through SecretRef, the generated
agents/*/agent/models.jsonentries keep non-secret markers (not the resolved secret values) forapiKey/header surfaces. Marker persistence follows the source as the authority: OpenClaw writes markers from the active source config snapshot (before resolution), never from resolved runtime secret values. - A cold Gateway startup can isolate retryable resolution failures for mapped owners that are not Gateway-owned. Currently mapped classes cover model providers and skills, media/TTS/cron providers, eligible auth profiles, per-agent memory, sandbox SSH, channel accounts, and manifest-declared plugin routes. During startup, each failed owner's explicit refs stay in the runtime snapshot, the owner is surfaced through status and doctor, and requests for that owner are refused without falling back to lower-precedence credentials. Reload and config-write preflight apply the same owner-aware logic: healthy owners refresh; an eligible failed owner remains stale only when its ref identities, provider definitions, and the complete non-secret owner contract are unchanged; a new or altered failure turns cold. Gateway ingress auth, structurally invalid refs or values, fail-closed owners, and currently unmapped owners continue to be strict.
- For web search: in explicit provider mode (
tools.web.search.providerset), only the key for the selected provider is active. In auto mode (tools.web.search.providerunset), only the first provider key that resolves by precedence is active, and refs for non-selected providers stay inactive until selected. Provider credentials rely onplugins.entries.<plugin>.config.webSearch.*. - Slack
identity: "user"useschannels.slack.userTokenwithchannels.slack.appTokenfor Socket Mode orchannels.slack.signingSecretfor HTTP mode. The same pairing also applies underchannels.slack.accounts.*; this identity does not require a bot token.
Unsupported credentials
These credential classes are minted, rotated, session-bearing, or OAuth-durable, so they do not fit read-only external SecretRef resolution:
hooks.tokenhooks.gmail.pushTokenhooks.mappings[].sessionKeyauth-profiles.oauth.*channels.discord.threadBindings.webhookTokenchannels.discord.accounts.*.threadBindings.webhookTokenchannels.whatsapp.creds.jsonchannels.whatsapp.accounts.*.creds.json