Slack channel_not_found: 7 Causes We Reproduced, With Fixes
channel_not_found means Slack cannot see the channel with the token you used: a wrong ID, a name that does not exist, a private channel the bot is not in, or a channel in another workspace. Each case tested on a real bot.
On this page
Slack returns channel_not_found when the channel you passed does not exist for the token you used. The usual causes are a mistyped or copied-wrong channel ID, a private channel the bot has not been invited to, a channel name that does not exist, and a channel ID from a different workspace. Private channels are the most common case: to a bot that is not a member, a private channel looks like it does not exist. We ran each cause on 29 September 2026 with a bot that had chat:write and chat:write.public, and recorded Slack's answer.
What each call returned
All calls were chat.postMessage with the same bot token. Every one returned HTTP 200 with "ok": false or "ok": true.
channel value we passed | What it was | Response |
|---|---|---|
C0C4RQXFPAX | A real ID with the last letter changed | channel_not_found |
C0C572NKD7U | A private channel, bot not invited | channel_not_found |
#w1-lab-private | That private channel by name | channel_not_found |
#general | A name no channel in this workspace has | channel_not_found |
#w1-lab-public after a rename | The old name of a renamed channel | channel_not_found |
C0AQB3JTWMQ | A channel ID from another workspace | channel_not_found |
D0B7D4VDCUD | A person's own DM with themselves | channel_not_found |
C0C4RQXFPAT | A public channel, bot not a member, before chat:write.public | not_in_channel |
#w1-lab-public | That public channel by name | not_in_channel |
C0C5106NNJX | An archived channel the bot was in | is_archived |
U0B7L4YK420 | A user ID | ok: true, sent to the app's DM with that user |
The body is the same for every channel_not_found:
{"ok": false, "error": "channel_not_found"}
Two rows are worth knowing before you debug. Every workspace has a default channel, but it is not always #general; in our test workspace it is #all-slack, so #general failed. And a DM ID only works for the people in that DM. A bot cannot post into a DM between people; pass the person's user ID instead and Slack delivers it to the app's own DM with them.
Fix: use the channel ID from channel details
Names change and can be ambiguous. IDs do not. Open the channel, click its name at the top, and the ID is at the bottom of the About tab, with a copy button:
Public channel IDs start with C. Private channels created today also start with C; the lock icon, not the ID, tells you it is private. Paste the ID into the channel field and keep the name out of your config.
Fix: invite the bot to the private channel
Type /invite @YourApp in the private channel. After we did, the same call that returned channel_not_found returned ok: true. When we removed the bot again, the error came back. Adding scopes does not help: our bot had chat:write.public and groups:history, and the private channel still did not exist for it until the invite. The invite step, with screenshots, is in Slack not_in_channel.
Never appear "away" on Slack again
Cloud-based. No downloads. Works 24/7 even when your laptop is off.
Fix: match the token to the workspace
A bot token belongs to one workspace install. The ID C0AQB3JTWMQ is a real channel in another workspace, and our token got channel_not_found. If your app is installed in several workspaces, store the token and the channel ID as a pair, and check auth.test: its team_id must be the workspace that owns the channel. A conversations.info call on the ID is a cheap check before you post: it answers ok for a public channel even when the bot is not in it.
When the SDK says channel not found
The Python and Node SDKs raise the same error string. In Python, slack_sdk raises SlackApiError and the code is in e.response["error"]:
from slack_sdk.errors import SlackApiError
try:
client.chat_postMessage(channel=channel_id, text="hi")
except SlackApiError as e:
print(e.response["error"])
Run against our private channel with slack_sdk 3.44.1, it printed channel_not_found.
Other services that post to Slack, such as Zapier or CI plugins, pass the same response through. The Jenkins Slack plugin printed Slack notification failed with exception: {"ok":false,"error":"channel_not_found"} for our private channel (Jenkins test). The fix is the same: use the ID, and invite their bot to private channels. For the error you get when the token lacks a permission instead, see missing_scope.
FAQ
Why does the channel exist in Slack but the API says channel_not_found? Because the token cannot see it. A private channel is invisible to a bot that is not a member, and a channel in another workspace is invisible to this workspace's token.
Does conversations.join fix channel_not_found?
Not for private channels. Our bot called conversations.join on the private channel and got channel_not_found back. Only an invite from a member works; our add-to-channel tests show that call with a person's user token.
Can I post to a channel by name?
For public channels, yes: #w1-lab-public reached the channel and gave the same result as the ID. Store the ID anyway. We renamed the channel, and a post to the old name #w1-lab-public returned channel_not_found, while the ID kept working. Slack keeps the old name in the channel's previous_names, and the channel name rules show which new names a rename accepts.
Stop Jiggling Your Mouse.
Join hundreds of remote workers who never worry about their Slack status. Set it up once, stay green forever.
Related Articles
How to See All Your DMs in Slack, Including the Hidden Ones
The DMs tab lists your direct messages with people. App DMs, Slackbot and DMs with deleted accounts sit elsewhere. We compared the tab with the full list the Slack API returned.
Slack Images Not Showing? 5 Causes We Reproduced
We uploaded images to a Slack test channel and then switched each image setting off, ran /collapse, and posted from a bot that was not in the channel. Five causes, each reproduced.
How to Message Yourself on Slack (and What It Notifies)
Your own name under Direct messages opens a private DM with yourself. We sent it a note, a file, a scheduled message and a reminder, and checked which ones raised a badge.