Skip to main content

Installation

Install the Arlo Health plugin with a single command:
openclaw plugin install arlo-health

Requirements

  • Node.js 18 or higher
  • OpenClaw CLI v2.0+

What It Does

The arlo-health plugin adds virtual telemedicine capabilities to your OpenClaw agent. Once installed, your agent can:
  • Start consultations — Gather symptoms and connect users with healthcare providers
  • Handle triage — AI-powered symptom assessment before provider connection
  • Manage prescriptions — View prescriptions and select pharmacies
  • Send messages — Async communication with providers during active consultations

How It Works

The plugin wraps Arlo’s REST API into an OpenClaw-compatible interface. Under the hood, it uses the same endpoints documented in our API Reference.
1

Install the plugin

Run openclaw plugin install arlo-health
2

User authenticates

When a user needs healthcare, the plugin initiates OAuth signup
3

Start a consultation

Your agent gathers symptoms and starts a consultation
4

Provider connects

A licensed healthcare provider reviews and responds

Available Tools

Once installed, these tools are available to your OpenClaw agent:
ToolDescription
arlo_init_signupStart OAuth signup flow
arlo_check_statusCheck authentication status
arlo_start_consultationBegin a new consultation
arlo_send_messageSend a message during consultation
arlo_get_consultationsList past and active consultations
arlo_get_prescriptionsView prescription history
arlo_search_pharmaciesFind nearby pharmacies
arlo_select_pharmacySend prescription to pharmacy
Tool names are prefixed with arlo_ to avoid conflicts with other plugins.

Configuration

Authentication is handled per-user through OAuth 2.1 with PKCE.

Webhook Setup (Required for Notifications)

Critical: After a user authenticates, you must explicitly call register_webhook with deliveryContext and conversationSessionKey. These fields are not auto-populated from openclaw.json — without them, notifications will not be routed to the user’s conversation.
For real-time notifications when providers respond, configure webhooks with all required fields:
{
  webhookUrl: "https://your-agent.com/hooks/arlo",
  webhookToken: "your-secret-token",
  deliveryContext: {
    to: "+15551234567",
    channel: "platform",
    deliver: true
  },
  conversationSessionKey: "agent:main:main"
}
FieldRequiredDescription
toYesRecipient identifier (phone number, chat ID, etc.)
channelYesPlatform name (whatsapp, telegram, discord, etc.)
deliverNoWhether to deliver the notification to the user
conversationSessionKeyYesSession key for threading notifications back to the correct conversation

Notification Handling

When Arlo fires a webhook, OpenClaw wakes the agent session and delivers the notification as a system message. The agent is then responsible for deciding what to do.
Simply replying to the session is not enough — heartbeat-triggered replies don’t auto-deliver to the user’s channel. The agent must proactively push using its channel messaging tool (e.g. message action=send for WhatsApp/Telegram, a channel post for Discord, etc.).
The simplest and most reliable approach is OpenClaw’s built-in /hooks/wake endpoint. Register it as your webhook URL — no custom server needed.
{
  "webhookUrl": "https://your-gateway-url.com/hooks/wake",
  "deliveryContext": {
    "to": "+15551234567",
    "channel": "platform",
    "deliver": true
  },
  "conversationSessionKey": "agent:main:main"
}
When Arlo fires, OpenClaw wakes the agent with the notification text as a system message. The agent runs, fetches the consultation, and decides how to respond.

Agent Prompting (Required)

hooks/wake requires your agent to know what to do on receipt. Add this to your HEARTBEAT.md, system prompt, or equivalent agent instructions:
When you receive an [Arlo] webhook notification:
1. Call arlo_get_consultation to fetch the latest message(s)
2. Decide if this warrants notifying the user
3. If yes — push via the appropriate channel messaging tool using the
   channel and recipient from the registered deliveryContext
4. Summarize intelligently — do not copy provider messages verbatim
5. Do NOT just reply in session — that reply will not reach the user

Notify when: provider asked a question, diagnosis/prescription is ready,
something is time-sensitive or action-required.

Stay quiet when: duplicate notification, test/debug messages,
non-urgent status the user didn't ask for.
The arlo_register_webhook tool description already includes this guidance inline — any agent using the tool at runtime will see it. The prompting above reinforces it at the environment level for more consistent behavior.

Alternative: Custom Endpoint

If you need custom processing (filtering, multi-channel fan-out, logging), run your own webhook server and register that URL instead. The plugin makes no assumptions about delivery — it calls whatever URL you register. See the Webhooks tool reference for payload details.

Correct Post-Connect Flow

After a user successfully authenticates, always register webhooks explicitly:
// User says: "I've had a sore throat for 3 days"

// 1. Check if user is authenticated
const status = await arlo_check_status();

if (!status.authenticated) {
  // 2. Start signup flow
  const { authUrl } = await arlo_init_signup({
    webhookUrl: "https://your-agent.com/hooks/arlo",
    webhookToken: process.env.ARLO_WEBHOOK_SECRET
  });

  // Direct user to authUrl
  return `Please sign up first: ${authUrl}`;
}

// 3. CRITICAL: Register webhook with explicit deliveryContext + sessionKey
const webhookResult = await arlo_register_webhook({
  webhookUrl: "https://your-agent.com/hooks/arlo",
  webhookToken: process.env.ARLO_WEBHOOK_SECRET,
  deliveryContext: {
    to: currentUser.phoneNumber,  // The user's identifier
    channel: "whatsapp",
    deliver: true
  },
  conversationSessionKey: currentConversation.id  // Your session/thread ID
});

// 4. Verify webhook is properly configured
if (!webhookResult.conversationSessionKey) {
  console.error("Warning: conversationSessionKey is null - notifications won't be threaded");
}

// 5. Start consultation with gathered context
const { conversationId } = await arlo_start_consultation({
  contextMessage: "I've had a sore throat for 3 days..."
});
The hasDeliveryContext: true response only indicates an object exists — it does not confirm that to or channel are set. Always pass these explicitly.

View on npm

arlo-health

View package on npm for version history and changelog

Next Steps

Quickstart

Step-by-step guide to your first consultation

Webhooks

Configure real-time notifications

Consultation Lifecycle

Understand the consultation flow

API Reference

Full REST API documentation