docs/channels/zalo.md
Status: experimental. DMs are supported. The Capabilities section below reflects current Marketplace-bot behavior.
Zalo ships as a bundled plugin in current OpenClaw releases, so normal packaged builds do not need a separate install.
If you are on an older build or a custom install that excludes Zalo, install the npm package directly:
openclaw plugins install @openclaw/zaloopenclaw plugins install @openclaw/[email protected]openclaw plugins install ./path/to/local/zalo-pluginZALO_BOT_TOKEN=...channels.zalo.accounts.default.botToken: "...".Minimal config:
{
channels: {
zalo: {
enabled: true,
accounts: {
default: {
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
},
},
}
Zalo is a Vietnam-focused messaging app; its Bot API lets the Gateway run a bot for 1:1 conversations. It is a good fit for support or notifications where you want deterministic routing back to Zalo.
This page reflects current OpenClaw behavior for Zalo Bot Creator / Marketplace bots. Zalo Official Account (OA) bots are a different Zalo product surface and may behave differently.
numeric_id:secret). For Marketplace bots, the usable runtime token may appear in the bot's welcome message after creation.Example:
{
channels: {
zalo: {
enabled: true,
accounts: {
default: {
botToken: "12345689:abc-xyz",
dmPolicy: "pairing",
},
},
},
},
}
If you later move to a Zalo bot surface where groups are available, you can add group-specific config such as groupPolicy and groupAllowFrom explicitly. For current Marketplace-bot behavior, see Capabilities.
Env option: ZALO_BOT_TOKEN=... (works for the default account only).
Multi-account support: use channels.zalo.accounts with per-account tokens and optional name.
channels.zalo.webhookUrl.channels.zalo.mediaMaxMb (default 5).channels.zalo.dmPolicy = "pairing". Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour).openclaw pairing list zaloopenclaw pairing approve zalo <CODE>channels.zalo.allowFrom accepts numeric user IDs (no username lookup available).For Zalo Bot Creator / Marketplace bots, group support was not available in practice because the bot could not be added to a group at all.
That means the group-related config keys below exist in the schema, but were not usable for Marketplace bots:
channels.zalo.groupPolicy controls group inbound handling: open | allowlist | disabled.channels.zalo.groupAllowFrom restricts which sender IDs can trigger the bot in groups.groupAllowFrom is unset, Zalo falls back to allowFrom for sender checks.channels.zalo is missing entirely, runtime still falls back to groupPolicy="allowlist" for safety.The group policy values (when group access is available on your bot surface) are:
groupPolicy: "disabled" — blocks all group messages.groupPolicy: "open" — allows any group member (mention-gated).groupPolicy: "allowlist" — fail-closed default; only allowed senders are accepted.If you are using a different Zalo bot product surface and have verified working group behavior, document that separately rather than assuming it matches the Marketplace-bot flow.
channels.zalo.webhookUrl and channels.zalo.webhookSecret.
X-Bot-Api-Secret-Token header for verification.channels.zalo.webhookPath (defaults to the webhook URL path).Content-Type: application/json (or +json media types).event_name + message_id) are ignored for a short replay window.Note: getUpdates (polling) and webhook are mutually exclusive per Zalo API docs.
For a quick support snapshot, see Capabilities. The notes below add detail where the behavior needs extra context.
This table summarizes current Zalo Bot Creator / Marketplace bot behavior in OpenClaw.
| Feature | Status |
|---|---|
| Direct messages | ✅ Supported |
| Groups | ❌ Not available for Marketplace bots |
| Media (inbound images) | ⚠️ Limited / verify in your environment |
| Media (outbound images) | ⚠️ Not re-tested for Marketplace bots |
| Plain URLs in text | ✅ Supported |
| Link previews | ⚠️ Unreliable for Marketplace bots |
| Reactions | ❌ Not supported |
| Stickers | ⚠️ No agent reply for Marketplace bots |
| Voice notes / audio / video | ⚠️ No agent reply for Marketplace bots |
| File attachments | ⚠️ No agent reply for Marketplace bots |
| Threads | ❌ Not supported |
| Polls | ❌ Not supported |
| Native commands | ❌ Not supported |
| Streaming | ⚠️ Blocked (2000 char limit) |
openclaw message send --channel zalo --target 123456789 --message "hi".Bot doesn't respond:
openclaw channels status --probeopenclaw logs --followWebhook not receiving events:
Full configuration: Configuration
The flat top-level keys (channels.zalo.botToken, channels.zalo.dmPolicy, and similar) are a legacy single-account shorthand. Prefer channels.zalo.accounts.<id>.* for new configs. Both forms are still documented here because they exist in the schema.
Provider options:
channels.zalo.enabled: enable/disable channel startup.channels.zalo.botToken: bot token from Zalo Bot Platform.channels.zalo.tokenFile: read token from a regular file path. Symlinks are rejected.channels.zalo.dmPolicy: pairing | allowlist | open | disabled (default: pairing).channels.zalo.allowFrom: DM allowlist (user IDs). open requires "*". The wizard will ask for numeric IDs.channels.zalo.groupPolicy: open | allowlist | disabled (default: allowlist). Present in config; see Capabilities and Access control (Groups) for current Marketplace-bot behavior.channels.zalo.groupAllowFrom: group sender allowlist (user IDs). Falls back to allowFrom when unset.channels.zalo.mediaMaxMb: inbound/outbound media cap (MB, default 5).channels.zalo.webhookUrl: enable webhook mode (HTTPS required).channels.zalo.webhookSecret: webhook secret (8-256 chars).channels.zalo.webhookPath: webhook path on the gateway HTTP server.channels.zalo.proxy: proxy URL for API requests.Multi-account options:
channels.zalo.accounts.<id>.botToken: per-account token.channels.zalo.accounts.<id>.tokenFile: per-account regular token file. Symlinks are rejected.channels.zalo.accounts.<id>.name: display name.channels.zalo.accounts.<id>.enabled: enable/disable account.channels.zalo.accounts.<id>.dmPolicy: per-account DM policy.channels.zalo.accounts.<id>.allowFrom: per-account allowlist.channels.zalo.accounts.<id>.groupPolicy: per-account group policy. Present in config; see Capabilities and Access control (Groups) for current Marketplace-bot behavior.channels.zalo.accounts.<id>.groupAllowFrom: per-account group sender allowlist.channels.zalo.accounts.<id>.webhookUrl: per-account webhook URL.channels.zalo.accounts.<id>.webhookSecret: per-account webhook secret.channels.zalo.accounts.<id>.webhookPath: per-account webhook path.channels.zalo.accounts.<id>.proxy: per-account proxy URL.