Discord Link Preview
Discord unfurls a pasted link by fetching the page and reading the HTML. Paste a URL to see the Open Graph tags that preview is built from. The large image, the thumbnail, and the accent color are on the Discord Embed Preview page.
How Discord unfurls a link
- The fetch. Discord's link preview docs describe one GET of the URL that was shared. The tags have to be in that HTML. Discord does not execute the page, so a tag added by a client-side script is never seen. The response has to be HTTP or HTTPS, status 2xx, content type text/html or application/xhtml+xml, and not a download (Content-Disposition: attachment). Discord follows at most 5 redirects, reads at most 50 MB, and the whole fetch, including measuring images and video, has to finish within 10 seconds. The user agent they publish is Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com). Their support page says to look for the word Discordbot in that agent, and to check the IP against Discord's published ranges when a firewall decision depends on it, because the user agent string can be copied.
- Open Graph, then oEmbed. The title is the first non-empty og:title or twitter:title. The description is og:description, then twitter:description. og:site_name is the name above the title. The image comes from og:image, og:image:url, og:image:secure_url, twitter:image, or twitter:image:src. For the title, the description, and the site name, the first non-empty tag wins. For layout, color, and date, the last tag in the document wins. twitter:card values of player, summary_large_image, and photo change the layout. theme-color sets the accent, as #RRGGBB or #RRGGBBAA. JSON oEmbed is discovered from the first link with type application/json+oembed, and it runs after Open Graph. Its title is used only when no Open Graph or Twitter title was found. thumbnail_url is used only when no Open Graph image was found, and it is dropped unless thumbnail_width and thumbnail_height are both set. author_name and author_url are the author line Discord documents. provider_name and provider_url replace og:site_name and add a link. type sets the layout only when og:type and twitter:card did not. html, url, width, height, and cache_age are ignored, and a failed oEmbed fetch is ignored. The Discord Embed Preview page is the large image summary_large_image selects.
<meta property="og:site_name" content="Example"> <meta property="og:title" content="Page title"> <meta property="og:description" content="One or two sentences."> <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"> <link type="application/json+oembed" href="https://example.com/oembed?url=https://example.com/page"> - Why the preview fails. The preview is missing when those tags are absent from the server HTML, the status is not 2xx, the redirect chain is longer than 5, or the fetch does not finish in 10 seconds. Discord drops the whole preview when og:site_name is over 256 characters, image alt text is over 4,096 characters, or any URL is over 2,048 characters. A title over 70 bytes is trimmed. A description over 350 bytes is trimmed, and HTML in it is shown as text. On og:type rich, that description is rendered as Discord markdown. The image formats they list are png, gif, jpg, jpeg, webp, and avif. A relative image URL has to start with /. Two or more og:image tags become a gallery, and at most 4 are shown. A URL that points straight at an image file previews with no metadata. Video is mp4, webm, or mov, served over https, with og:image as the frame. Their quick start uses a 1200×630 image. The docs publish no minimum pixel size. The Open Graph Image Size page is the sizes other platforms do publish.
- Check it with Peekly. Paste the public URL above. Peekly reads the HTML your server sends and grades og:title, og:description, og:image, og:site_name, theme-color, and twitter:card. It uses the first og:image. It does not request your oEmbed URL, and it does not send Discordbot. Discord caches a preview for about 30 minutes, and resharing that URL in the window shows the stored card. The way their docs show a change immediately is a new query string, such as ?v=2. The Embed Debugger at discord.com/developers/embeds shows the tags Discord read and the layout it chose. A message already sent keeps its embed. The Refresh a Link Preview Cache page lists that cache next to the other platforms.
Tags covered: og:title · og:description · og:image · og:site_name · twitter:card · theme-color · application/json+oembed
More checkers
Twitter Card ValidatorOpen Graph CheckerLinkedIn Link Preview CheckerDiscord Embed PreviewWhatsApp Link Preview CheckerSlack Link Preview CheckeriMessage Link Preview CheckerFacebook Link Preview CheckerOpen Graph Image SizeTelegram Link Preview CheckerReddit Link Preview CheckerNext.js Open GraphRefresh a Link Preview CacheBluesky Link Preview CheckerMastodon Link Preview CheckerMicrosoft Teams Link Preview CheckerFix a Broken Open Graph PreviewInstagram Link Preview CheckerPinterest Link Preview CheckerTikTok Link Preview CheckerYouTube Link Preview CheckerThreads Link Preview CheckerSnapchat Link Preview CheckerHow to Add Open Graph TagsOpen Graph Image Not UpdatingX (Twitter) Link PreviewWordPress Open GraphShopify Open GraphAll platforms
What each platform reads
- X / Twittertwitter:card, twitter:* → og:* fallback1200×630 (min 300×157), < 5 MB
- Facebookog:title, og:description, og:image1200×630, 1.91:1
- LinkedInog:title, og:image (og: only)1200×627, 1.91:1
- Discordog:site_name, og:*, theme-color, twitter:cardLarge image needs summary_large_image
- Slackog:site_name, og:title, og:description, og:image1200×630
- WhatsAppog:title, og:description, og:imageKeep < 300 KB
Guidance based on each platform's public documentation and observed behavior. Platforms change their rules without notice.
FAQ
+Is Peekly free?
Yes. Checking a single URL is free forever — no signup and no limit on one-off checks. Batch watching and monitoring may arrive later as a paid Pro plan; the free single-URL tool stays.
+Why does my link show no image when I share it?
Usually one of four things: there's no og:image tag, the image URL is relative instead of absolute, the image is behind a login, firewall or bot block, or the file is too big or in an unsupported format like SVG. Peekly checks all four and tells you which one it is.
+What size should my og:image be?
1200×630 pixels (a 1.91:1 ratio) as a PNG or JPG under about 300 KB. That size works for large cards on X, Facebook, LinkedIn, Discord, Slack and WhatsApp.
+Do I need twitter: tags if I already have Open Graph tags?
X reads og:title, og:description and og:image as fallbacks, but you still need twitter:card set to summary_large_image if you want the big image card. Without it, X shows a small thumbnail.
+I fixed my tags but the old preview still shows. Why?
Platforms cache link previews, sometimes for days. Facebook and LinkedIn let you force a refresh with their own debugging tools. On X, Slack and Discord the cache usually expires on its own, or you can add a query string such as ?v=2 to the URL.
+Do you store the pages I check?
No. We fetch the page once to read its <head>, show you the result, and don't save the page or the result. We only fetch public http(s) URLs, and private or internal addresses are blocked.
+Are the previews pixel-perfect?
They're close approximations of each platform's current card layout, built from the same tags the platforms read. Platforms change their designs from time to time, so treat them as a very good guide rather than a screenshot.
$9
One time
A written fix for the batch.
Up to 25 URLs. We check og:image, Twitter cards, size, redirects, and cache, then send copy-paste meta tags within 48 hours. The free single-URL check stays free.