Create Twitter Card (twittercard) meta tags quickly, then copy and paste them into your site’s HTML head section.
<meta name="twitter:card" content="summary_large_image">
staging. subdomains behind basic auth), and Image Alt Text (up to 420 characters describing the image for screen readers).@yourbrand — the X account that owns the site) and Creator Handle (@theauthor — the article's author). For app cards add twitter:app:id:iphone / :googleplay and optional :url deep-link; for player cards add twitter:player (HTTPS iframe URL), twitter:player:width, and twitter:player:height.<meta> Block: Click Generate / Copy to grab the full HTML snippet. Paste it inside <head> on every page you want to share — most static-site generators (Next.js, Hugo, Astro, Jekyll) inject these per-page from frontmatter.Without twitter:card meta tags, links to your page render as a bare URL in the timeline — no image, no title, no description, no click incentive. With them, your post becomes a rich preview that takes up several lines of feed real estate and roughly doubles click-through versus a plain link. Common reasons to set them explicitly rather than rely on Open Graph fallback:
twitter:card to decide whether to render the small square (summary) or the big 2:1 hero (summary_large_image). Open Graph has no equivalent tag, so without twitter:card set explicitly, X defaults to the small thumbnail even if your og:image is 1200×630.twitter:title short and punchy for the 280-character context while keeping og:title longer for LinkedIn and Facebook. The fallback chain means missing twitter:* tags inherit from og:*, but explicit tags override.twitter:creator shows "@author" under the card and notifies that account when the link is shared widely. Open Graph has no per-post author attribution.app card surfaces "Open in App" / "Install" buttons pulling iTunes / Play Store IDs directly. No OG equivalent exists.player card embeds an HTTPS iframe so users play media without leaving X. Required for SoundCloud, Mixcloud, Vimeo-style embeds. (Manual approval needed — see the FAQ below.)?v=2) when sharing.Pair these with an Open Graph block for full social coverage. For the image asset itself, compress JPG or compress PNG to stay under the 5 MB hard cap, and use Crop Image to nail the exact 2:1 ratio. If you also need a homepage QR code in the same campaign, the QR Code Generator lives one click away.
| Property | summary | summary_large_image | app | player |
|---|---|---|---|---|
| Layout | Small square thumbnail left of title/description | Hero image above title/description | Native app card with install / open button | Inline HTML5 audio or video player |
| Image aspect ratio | 1:1 | 2:1 | App icon (handled by the store) | n/a (uses player iframe poster) |
| Image min dimensions | 144 × 144 px | 300 × 157 px | n/a | n/a |
| Image max dimensions | 4096 × 4096 px | 4096 × 4096 px | n/a | n/a |
| Image file size cap | 5 MB | 5 MB | n/a | n/a |
| Supported image formats | JPG, PNG, WEBP, GIF (no animated GIF playback) | JPG, PNG, WEBP, GIF (no animated GIF playback) | n/a | n/a |
| Whitelist / approval needed | No | No | No | Yes — manual approval from X required before the embed renders |
| Best for | Reference articles, docs, link lists | Blog posts, landing pages, product pages, news | iOS / Android apps deep-linking from a web page | SoundCloud, Mixcloud, Vimeo-style embeds |
| Tag | summary | summary_large_image | app | player |
|---|---|---|---|---|
twitter:card |
Required (summary) |
Required (summary_large_image) |
Required (app) |
Required (player) |
twitter:title |
Required (≤70 chars renders cleanly) | Required | Inherited from app store metadata | Required |
twitter:description |
Optional (≤200 chars) | Optional | Optional | Optional |
twitter:image |
Required | Required | n/a | Required (poster image) |
twitter:image:alt |
Recommended (≤420 chars) | Recommended | n/a | Recommended |
twitter:site |
Recommended (@brand) |
Recommended | Required | Required |
twitter:creator |
Optional | Optional | Optional | Optional |
twitter:app:name:iphone/:ipad/:googleplay |
n/a | n/a | Required (at least one platform) | n/a |
twitter:app:id:iphone/:ipad/:googleplay |
n/a | n/a | Required matching the name | n/a |
twitter:app:url:iphone/:ipad/:googleplay |
n/a | n/a | Optional deep link | n/a |
twitter:player |
n/a | n/a | n/a | Required (HTTPS iframe) |
twitter:player:width/:height |
n/a | n/a | n/a | Required (pixel dimensions) |
twitter:player:stream |
n/a | n/a | n/a | Optional MP4 raw stream URL |
Open Graph fallback: when twitter:title, twitter:description, or twitter:image are missing, X falls back to og:title, og:description, and og:image respectively. twitter:card itself has no OG equivalent — you must set it explicitly to get anything beyond the default small-image layout.
X removed the preview functionality from the official Card Validator at cards-dev.twitter.com/validator in August 2022 and the tool has been effectively deprecated since the rebrand. The validator URL still resolves but no longer renders previews. X's own guidance is to use the Tweet Composer on x.com or the mobile apps — paste your URL into a draft tweet and the card preview that appears is the canonical preview. For automated checking, popular third-party debuggers include opengraph.xyz, metatags.io, and socialpreviewhub. None of them clear X's cache; only X's crawler can refresh that, on roughly a 7-day cycle.
For summary_large_image, X documents a 2:1 aspect ratio, minimum 300 × 157 px, maximum 4096 × 4096 px, and file size ≤5 MB. Supported formats are JPG, PNG, WEBP, and GIF (animated frames do not animate inside the card). The current sweet spot is 1200 × 628 (or 1200 × 630, which also works on Facebook, LinkedIn, Discord, and Slack). For summary, the requirement is 1:1 minimum 144 × 144 px, same 4096 × 4096 / 5 MB ceiling.
In rough order of likelihood: (1) X has cached an older version of the URL — append ?v=2 (or any unused query) when sharing to force a fresh fetch. (2) Your image is not publicly reachable — staging hosts, basic auth, signed S3 URLs, and CDNs that block unknown bots all fail. The X crawler must be able to GET the image anonymously over HTTPS. (3) robots.txt blocks Twitterbot — add an explicit User-agent: Twitterbot Allow: / rule. (4) The image exceeds 5 MB or uses an unsupported format. (5) twitter:card is missing entirely, so X falls back to the small layout regardless of og:image size.
twitter:* tags if I already have og:* set?For twitter:title, twitter:description, and twitter:image, no — X falls back to og:title, og:description, and og:image when the Twitter-specific tag is missing. But for twitter:card itself, yes — there is no Open Graph equivalent. Without twitter:card, X defaults to the small summary layout even when your og:image is a 1200×630 hero. The minimum viable setup if you already have a complete og:* block is just one extra tag: <meta name="twitter:card" content="summary_large_image">.
X's card crawler caches scrape results for roughly seven days and there is no public API to flush that cache. Three practical workarounds: (1) Add a cache-busting query parameter (?v=2, ?refresh=1) when sharing — X treats the new URL as a fresh fetch. (2) Wait out the cycle — about a week after your meta tags change, organic shares will pick up the new card. (3) For high-value campaigns, change the canonical URL (e.g., /launch → /launch-2) so the crawler treats it as new content. Note that opengraph.xyz and metatags.io previews refresh on every fetch, so they're useful for confirming your tags are correct even while X still serves the old preview.
The player card type is not self-serve. You must submit your domain for manual approval through X's Player Card Approval process before the embed renders for users. Approval requirements include: the player must work in all X clients (web, iOS, Android), no sign-in walls, no banners or non-standard UI inside the iframe, no mixed-content warnings, and HTTPS only. Until your domain is approved, the markup is parsed but the card displays as a plain link. This is why most independent publishers use summary_large_image and link out to their player rather than embedding inline.
The most common replacements are Tweet Composer itself (paste the URL into a new tweet draft — the rendered preview is canonical), opengraph.xyz (free, no signup, shows OG + twitter + LinkedIn previews side by side), metatags.io (similar, with an editable mock-up), socialpreviewhub.com, and opentweet.io's X Card Validator. For continuous monitoring, headless-Chrome scripts that scrape your own <head> and compare against expected values catch regressions before they ship. None of these tools can clear X's cache — they only confirm your tags are syntactically correct and resolve to the right image.
name= or property=?Twitter/X tags use name="twitter:card" (HTML5 meta name), while Open Graph tags use property="og:title" (RDFa). X's parser is forgiving — it will accept property="twitter:card" too — but the spec is name=. The content value for twitter:card is case-sensitive: summary_large_image works, Summary_Large_Image does not. Handles in twitter:site and twitter:creator must start with @ and are case-insensitive (@xconvert and @XConvert both resolve to the same account).
og:image and twitter:image?Yes, and that's the common pattern. A single 1200 × 630 JPG or PNG works for both, with og:image driving Facebook, LinkedIn, Discord, Slack, iMessage, and most other previewers, while twitter:image (or the OG fallback) drives X. The only edge case is the small summary card — if you specifically want X to show a square thumbnail while LinkedIn shows a hero, supply both twitter:image (square 144×144 to 4096×4096) and og:image (rectangular 1200×630), and set twitter:card to summary.