You posted a screenshot in a Discord server six months ago. Today someone clicked the link — and saw nothing. The URL went something like:
https://cdn.discordapp.com/attachments/123/456/screen.png?ex=...&is=...&hm=...That ?ex= parameter is a Unix timestamp — the expiry. Discord signs every attachment URL with a short-lived token that rotates roughly daily. Inside Discord, the client re-fetches the signed URL on every view, so it always works. But the literal URL you copied — the one in your README, your tweet, your blog post — points to a snapshot in time that's now invalid.
Why Discord changed this
The signed-URL move was a security and abuse change: it stops random hotlinks to Discord's CDN, and lets Discord rotate access if a file needs to be pulled. Sensible from their side; painful for anyone whose old links no longer work.
The fix
Don't store image URLs you care about on Discord's CDN. Host the image somewhere that returns a permanent URL — like swiftimg.
- Open the original Discord message and right-click → Save image, or download from the link before it expires.
- Upload to swiftimg at /upload. No account required.
- Copy the direct image URL from the share box.
- Paste that URL wherever the broken Discord one was — README, blog, channel description, wiki, etc.
Will the new URL still embed in Discord?
Yes. Discord auto-unfurls any direct image URL, and the embed even respects animated WebP playback. The advantage: the URL works everywhere — Discord, the README that referenced it, the Notion page someone bookmarked, the search engine that indexed it.
For new screenshots: skip Discord's CDN entirely
If you take screenshots regularly, install ShareX or @swiftimg/cli and let every screenshot upload to a permanent URL by default. Paste the URL into Discord, and now your messages outlive their attachments.
More: image hosting for Discord and the underlying swiftimg vs Discord CDN comparison.