On this page
On this page
Gateway
Configuration — automations and media template variables
Scheduled automation keys under cron.*, plus the media model template variable surface.
For the full key index and the other top-level config domains, see Configuration reference.
Automations (cron)
enabled: execute stored automation jobs (default:true). Setfalseto pause all automation execution without deleting jobs.skipMissedJobs: skip missed recurring (cron/every) slots at startup and advance to the next future occurrence (default:false). One-shot (at) catch-up is unchanged.triggers.enabled: run event-driven automation triggers (default:true). Setfalseto disable condition triggers, script payloads, stream schedules, and event-source admission.sessionRetention: how long to keep completed isolated automation run sessions before pruning SQLite session rows. Also controls cleanup of archived deleted automation transcripts. Default:24h; setfalseor a zero duration such as"0h"to disable (negative durations are invalid).- Terminal run history is retained for 7 days (
lostrows for 24 hours), with the newest 2000 rows per job and history class enforced as an additional ceiling. webhookToken: bearer token used for automation webhook POST delivery (delivery.mode = "webhook"), if omitted no auth header is sent.webhookSsrfPolicy: shared outbound SSRF policy for primary, completion, failure-destination, and failure-alert webhooks. Private/internal targets are blocked when omitted. Prefer exactallowedHostnames; usedangerouslyAllowPrivateNetwork: trueonly for trusted private-network receivers. The narrow fake-IP proxy flags areallowRfc2544BenchmarkRangeandallowIpv6UniqueLocalRange.webhookSsrfPolicy.blockedHostnames: denies exact hosts and wildcard subdomains before DNS and all allow rules.*.example.comexcludes the apex; addexample.comseparately to block it. Empty or unset adds no denials.
The cron block is strict; cron.enabled, cron.skipMissedJobs, cron.triggers, cron.webhookToken,
cron.webhookSsrfPolicy, cron.sessionRetention, cron.delivery, cron.failureAlert, cron.agents, and cron.creators are the only accepted keys. The
retired cron.webhook fallback URL is gone: runtime delivery uses per-job
delivery.mode = "webhook" plus delivery.to, or delivery.completionDestination
when preserving announce delivery. openclaw doctor --fix strips a leftover
cron.webhook from existing config files.
cron.delivery, cron.agents, and cron.creators
delivery: default announce destination (channel,to, optionalthreadIdandaccountId;tois required). It applies at run time toannouncejobs that set nochannelother than"last", noto,threadId, oraccountId, and no owner targeting. It replaces the remembered creating-chat route and the single-channel fallback for those jobs. Jobs withdelivery.mode"none"or"webhook"never gain a chat destination.agents.<agentId>.delivery: the same shape, for jobs owned by that agent. The owner is the job'sagentId, else the agent in its session key, else the default agent. It replacescron.deliverywhole; fields are not merged.agents.<agentId>.failureAlert: failure-alert route fields only (mode,channel,to,threadId,accountId) for jobs owned by that agent. They replace the route fields ofcron.failureAlertwhole;enabled,after,cooldownMs, andincludeSkippedstay Gateway-wide, socron.failureAlert.enabled: falsestill disables inherited alerts. Like acron.failureAlertobject, an agent route activates the alert policy for that agent's jobs.creators.<profileId>.deliveryandcreators.<profileId>.failureAlert: the same shapes, for jobs created by that person. The key is the Gateway profile id recorded as the job's creator when it was created: the operator profile that created it, or the human profile that asked an agent to create it. Jobs created before creator recording, and jobs whose creator is channel-only, unknown, an agent with no delegating human, or the system, have no creator default. Keys match exactly. A creator entry wins over the owner agent's entry and replaces it whole.- Defaults resolve at run time and never rewrite stored jobs. Editing them moves future results of every job that relies on them.
- Config validation rejects a
channelindeliveryor in anagents/creatorsfailureAlertroute that names no installed channel plugin (built-in aliases such asgchatare accepted). An unknowncron.failureAlert.channelonly warns, so existing configs keep loading.openclaw doctoralso lists any default destination whose channel plugin is not active. agentskeys that resolve to the same agent id, such asopsandOPS, are rejected.- Primary precedence: the job's own routing fields, then
creators.<profileId>.delivery, thenagents.<agentId>.delivery, thendelivery, then the remembered session route. Failure routes follow the same order: the job's ownfailureAlertroute, then the creator route, then the agent route, thencron.failureAlert.
See Automation delivery.
cron.failureAlert
cron.failureAlert owns the global alert policy and its default destination. Jobs
with an existing failure route are covered by default after 2 consecutive
execution failures with a 1-hour cooldown; a cron.failureAlert object explicitly
activates/tunes the policy even when no route existed. The retired
cron.failureDestination block is merged into it by
openclaw doctor --fix.
enabled: explicitly enable or disable the global policy.falsedisables inherited notifications unless a job has its ownfailureAlertobject;trueexplicitly enables globally. Omitting it preserves route-backed defaults.after: consecutive failures before an alert fires (positive integer, min:1; default:2).cooldownMs: minimum milliseconds between repeated alerts for the same job (non-negative integer; default:3600000).includeSkipped: count consecutive skipped runs toward the alert threshold (default:false). Skipped runs are tracked separately and do not affect execution-error backoff.mode: delivery mode -"announce"sends via a channel message;"webhook"posts to the target into. Defaults to"announce"when enough target data exists.channel: channel override for announce delivery."last"reuses the last known delivery channel.to: explicit announce target or webhook URL. Required for webhook mode.accountId: optional account or channel id to scope alert delivery.- Route precedence is per-job
failureAlertroute fields, then per-jobdelivery.failureDestinationlayered over these global destination fields (or the creator'scron.creators.<profileId>.failureAlertroute, else the owning agent'scron.agents.<agentId>.failureAlertroute, when set), then the primary announce target, including a configured default destination. - Per-job
failureAlert: falsedisables execution and required-delivery failure alerts for that job; the auto-disable safety notification remains active. Any per-jobfailureAlertobject explicitly enables and tunes that job. delivery.bestEffort: truesuppresses inherited/default execution alerts; an explicit per-jobfailureAlertremains authoritative.- Required completion-delivery failure (
status: "ok",completionStatus: "failed") does not increment execution backoff and may notify immediately only through a resolved alternate failure destination, not the failed primary route. delivery.failureDestinationis only supported forsessionTarget="isolated"jobs unless the job's primarydelivery.modeis"webhook".
See Automations. Cron records isolated automation run history.
Media model template variables
Template placeholders expanded in tools.media.models[].args:
| Variable | Description |
|---|---|
{{Body}} |
Full inbound message body |
{{RawBody}} |
Raw body (no history/sender wrappers) |
{{BodyStripped}} |
Body with group mentions stripped |
{{From}} |
Sender identifier |
{{To}} |
Destination identifier |
{{MessageSid}} |
Channel message id |
{{SessionId}} |
Current session UUID |
{{IsNewSession}} |
"true" when new session created |
{{AttachmentUrl}} |
Current attachment URL or provider reference |
{{AttachmentPath}} |
Current attachment local path |
{{AttachmentContentType}} |
Current attachment MIME content type |
{{AttachmentDir}} |
Directory containing AttachmentPath |
{{AttachmentIndex}} |
Zero-based source fact index |
{{Transcript}} |
Audio transcript |
{{Prompt}} |
Resolved media prompt for CLI entries |
{{MaxChars}} |
Resolved max output chars for CLI entries |
{{ChatType}} |
"direct" or "group" |
{{GroupSubject}} |
Group subject (best effort) |
{{GroupMembers}} |
Group members preview (best effort) |
{{SenderName}} |
Sender display name (best effort) |
{{SenderE164}} |
Sender phone number (best effort) |
{{Provider}} |
Provider hint (whatsapp, telegram, discord, etc.) |
The legacy {{MediaPath}}, {{MediaUrl}}, {{MediaType}}, and {{MediaDir}}
names remain available during the plugin SDK compatibility window but are
deprecated. New configuration should use the Attachment* variables.