2026-01-15 06:12:54 +00:00
---
2026-01-30 03:15:10 +01:00
summary: "CLI reference for `openclaw cron` (schedule and run background jobs)"
2026-01-15 06:12:54 +00:00
read_when:
- You want scheduled jobs and wakeups
- You’ re debugging cron execution and logs
2026-01-31 16:04:03 -05:00
title: "cron"
2026-01-15 06:12:54 +00:00
---
2026-01-30 03:15:10 +01:00
# `openclaw cron`
2026-01-15 06:12:54 +00:00
Manage cron jobs for the Gateway scheduler.
Related:
2026-01-31 21:13:13 +09:00
2026-01-15 06:12:54 +00:00
- Cron jobs: [Cron jobs ](/automation/cron-jobs )
2026-01-30 03:15:10 +01:00
Tip: run `openclaw cron --help` for the full command surface.
2026-01-15 06:12:54 +00:00
2026-02-03 16:53:46 -08:00
Note: isolated `cron add` jobs default to `--announce` delivery. Use `--no-deliver` to keep
output internal. `--deliver` remains as a deprecated alias for `--announce` .
2026-02-03 14:21:38 -08:00
2026-04-04 14:51:08 +01:00
Note: cron-owned isolated runs expect a plain-text summary and the runner owns
the final send path. `--no-deliver` keeps the run internal; it does not hand
delivery back to the agent's message tool.
2026-02-03 15:00:03 -08:00
Note: one-shot (`--at` ) jobs delete after success by default. Use `--keep-after-run` to keep them.
2026-04-04 08:22:24 +01:00
Note: `--session` supports `main` , `isolated` , `current` , and `session:<id>` .
Use `current` to bind to the active session at creation time, or `session:<id>` for
an explicit persistent session key.
2026-03-23 19:25:03 -07:00
Note: for one-shot CLI jobs, offset-less `--at` datetimes are treated as UTC unless you also pass
`--tz <iana>` , which interprets that local wall-clock time in the given timezone.
2026-02-07 19:46:01 -08:00
Note: recurring jobs now use exponential retry backoff after consecutive errors (30s → 1m → 5m → 15m → 60m), then return to normal schedule after the next successful run.
2026-03-08 14:46:33 -07:00
Note: `openclaw cron run` now returns as soon as the manual run is queued for execution. Successful responses include `{ ok: true, enqueued: true, runId }` ; use `openclaw cron runs --id <job-id>` to follow the eventual outcome.
2026-04-04 08:22:24 +01:00
Note: `openclaw cron run <job-id>` force-runs by default. Use `--due` to keep the
older "only run if due" behavior.
2026-04-04 14:48:51 +01:00
Note: isolated cron turns suppress stale acknowledgement-only replies. If the
first result is just an interim status update and no descendant subagent run is
responsible for the eventual answer, cron re-prompts once for the real result
before delivery.
2026-04-04 18:26:28 +01:00
Note: if an isolated cron run returns only the silent token (`NO_REPLY` /
`no_reply` ), cron suppresses direct outbound delivery and the fallback queued
summary path as well, so nothing is posted back to chat.
2026-04-04 14:26:46 +01:00
Note: `cron add|edit --model ...` uses that selected allowed model for the job.
If the model is not allowed, cron warns and falls back to the job's agent/default
model selection instead. Configured fallback chains still apply, but a plain
model override with no explicit per-job fallback list no longer appends the
agent primary as a hidden extra retry target.
2026-04-04 14:53:40 +01:00
Note: isolated cron model precedence is Gmail-hook override first, then per-job
`--model` , then any stored cron-session model override, then the normal
agent/default selection.
Note: isolated cron fast mode follows the resolved live model selection. Model
config `params.fastMode` applies by default, but a stored session `fastMode`
override still wins over config.
Note: if an isolated run throws `LiveSessionModelSwitchError` , cron persists the
switched provider/model (and switched auth profile override when present) before
retrying. The outer retry loop is bounded to 2 switch retries after the initial
attempt, then aborts instead of looping forever.
2026-04-04 13:25:44 +01:00
Note: failure notifications use `delivery.failureDestination` first, then
global `cron.failureDestination` , and finally fall back to the job's primary
announce target when no explicit failure destination is configured.
2026-02-23 17:39:48 -05:00
Note: retention/pruning is controlled in config:
- `cron.sessionRetention` (default `24h` ) prunes completed isolated run sessions.
- `cron.runLog.maxBytes` + `cron.runLog.keepLines` prune `~/.openclaw/cron/runs/<jobId>.jsonl` .
2026-03-09 20:12:37 +01:00
Upgrade note: if you have older cron jobs from before the current delivery/store format, run
`openclaw doctor --fix` . Doctor now normalizes legacy cron fields (`jobId` , `schedule.cron` ,
2026-04-01 16:43:25 +09:00
top-level delivery fields including legacy `threadId` , payload `provider` delivery aliases) and migrates simple
2026-03-09 20:12:37 +01:00
`notify: true` webhook fallback jobs to explicit webhook delivery when `cron.webhook` is
configured.
2026-01-21 01:12:43 +00:00
## Common edits
Update delivery settings without changing the message:
``` bash
2026-02-03 13:44:29 -08:00
openclaw cron edit <job-id> --announce --channel telegram --to "123456789"
2026-01-21 01:12:43 +00:00
```
Disable delivery for an isolated job:
``` bash
2026-01-30 03:15:10 +01:00
openclaw cron edit <job-id> --no-deliver
2026-01-21 01:12:43 +00:00
```
2026-02-03 13:44:29 -08:00
2026-03-05 17:05:21 -05:00
Enable lightweight bootstrap context for an isolated job:
``` bash
openclaw cron edit <job-id> --light-context
```
2026-02-03 16:53:46 -08:00
Announce to a specific channel:
2026-02-03 13:44:29 -08:00
``` bash
2026-02-03 16:53:46 -08:00
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
2026-02-03 13:44:29 -08:00
```
2026-03-05 17:05:21 -05:00
Create an isolated job with lightweight bootstrap context:
``` bash
openclaw cron add \
--name "Lightweight morning brief" \
--cron "0 7 * * *" \
--session isolated \
--message "Summarize overnight updates." \
--light-context \
--no-deliver
```
`--light-context` applies to isolated agent-turn jobs only. For cron runs, lightweight mode keeps bootstrap context empty instead of injecting the full workspace bootstrap set.
2026-04-04 08:22:24 +01:00
2026-04-04 14:51:08 +01:00
Delivery ownership note:
- Cron-owned isolated jobs always route final user-visible delivery through the
cron runner (`announce` , `webhook` , or internal-only `none` ).
- If the task mentions messaging some external recipient, the agent should
describe the intended destination in its result instead of trying to send it
directly.
2026-04-04 08:22:24 +01:00
## Common admin commands
Manual run:
``` bash
openclaw cron run <job-id>
openclaw cron run <job-id> --due
openclaw cron runs --id <job-id> --limit 50
```
Agent/session retargeting:
``` bash
openclaw cron edit <job-id> --agent ops
openclaw cron edit <job-id> --clear-agent
openclaw cron edit <job-id> --session current
openclaw cron edit <job-id> --session "session:daily-brief"
```
Delivery tweaks:
``` bash
openclaw cron edit <job-id> --announce --channel slack --to "channel:C1234567890"
openclaw cron edit <job-id> --best-effort-deliver
openclaw cron edit <job-id> --no-best-effort-deliver
openclaw cron edit <job-id> --no-deliver
```
2026-04-04 13:25:44 +01:00
Failure-delivery note:
- `delivery.failureDestination` is supported for isolated jobs.
- Main-session jobs may only use `delivery.failureDestination` when primary
delivery mode is `webhook` .
- If you do not set any failure destination and the job already announces to a
channel, failure notifications reuse that same announce target.