Integrating VoceChat with OpenClaw via Plugin
What this plugin already implements
The current VoceChat plugin already covers the core integration flow:
- Receive inbound VoceChat webhook messages
- Route messages into OpenClaw
- Send OpenClaw replies back to VoceChat
- Support sending text messages
- Support sending replies
- Support file upload and attachment sending
- Expose a
GET /health check endpoint
In other words, VoceChat can be used directly as the chat frontend for OpenClaw.
Overall architecture
VoceChat Users / Groups
|
v
VoceChat Bot Webhook (HTTP POST /)
|
v
OpenClaw Gateway + VoceChat Plugin
|
v
OpenClaw Agent Runtime
|
v
VoceChat Bot API
Prerequisites
Before you begin, make sure you have:
- A working VoceChat service
- A working OpenClaw deployment
- The VoceChat plugin source code or plugin package available locally
- A VoceChat Bot and its corresponding API Key
- A public address that allows VoceChat to access the OpenClaw webhook port
Quick start
If you have already deployed OpenClaw, you can simply send this page to it and let it help you with the configuration and setup steps.
Step 1: Create a Bot in VoceChat
Go to:
Settings => Bot&Webhook
Create a Bot for OpenClaw, for example:
- Bot Name:
OpenClaw - Webhook URL: leave it empty for now
Then create and save an API Key for this Bot.
At minimum, record these two values:
- VoceChat server URL
- Bot API Key
Step 2: Load the VoceChat plugin in OpenClaw
Enable local plugins in the OpenClaw configuration.
Example:
{
"plugins": {
"allow": ["vocechat"],
"load": {
"paths": [
"/root/.openclaw/workspace/vocechat"
]
},
"entries": {
"vocechat": {
"enabled": true
}
}
}
}
This configuration tells OpenClaw to load the vocechat channel plugin from a local path.
Step 3: Configure channels.vocechat
Add a channels.vocechat section to openclaw.json.
Example:
{
"channels": {
"vocechat": {
"enabled": true,
"serverUrl": "https://your-vocechat.example.com",
"apiKey": "YOUR_BOT_API_KEY",
"webhookHost": "0.0.0.0",
"webhookPort": 8010
}
}
}
Field descriptions:
serverUrl: The root URL of your VoceChat serviceapiKey: The VoceChat Bot API KeywebhookHost: The webhook bind address, usually0.0.0.0webhookPort: The webhook listening port, default is8010
This plugin supports top-level default account configuration. If needed, you can also configure multiple accounts under channels.vocechat.accounts.
Step 4: Ensure OpenClaw has sufficient tool permissions
The plugin repository documentation recommends explicitly granting adequate tool permissions to OpenClaw.
Example:
{
"tools": {
"profile": "full",
"allow": ["*"],
"exec": {
"host": "gateway",
"security": "full",
"ask": "off"
}
}
}
If permissions are insufficient, some runtime behaviors may be incomplete.
Step 5: Expose the webhook port
This plugin starts an HTTP webhook server inside OpenClaw.
Default behavior:
GET /→ returns200 okPOST /→ receives VoceChat webhook payloads
Default bind address:
0.0.0.0:8010
If you are using Docker or Docker Compose, remember to expose port 8010.
Example:
ports:
- "18789:18789"
- "8010:8010"
Step 6: Point the VoceChat webhook to OpenClaw
After OpenClaw starts and loads the plugin, go back to the Bot configuration page in VoceChat and set the webhook URL to the public address exposed by OpenClaw.
For example:
http://YOUR_OPENCLAW_HOST:8010/
VoceChat will validate the webhook URL, and since this plugin already includes a built-in GET / health check, it can be used directly for verification.
Step 7: Restart the OpenClaw Gateway
After modifying the configuration, restart the gateway.
Common commands:
openclaw gateway status
openclaw gateway restart
If you are running OpenClaw with Docker Compose, you can also restart the corresponding container there.
How inbound messages are handled
The plugin receives VoceChat events through POST /.
It already handles the basic inbound flow for you:
- Parse the webhook JSON
- Determine whether the event is from a private chat or a group chat
- Extract the message content
- Ignore unsupported edit / delete events
- Route the message into OpenClaw
- Record the inbound session
- Send OpenClaw replies back to VoceChat
The internal target formats used by the plugin are:
vocechat:private:<uid>vocechat:group:<gid>
Currently supported capabilities
Currently implemented:
- Private chat
- Group chat
- Text replies
- Reply sending
- Media / file outbound upload
- Basic health check
- Bot API–based status probing
Verification checklist
After configuration, it is recommended to verify the setup using the following checklist:
GET http://YOUR_OPENCLAW_HOST:8010/returnsok- VoceChat can successfully save the webhook URL
- Messages sent to the Bot in private chat reach OpenClaw
- OpenClaw replies return to the same conversation
- If testing group chat, the Bot can speak normally in the group
Troubleshooting
VoceChat cannot save the webhook
Check:
- Whether the OpenClaw address is reachable from VoceChat
- Whether
GET /on the webhook URL returns200 - Whether port
8010is exposed - Whether your reverse proxy forwards requests correctly to the OpenClaw webhook port
OpenClaw does not receive any messages at all
Check:
- Whether
vocechatis allowed and enabled inplugins - Whether the plugin path is correct
- Whether
channels.vocechat.enabledis set totrue - Whether you restarted the gateway after changing the configuration
OpenClaw receives messages but cannot send replies back
Check:
- Whether
serverUrlis correct - Whether
apiKeyis valid - Whether the Bot still has permission to send messages to the target private chat or group
- If testing group chat, whether the Bot has already been added to that group
The plugin replies to the wrong conversation
Check:
- Whether the inbound event target is actually a private chat or a group chat
- Whether the Bot account currently in use is the one you expect
- If multiple VoceChat accounts are configured, whether routing is going to the correct account
Related implementation details
The channel id registered by this plugin in OpenClaw is vocechat.
Some key implementation points:
- plugin id:
vocechat - inbound webhook:
GET /andPOST / - default webhook port:
8010 - outbound target format:
vocechat:private:<uid>vocechat:group:<gid>