Discord Attachment Link Expired? Here's Why and How to Fix It
Discord CDN attachment links now expire after 24 hours. Here's why, how to recover access, and how to share files in a way that doesn't rot.
You posted a file in Discord six months ago. You also pasted the link into a Notion doc, a Wiki, or a forum thread. Today, somebody clicks the link and gets an XML error or a download that just stops. The file is still in Discord. The link is dead.
Welcome to Discord's CDN link expiration. Here's what changed, why it changed, and what to do instead.
What actually broke
In 2023 Discord introduced 24-hour expiration on cdn.discordapp.com and media.discordapp.net attachment URLs. Inside Discord, the app refreshes these links transparently — you don't notice. Outside Discord — anywhere the URL is pasted, embedded, or referenced — the link goes stale fast.
The signed parameters that authorize the CDN response (ex, is, hm) expire on a rolling 24-hour window. Past that window, the URL returns "Access Denied" or "Forbidden." The file is still in Discord's storage; you just can't reach it directly.
If you're hitting this on uploaded files that won't even open, that's a different symptom — see the file too large error breakdown for upload-stage failures.
Why Discord did this
Officially: to "improve safety and security." Practically: to stop Discord's free CDN from being used as an unlimited free file host for non-Discord projects. Pre-2023, people were embedding Discord URLs in wikis, forums, and websites because the links were free, fast, and didn't expire.
It worked. People stopped doing that. They also stopped being able to reliably share Discord-hosted files outside of Discord.
Can you recover an expired link?
Sort of.
If the original message is still in Discord and you have access to the channel, you can:
- Open the message in Discord.
- Right-click the attachment → "Copy Link."
- You'll get a fresh URL with new signed parameters good for ~24 hours.
So the file isn't gone — just the specific URL you saved is. There are also browser extensions ("Fix Discord CDN") that automatically refresh expired Discord links by going back to the original message. They work, but they require the source message to still exist.
If the message was deleted, the channel was wiped, or you've been removed from the server, the link is truly dead.
Why this matters for community servers
You can't reliably:
- Embed Discord attachments in your community wiki.
- Send Discord file links to people outside your server.
- Reference Discord-uploaded resources from blog posts, docs, or threads.
- Build any external tooling that consumes Discord attachment URLs.
For one-off chat, this doesn't matter. For a community that's actively trying to build a knowledge base — class materials, asset libraries, build archives — Discord stops being the right storage layer the moment those resources need to outlive 24 hours.
What to do instead
For files you want to reference long-term:
Option 1: Public file host with stable URLs
Google Drive, Dropbox, OneDrive, S3 — anywhere with persistent URLs.
Pros: links don't expire. Cons: access control is decoupled from Discord membership. A "anyone with the link" share is permanently public.
Option 2: Self-hosted storage
If you have an S3 / R2 / GCS bucket, upload there and serve via your own domain. Total control. Highest setup cost.
Option 3: Discord-OAuth-gated storage
The pattern designed for this exact problem:
- Files live in private object storage (R2, S3).
- Access is gated by Discord OAuth — only members of your server can reach them.
- URLs are signed and time-limited (so the raw bucket isn't public), but the file itself is permanent and the access logic is consistent.
DisCoRibute is built around this. You upload once, server members get authenticated access whenever they want, and the file doesn't disappear because Discord rotated a hash 24 hours ago. For community resources you actually need to be able to reference later, this maps to the access pattern Discord broke.
How to migrate from Discord-hosted files
If you've been treating Discord as your community's file system and the rot is catching up:
- Audit. Find every place a Discord CDN URL has been pasted outside Discord — wikis, docs, pinned messages, external sites.
- Pick a destination. Either a public file host (if the content is public) or a Discord-OAuth-gated service (if it's member-only).
- Re-upload the source files there, and replace the URLs.
- Going forward: post the new URL in Discord too. Discord becomes a notification layer, not the storage layer.
What the change is really telling you
Discord made an explicit decision: their CDN isn't a public file host. If you treat it like one, the URLs will rot. That's not a bug — it's the design.
For community sharing inside Discord, attachments still work fine; you just shouldn't paste the URLs anywhere outside. For anything that needs to live in a wiki or a doc or a public page, the storage needs to be somewhere built for permanence. Discord links were never the right tool for that, even back when they didn't expire.