> This page is also available as Markdown: append .md to its URL. The full index of Sikaru docs is at https://docs.sikaru.ai/llms.txt. Code examples use only operations from the public API reference at https://docs.sikaru.ai/api-reference.

# Schedule recurring work

Operations on this page (Python SDK `sikaru_api`):

1. `client.run_schedules.create_schedule(project, session_id=..., interval_seconds=..., input={"text": ...}, idempotency_key=...)["schedule"]`. `interval_seconds` from 60 through 30 days; no cron expressions or calendar time zones.
2. `client.run_schedules.list_schedules(project, session_id=...)` (needs `runs:read`).
3. `client.run_schedules.pause_schedule(project, schedule_id, paused=True | False)` pauses or resumes.
4. `delete_schedule(project, schedule_id)` ends recurring admission.

Registration and changes need `runs:create`. CLI: `sikaru run-schedules --help`. Pausing or deleting does not cancel admitted runs.

A **schedule** appends recurring queued input to an existing session. Create the session first, then choose an interval in seconds.

| Constraint          | Value                      |
| ------------------- | -------------------------- |
| Interval            | 60 seconds through 30 days |
| Cron expressions    | Not accepted               |
| Calendar time zones | Not accepted               |
| Register or change  | `runs:create`              |
| List                | `runs:read`                |

## Create a schedule

```python
schedule = client.run_schedules.create_schedule(
    project,
    session_id=session_id,
    interval_seconds=3600,
    input={"text": "Review new cases and summarize changes."},
    idempotency_key="hourly-case-review",
)["schedule"]
```

Keep `schedule["id"]` to control the schedule.

* Scheduled input joins the session's queue instead of steering its active turn.
* Runs still use the agent, permissions, and runtime admission rules for the session.
* A scheduler delay does not imply that every missed interval will be replayed.

## Pause, resume, or remove

```python
schedules = client.run_schedules.list_schedules(project, session_id=session_id)
client.run_schedules.pause_schedule(project, schedule["id"], paused=True)
# Later, when recurring work should resume:
client.run_schedules.pause_schedule(project, schedule["id"], paused=False)
```

Call `delete_schedule(project, schedule_id)` when recurring admission should end.

> **Warning**
>
> Pausing or removing a schedule does not cancel runs already admitted. Cancel those runs separately if needed.

Preserve the creation idempotency key across uncertain acknowledgements and do not reuse it for different input. Inspect session turns and run events to verify actual execution; a schedule receipt only confirms registration.

Discover CLI equivalents with `sikaru run-schedules --help`.

## Next steps

#### [Sessions and steering](/run/sessions-and-steering)

Create the session a schedule appends to.

#### [Runs and tool requests](/run/runs-and-tool-requests)

Observe and cancel scheduled runs.