NapNodes

← Discord bot guides

Discord bots · updated 5 November 2026

“___hidden___” Channels in Your Discord Bot: What Changes on November 16, 2026

From November 16, 2026, your bot won't know the names of channels it can't view: they'll arrive named ___hidden___, or not arrive at all. If your bot only works in its own channels, you don't need to do anything. If it lists, copies or audits every channel in a server, you do. This guide was published before the change takes effect and is based on Discord's documentation: here's how to tell if you're affected, how to test it now and what to change in discord.py and discord.js.

What exactly changes

Until now, a bot received data for every channel in a server, including ones it couldn't open: name, topic and permissions. Discord announced this on August 12, 2026 as a breaking change, and from November 16 it applies to every bot:

Over the Gateway (the live connection your bot's cache is built from), those channels still arrive, but with the name replaced by ___hidden___, the CHANNEL_OBFUSCATED flag (1 << 17) set and a single permission overwrite: VIEW_CHANNEL denied for @everyone.

Over the HTTP API, GET /guilds/{guild.id}/channels no longer returns them: they're simply missing, with no error or warning.

On a hidden channel, only id, type, position and parent_id can be trusted; Discord says not to rely on anything else. As soon as your bot gains access, it receives a Channel Update with the real data. And what arrives inside an interaction (a slash command, for example) isn't hidden.

For Discord, being able to view a channel means having VIEW_CHANNEL on it, or being connected to it if it's a voice channel. And a category is viewable if any channel inside it is.

Rather not set it up yourself? Discord bot hosting from €1.50 a month, no contract and a full refund within 72 hours. Or create a free Discord bot, no card needed.

Which bots are affected

Discord is clear: if your bot only acts in channels it has permission to view, this doesn't affect you. A welcome, music, giveaway or ticket bot with its channels set up properly carries on as before.

It does affect bots that read data about channels they can't view. Discord gives three examples: bots that mirror or audit the full channel list, bots that calculate permissions across every channel, and bots that report on a server's structure.

Also check whether your bot does any of these: looks up a channel by name (discord.utils.get(guild.channels, name="logs"), or find in discord.js), backs up the server, shows a channel picker on a settings website, or counts channels. Watch out for that last one: the cache will keep counting hidden channels and an HTTP request won't, so the two numbers will stop matching.

How to test it before the date

Discord lets you turn it on early over the Gateway, temporarily and for testing only. There's no way to do it over HTTP: you'll only see that on the 16th.

  1. Open your bot in the portal

    At discord.com/developers/applications, pick your application and go to “Bot”. Use a test bot if you have one.

  2. Turn on “Private Channel Obfuscation”

    It's the toggle Discord added for testing. You can also ask for it in code, with capability 1 << 15 in Identify, but the toggle is easier.

  3. Restart the bot

    The cache fills when it connects. Without rebuilding it, you'll keep seeing the old data.

  4. Create a channel it can't view

    Make it private, without giving the bot's role access, and run the features that loop through channels. If ___hidden___ shows up in a log or something breaks, you've found what to change.

How to tell if a channel is hidden in your code

Discord says to check the CHANNEL_OBFUSCATED flag and not to trust the name. But it only comes over the Gateway, and as of November 5, 2026 the libraries don't make it easy: discord-api-types already has ChannelFlags.ChannelObfuscated, but in discord.py and in discord.js's channel class we haven't found a direct way to read it on a normal channel.

What works in both is asking about the permission, which is what you really want to know anyway. This keeps only the channels your bot can view:

app.py (discord.py)
def visible_channels(guild: discord.Guild):
    me = guild.me
    return [c for c in guild.channels if c.permissions_for(me).view_channel]
index.js (discord.js)
// viewable checks the bot's own View Channels permission
const visible = guild.channels.cache.filter((c) => c.viewable);

What to change in your bot

  1. Store ids, not names

    A hidden channel's name is useless, and they'll all be called the same. Store the id: it's one of the few fields that stays valid. With Developer Mode on in Discord, right-click the channel → “Copy Channel ID”.

  2. Skip the channels you can't view

    Before looping through channels, filter them as in the example above. If the bot tries to act on one it can't view, Discord answers with the Missing Access error.

  3. Say what's missing instead of hiding it

    If your bot does backups or audits, report how many channels it skipped: “I can't view 3 channels. Give me View Channels to include them.” An incomplete report that looks complete is worse than a warning.

  4. Fetch channels the right way

    If you use fetch_channels() in discord.py or guild.channels.fetch() in discord.js, remember they go over HTTP: hidden channels just won't come back.

If your bot needs to see a channel

Give it permission, because there's no other way: in “Edit Channel” → “Permissions”, add the bot's role and enable “View Channels”. If there are many, do it on the category. To work out which permissions to ask for in the invite link, use the bot permissions calculator.

Updating discord.py or discord.js won't bring the names back, because the change is on Discord's servers. And what it has published offers no way to keep the old behaviour.

If your bot is on NapNodes

The change is Discord's and works the same wherever your bot runs: there's nothing to touch on the server, only in your code.

  1. Upload the new code

    In “Files”, or from your GitHub repository if you've set it in “Settings”.

  2. Press “Restart”

    A bot reads its code when it starts.

  3. Check the “Console”

    That's where your bot's output appears, including any ___hidden___ in its logs.

Frequently asked questions

What does ___hidden___ mean on a Discord channel?

That your bot doesn't have permission to view that channel, so Discord hides its name and nearly all its data. It's not an error or a new channel: it's the same channel as always, hidden from that bot.

When does Discord start hiding channels from bots?

On November 16, 2026, for every bot. Before that you can only test it over the Gateway, with the “Private Channel Obfuscation” toggle in the developer portal.

Do I need to change anything in my bot?

Only if it reads data about channels it can't view: server backups, audits, reports or looking up channels by name. If it only works in its own channels, Discord says it isn't affected.

Does updating discord.py or discord.js fix it?

No. The change is in Discord, not the library. For your bot to see a channel again, give it the View Channels permission there.

Why are channels missing from what the API returns?

Because from that date the HTTP channel list leaves out the ones your bot can't view, with no error. Over the Gateway they still arrive, but with their data hidden.

How do I know which channels my bot can view?

Ask about its permission: in discord.py, channel.permissions_for(guild.me).view_channel; in discord.js, channel.viewable.

Shall we set it up for you?

Discord bot hosting from €1.50 a month, never oversold: your RAM is yours alone. And if you'd rather start without paying, there's a free Discord bot, no card needed.

Free tool: Discord bot permissions calculator. Tick your bot's permissions and get the number and the invite link; or paste a number and see which permissions it grants.

Keep reading

All Discord bot guides, sorted →