docs/channels/line.md
LINE connects to OpenClaw via the LINE Messaging API. The plugin runs as a webhook receiver on the gateway and uses your channel access token + channel secret for authentication.
Status: downloadable plugin. Direct messages, group chats, media, locations, Flex messages, template messages, and quick replies are supported. Reactions and threads are not supported.
Install LINE before configuring the channel:
openclaw plugins install @openclaw/line
Local checkout (when running from a git repo):
openclaw plugins install ./path/to/local/line-plugin
https://gateway-host/line/webhook
The gateway responds to LINE’s webhook verification (GET) and inbound events (POST).
If you need a custom path, set channels.line.webhookPath or
channels.line.accounts.<id>.webhookPath and update the URL accordingly.
Security note:
req.body values are ignored for signature-integrity safety.Minimal config:
{
channels: {
line: {
enabled: true,
channelAccessToken: "LINE_CHANNEL_ACCESS_TOKEN",
channelSecret: "LINE_CHANNEL_SECRET",
dmPolicy: "pairing",
},
},
}
Public DM config:
{
channels: {
line: {
enabled: true,
channelAccessToken: "LINE_CHANNEL_ACCESS_TOKEN",
channelSecret: "LINE_CHANNEL_SECRET",
dmPolicy: "open",
allowFrom: ["*"],
},
},
}
Env vars (default account only):
LINE_CHANNEL_ACCESS_TOKENLINE_CHANNEL_SECRETToken/secret files:
{
channels: {
line: {
tokenFile: "/path/to/line-token.txt",
secretFile: "/path/to/line-secret.txt",
},
},
}
tokenFile and secretFile must point to regular files. Symlinks are rejected.
Multiple accounts:
{
channels: {
line: {
accounts: {
marketing: {
channelAccessToken: "...",
channelSecret: "...",
webhookPath: "/line/marketing",
},
},
},
},
}
Direct messages default to pairing. Unknown senders get a pairing code and their messages are ignored until approved.
openclaw pairing list line
openclaw pairing approve line <CODE>
Allowlists and policies:
channels.line.dmPolicy: pairing | allowlist | open | disabledchannels.line.allowFrom: allowlisted LINE user IDs for DMs; dmPolicy: "open" requires ["*"]channels.line.groupPolicy: allowlist | open | disabledchannels.line.groupAllowFrom: allowlisted LINE user IDs for groupschannels.line.groups.<groupId>.allowFromchannels.line is completely missing, runtime falls back to groupPolicy="allowlist" for group checks (even if channels.defaults.groupPolicy is set).LINE IDs are case-sensitive. Valid IDs look like:
U + 32 hex charsC + 32 hex charsR + 32 hex charschannels.line.mediaMaxMb (default 10).~/.openclaw/media/inbound/ before it is passed
to the agent, matching the shared media store used by other bundled channel
plugins.Use channelData.line to send quick replies, locations, Flex cards, or template
messages.
{
text: "Here you go",
channelData: {
line: {
quickReplies: ["Status", "Help"],
location: {
title: "Office",
address: "123 Main St",
latitude: 35.681236,
longitude: 139.767125,
},
flexMessage: {
altText: "Status card",
contents: {
/* Flex payload */
},
},
templateMessage: {
type: "confirm",
text: "Proceed?",
confirmLabel: "Yes",
confirmData: "yes",
cancelLabel: "No",
cancelData: "no",
},
},
},
}
The LINE plugin also ships a /card command for Flex message presets:
/card info "Welcome" "Thanks for joining!"
LINE supports ACP (Agent Communication Protocol) conversation bindings:
/acp spawn <agent> --bind here binds the current LINE chat to an ACP session without creating a child thread.See ACP agents for details.
The LINE plugin supports sending images, videos, and audio files through the agent message tool. Media is sent via the LINE-specific delivery path with appropriate preview and tracking handling:
Outbound media URLs must be public HTTPS URLs. OpenClaw validates the target hostname before handing the URL to LINE and rejects loopback, link-local, and private-network targets.
Generic media sends fall back to the existing image-only route when a LINE-specific path is not available.
channelSecret matches the LINE console.channels.line.webhookPath
and that the gateway is reachable from LINE.channels.line.mediaMaxMb if media exceeds the
default limit.