Inspect what is sent
Run this command before or after changing your preference:--json to get the same state and payload as one machine-readable
document.
The output shows whether feature statistics are enabled, why they are enabled
or disabled, the request endpoint, and the last successful check. When feature
statistics are enabled, it prints the exact JSON payload the next request would
send. When they are disabled, it shows the update-only request and its
User-Agent header instead.
Daily update check
The default request is:User-Agent contains the OpenClaw version, operating system, Node.js
version, CPU architecture, and whether the request came from the Gateway or
CLI. It has no request body, install identifier, machine identifier, or random
tracking identifier.
The service responds with the latest version and, optionally, a short
operator-facing note. OpenClaw displays an available update and its note through
the existing update notice. Unreachable services, timeouts, invalid responses,
and other failed checks do not interrupt startup or normal operation.
A successful response and its timestamp are cached in the existing shared state
database. Startup reuses the cached result for the next 24 hours, and a running
Gateway checks again during normal maintenance with a small random delay. Failed
checks do not count as successful daily checks.
For testing or self-hosting, set OPENCLAW_TELEMETRY_ENDPOINT to your complete
replacement endpoint URL. The public server source is available at
openclaw/telemetry.
Optional anonymous feature statistics
Feature statistics are off by default. Interactive setup offers a one-time opt-in with No thanks selected by default. Non-interactive and scripted installations never opt in automatically. OpenClaw records when you accepted or declined so it does not ask again. When you explicitly enable feature statistics, the same daily request becomes aPOST with this complete JSON payload:
OpenClaw names only plugins and channels that are bundled with OpenClaw or
already appear in its official plugin catalog. Privately developed plugins are
counted but never named because a private plugin name could identify its
organization. Subtract
features.plugins.length from features.pluginsEnabled
to find the number of unnamed private plugins.
The sender and openclaw telemetry show use the same payload builder, so the
JSON displayed by the CLI is the same payload the sender would use at that
moment.
Reports carry no identifier of any kind, which means they cannot be linked to
each other. We can see that some install runs Telegram with Anthropic models; we
cannot see that it is the same install as yesterday, and we cannot build a
history of any single machine. That costs us retention analysis, and we consider
it worth paying.
What is never collected
Neither request tier includes message content, prompts, model names, API keys, credentials, secret references, file paths, hostnames, account identifiers, user identifiers, or installation and machine identifiers. OpenClaw does not create a random UUID or other persistent request identifier, so daily requests cannot be linked through an OpenClaw-issued identifier. Anonymous feature statistics are separate from optional, operator-configured OpenTelemetry export.Turn feature statistics on or off
Enable or disable anonymous feature statistics at any time:DO_NOT_TRACK=1 or DO_NOT_TRACK=true to force feature statistics off,
even when telemetry.enabled is true. DO_NOT_TRACK does not disable the
daily update check: OpenClaw sends the update-only GET request without a
feature-statistics body.
Disable every automatic update request
To go fully dark, disable the existing startup update check:update.auto.enabled is
true. Setting OPENCLAW_NO_AUTO_UPDATE=1 also prevents automatic update
requests and applies. Explicit update commands remain available when you choose
to run them.
See Configuration reference for
the full telemetry configuration and
Update configuration for the
automatic update-check controls.