Guide
Twitter Card types: summary vs summary_large_image
X keeps its own twitter:* tags even when og:* is complete. Open Graph describes the page. twitter:card picks the X layout: summary is a small thumbnail beside the title, and summary_large_image is a large landscape photo above the title and domain. Choose from the image you have. LinkedIn, Slack, and iMessage ignore twitter:card and keep reading Open Graph.
CardScope fetches the URL from the edge and rebuilds diagnostic shells from the tags it finds. It is not a pixel-perfect X UI. Use CardScope to confirm live twitter:card, the image URL, and the Open Graph fallback. Use a fresh X composer when you need the live card — see clear Open Graph cache.
Why X has its own twitter:* tags
twitter:card— the layout switch. Open Graph has no equivalent. A finishedog:title/og:description/og:imageset still does not tell X whether to show a small thumb or a large photo.twitter:title,twitter:description,twitter:image— optional overrides. When they are absent, X often fills those fields fromog:*.- Other clients — LinkedIn ignores
twitter:*. Shipping only Twitter tags leaves LinkedIn as a bare URL. See LinkedIn vs X. - Other card values —
playerandappexist for video players and app installs. Articles, docs, and product pages almost always wantsummaryorsummary_large_image.
summary vs summary_large_image
| Card | What X shows | Use it when |
|---|---|---|
summary |
Small thumbnail beside the title and a short description | Square icon, avatar, or logo — the sentence matters as much as the picture |
summary_large_image |
Large landscape photo above the title and domain. The description is typically omitted on the card | You have a wide hero (start at 1200×630) and the picture is the point |
A 1:1 image on summary_large_image letterboxes. A 1200×630 hero on summary shrinks to a thumb and hides the crop you designed. Size notes live in the OG image size guide. Discord also reads twitter:card when it chooses a large embed; LinkedIn does not. See Slack vs Discord and LinkedIn vs X.
What X uses when Twitter fields are missing
X reads twitter:* first, then falls back to Open Graph, then to the document <title> and meta description:
- Title —
twitter:title, thenog:title, then<title>. X usually cuts around 70 characters. - Description —
twitter:description, thenog:description. It shows onsummary. The large card usually drops it. - Image —
twitter:image(ortwitter:image:src), thenog:image. The URL needs to be absolutehttps://. Relative paths get dropped — see absolute vs relative OG image URL.
That fallback does not replace twitter:card. The tag still chooses large vs small. If it is missing, X may not render a card at all, even when Open Graph is complete. Set it.
You do not have to duplicate every field. If the X title and image should match the page, og:title, an absolute og:image, and twitter:card are enough for the large card. Add twitter:title or twitter:image only when X should differ — a shorter line, or a crop made for the large card. Length notes are in the OG title & description guide.
Common mistakes
| Mistake | What you see | Fix |
|---|---|---|
| Wrong type for the aspect | A square letterboxes on the large card, or a wide hero becomes a tiny thumb | Match summary to a square and summary_large_image to ~1.91:1 (1200×630) |
Relative twitter:image |
/og.png or a path without a host. X drops it |
Use an absolute https:// URL. A relative Twitter image is its own bug even when og:image is fine |
| Large card, no usable image | summary_large_image with neither twitter:image nor og:image as an absolute, fetchable file |
You can omit twitter:image when og:image is the same absolute landscape file. You cannot omit both |
| Mismatched titles | twitter:title and og:title say different things, or one runs well past ~70 characters and X clips a different string than LinkedIn |
Keep them aligned unless a shorter X title is intentional |
HTTP image URLs get dropped the same way relative ones do. After the tags are right, X can still show an old card. Verify the live HTML, then refresh the cache — the clear Open Graph cache guide covers that step.
A minimal set
For a large landscape card, this is enough when the X title should match the page:
<meta property="og:title" content="A specific title, not the brand name">
<meta property="og:description" content="One sentence, 70–110 characters.">
<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="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://example.com/og.png">
For a small card, set twitter:card to summary and point the image at a square file, still on absolute https://. Add twitter:title only when it should differ from og:title. Same foundation as the Facebook, LinkedIn vs X, Slack vs Discord, WhatsApp / Telegram, and iMessage guides — one solid Open Graph set, then twitter:card for X’s layout.
Checklist before you ship
- Pick the layout from the image —
summaryfor a small square,summary_large_imagefor a landscape hero. - Set
twitter:cardto that value. Do not leave it unset and hope Open Graph implies a layout. - Use absolute
https://image URLs ontwitter:imageandog:image. The same file is fine. No relative paths. - Match the aspect — about 1200×630 for the large card. A square is fine for
summary. - Keep titles in agreement and short enough that X’s ~70 character clip still reads. Description matters on
summary; the large card usually hides it. - Verify with CardScope — reconstructed shells, the tag table, and the checklist — then refresh X if an old card is cached.
FAQ
What is the difference between summary and summary_large_image?
summary is a small thumbnail beside the title and a short description. summary_large_image is a large landscape photo above the title and domain; the description usually does not appear on that card. Choose the type that matches the image you actually have. Crop and size notes are in the OG image size guide.
Does X use Open Graph when Twitter tags are missing?
Often, for the text and the image. X prefers twitter:title, twitter:description, and twitter:image, then falls back to og:title, og:description, and og:image, then to the document title and meta description. twitter:card is not filled in by Open Graph. Set it, or X may not render a card.
Why keep twitter:card if og:image is already set?
og:image supplies a picture. twitter:card chooses the layout: a small thumb or a large landscape photo. A complete Open Graph image on the wrong card type still looks wrong. LinkedIn ignores twitter:card and keeps reading Open Graph — see LinkedIn vs X.
What are the common Twitter Card mistakes?
A card type that does not match the image aspect, a relative twitter:image, summary_large_image with no absolute image on twitter:image or og:image, and a twitter:title that does not match og:title or runs long enough to clip. Fix the tags, verify them, then refresh the X cache if the old card sticks. Image URL rules are in the absolute OG image URL guide; title length is in OG title & description.
Is CardScope free?
Three free checks per day per IP, no account. Pro is $19 once for unlimited checks. We parse HTML in memory and discard it — rate limits store a hash of your IP for 48 hours, not the page.
Check a URL on CardScope
Paste the permalink. You get reconstructed shells for the clients CardScope supports, the tag table, and a fix checklist — so you can see whether twitter:card is summary or summary_large_image, and whether the image falls back to Open Graph. These shells are built from tags. They are not a pixel-perfect X UI. Three free checks per day per IP, no account. Pro is $19 once if you want unlimited checks. We parse HTML in memory and discard it — rate limits store a hash of your IP for 48 hours, not the page.