Guide

Reddit link preview: missing or wrong thumbnail

You submit a link on Reddit and the thumbnail is missing, or it is some other picture from the page. The post title is what you typed. Reddit does not publish how the thumbnail is chosen.

Reddit Help does document that a link post has a thumbnail, and that the thumbnail is not the title. The May 5, 2025 changelog says tapping the thumbnail image of a link post opens the external destination, and tapping the title opens the Reddit post. A spoiler tag blurs that thumbnail and hides the preview. Help does not name og:image, a user agent, a cache lifetime, or a button that fetches the page again.

The last public scraper is in the reddit-archive/reddit repository, which GitHub shows as archived by the owner on Nov 9, 2017. r2/r2/lib/media.py is the file that picks a thumbnail. Treat it as that old source, not as a current spec. A real link post is the check.

Check a live URL on CardScope. The free check shows the meta tags and whether og:image and og:title are set. It is not a screenshot of Reddit, and it does not edit a Reddit post. A paid check of every app still shows X, LinkedIn, Slack, Discord, and iMessage.

To sketch the words and the picture before the page is live, the link preview mockup draws X, Facebook, LinkedIn, Slack, Discord, and iMessage from text you type. It does not draw a Reddit thumbnail. The tags below are the same Open Graph set those apps read.

Checklist before you share

  1. og:image is an absolute https:// URL. In the archived fetcher, a request is built only when the URL already starts with http:// or https://. A path such as /og.png is not joined to the page, so it is not fetched. See absolute OG image URL.
  2. The tags are in the first HTML response. The archived parser is BeautifulSoup on the bytes that came back. It does not run JavaScript. See JavaScript / SPA previews.
  3. The response is your page. If a firewall returns a challenge, that response is what the parser sees. See crawler blocked.
  4. You are not looking at a spoiler. Reddit Help says a spoiler tag blurs the thumbnail and hides the preview. Turn that off before you rewrite the tags.
  5. The post title is typed, not scraped. Changing og:title does not change the title on the link post. Set og:title anyway for the other apps. Length and wording are in OG title & description.

Reddit Help does not publish a pixel size or a file-format list for the thumbnail. 1200×630 PNG or JPEG is the usual cross-app default in OG image size and OG image format, not a number from Reddit. The Open Graph image resizer crops to 1200×630 in the browser. The Open Graph tag generator writes the tags. Neither one posts to Reddit.

What the archived scraper read

For a normal HTML page, _ThumbnailOnlyScraper in media.py walks this list and stops at the first hit. The comment in that function points at the Open Graph protocol.

  1. og:image. The first <meta property="og:image">, or if there is none, the first <meta name="og:image">. A later tag does not override an earlier one.
  2. og:image:url. The same lookup, on property and then name.
  3. <link rel="image_src" href="...">. The href is used as written.
  4. A page <img>. Only when the three tags above are absent. Relative img sources are joined to the page URL. Images smaller than 5,000 pixels of area are skipped. Images whose long side is more than 1.5 times the short side are skipped. A file name containing sprite is penalized. The largest remaining image wins.

That 1.5 ratio is only the fallback. An og:image is returned before the heuristic runs, so a 1200×630 image is not rejected for being wide when it is the og:image. It can be skipped when it is only an <img> on a page with no og:image. That is a reason the thumbnail is the wrong picture: the tag is missing, and the fallback prefers a smaller, squarer image.

If the response Content-Type contains image, the archived code uses the link URL itself and does not look for tags. If the type contains neither image nor html, it returns no thumbnail. og:title, og:description, and twitter:image do not appear in media.py.

