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

# Install Skills

> Give your agent new capabilities by installing skills from ClawHub.

Out of the box, your OpenClaw agent can chat — but that's about it. Skills are what turn it from a chatbot into something useful. Web search, browser control, code execution, image generation — they're all skills you can install with a single API call.

Skills come from **ClawHub**, the OpenClaw package registry. Think of it like npm, but for agent capabilities.

<Note>
  Your instance needs to be in `running` status for all of these endpoints to work. If it's stopped, start it first.
</Note>

## Set up

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
export CHOWDER_KEY="chd_org_your_key_here"
export INSTANCE_ID="your-instance-id"
```

<Steps>
  ### Browse available skills

  List what's available for your instance. Pass `eligible_only=true` to filter down to skills that are ready to install:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl "https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills?eligible_only=true" \
    -H "Authorization: Bearer $CHOWDER_KEY"
  ```

  ```json Response theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  [
    {
      "name": "web-search",
      "description": "Search the web using multiple providers",
      "source": "clawhub",
      "ready": false
    },
    {
      "name": "browser",
      "description": "Full browser control via Playwright",
      "source": "clawhub",
      "ready": false
    },
    {
      "name": "image-gen",
      "description": "Generate images with DALL-E or Stable Diffusion",
      "source": "clawhub",
      "ready": false
    },
    {
      "name": "code-runner",
      "description": "Execute code in a sandboxed environment",
      "source": "clawhub",
      "ready": false
    }
  ]
  ```

  `ready: false` means it's not installed yet. Let's fix that.

  <Tip>
    Drop the `eligible_only` param to see *all* skills, including ones already installed.
  </Tip>

  ### Install a skill

  Let's install web search. Skills are identified by their ClawHub slug — the format is `@org/skill-name`:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X POST https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/install \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "slug": "@openclaw/web-search"
    }'
  ```

  ```json Response theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  {
    "skill": "web-search",
    "status": "installed",
    "output": "✔ OK. Installed web-search -> /home/sandbox/.openclaw/workspace/skills/web-search",
    "env_applied": null,
    "required_env": null,
    "message": null
  }
  ```

  `"status": "installed"` — it's live. The agent can now search the web. Try it:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X POST https://api.chowder.dev/v1/instances/$INSTANCE_ID/responses \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "claude-sonnet-4-20250514",
      "input": "What are the top news stories today?"
    }'
  ```

  The agent will use the web-search skill to fetch current results and summarize them.

  ### Handle skills that need environment variables

  Some skills require API keys or config. When that's the case, the install response tells you:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X POST https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/install \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "slug": "@openclaw/image-gen"
    }'
  ```

  ```json Response — needs env vars theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  {
    "skill": "image-gen",
    "status": "installed_missing_env",
    "output": "✔ OK. Installed image-gen -> /home/sandbox/.openclaw/workspace/skills/image-gen",
    "env_applied": null,
    "required_env": ["OPENAI_API_KEY"],
    "message": "Missing env vars: OPENAI_API_KEY"
  }
  ```

  Notice `"status": "installed_missing_env"` and the `required_env` array. The skill is installed but won't work until you provide those vars.

  <Warning>
    A skill in `installed_missing_env` status is installed on disk but won't be invoked by the agent. Set the required env vars to activate it.
  </Warning>

  ### Set environment variables

  Use the PATCH endpoint to configure the skill's env vars:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X PATCH https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/image-gen \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "apiKey": "sk-your-openai-key-here"
    }'
  ```

  This returns `204 No Content`. The key is written to the OpenClaw config and the skill is now fully activated.

  <Tip>
    You can also pass env vars at install time to skip the extra step:

    ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
    curl -X POST https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/install \
      -H "Authorization: Bearer $CHOWDER_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "slug": "@openclaw/image-gen",
        "env": {
          "OPENAI_API_KEY": "sk-your-openai-key-here"
        }
      }'
    ```

    ```json theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
    {
      "skill": "image-gen",
      "status": "installed",
      "output": "✔ OK. Installed image-gen -> ...",
      "env_applied": ["OPENAI_API_KEY"],
      "required_env": ["OPENAI_API_KEY"],
      "message": null
    }
    ```

    When `env_applied` matches `required_env`, everything's good.
  </Tip>

  ### Verify a skill is ready

  Check the status of any installed skill:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/web-search \
    -H "Authorization: Bearer $CHOWDER_KEY"
  ```

  ```json Response theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  {
    "name": "web-search",
    "description": "Search the web using multiple providers",
    "source": "clawhub",
    "path": "/home/sandbox/.openclaw/workspace/skills/web-search",
    "ready": true
  }
  ```

  `"ready": true` means the skill is installed, enabled, and has all required env vars configured. The agent will use it when relevant.

  ### Uninstall a skill

  Changed your mind? Remove a skill with DELETE:

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X DELETE https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/web-search \
    -H "Authorization: Bearer $CHOWDER_KEY"
  ```

  Returns `204 No Content`. The skill files are removed from the workspace and the ClawHub lockfile is updated.
</Steps>

## Enable and disable without uninstalling

Sometimes you want to temporarily disable a skill without removing it entirely. Use the PATCH endpoint:

<CodeGroup>
  ```bash Disable theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X PATCH https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/image-gen \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{"enabled": false}'
  ```

  ```bash Re-enable theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
  curl -X PATCH https://api.chowder.dev/v1/instances/$INSTANCE_ID/skills/image-gen \
    -H "Authorization: Bearer $CHOWDER_KEY" \
    -H "Content-Type: application/json" \
    -d '{"enabled": true}'
  ```
</CodeGroup>

Both return `204 No Content`. The skill files stay on disk but the agent won't use a disabled skill.

## Quick reference

| Action        | Method   | Endpoint                                       |
| ------------- | -------- | ---------------------------------------------- |
| List skills   | `GET`    | `/v1/instances/{id}/skills`                    |
| List eligible | `GET`    | `/v1/instances/{id}/skills?eligible_only=true` |
| Skill info    | `GET`    | `/v1/instances/{id}/skills/{name}`             |
| Install       | `POST`   | `/v1/instances/{id}/skills/install`            |
| Configure     | `PATCH`  | `/v1/instances/{id}/skills/{name}`             |
| Uninstall     | `DELETE` | `/v1/instances/{id}/skills/{name}`             |

## What's next?

<CardGroup cols={2}>
  <Card title="Scoped API Keys" icon="key" href="/guides/scoped-keys">
    Create restricted keys so integrations can install skills without full org access.
  </Card>

  <Card title="Build a Frontend" icon="browser" href="/guides/build-a-frontend">
    Build a chat UI that leverages your agent's new skills.
  </Card>
</CardGroup>
