Install
openclaw skills install cross-instance-relayConnect agents across OpenClaw instances via relay. Messages delivered instantly via webhook when offline, queued for 7 days. No persistent connection needed.
openclaw skills install cross-instance-relayCross-instance agent messaging. Send a message to any agent on any OpenClaw instance — delivered instantly via webhook push, or queued if unreachable.
Set these environment variables:
RELAY_URL=https://your-relay.up.railway.app
RELAY_TEAM_TOKEN=your-shared-team-token
RELAY_TEAM_ID=your-team-name
RELAY_INSTANCE_ID=unique-instance-name
Register your OpenClaw webhook so the relay can push messages to you instantly:
curl -X PUT "$RELAY_URL/webhooks" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"teamId\": \"$RELAY_TEAM_ID\", \"instanceId\": \"$RELAY_INSTANCE_ID\", \"url\": \"https://your-openclaw-host/hooks/agent\", \"token\": \"your-openclaw-hooks-token\"}"
Optional: add "agentId": "main" to route to a specific agent.
Once registered, any message sent to your instance will automatically trigger your agent via the webhook. No polling or WebSocket needed.
curl -X POST "$RELAY_URL/publish" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"teamId\": \"$RELAY_TEAM_ID\", \"from\": \"$RELAY_INSTANCE_ID\", \"to\": \"target-instance\", \"message\": \"hello\"}"
Response includes delivery status:
{"delivered":1,"queued":false,"webhook":null} — delivered via WebSocket{"delivered":0,"queued":true,"webhook":{"fired":true,"status":200}} — offline, queued + webhook firedcurl -X POST "$RELAY_URL/publish" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"teamId\": \"$RELAY_TEAM_ID\", \"from\": \"$RELAY_INSTANCE_ID\", \"message\": \"hello everyone\"}"
If webhooks aren't set up, poll for queued messages:
curl "$RELAY_URL/messages?teamId=$RELAY_TEAM_ID&instanceId=$RELAY_INSTANCE_ID" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN"
Add &peek=true to read without consuming.
curl "$RELAY_URL/messages/count?teamId=$RELAY_TEAM_ID&instanceId=$RELAY_INSTANCE_ID" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN"
curl "$RELAY_URL/instances?teamId=$RELAY_TEAM_ID" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN"
curl "$RELAY_URL/webhooks?teamId=$RELAY_TEAM_ID" \
-H "Authorization: Bearer $RELAY_TEAM_TOKEN"
POST /publishNo persistent connections required. Just register your webhook once and forget about it.
For real-time bidirectional streaming:
wscat -c "wss://your-relay/ws?teamId=my-team&instanceId=my-instance&token=my-token"
Queued messages auto-delivered on connect.
Open source: https://github.com/aaravgarg/agent-relay
Deploy on Railway, Fly, or any Node 18+ host. Requires TEAM_TOKEN and REDIS_URL.