# Why your link preview is wrong on X and LinkedIn

X documents a **7-day card cache**; LinkedIn says allow **48 hours**, or use its **Post Inspector** to refresh the
preview for new posts. First fix the tags and image in the page's `<head>`: refreshing a cache won't fix a missing
`og:image`, a blocked crawler or the wrong `twitter:card` type.

**Checked on October 27, 2026.**

## What each network reads

| Card part | X reads | LinkedIn reads |
|---|---|---|
| Card type | `twitter:card`: `summary_large_image` or `summary` | No card type |
| Title | `twitter:title`, else `og:title` | `og:title` |
| Description | `twitter:description`, else `og:description` | `og:description` |
| Image | `twitter:image`, else `og:image` | `og:image` |
| Image description | `twitter:image:alt`, else `og:image:alt` | Not documented |
| Page address | Not documented | `og:url` |
| Site attribution | `twitter:site` or `twitter:site:id` | No equivalent in LinkedIn's list |

X's [Cards markup reference](https://web.archive.org/web/20260201012312/https://developer.x.com/en/docs/x-for-websites/cards/overview/markup)
lists each `twitter:` tag beside the Open Graph tag it falls back to, and its
[getting started guide](https://web.archive.org/web/20260206065645/https://developer.x.com/en/docs/x-for-websites/cards/guides/getting-started)
says X looks for the Twitter tag first, then the Open Graph one. So the `og:` title, description and image can serve
both networks; add a `twitter:` version where X should show something different. X's reference caps the title at 70
characters, the description at 200 and the image description at 420. Its own tags also cover:

- **The card type.** `twitter:card` has no Open Graph equivalent. Without it, X's reference says a small `summary` card
  *may* be drawn from `og:type`, `og:title` and `og:description`. For the wide image card, set `twitter:card` to
  `summary_large_image`. If a page has more than one `twitter:card`, X uses the last.
- **Site attribution.** The markup reference requires either `twitter:site` (the site's X handle) or `twitter:site:id`
  (its numeric X account ID); neither has an Open Graph fallback.
- **Name or property.** X's examples use `name="twitter:…"`; Open Graph uses `property="og:…"`. X's guide says its
  parser falls back to `property`, so existing Open Graph markup needs no change.

LinkedIn's [shareable-website help](https://www.linkedin.com/help/linkedin/answer/a521928) lists four `og:` tags that
must exist: `og:title`, `og:image`, `og:description` and `og:url`. Its
[URL troubleshooting help](https://www.linkedin.com/help/linkedin/answer/a525063/issues-sharing-urls-troubleshooting?lang=en)
says the share box relies on oEmbed and Open Graph, and without them may pull other content from the page. Neither
page mentions `twitter:` tags, so don't count on them for LinkedIn.

A shared head for LinkedIn and X's large-image card (replace the example handle with the site's own):

```html
<title>How we cut our export time in half</title>
<meta property="og:title" content="How we cut our export time in half">
<meta property="og:description" content="Three changes, measured on real exports.">
<meta property="og:image" content="https://example.com/cards/export.jpg">
<meta property="og:image:alt" content="Export time falling from 40 to 18 seconds">
<meta property="og:url" content="https://example.com/blog/export-time">
<meta property="og:type" content="article">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@example">
```

Put the tags in the `<head>`, give each one once, and use a full `https://` address for the image. Tags a script adds
after the page loads may never be seen: neither network's documentation says its crawler runs scripts, and Flaghand's
reader doesn't.

## What X draws today

Measured on x.com on October 26, 2026. X's documentation doesn't describe today's layout, and it can change.

- **The large card** (`summary_large_image`): the image across the post at 1.91:1, 516 × 270 px on desktop, the title on
  one line in a dark label over its lower left corner, and "From example.com" under it. It shows no description.
- **The small card** (`summary`): X documents a square image crop. A large-card tag is not enough on its own: the page
  and image must also be reachable and meet X's requirements below.

X's guide adds that a post shows one card at most, that attached photos or video take its place, and that with several
links the first one with a card is used.

## What LinkedIn draws today

Measured on linkedin.com on October 26, 2026: a link in a feed post shows a 16:9 thumbnail, 128 × 72 px, beside the
title on up to two lines and the domain. LinkedIn's help doesn't say what it shows without `og:title` beyond "other
content from the page", so set it.

## Image sizes, and what each card cuts

| | X large card | X small card | LinkedIn |
|---|---|---|---|
| Shape X or LinkedIn documents | 2:1 | 1:1 | 1.91:1, recommended |
| Smallest documented | 300 × 157 | 144 × 144 | 1200 × 627 |
| Largest documented | 4096 × 4096, under 5 MB | 4096 × 4096, under 5 MB | 5 MB |
| Drawn at (measured) | 516 × 270, 1.91:1 | Square crop (documented) | 128 × 72, 16:9 |
| A 1200 × 630 image | Shown whole | Cut 24% from each side | Cut 3% from each side |

X's [large-card page](https://web.archive.org/web/20260204074639/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary-card-with-large-image)
and [small-card page](https://web.archive.org/web/20260128060618/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary)
take JPG, PNG, WebP and GIF (only an animated GIF's first frame), not SVG, and ask for an image unique to the page
rather than a site logo or author photo used across many pages. LinkedIn's sharing help gives the size and weight; its
list of file types (JPG, PNG or GIF) is for single image ads, so a JPG or PNG is the safe choice for both networks.

A 1200 × 630 JPG or PNG works for both: X's large card shows all of it and LinkedIn's thumbnail trims only the sides.
Keep words and faces away from the left and right edges, and don't depend on small text, since LinkedIn draws the whole
image 128 px wide. The free [image size checker](/image-size-checker) shows how post photos and profile images crop.

## Why the card doesn't show

X's archived
[troubleshooting guide](https://web.archive.org/web/20260124210156/https://developer.x.com/en/docs/x-for-websites/cards/guides/troubleshooting-cards)
names these causes:

- **robots.txt blocks X's crawler**, Twitterbot. A blocked page shows no card; a blocked image shows no picture. To let
  X in while keeping other crawlers out, its guide's example starts with:

  ```text
  User-agent: Twitterbot
  Disallow:
  ```

- **The server, host or firewall blocks it.** X's guide mentions `.htaccess` deny rules and hosts blocking its
  addresses; bot protection that turns away unknown crawlers can do the same.
- **The image can't be fetched**: on a private or staging address, over the 5 MB X's crawler downloads, or smaller than
  the card's minimum.
- **The page is too large or its TLS too old**: X's crawler reads up to 2 MB of the page and needs TLS 1.1 or later.

On LinkedIn, its help says a missing `og:` tag lets it pull other content; an image that meets the requirements but
still doesn't appear may mean the site blocks LinkedIn from pulling it or the image sits in a protected folder; an
address with spaces in it can't be shared at all; and for a company page, a "cannot display preview" error
[may come from the landing page's SSL certificate](https://www.linkedin.com/help/linkedin/answer/a732049/troubleshoot-posts-on-your-linkedin-page?lang=en-us&intendedLocale=en).

## Why the old card is still there, and how to refresh it

### X: about seven days, with no guaranteed purge

X's archived getting started guide says a card is cached for 7 days after a link to the page is posted, and its
troubleshooting guide says X re-reads the page's card tags roughly every seven days. That is a documented interval,
not a promise that every card updates on the seventh day. The archived refresh workaround is also qualified:

1. Fix the tags and check the page's HTML source. Confirm that both the page and image can be fetched without signing in.
2. For a new post, the troubleshooting guide suggests making a new shortened URL with bit.ly and sharing that. It says
   this **may** refresh the card; it is not a guaranteed purge. Its `?x=test1` example is a way to generate another
   shortened URL, not a documented refresh button for the original address.
3. If the image file changed but its address didn't, change the image's address in the tag too, for example
   `export.jpg?v=2`: X caches images by their address. Make sure that address really serves the updated image.

X's documentation doesn't promise an immediate refresh of posts already published.

### LinkedIn: 48 hours, or Post Inspector

LinkedIn's troubleshooting help says to allow 48 hours from the last time the address was shared before trying again,
and that a developer who changed a site's tags should wait 48 hours for them to take effect. To refresh it sooner:

1. Open LinkedIn's [Post Inspector](https://www.linkedin.com/post-inspector/).
2. Paste the exact address you plan to share.
3. Inspect it and confirm that the new title, description and image are right.

LinkedIn's [Post Inspector help](https://www.linkedin.com/help/linkedin/answer/a6233775) says this changes the preview
only for new posts with the link: posts already published keep the one they have.

## When Flaghand posts the link

The two networks work differently, so Flaghand handles their link cards differently too.

**LinkedIn.** LinkedIn's [Posts API](https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/posts-api?view=li-lms-2026-10)
doesn't read link previews for posts made through it: the app must send the card's thumbnail, title and description.
So when you paste a link into a LinkedIn draft, or an agent creates a link card, Flaghand reads the page's head once:

- the title from `og:title`, then `twitter:title`, then the page's `<title>`, then the address itself;
- the description from `og:description`, then `twitter:description`, then `description`;
- the image from `og:image:secure_url`, `og:image`, `og:image:url`, `twitter:image`, then `twitter:image:src`, saved to
  your workspace if it's a JPEG, PNG, WebP or GIF. Otherwise the card has no image, with a warning, and you can
  upload one.

It reads only the `<head>`, keeps the first copy of each tag and runs no scripts. It can't read LinkedIn's own pages or
private network addresses. The card is saved with the draft and is part of what the owner approves with their passkey:
neither approval nor posting reads the page again. So LinkedIn's 48-hour cache and Post Inspector don't change a post
Flaghand makes, and neither does a tag you fix later. Remove the link and paste it again to read the page afresh (an
agent creates a new link card and puts it in the draft). An edit voids any earlier approval, so request approval again.
Because Flaghand falls back to `twitter:` tags, a page with only those can get a full card in Flaghand but not in
LinkedIn's own share box, which its help ties to oEmbed and Open Graph: give the page `og:` tags.

**X.** Flaghand posts the text with the link and sends X no card. X draws the card from the page when the post goes
live, through its own cache. Check the page's tags and image before you request approval; a Flaghand preview can't
purge X's cache or guarantee the card X will draw.

Flaghand's [draft and media documentation](https://app.flaghand.com/docs/drafts-and-media) covers link cards from the API, CLI and
MCP. An agent drafts, checks and requests approval; only the owner approves, with their passkey in the desk. No agent
token can approve, schedule or post.

## Sources

- X's Cards documentation (archived):
  [markup reference](https://web.archive.org/web/20260201012312/https://developer.x.com/en/docs/x-for-websites/cards/overview/markup)
  (each tag, its Open Graph fallback, title, description and alt lengths, image types),
  [getting started](https://web.archive.org/web/20260206065645/https://developer.x.com/en/docs/x-for-websites/cards/guides/getting-started)
  (card types, the last `twitter:card` wins, `property` fallback, robots.txt, the 7-day cache, one card per post),
  [summary card with large image](https://web.archive.org/web/20260204074639/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary-card-with-large-image)
  and [summary card](https://web.archive.org/web/20260128060618/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary)
  (shapes, minimum and maximum sizes, 5 MB), and
  [troubleshooting](https://web.archive.org/web/20260124210156/https://developer.x.com/en/docs/x-for-websites/cards/guides/troubleshooting-cards)
  (crawler blocks, 2 MB pages, TLS, the seven-day re-read, the shortened-URL workaround and changing an image address).
- LinkedIn Help: [make your website shareable](https://www.linkedin.com/help/linkedin/answer/a521928) (the four
  required `og:` tags, 1200 × 627, 1.91:1, 5 MB),
  [troubleshoot shared URLs](https://www.linkedin.com/help/linkedin/answer/a525063/issues-sharing-urls-troubleshooting?lang=en)
  (oEmbed and Open Graph, spaces, the 48-hour cache),
  [use Post Inspector to refresh a URL](https://www.linkedin.com/help/linkedin/answer/a6233775) (new posts only) and
  [troubleshoot Page posts](https://www.linkedin.com/help/linkedin/answer/a732049/troubleshoot-posts-on-your-linkedin-page?lang=en-us&intendedLocale=en)
  (the SSL certificate).
- LinkedIn's [Posts API](https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/posts-api?view=li-lms-2026-10)
  (no link scraping for posts made through the API).
- Flaghand's measurements of x.com and linkedin.com, October 26, 2026, used by its post previewers: the large X
  card and LinkedIn thumbnail sizes, layouts and crops. Neither network publishes these, and either can change them.
- Flaghand's `scheduler/src/link-cards.js`: which tags its LinkedIn cards read, in what order, and when.

[All guides](/docs/guides.md)
