Skip to main content
Non-interactive helpers for openclaw.json: get/set/patch/unset a value by path, print the schema, validate, or print the active file path. Run openclaw config with no subcommand to open the same guided wizard as openclaw configure.
When OPENCLAW_NIX_MODE=1, OpenClaw treats openclaw.json as immutable. Read-only commands (config get, config file, config schema, config validate) still work; config writers refuse. Edit the Nix source for the install instead; for the first-party nix-openclaw distribution, use the nix-openclaw Quick Start and set values under programs.openclaw.config or instances.<name>.config.

Root options

string
Repeatable guided-setup section filter when you run openclaw config without a subcommand.
Guided sections: workspace, model, web, gateway, daemon, channels, plugins, skills, health.

Examples

Paths

Dot or bracket notation. Quote bracket paths in shell examples so zsh does not glob-expand [0]:
Prefer agents.entries.<id> paths for agent edits. The legacy agents.list[0] syntax and whole-list inputs still work with set, patch, and unset; writes persist the canonical keyed roster. Indexed edits use the current roster order. Within a batch, a submitted list keeps its order across subsequent keyed edits, including when agent IDs are numeric strings. Existing roster-deletion and $include ownership protections still apply. When a legacy roster expands a single-agent installation in the root config file, writes retire its default marker and preserve the existing agent’s responsibilities with explicit owners. An explicitly authored ownership: "explicit" cannot be combined with a legacy default: true marker. For root-file writes, changing session.store clears a copied agents.defaults.sessionStore.agentId because that owner belongs to the previous store. To assign the destination store’s owner, set that owner path explicitly in the same batch.

config get

Reads a value from the redacted config snapshot (secrets never print). --json prints the same redacted value as JSON; otherwise strings/numbers/booleans print bare and objects/arrays print as formatted JSON. A schema-valid but unset path explains that the runtime default applies; an unknown path suggests openclaw config schema. With --json, both use the standard CLI JSON failure envelope on stdout and exit with status 1. Without --json, diagnostics remain on stderr.

config file

Prints the active config file path, resolved from OPENCLAW_CONFIG_PATH or the default location. The path names a regular file, not a symlink; see Write safety. With --json, stdout contains an object with the resolved path under path.

config schema

Prints the generated JSON schema for openclaw.json to stdout.
  • The current root config schema, plus a root $schema string field for editor tooling.
  • Field title / description docs metadata used by the Control UI.
  • Nested object, wildcard (*), and array-item ([]) nodes inherit the same title / description metadata when matching field docs exist.
  • anyOf / oneOf / allOf branches inherit the same docs metadata too.
  • Best-effort live plugin + channel schema metadata when runtime manifests can be loaded.
  • A clean fallback schema even when the current config is invalid.
The schema is JSON in both modes. --json is accepted as the explicit machine-output spelling and keeps stdout reserved for the schema document.

config validate

Validates the current config against the active schema without starting the gateway. It also checks provider/source compatibility for every registry-declared SecretRef, including disabled plugin or channel configuration. This strict command can report an inactive mismatch that does not block normal Gateway startup, where SecretRef resolution remains limited to effectively active surfaces. After schema validation, it checks every configured manual exec provider’s command path using the same non-executing trust checks as startup: file presence, symlinks, trusted directories, permissions, ownership, and Windows ACL availability. config set, config patch, and config unset apply these checks only to providers changed or referenced by the operation, including during dry runs. Replacing the secrets or secrets.providers collection checks every remaining provider. An unrelated inactive provider does not block targeted repairs or removal of that provider. Path validation does not execute providers or verify their output. Passing it does not guarantee successful secret resolution; exec dry runs require --allow-exec to test that separately.
The exec-provider checks inspect the filesystem of the host where the CLI runs. Run config validate on the gateway host itself (or on a host with matching command paths, ownership, and ACLs). Paths and permissions can change after validation; startup checks them again before execution.
If validation is already failing, start with openclaw configure or openclaw doctor --fix. openclaw chat does not bypass the invalid-config guard.
Provider and runtime params bags are intentionally typed as Record<string, unknown> because their owners define the supported keys and values. openclaw config validate can validate the container and overall config shape, but it cannot type-check provider-specific parameter names or values. Passing validation does not prove that a param is supported; consult the provider docs and verify behavior on the selected runtime and provider.

Values

