{
  "title": "Zalo Personal (unofficial)",
  "content": "Status: experimental. This integration automates a **personal Zalo account** via `zca-cli`.\n\n> **Warning:** This is an unofficial integration and may result in account suspension/ban. Use at your own risk.\n\nZalo Personal ships as a plugin and is not bundled with the core install.\n\n* Install via CLI: `openclaw plugins install @openclaw/zalouser`\n* Or from a source checkout: `openclaw plugins install ./extensions/zalouser`\n* Details: [Plugins](/plugin)\n\n## Prerequisite: zca-cli\n\nThe Gateway machine must have the `zca` binary available in `PATH`.\n\n* Verify: `zca --version`\n* If missing, install zca-cli (see `extensions/zalouser/README.md` or the upstream zca-cli docs).\n\n## Quick setup (beginner)\n\n1. Install the plugin (see above).\n2. Login (QR, on the Gateway machine):\n   * `openclaw channels login --channel zalouser`\n   * Scan the QR code in the terminal with the Zalo mobile app.\n3. Enable the channel:\n\n4. Restart the Gateway (or finish onboarding).\n5. DM access defaults to pairing; approve the pairing code on first contact.\n\n* Uses `zca listen` to receive inbound messages.\n* Uses `zca msg ...` to send replies (text/media/link).\n* Designed for “personal account” use cases where Zalo Bot API is not available.\n\nChannel id is `zalouser` to make it explicit this automates a **personal Zalo user account** (unofficial). We keep `zalo` reserved for a potential future official Zalo API integration.\n\n## Finding IDs (directory)\n\nUse the directory CLI to discover peers/groups and their IDs:\n\n* Outbound text is chunked to \\~2000 characters (Zalo client limits).\n* Streaming is blocked by default.\n\n## Access control (DMs)\n\n`channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`).\n`channels.zalouser.allowFrom` accepts user IDs or names. The wizard resolves names to IDs via `zca friend find` when available.\n\n* `openclaw pairing list zalouser`\n* `openclaw pairing approve zalouser <code>`\n\n## Group access (optional)\n\n* Default: `channels.zalouser.groupPolicy = \"open\"` (groups allowed). Use `channels.defaults.groupPolicy` to override the default when unset.\n* Restrict to an allowlist with:\n  * `channels.zalouser.groupPolicy = \"allowlist\"`\n  * `channels.zalouser.groups` (keys are group IDs or names)\n* Block all groups: `channels.zalouser.groupPolicy = \"disabled\"`.\n* The configure wizard can prompt for group allowlists.\n* On startup, OpenClaw resolves group/user names in allowlists to IDs and logs the mapping; unresolved entries are kept as typed.\n\nAccounts map to zca profiles. Example:\n\n* Install zca-cli and ensure it’s on `PATH` for the Gateway process.\n\n**Login doesn’t stick:**\n\n* `openclaw channels status --probe`\n* Re-login: `openclaw channels logout --channel zalouser && openclaw channels login --channel zalouser`",
  "code_samples": [
    {
      "code": "4. Restart the Gateway (or finish onboarding).\n5. DM access defaults to pairing; approve the pairing code on first contact.\n\n## What it is\n\n* Uses `zca listen` to receive inbound messages.\n* Uses `zca msg ...` to send replies (text/media/link).\n* Designed for “personal account” use cases where Zalo Bot API is not available.\n\n## Naming\n\nChannel id is `zalouser` to make it explicit this automates a **personal Zalo user account** (unofficial). We keep `zalo` reserved for a potential future official Zalo API integration.\n\n## Finding IDs (directory)\n\nUse the directory CLI to discover peers/groups and their IDs:",
      "language": "unknown"
    },
    {
      "code": "## Limits\n\n* Outbound text is chunked to \\~2000 characters (Zalo client limits).\n* Streaming is blocked by default.\n\n## Access control (DMs)\n\n`channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`).\n`channels.zalouser.allowFrom` accepts user IDs or names. The wizard resolves names to IDs via `zca friend find` when available.\n\nApprove via:\n\n* `openclaw pairing list zalouser`\n* `openclaw pairing approve zalouser <code>`\n\n## Group access (optional)\n\n* Default: `channels.zalouser.groupPolicy = \"open\"` (groups allowed). Use `channels.defaults.groupPolicy` to override the default when unset.\n* Restrict to an allowlist with:\n  * `channels.zalouser.groupPolicy = \"allowlist\"`\n  * `channels.zalouser.groups` (keys are group IDs or names)\n* Block all groups: `channels.zalouser.groupPolicy = \"disabled\"`.\n* The configure wizard can prompt for group allowlists.\n* On startup, OpenClaw resolves group/user names in allowlists to IDs and logs the mapping; unresolved entries are kept as typed.\n\nExample:",
      "language": "unknown"
    },
    {
      "code": "## Multi-account\n\nAccounts map to zca profiles. Example:",
      "language": "unknown"
    }
  ],
  "headings": [
    {
      "level": "h2",
      "text": "Plugin required",
      "id": "plugin-required"
    },
    {
      "level": "h2",
      "text": "Prerequisite: zca-cli",
      "id": "prerequisite:-zca-cli"
    },
    {
      "level": "h2",
      "text": "Quick setup (beginner)",
      "id": "quick-setup-(beginner)"
    },
    {
      "level": "h2",
      "text": "What it is",
      "id": "what-it-is"
    },
    {
      "level": "h2",
      "text": "Naming",
      "id": "naming"
    },
    {
      "level": "h2",
      "text": "Finding IDs (directory)",
      "id": "finding-ids-(directory)"
    },
    {
      "level": "h2",
      "text": "Limits",
      "id": "limits"
    },
    {
      "level": "h2",
      "text": "Access control (DMs)",
      "id": "access-control-(dms)"
    },
    {
      "level": "h2",
      "text": "Group access (optional)",
      "id": "group-access-(optional)"
    },
    {
      "level": "h2",
      "text": "Multi-account",
      "id": "multi-account"
    },
    {
      "level": "h2",
      "text": "Troubleshooting",
      "id": "troubleshooting"
    }
  ],
  "url": "llms-txt#zalo-personal-(unofficial)",
  "links": []
}