Bulk Open Graph & Twitter Card Validator
Data checkedOpen Graph
How to use the Open Graph and Twitter Card checker
Back to the toolEach URL is fetched once and every share tag in its head is read back: the og: family that Facebook, LinkedIn and Zalo read, and the twitter: family that X reads. One run, two answers per page.
- 01
Enter the URLs to check
Single mode checks one address and runs on Enter. Switch to Bulk to paste a list, one URL per line, up to 30 per run. Share tags are set per template, so paste one page of each kind: an article, a product, the home page. If one template is broken, every page built from it is broken too.
- 02
Choose the URL normalization level
Normalize URL rewrites each address before fetching. Full URL keeps the path and query but drops tracking parameters and the fragment; No query removes the query string; Domain only keeps the domain. Keep the full address for a shared link: the tags are read from the page the request lands on, and the query can decide which page that is.
- 03
Read the Open Graph and Twitter columns
Two columns, one fetch. Each cell lists the tag names that family declares, prefix dropped. An empty Twitter cell next to a full Open Graph one is normal and usually fine: X falls back to the og: tags for title, description and image. The one tag it cannot fall back to is twitter:card, and the panel says so.
- 04
Inspect a row and export the results
View gives each family its own conclusion, because a page can be perfect for Facebook and useless for X, or the reverse. Every tag carries the attribute it was declared with, [property] or [name], which says who can read it, not where to fix it. Copy table copies the rows tab-separated; Export CSV writes them to a file.
How to read the social share tag report
A row reads left to right: the address checked, where it landed, and what each of the two share-tag families declares there.
Result table columns
- URL
- The address exactly as it was checked — after normalization, not always what you typed.
- Resolved URL
- Where the request ended and the status it ended on. Redirects are followed first, and the tags are read from that final page.
- Open Graph
- The og: tag names the final page declares, prefix dropped, in document order. — means none was declared.
- The twitter: tag names, the same way. Empty here is common and not automatically a fault: X falls back to the og: tags.
- Result
- Whether the row finished, is still running, or stopped on an error. It says nothing about the tags themselves.
- Actions
- View opens the detail panel for that row; Retry appears instead when the request never got through.
Detail panel verdicts
- No Open Graph or Twitter tags — shared links fall back to scraping.
- The page declares no share tag at all, in either family. Every platform then builds the card by guessing from the page: usually the wrong image, and a title you did not choose.
- No Twitter tags — the page declares only the other kind.
- Said inside one section when that family is empty but the other is not, naming whichever family the section is: Open Graph on the left, Twitter on the right. It is a statement about that half only.
- The Open Graph tags are well formed.
- Nothing is wrong with that family; the sentence names it, and the Twitter form appears too. A page can be clean for one family and broken for the other.
- A required Open Graph tag is missing: og:type.
- The four the protocol requires are og:title, og:type, og:image and og:url; the sentence lists whichever are absent. A tag declared with an empty content counts as missing, because that is what the platforms do with it.
- An og: tag uses name= instead of property= — Facebook and Zalo will not see it.
- The hardest fault here to catch by eye: the tag is in the head, spelled correctly, and invisible to Facebook, because og: tags are read from property= and this one used name=.
- og:image is not an absolute URL, so the image will not show.
- A crawler that fetches the tag has no page context to resolve a relative path against. A protocol-relative //host/path is fine; /img/card.png is not.
- og:url points elsewhere — shares will be credited to that URL.
- og:url is the page identity in the graph: every like and share is credited to it. It is compared against the canonical, not the address you typed. A www / non-www difference splits one page into two.
- twitter:card holds a value X does not define, so no card is built.
- X defines summary, summary_large_image, app and player. Anything else is not a smaller card, it is no card.
- No twitter:card — X builds no card at all.
- The one twitter: tag with no og: equivalent, so it is the one worth adding even on a page with a complete og: set.
- No og:description — that line stays blank on every platform.
- Not one of the four required tags, so a suggestion rather than a fault; but every platform shows that line, and an empty one is a card with a hole in it.
Attribute badges
- [property]
- The tag was declared as <meta property="…">. This is what the Open Graph protocol specifies and what Facebook, LinkedIn and Zalo read.
- [name]
- The tag was declared as <meta name="…">. This is what X documents for twitter: tags. An og: tag with this badge is the fault above; a twitter: tag with property= is not flagged, because X accepts both in practice.