Values parse as JSON5 when possible; otherwise they are treated as raw strings. Use --strict-json to require standard JSON with no string fallback (JSON5-only syntax such as comments, trailing commas, or unquoted keys is then rejected). --json is a legacy alias for --strict-json on config set.
For structured values that are awkward to quote in your shell, put a config-shaped JSON5 object in a file and use config patch --file <path> --dry-run. The file contains config keys and their values, not a bare array. config get <path> --json prints the redacted value as JSON instead of terminal-formatted text. When a write changes agents.defaults.model or a per-agent agents.entries.*.model, OpenClaw resolves each changed primary or fallback through the configured catalogs and the selected provider’s model resolver before writing. Provider-supported exact provider/model pins are accepted even when absent from the curated picker; validation does not replace the selected model. Unknown model references are rejected without changing the active config. Run openclaw models list to browse the picker, or check the provider’s documentation for an exact model ID. Successful validation does not prove that your account can call the model.
Object assignment replaces the target path by default. Protected paths that commonly hold user-added entries refuse replacements that would remove existing entries unless you pass --replace: agents.defaults.models, agents.entries, models.providers, models.providers.<id>, models.providers.<id>.models, plugins.entries, and auth.profiles.
Use --merge when adding entries to those maps:
Use --replace only when the provided value should intentionally become the complete target value.

Conditional writes

Use a conditional expectation when automation must update one authored path only if it has not changed since the caller last observed it:
--expect-current-json <json> uses strict JSON and compares the value by JSON type and structure. null is an authored value, so it does not satisfy --expect-current-absent. The comparison uses the effective authored config after includes and environment substitution, before runtime defaults are applied. The two expectation flags are mutually exclusive. They apply only to a single config set operation, require a direct non-redirected config path, and cannot be combined with batch mode or --dry-run. If input or roster resolution would write a different path than the caller requested, such as a sibling *Ref path, the command exits with status 1 instead of retargeting the expectation. A mismatch exits with status 1, writes nothing, and does not print either the expected or current value. OpenClaw’s config snapshot guard still rejects a later race between the expectation check and the final file replacement.

config set modes

SecretRef assignments are rejected on unsupported runtime-mutable surfaces (for example hooks.token, Discord thread-binding webhook tokens, and WhatsApp creds JSON). See SecretRef Credential Surface.
Batch parsing always uses the batch payload (--batch-json/--batch-file) as the source of truth; --strict-json / --json do not change batch parsing behavior. Batch assignments apply in order, then validation checks the final config. A SecretRef replaced by a later assignment is not resolved or counted in dry-run output, even with --allow-exec. Providers that remain in a changed provider collection still receive command-path trust checks. JSON path/value mode also works for SecretRefs and providers directly:

Provider builder flags

Provider builder targets must use secrets.providers.<alias> as the path.
  • --provider-source <env|file|exec|store>
  • --provider-timeout-ms <ms> (file, exec)
  • --provider-allowlist <ENV_VAR> (repeatable)
  • --provider-path <path> (required)
  • --provider-mode <singleValue|json>
  • --provider-max-bytes <bytes>
  • --provider-command <path> (required)
  • --provider-arg <arg> (repeatable)
  • --provider-no-output-timeout-ms <ms>
  • --provider-max-output-bytes <bytes>
  • --provider-json-only
  • --provider-env <KEY=VALUE> (repeatable)
  • --provider-pass-env <ENV_VAR> (repeatable)
  • --provider-trusted-dir <path> (repeatable)
Hardened exec provider example:

config patch

Paste or pipe a config-shaped JSON5 patch instead of running many path-based config set commands. Objects merge recursively; arrays and scalar values replace the target; null deletes the target path.
Patch files are limited to 8 MiB. Piped --stdin patches are limited to 1 MiB. Pipe a patch over stdin for remote setup scripts:
Example patch:
The runtime pin makes this an embedded OpenClaw recipe. A valid fastMode value is a portable typed runtime control and does not choose OpenClaw by itself. Use --replace-path <path> when one object or array must become exactly the provided value instead of being recursively patched:
--dry-run runs schema and SecretRef resolvability checks without writing. Exec-backed SecretRefs are skipped by default during dry-run; add --allow-exec when you intentionally want dry-run to execute provider commands.

Dry run