A protocol-relative image (//cdn.example.com/og.png) is given the page’s scheme, then fetched. Anything that still does not start with http:// or https:// is not requested. Reddit Help does not say that an http:// image is rejected. The archived fetcher requests one as http. Prefer https so the same URL works for the other apps.

Embedly is a different path

The same file can ask Embedly before it reads Open Graph. That happens only when an Embedly API key is configured and the URL matches Embedly’s service list. A photo response uses the oEmbed url. Anything else uses thumbnail_url. If that thumbnail is missing, the Open Graph scraper runs. r2/example.ini says that with no key, the scraper only fetches thumbnails.

Reddit’s current AutoModerator documentation still says the embedded media object’s author, author URL, title, and description come from embed.ly, and it points moderators at http://embed.ly/extract. That article does not mention og:image, and it does not say those fields are the link post’s title or its thumbnail. Opening https://embed.ly/extract on Oct 21, 2026 returned Embedly’s Extract API page. This guide did not get a thumbnail back from it, so do not treat that URL as a debugger.

A minimal set

The archived thumbnail scraper uses the image line. The title, description, width, and height are here for the other apps, and because you will check this page in CardScope too.

<meta property="og:title" content="A specific title, not the brand name">
<meta property="og:description" content="One sentence that matches the page.">
<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 property="og:url" content="https://example.com/permalink">

Put that block in the server HTML. One og:image is enough. If you also keep an old image_src or a second og:image, the archived parser still stops at the first og:image.

Check the live HTML

Read the first response, not the Elements panel after JavaScript has run. View-source on the same URL should show the same tags.

curl -sL https://example.com/your-page | grep -iE 'og:image|og:title|image_src'
curl -sI https://example.com/og.png

The image response should be an image, and the URL you grepped should be absolute https://. Open that image URL in a private window.

The archived config sets the scraper user agent to Mozilla/5.0 (compatible; redditbot/1.0; +http://www.reddit.com/feedback). Reddit Help does not document the user agent production sends now, so a curl with that string only shows what your server does for that old header. It is not proof of what Reddit fetches today.

curl -sI -A 'Mozilla/5.0 (compatible; redditbot/1.0; +http://www.reddit.com/feedback)' \
  https://example.com/your-page

If that request is a 403, a challenge, or a login page, your real tags are not in the body yet. Fix the firewall before you edit tags. Allowing that exact string is not a documented Reddit requirement.

After you change the tags

Reddit Help does not document a public debugger that re-fetches one URL for everyone, and it does not publish a cache lifetime. In the archived _set_media, a link post that already had a thumbnail or a media object was left alone unless the scrape was called with force. That force path is not a button in the help center.

Confirm the live tags first (curl, view-source, or a CardScope check). Then submit a new link post if you want to see what Reddit shows for that URL now. This page does not claim that a new post rewrites an older one, and it does not name a wait time.

Clear Open Graph cache is for Slack, X, LinkedIn, Discord, Facebook, and iMessage, where a few of them have a public debugger. Bluesky stores the card inside the post. Mastodon stores one card per URL on each server. Reddit’s help center does not give you an equivalent tool.

FAQ

What does Reddit read for a link-post thumbnail?

Reddit Help does not say. In the source archived on Nov 9, 2017, the order is og:image, then og:image:url, then rel="image_src", then a page image that passes the size heuristic. og:title is not in that file.

Does changing og:title change the post title?

No. You type the link post title. The May 5, 2025 changelog treats the title and the thumbnail as different targets. Set og:title for the other apps, not because Reddit will replace the title you typed.

Why is the thumbnail the wrong image?

The first og:image wins in the archived parser. If it is missing, a relative path, or not in the HTML the server sent, the fallback can pick another <img>, and it skips very small and very wide ones. A spoiler tag blurs the thumbnail even when an image was stored.

How do I make Reddit look again?

There is no Sharing Debugger equivalent in Reddit Help. The archived code did not scrape a link again once it had a thumbnail, unless force was set, and that is not a public tool. Check the live HTML, then look at a new link post.

What does a CardScope check cost?

The five previews and the fix checklist are Pro: $19 once, not a subscription. No account. A sample report is the way to see that result before you pay. The free check shows the meta tags and whether og:image and og:title are set. We parse HTML in memory and discard it — we do not store the page. The sample is not a Reddit preview either.