Docs

Wire the workflow, not a monitoring maze.

The MVP ships with first-party examples for GitHub Actions and Vercel, plus signed snippets on each monitor detail page.

Heartbeat monitor

Vercel Cron example

Use this when the job is “tell me it finished at all.”

await fetch(`${process.env.LUOTA_API_BASE_URL}/v1/monitors/${process.env.LUOTA_MONITOR_ID}/ping`, {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "x-watchflow-key": process.env.LUOTA_INGEST_TOKEN!
  },
  body: JSON.stringify({
    occurredAt: new Date().toISOString(),
    payload: { source: "vercel-cron" }
  })
});

Run lifecycle monitor

GitHub Actions example

Use this when the job has a start and a finish, and you care about failure, lateness, and duration.

- name: Tell Luota the job started
  run: |
    curl -X POST "$LUOTA_API_BASE_URL/v1/runs/start" \
      -H "x-watchflow-key: $LUOTA_INGEST_TOKEN" \
      -H "content-type: application/json" \
      -d '{"monitorId":"mon_123","externalRunId":"${{ github.run_id }}","deploySha":"${{ github.sha }}","host":"github-actions"}'

Choosing the right monitor

Heartbeat

Best when you only need a single “I finished” signal.

Run lifecycle

Best when you need failure output, stuck-run detection, and duration thresholds.

Freshness

Best when the output should keep updating, even if there is no obvious job boundary.