--dry-run simulates a change without writing openclaw.json. Available on config set, config patch, and config unset. Which checks run depends on the input mode. Value mode (config set <path> <value> without --strict-json) skips the full schema pass and the ordinary SecretRef resolvability scan. Policy, provider, and model-reference checks can still run. When no checks apply, value mode reports Dry run successful even for a value the real write rejects. Use --strict-json (or config patch --file --dry-run) when you need schema validation.
  • Value mode (a plain <value> without --strict-json): skips the full schema pass and ordinary SecretRef resolvability scan. Policy, provider, and model-reference checks can still run. When no checks apply, the CLI prints Dry run note: value mode does not run schema/resolvability checks and can succeed even when the real write would fail schema validation.
  • Builder mode: runs SecretRef resolvability checks for changed refs/providers.
  • JSON mode (--strict-json, --json, or batch mode): runs schema validation plus SecretRef resolvability checks.
  • Policy validation runs against the full post-change config, so parent-object writes (for example setting hooks as an object) cannot bypass unsupported-surface validation.
  • Exec command-path trust checks run without executing providers. Exec SecretRef resolvability checks are skipped by default to avoid command side effects; pass --allow-exec to opt in (this may execute provider commands). --allow-exec is dry-run only and errors without --dry-run.
  • ok: whether dry-run passed
  • operations: number of assignments evaluated
  • checks: whether schema/resolvability checks ran
  • checks.resolvabilityComplete: whether resolvability checks ran to completion (false when exec refs are skipped)
  • refsChecked: number of refs actually resolved during dry-run
  • skippedExecRefs: number of exec refs skipped because --allow-exec was not set
  • errors: structured failures when ok=false; each carries a kind of missing-path, schema, resolvability, model, or conflict (conflict means the config file changed while the command was writing, so nothing was changed — re-run to pick up the new file)

JSON output shape

  • config schema validation failed: your post-change config shape is invalid; fix the path/value or provider/ref object shape.
  • Config policy validation failed: unsupported SecretRef usage: move that credential back to plaintext/string input; keep SecretRefs on supported surfaces only.
  • SecretRef assignment(s) could not be resolved: the referenced provider/ref cannot currently resolve (missing env/store name, invalid file pointer, exec provider failure, or provider/source mismatch).
  • model reference validation failed: a changed text-model primary or fallback is unknown; run openclaw models list and choose an available model.
  • Dry run note: skipped <n> exec SecretRef resolvability check(s): rerun with --allow-exec if you need exec resolvability validation.
  • For batch mode, fix failing entries and rerun --dry-run before writing.

Applying changes

After every successful config set / config patch / config unset, the CLI prints one of three hints so you know whether the gateway needs a restart: Effective changes to plugins.entries (or any subpath) require a restart, since the CLI cannot prove every plugin’s reload metadata is loaded. Successful config set or config unset operations that produce no effective config diff print No change and leave the JSON5 file byte-for-byte untouched. A config unset target that is absent from the authored config exits with status 1 and also leaves the file untouched. Setting an absent key to a value equal to its runtime default is still an authored change and persists the explicit value.

Write safety

openclaw config set and other OpenClaw-owned config writers validate the full post-change config before committing it to disk. If the new payload fails schema validation or looks like a destructive clobber, the active config is left alone and the rejected payload is saved beside it as openclaw.json.rejected.*. OpenClaw-owned writes that change config reserialize JSON5 as standard JSON. When the source contains comments, the writer warns immediately before removing them; use a direct editor when preserving comments matters.
The active config path must be a regular file. Symlinked openclaw.json layouts are unsupported for writes; use OPENCLAW_CONFIG_PATH to point directly at the real file instead.
Prefer CLI writes for small edits:
If a write is rejected, inspect the saved payload and fix the full config shape:
Direct editor writes are still allowed, but the running Gateway treats them as untrusted until they validate. At startup, eligible single-file configs can receive deterministic legacy-key migrations if the complete result validates, with the previous config kept in the .bak ring. Other invalid direct edits fail startup; hot reload skips invalid edits without rewriting openclaw.json. Run openclaw doctor --fix to repair prefixed/clobbered config or restore the last-known-good copy. See Gateway troubleshooting. Whole-file recovery is reserved for doctor repair. Plugin schema changes or minHostVersion skew stay loud instead of rolling back unrelated user settings such as models, providers, auth profiles, channels, gateway exposure, tools, memory, browser, or cron config.

Repair loop

After openclaw config validate passes, use the local TUI to have an embedded agent compare the active config against the docs while you validate each change from the same terminal:
Inside the TUI, a leading ! runs a literal local shell command (after a one-time per-session confirmation prompt):
1

Compare with docs

Ask the agent to compare your current config with the relevant docs page and suggest the smallest fix.
2

Apply targeted edits

Apply targeted edits with openclaw config set or openclaw configure.
3

Re-validate

Rerun openclaw config validate after each change.
4

Doctor for runtime issues

If validation passes but the runtime is still unhealthy, run openclaw doctor or openclaw doctor --fix for migration and repair help.