> ## Documentation Index
> Fetch the complete documentation index at: https://iii.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Schedule a Cron Task

> How to run a Function on a recurring schedule.

## Goal

Run a Function at regular intervals (cleanup jobs, report generation, health checks) using the Cron worker.

## Steps

### 1. Enable the Cron worker

```yaml title="iii-config.yaml" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
workers:
  - name: iii-cron
    config:
      adapter:
        name: kv
```

### 2. Register the Function

<Tabs>
  <Tab title="Node / TypeScript">
    ```typescript title="cron-task.ts" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    import { registerWorker, Logger } from 'iii-sdk'

    const iii = registerWorker(process.env.III_URL ?? 'ws://localhost:49134')

    iii.registerFunction('cleanup::expired-sessions', async () => {
      const logger = new Logger()
      // ...cleanup logic here...
      logger.info('Cleanup ran', { timestamp: new Date().toISOString() })
      return { deleted: 0 }
    })
    ```
  </Tab>

  <Tab title="Python">
    ```python title="cron_task.py" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    import os

    from iii import Logger, register_worker

    iii = register_worker(os.environ.get("III_URL", "ws://localhost:49134"))


    def cleanup_sessions(_):
        logger = Logger()
        # ...cleanup logic here...
        logger.info("Cleanup ran")
        return {"deleted": 0}


    iii.register_function("cleanup::expired-sessions", cleanup_sessions)
    ```
  </Tab>

  <Tab title="Rust">
    ```rust title="cron_task.rs" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    use iii_sdk::{register_worker, InitOptions, Logger, RegisterFunction, RegisterTriggerInput};
    use serde_json::{json, Value};
    use tokio::signal;

    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let url = std::env::var("III_URL").unwrap_or_else(|_| "ws://127.0.0.1:49134".to_string());
        let iii = register_worker(&url, InitOptions::default());

        let reg = RegisterFunction::new_async("cleanup::expired-sessions", |_: Value| async move {
            let logger = Logger::new();
            // ...cleanup logic here...
            logger.info("Cleanup ran", None);
            Ok(json!({ "deleted": 0 }))
        });
        iii.register_function(reg);

        signal::ctrl_c().await?;
        Ok(())
    }
    ```
  </Tab>
</Tabs>

### 3. Register the Cron trigger

<Tabs>
  <Tab title="Node / TypeScript">
    ```typescript title="cron-trigger.ts" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    iii.registerTrigger({
      type: 'cron',
      function_id: 'cleanup::expired-sessions',
      config: { expression: '* * * * * * *' }, // runs every second
    })
    ```
  </Tab>

  <Tab title="Python">
    ```python title="cron_trigger.py" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    iii.register_trigger({
        "type": "cron",
        "function_id": "cleanup::expired-sessions",
        "config": {"expression": "* * * * * * *"},  # runs every second
    })
    ```
  </Tab>

  <Tab title="Rust">
    ```rust title="cron_trigger.rs" theme={"theme":{"light":"catppuccin-latte","dark":"dark-plus"}}
    iii.register_trigger(RegisterTriggerInput {
        trigger_type: "cron".into(),
        function_id: "cleanup::expired-sessions".into(),
        config: json!({ "expression": "* * * * * * *" }), // runs every second
        metadata: None,
    })?;
    ```
  </Tab>
</Tabs>

This runs the Function every second. The `expression` field uses a 7-field cron format (`second minute hour day month weekday year`).

### Common schedules

| Expression        | Frequency            |
| ----------------- | -------------------- |
| `* * * * * * *`   | Every second         |
| `0 * * * * * *`   | Every minute         |
| `0 */5 * * * * *` | Every 5 minutes      |
| `0 0 * * * * *`   | Every hour           |
| `0 0 */6 * * * *` | Every 6 hours        |
| `0 0 0 * * * *`   | Daily at midnight    |
| `0 0 9 * * 1 *`   | Every Monday at 9 AM |

## Result

The Function executes automatically on the defined schedule. The Engine handles scheduling, no external cron daemon needed.

<Info title="See also">
  For advanced scheduling options, see the [Cron worker reference](../workers/iii-cron).
</Info>
