# Twitter card: size, types and meta tags for X link previews

> Twitter card image sizes, summary vs summary_large_image, every twitter: meta tag with its Open Graph fallback, and why a card does not show on X.

Published 2026-11-04 · https://shareglint.com/en/twitter-card

A **Twitter card** is the preview X draws under a post that contains a link: an image, a title, a description and the domain. You choose its layout with one tag, `<meta name="twitter:card" content="summary_large_image">`; for the rest X reads its own `twitter:` tags or, when they are missing, your Open Graph tags. The large card wants a **2:1** image between 300×157 and 4096×4096 pixels, under 5 MB — in practice the same **1200×630** image every other platform uses.

## Card types

X documents four card types ([X cards markup, archived](https://web.archive.org/web/20260116124848/https://developer.x.com/en/docs/x-for-websites/cards/overview/markup)):

| `twitter:card` | What it shows | Use it for |
|---|---|---|
| `summary` | A small square image beside the title and description | Pages without a designed image; a logo or avatar |
| `summary_large_image` | A wide image across the card | Articles, products, anything with a 1200×630 og:image |
| `player` | An inline video or audio player in an iframe | Media you host, needs HTTPS and an approved player |
| `app` | An app with install links | Mobile apps in the App Store or Google Play |

The old Photo and Gallery cards were deprecated and are now drawn as `summary_large_image` ([X docs, archived](https://web.archive.org/web/20260112050218/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary-card-with-large-image)). If you are not sure, use `summary_large_image`.

## Twitter card image size

| | `summary_large_image` | `summary` |
|---|---|---|
| Aspect ratio | 2:1 | 1:1, cropped to a square |
| Minimum | 300×157 px | 144×144 px |
| Maximum | 4096×4096 px | 4096×4096 px |
| File size | under 5 MB | under 5 MB |
| Formats | JPG, PNG, WEBP, GIF (first frame only); no SVG | same |

Sources: X's [summary card with large image](https://web.archive.org/web/20260112050218/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary-card-with-large-image) and [summary card](https://web.archive.org/web/20251216122910/https://developer.x.com/en/docs/x-for-websites/cards/overview/summary) pages. X's card documentation moved off developer.x.com, so these are the last archived copies.

Two practical consequences:

- **1200×630 is fine for X.** It is 1.91:1, close to the 2:1 X asks for and inside its limits, and it meets Facebook, LinkedIn and WhatsApp too. Keep text away from the edges; the [OG image size table](https://shareglint.com/en/og-image-size) shows each platform's crop.
- **A wide image in a `summary` card is cut to a square** from the middle. If your card shows a slice of a headline, the page is missing `twitter:card` or sets `summary`.

## Every twitter: tag

| Tag | Falls back to | What it holds |
|---|---|---|
| `twitter:card` | — | The card type. Without it, if `og:type`, `og:title` and `og:description` exist, "a summary card may be rendered" |
| `twitter:title` | `og:title` | Title, max 70 characters |
| `twitter:description` | `og:description` | Description, max 200 characters |
| `twitter:image` | `og:image` | Image URL; under 5 MB |
| `twitter:image:alt` | `og:image:alt` | Image description for screen readers, max 420 characters |
| `twitter:site` | — | `@username` of the website |
| `twitter:site:id` | — | The same as a numeric user ID |
| `twitter:creator` | — | `@username` of the author |
| `twitter:creator:id` | — | The same as a numeric user ID |
| `twitter:player` | — | HTTPS URL of the player iframe (player card) |
| `twitter:player:width`, `twitter:player:height` | — | Iframe size in pixels |
| `twitter:player:stream` | — | URL of the raw video or audio stream |
| `twitter:app:name:iphone`, `:id:iphone`, `:url:iphone` | — | App card: name, App Store ID, custom URL scheme (also `:ipad`, `:googleplay`) |

The two X pages disagree on `twitter:site`: the markup reference says "Either twitter:site or twitter:site:id is required", the card pages mark it optional. Set it when you have an account to attribute the card to.

## The minimal markup

If the page already has Open Graph tags, X needs one more line:

```html
<meta property="og:title" content="How we cut our image pipeline to 900 ms">
<meta property="og:description" content="Moving rendering off the request path and caching by content hash.">
<meta property="og:image" content="https://example.com/og/image-pipeline.png">
<meta property="og:image:alt" content="Title card: How we cut our image pipeline to 900 ms">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@example">
```

Set `twitter:title`, `twitter:description` or `twitter:image` only when X should get something different from everyone else — a shorter title that fits 70 characters, or a 2:1 crop of a square image. Twitter Card tags use `name=`; Open Graph uses `property=` ([ogp.me](https://ogp.me/)). Most parsers accept either, but following each spec avoids surprises with strict ones. The full list of `og:` properties is on the [Open Graph reference](https://shareglint.com/en/open-graph).

## How X fetches the card

X's crawler identifies itself as `Twitterbot` (for example `Twitterbot/1.0`). When a link is first posted it downloads the page, reads the tags from the HTML and downloads the image. What follows from that:

- **The tags must be in the server's HTML.** Twitterbot does not run your JavaScript. A React or Vue app that sets meta tags in the browser shows no card; render the tags on the server or at build time.
- **Twitterbot must be allowed in.** X's troubleshooting guide lists `robots.txt` rules, `.htaccess` deny lines, CMS settings and hosts blocking its IP ranges as the usual reasons a card is missing, and notes the crawler "will typically download up to 5MB images" ([X troubleshooting, archived](https://web.archive.org/web/20241202114848/https://developer.x.com/en/docs/twitter-for-websites/cards/guides/troubleshooting-cards)). Bot protection that serves a challenge page has the same effect.
- **HTTPS must work for an old client.** The same guide asks for TLS 1.1 or newer and a correct certificate chain.
- **Cards are cached.** X re-crawls a page "roughly every seven days". There is no button to refresh it: to see a change sooner, share a URL X has not seen (add `?v=2`) and give a new image a new file name.

## Testing a card

The old Card Validator at `cards-dev.x.com/validator` now redirects to an X login (checked 2026-11-04). Three ways that work:

1. **The X composer.** Paste the URL into a new post; the card appears in the draft. You do not need to publish.
2. **A validator that reads the tags.** Our [Twitter card validator](https://shareglint.com/en/tools/twitter-card-validator) fetches the page as a crawler, shows the card X would draw and the tag it used for each field, and flags a missing `twitter:card`, a relative image URL or an image under the minimum.
3. **curl.** See exactly what Twitterbot receives:

```bash
curl -sL -A "Twitterbot/1.0" https://example.com/blog/post \
  | grep -Eio '<meta[^>]+(og:|twitter:)[^>]+>'
```

If curl shows the tags and the image URL opens in a private window, the remaining suspects are bot protection and X's cache. The [debugging guide](https://shareglint.com/en/guides/og-image-not-showing) goes through each cause on every platform.

## Common mistakes

| Symptom | Cause | Fix |
|---|---|---|
| Small square thumbnail instead of a wide image | No `twitter:card`, or `summary` | `<meta name="twitter:card" content="summary_large_image">` |
| Headline cut off in the image | Wide image shown in a `summary` card, or text near the edges | Use `summary_large_image`; keep text in the centre |
| No card at all | Twitterbot blocked, tags added by JavaScript, image over 5 MB or SVG | Check `robots.txt` and bot rules; render tags on the server; serve JPG/PNG |
| Old image after an update | X's ~7-day cache keyed by URL | New image file name; share a changed URL |
| Card works on Facebook, not X | Facebook re-scraped, X did not; or X blocked by a firewall rule | Wait or change the URL; allow Twitterbot |

## One image for every card

The image is the part that takes work: every post needs its own, at 1200×630, with the title readable at phone size. Shareglint renders it from an HTML template and the page's title with one HTTP request — 153 built-in templates or your own HTML and CSS — and the same template renders in every size from one request (og 1200×630, square 1080×1080, portrait 1080×1350, story 1080×1920, pinterest 1000×1500, youtube 1280×720), so the card for X and LinkedIn, a square for Instagram and a tall pin for Pinterest come from one design. The free plan covers 100 images a month.

## FAQ

### What size is a Twitter card image?

For summary_large_image: a 2:1 aspect ratio, at least 300×157 and at most 4096×4096 pixels, under 5 MB. For the small summary card: 1:1, at least 144×144, at most 4096×4096, under 5 MB; it is cropped to a square. 1200×630 works for the large card and for every other platform.

### What is the difference between summary and summary_large_image?

summary shows a small square thumbnail beside the title; summary_large_image shows a wide image across the card. Pages with a designed 1200×630 og:image should use summary_large_image, or the image is cropped to a square.

### Do I need twitter: tags if I have Open Graph tags?

Only twitter:card. X falls back to og:title, og:description, og:image and og:image:alt when their twitter: versions are missing, but twitter:card has no Open Graph equivalent: without it X may render the small summary card.

### Why does my Twitter card not show?

The usual causes: Twitterbot is blocked by robots.txt, a firewall or bot protection; the image URL is relative, behind a login, over 5 MB or an SVG; the tags are added by JavaScript after load; or X still has an old version cached, which it re-crawls roughly every seven days.

### Is there still a Twitter Card Validator?

The old validator at cards-dev.x.com redirects to an X login. The dependable test is to paste the link into the X post composer, which draws the card without posting, or to use a third-party validator that shows the tags X reads.

### Can a Twitter card image be a GIF or WebP?

Yes. X documents JPG, PNG, WEBP and GIF; only the first frame of an animated GIF is used, and SVG is not supported.
