A Discord attachment link expires because the expiry is built into the link itself. Discord's developer documentation states it directly: attachments uploaded to Discord's CDN "have signed URLs with a preset expiry time." The URL is not a permanent address for a file — it is a time-limited, signed token that happens to look like an address.
That one sentence explains almost every version of this problem: the image that loaded fine in a forum post last week and now errors, the bot that cached a URL and started serving broken links, the doc page with a row of dead thumbnails. None of those are bugs. They are the documented behaviour of a signed URL reaching its expiry.
What the documentation does not say is how long that window is.
The three parameters that make an attachment link temporary
If you look at a Discord attachment URL you have copied out of the client, it carries a query string. Discord's API reference defines three parameters, verbatim:
| Parameter | Official definition |
|---|---|
ex | "Hex timestamp indicating when an attachment CDN URL will expire" |
is | "Hex timestamp indicating when the URL was issued" |
hm | "Unique signature that remains valid until the URL's expiration" |
The link is self-describing: it carries its own issue time, its own expiry time, and a signature scoped to that expiry. Nothing needs to be looked up server-side to know the link is stale — the deadline travels with the URL.
Two consequences follow. First, the presence of ex, is and hm is the marker that tells you which kind of Discord link you are holding. Second, Discord describes hm as a signature valid until the expiration, and documents no way to extend a URL's life by editing its parameters. Treat a copied attachment URL as something with a shelf life, not as storage.
The documentation calls ex and is hex timestamps and stops there. If you need to decode one precisely, check the official documentation rather than a community guess.
How long is "a preset expiry time"? Discord doesn't say
Here is the part where most articles on this keyword quietly invent a number.
Discord's documentation says "a preset expiry time." It does not state the duration. Not in hours, not in days, not as a range. Any specific figure you have read for how long a Discord attachment link lasts did not come from Discord's documentation — it came from somebody watching links break and doing arithmetic.
That community estimate may well be right. It is still not something to build on, for the same reason you would not hardcode any other undocumented value: Discord has changed documented numbers before, and an undocumented one can change without anyone announcing it. The honest answer is that the expiry is preset, the deadline for a given link is readable from its own ex parameter, and the duration is not published. Check the official documentation if that changes.
So if you are designing anything around these links — a cache, a scheduled job, a "refresh the thumbnails weekly" cron — do not build it around a guessed interval. Build it around re-fetching, which is the mechanism Discord actually documents.
Not every Discord CDN link expires
This is the distinction that gets lost, and it is why people get contradictory results when they test.
Discord's reference lists a set of standard CDN endpoints, and about those it says: "The standard CDN endpoints listed above are not signed, so they will not expire." Signed attachment URLs and standard CDN endpoints are two different things living on the same infrastructure.
So "do Discord links expire?" has no single answer. It depends entirely on which kind of URL you copied:
- Signed attachment URLs — what you get from user- and bot-uploaded files, per the documentation's own example of "user and bot-uploaded images." These carry
ex/is/hmand have a preset expiry. - Standard CDN endpoints — the ones enumerated in Discord's reference. Documented as not signed, and documented as not expiring.
If two people test "does this Discord link die" and get opposite results, this is usually why: they were not testing the same class of URL. For which endpoints fall into the standard, unsigned group, check the official documentation.
Why the link still works inside Discord but not where you pasted it
The documentation covers this too: "Discord automatically refreshes attachment CDN URLs that appear within the client, so when your app receives a payload with a signed URL (like when you fetch a message), it will be valid."
Note carefully where that refreshing is described as happening. Two places: within the client, and in the payload your app receives when it fetches a message. That is the whole scope of the guarantee.
A URL you copied into a Notion page, a GitHub issue, a blog post, a Google Doc, or your own database is in neither of those places. Nothing is refreshing it. It was valid at the moment you copied it and it carries its own countdown from there — which is exactly why the image looks fine in Discord while the copy of it elsewhere has gone dead.
What to do instead of relying on the link
The fix depends on what you were trying to accomplish.
If you wanted to show someone a file outside Discord: send the file, not the link. That is the only approach that does not depend on someone else's expiry policy. Sending the file runs you into Discord's upload cap on the way out, and that cap is per-file, not per-message — the API reference says "The file upload size limit applies to each file in a request."
Discord's File Attachments FAQ puts the free ceiling at 20MB, with "Nitro Basic offers 50MB and Nitro offers up to 500MB." Discord also notes on that page that it is "currently experimenting with various file upload size limits" and that select users may see larger ones, so verify against the official page rather than a screenshot. Compressing the video before you send it is the reliable move:
Try it right here
Runs in your browser. Your file is not uploaded anywhere.
This runs entirely in your browser — the file is read from disk, re-encoded locally, and handed back. Nothing is uploaded, so there is no second link to expire. For what does and does not count against Discord's cap, see what actually counts when Discord says your file is too large; if a boosted server is involved, server boosts and upload limits covers how those interact. The same compressor has its own page at compress video.
If you wanted to embed a Discord image on a page you control: host it somewhere you control. A signed URL is not hosting.
If you wanted a stable reference for automation: store the message identifiers, not the URL. Re-fetch the message when you need the file, and use the fresh signed URL that comes back. That is the documented path.
If you are building a bot or app
Two details from Discord's reference that come up in this context:
- Re-fetch rather than cache the URL. The documentation's guarantee is that a signed URL in a payload your app receives "will be valid" at that moment. Storing it and reusing it later is outside that guarantee.
attachment_size_limitis scoped to interactions. The reference describes it as the value "provided when working with interactions," and says it "is calculated as the maximum of these values" across a user's Nitro status and the server's Boost Tier — the maximum, not the sum. Do not read it as a field on every API response.
FAQ
Why did my Discord image link stop working? Because attachment CDN URLs are signed with a preset expiry time, and the expiry travelled with the link you copied. Discord's documentation describes automatic refreshing within the client and in payloads your app fetches — a URL sitting in a document or a database gets neither.
How long does a Discord attachment link last?
Discord's documentation says only "a preset expiry time" and does not publish a duration. The specific deadline for a given link is encoded in that link's ex parameter, which the reference describes as a hex timestamp. Any hard number you have seen quoted elsewhere is not from Discord's documentation.
Can I make a Discord attachment link permanent?
Not by editing it. hm is described as a signature valid until the URL's expiration, and the documentation describes no mechanism for extending a link. The documented approach is to re-fetch the message and use the fresh signed URL, or to stop depending on Discord as a host.
Do all Discord CDN links expire?
No. The reference says the standard CDN endpoints "are not signed, so they will not expire." Only signed attachment URLs — the ones carrying ex, is and hm — have the preset expiry.
I just want to send someone a video without the link dying. Send the file itself, under the upload cap for your tier. Compressing first is usually all it takes for a clip meant to be watched in a chat window, and it sidesteps expiry entirely — there is no link involved.
Quotes from Discord's developer API reference and File Attachments FAQ, checked 16 September 2026. Discord revises these pages — verify before relying on them. More numbers live in the platform limits guides, and every converter and compressor listed under all Clapr tools runs locally in your browser.