Skip to content
Back to skills

Creating Workers

ASecurity

curl -X POST http://localhost:3111/math/add -H 'content-type: application/json' -d '{"a":2,"b":3}' ```

  • 18,821 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 3, 2026
developmenttypescriptpythonrustbashnodeapi

Works with

  • api

Security analysis

A100/100

Pro scans all 21 files and shows the line behind each finding

Scanned September 3, 2026

npx -y skills add iii-hq/iii --skill creating-workers --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Creating Workers?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Creating Workers
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iii-hq-creating-workers-5757226a/badge)](https://www.skillsdirectory.com/skills/iii-hq-creating-workers-5757226a)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
<!-- generated by iii-skill-render. DO NOT EDIT (changes here are overwritten on the next render). Edit docs/next/creating-workers/http.mdx. -->


The `http` worker exposes your functions as HTTP endpoints, turning a function into a REST route
without standing up a separate web server.

```bash
iii worker add http
```

<Note>
  This page is a quick tour. For path patterns, methods, headers, and response handling, see the
  [http worker docs](https://workers.iii.dev/workers/http). The worker's server settings
  (port, host, CORS, timeouts) are managed at runtime through the
  [configuration worker](../using-iii/configuration).
</Note>

## Create endpoints

The http worker exposes an `http` trigger type that binds a function to an HTTP method and path; the
function then runs on every matching request. Here is the full path from a running engine to a live
endpoint.

1. Start the engine, if it isn't already running:

```bash
iii --config config.yaml
```

2. In a worker, register the function you want to expose and bind an `http` trigger to it. If you do
   not have a worker yet, scaffold one with
   [`iii worker init`](./workers#scaffold-a-new-worker), then edit its source. The
   handler receives the request (`body`, `headers`, method) and its return value becomes the
   response:

```bash
iii worker init my-worker --language typescript
```

<Tabs>
  <Tab title="Node / TypeScript">
    ```typescript
    import { registerWorker } from "iii-sdk";

    const url = process.env.III_URL;
    if (!url) throw new Error("III_URL must be set");
    const worker = registerWorker(url, { workerName: "my-worker" });

    worker.registerFunction("http::add", async (payload: { body: { a: number; b: number } }) => ({
      status_code: 200,
      body: { c: payload.body.a + payload.body.b },
      headers: { "Content-Type": "application/json" },
    }));

    worker.registerTrigger({
      type: "http",
      function_id: "http::add",
      config: { api_path: "/math/add", http_method: "POST" },
    });
    ```
  </Tab>
  <Tab title="Python">
    ```python
    import os
    from iii import register_worker, InitOptions

    worker = register_worker(
        os.environ["III_URL"],
        InitOptions(worker_name="my-worker"),
    )

    def add(payload: dict) -> dict:
        body = payload["body"]
        return {
            "status_code": 200,
            "body": {"c": body["a"] + body["b"]},
            "headers": {"Content-Type": "application/json"},
        }

    worker.register_function("http::add", add)

    worker.register_trigger({
        "type": "http",
        "function_id": "http::add",
        "config": {"api_path": "/math/add", "http_method": "POST"},
    })
    ```
  </Tab>
  <Tab title="Rust">
    ```rust
    use iii_sdk::builtin_triggers::{HttpMethod, HttpTriggerConfig};
    use iii_sdk::trigger::IIITrigger;
    use iii_sdk::{InitOptions, RegisterFunction, register_worker};
    use schemars::JsonSchema;
    use serde::Deserialize;
    use serde_json::json;

    #[derive(Deserialize, JsonSchema)]
    struct AddRequest {
        body: AddBody,
    }
    #[derive(Deserialize, JsonSchema)]
    struct AddBody {
        a: i64,
        b: i64,
    }

    let url = std::env::var("III_URL").expect("III_URL must be set");
    let worker = register_worker(&url, InitOptions::default());

    worker.register_function(
        "http::add",
        RegisterFunction::new(|req: AddRequest| {
            Ok(json!({
                "status_code": 200,
                "body": { "c": req.body.a + req.body.b },
                "headers": { "Content-Type": "application/json" }
            }))
        }),
    );

    worker.register_trigger(
        IIITrigger::Http(HttpTriggerConfig::new("/math/add").method(HttpMethod::Post))
            .for_function("http::add"),
    )?;
    ```

  </Tab>
</Tabs>

3. Add the worker to start it, pointing at its directory:

```bash
iii worker add ./my-worker
```

For path patterns, request and response shapes, and the other configuration options, see the
[http worker docs](https://workers.iii.dev/workers/http).

## Calling the endpoint

Once the trigger is registered, call the path on the engine's HTTP port (`3111` by default):

```bash
# call the exposed function
curl -X POST http://localhost:3111/math/add -H 'content-type: application/json' -d '{"a":2,"b":3}'
```

Files in this skill

  • channels.mdx9.6 KB
  • channels.mdx.skill.md9.6 KB
  • functions.mdx15 KB
  • functions.mdx.skill.md15 KB
  • http.mdx4.2 KB
  • http.mdx.skill.md4.3 KB
  • index.mdx2.6 KB
  • index.mdx.skill.md2.6 KB
  • observability.mdx5.1 KB
  • observability.mdx.skill.md5.1 KB
  • queues.mdx14.6 KB
  • queues.mdx.skill.md14.6 KB
  • sandboxes.mdx4.3 KB
  • sandboxes.mdx.skill.md4.3 KB
  • triggers.mdx18.1 KB
  • triggers.mdx.skill.md18 KB
  • worker-manager.mdx12 KB
  • worker-manager.mdx.skill.md12 KB
  • worker-manifest.mdx5.6 KB
  • worker-manifest.mdx.skill.md5.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…