Looped Docs

Webhook

Run the agent over HTTP: an authenticated endpoint that returns the run result.

The webhook trigger gives the agent an HTTP endpoint: POST an input and receive the run result back. It is the integration point for everything that isn't a chat platform — other services, scripts, schedulers, or your own UI.

triggers:
  - type: webhook
    # path: /            (default)
    # port: 8080         (default)
    token_env: WEBHOOK_TOKEN   # required — bearer auth, deny by default
configs:
  agent-yaml:
    content: |
      handle: task-bot
      description: Runs tasks submitted over HTTP.
      model:
        provider: openai-compatible
        id: gpt-5.4-mini
      purpose: |
        You are a concise assistant. Complete the submitted task and
        reply with the result.
      triggers:
        - type: webhook
          token_env: WEBHOOK_TOKEN
      memory:
        scope: thread

services:
  task-bot:
    image: ghcr.io/loopedautomation/agent:latest
    configs:
      - source: agent-yaml
        target: /agent/agent.yaml
    env_file: .env   # WEBHOOK_TOKEN and the model's API key
    ports:
      - "8080:8080"
    volumes:
      - task-bot-data:/data
    restart: unless-stopped
volumes:
  task-bot-data:

Call it:

curl -s localhost:8080 \
  -H "authorization: Bearer $WEBHOOK_TOKEN" \
  -H "content-type: application/json" \
  -d '{"input": "run: echo hello", "conversation_id": "demo"}'

The response is the run result: {"status": "ok", "reply": "...", "steps": 2}. Pass the same conversation_id to continue a conversation (with memory.scope: threadMemory); omit it for one-shot runs.

token_env is required — an unauthenticated endpoint contradicts deny-by-default. The token resolves at startup, and a missing env var fails right there, before the endpoint ever accepts a call.

Every call lands in the agent's run history with its status, steps and tokens.

Are you an AI? Visit llms.txt — these docs as plain markdown.