Guide
Discord embed not showing
You paste a link in Discord and nothing appears under it, or you get text and no image. Discord documents how that preview is built. This page follows that document. How the same URL looks in Slack is a different question.
CardScope rebuilds a Discord preview from the tags on a fresh fetch. It is not a screenshot of the Discord app, and it does not clear Discord’s cache. The rules below are from Discord’s link preview docs. Where those docs are silent, this page says so.
What has to succeed before any preview
Discord says it makes one GET for the URL you shared and reads the HTML that comes back. All of the following have to be true:
- An HTML page over HTTP or HTTPS.
- The tags are in the HTML the server sends. Discord does not run client-side script. Tags added after load are invisible. See JavaScript / SPA previews.
- The response is a 2xx.
- Content type is
text/htmlorapplication/xhtml+xml, and the response is not served as a download (Content-Disposition: attachment). - At most 5 redirects.
- At most 50 MB.
- The whole fetch, including measuring images and video, finishes within 10 seconds.
Their crawler’s user agent contains Discordbot. Discord’s support article says matching that string is not proof the request is theirs, because anyone can fake a user agent, and that a firewall allow-list should also check their published IP ranges. If a bot challenge is what you suspect, the general case is crawler blocked.
The same docs name three limits that remove the preview entirely, rather than clipping it:
og:site_namelonger than 256 characters.- Image alt text longer than 4,096 characters.
- Any URL longer than 2,048 characters.
A title over 70 bytes or a description over 350 bytes is trimmed. Those two do not, by themselves, delete the preview. A single message previews at most 5 links; later links in that message get none. That limit is on the message, not on your tags.
twitter:card
Discord’s quick start sets twitter:card to summary_large_image and says that value shows text with a large image below it. The tag reference says the twitter:card values that change the layout are player, summary_large_image, and photo. For layout, color, and date tags, the last one in the document wins. For title, description, and site name, the first non-empty tag wins.
Those docs do not describe a separate layout for summary. If you want the large image, set summary_large_image, which is what their example does. What the same tag does on X is in Twitter Card types. Slack mostly ignores it. The side-by-side is Slack vs Discord.
Image
Discord lists these image formats: .png, .gif, .jpg, .jpeg, .webp, and .avif. Set og:image:width and og:image:height. Without them, Discord fetches the image to measure it, and that measurement counts toward the 10 second limit. Width, height, type, and alt attach to og:image and twitter:image only. They are not read on og:image:url, og:image:secure_url, or twitter:image:src, so use the plain tag names if you want the dimensions to count.
Discord does not publish a minimum pixel size. Their example is 1200×630. That size is also the usual cross-app default in OG image size, which is not a Discord minimum. Other apps are pickier about WebP, AVIF, and SVG than this format list — see OG image format before you rely on one file everywhere.
A relative image URL must start with /. An absolute https:// URL is still the right default, because other clients drop relative paths. See absolute OG image URL. If the picture is missing on more than Discord, walk og:image not showing before you keep editing this one tag.
theme-color
theme-color sets the accent color on the preview. Discord says the value has to be a 6- or 8-digit hex color:
<meta name="theme-color" content="#5865F2">
A missing color, or a value that is not #RRGGBB or #RRGGBBAA, is not documented as a reason the preview disappears. If there is no embed at all, fix the fetch and the image first. The color only paints the bar. When several theme-color tags exist, the last one wins.
Cache
Discord says previews are cached for about 30 minutes. Changing the tags and pasting the same URL shows the old preview until that expires. Their documented way to see the new preview immediately is to share the URL with a new query string, such as ?v=2. That is a different URL. It does not rewrite the preview already stored for the original link.
They also point at the Embed Debugger, which shows which tags Discord read and which layout it chose. The docs do not say the debugger deletes the cached preview for the original URL. CardScope does not clear Discord’s cache either. For Slack, LinkedIn, X, and the other apps, use clear Open Graph cache.
Tags their quick start uses
If the fetch rules above already pass, this is the set in Discord’s own example:
<meta property="og:site_name" content="Your product">
<meta property="og:title" content="A specific title, not the brand name">
<meta property="og:description" content="One sentence that still makes sense when clipped.">
<meta property="og:image" content="https://example.com/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="theme-color" content="#5865F2">
<meta name="twitter:card" content="summary_large_image">
Keep og:site_name well under 256 characters. Keep every URL under 2,048 characters.
FAQ
Why is my Discord embed not showing?
Start with the fetch. Discord requires HTML, a 2xx, tags in the server response, at most 5 redirects, and a total time under 10 seconds including image measurement. Then check the three “no preview at all” limits: site name, image alt, and URL length. A blocked Discordbot request looks the same from the channel: no preview.
Does theme-color make the embed appear?
No. It sets the accent color, and only as #RRGGBB or #RRGGBBAA. Discord does not say a bad or missing color hides the preview.
How do I refresh a Discord preview?
Discord documents a cache of about 30 minutes, and a new query string such as ?v=2 when you need to see the new tags immediately. The Embed Debugger shows how Discord read the URL. It is not documented as a purge of the original URL, and CardScope does not purge it either.
What does a CardScope check cost?
Previews for X, LinkedIn, Slack, Discord, and iMessage, plus the fix checklist, are Pro: $19 once. No account. Open a sample report if you want to see the result first. We parse HTML in memory and discard it — we do not store the page.