KakaoTalk
LOCO adapter — encrypted login, token renewal, and capabilities
Part of the channel adapters family.
Transport: LOCO protocol (no public URL required). Setup walkthrough: Add a channel.
Use a dedicated account
Auto-acking every received message is a distinct non-human fingerprint. KakaoTalk abuse detection may ban accounts that exhibit this pattern. Run this adapter only on dedicated agent accounts you can afford to lose.
Auth
Sub-device login using email and password. Passwords are stored encrypted at rest (AES-256-GCM; the key lives outside the agent folder).
Unlike the other adapters, secrets.json#channels.kakaotalk is not a flat credential object — it wraps one or more account records:
{
"channels": {
"kakaotalk": {
"currentAccount": "<accountId>",
"accounts": {
"<accountId>": {
"account_id": "<accountId>",
"oauth_token": "…",
"user_id": "…",
"device_uuid": "…",
"device_type": "pc",
"created_at": "…",
"updated_at": "…"
}
}
}
}
}| Field | Notes |
|---|---|
currentAccount | string | null — active account id, or null if none |
accounts.<accountId> | Map of account id → account record (fields below) |
Each record under accounts.<accountId>:
| Field | Notes |
|---|---|
account_id | Account identifier (matches the map key) |
oauth_token | Current session token |
user_id | KakaoTalk user ID |
device_uuid | Registered device UUID |
device_type | 'pc' or 'tablet' |
created_at | Record creation timestamp |
updated_at | Last-update timestamp |
refresh_token | optional — refresh token when present |
auth_method | optional — 'login' or 'extract' |
email | optional — login email (needed for automatic renewal) |
encryptedPassword | optional — AES-256-GCM envelope (needed for automatic renewal) |
A pendingLogin record may also appear under channels.kakaotalk mid-reauth; see secrets.json for the full schema.
CLI: typeclaw channel add kakaotalk (interactive). Do not use channel set for credential rotation — use typeclaw channel reauth kakaotalk instead.
Capabilities
| Feature | Supported | Notes |
|---|---|---|
| Outbound messages | yes | |
| Reactions | no | |
| Typing indicator | no | |
| Channel-name resolution | yes | |
| Self identity | no | |
| History | yes | Limit 200 messages |
| Attachments | yes | Files sent before text; no combined text+file send in one call |
| Membership | no |
Token renewal
Tokens expire after ~7 days. A host-side renewal cron refreshes them automatically. When a token goes stale, renewal can trigger a container restart via the host daemon. If automatic renewal fails, re-authenticate with:
typeclaw channel reauth kakaotalkQuirks
- KICKOUT recovery: if the same
device_uuidlogs in elsewhere, the adapter detects the KICKOUT event and retries with bounded backoff (2s / 10s / 60s, 5-minute budget total). - Mark-read: fires on every inbound message, clearing the unread "1" (노란숫자), except in open chats.
- Provisional registration: chats not surfaced by
getChatsare registered provisionally on first message. - No combined send: files are sent first, then text, as separate API calls.
Config
{
"channels": {
"kakaotalk": {
"enabled": true,
"engagement": {
"trigger": ["mention", "reply", "dm"],
"stickiness": { "perReply": { "window": 900000 } }
},
"history": {
"prefetch": {
"thread": { "head": 3, "tail": 10 },
"channel": { "tail": 10 }
}
},
"quotedReply": { "enabled": true, "queueDelayMs": 10000 }
}
}
}All fields above are shared across adapters. No adapter-specific extensions exist for kakaotalk. Credentials live in secrets.json#channels.kakaotalk.