Meta Tag Checker for a Whole Site
What it does
Check the title, meta description and Open Graph tags on every page of a site in one run, not one URL at a time. Give it a homepage or an XML sitemap. For each page it reports titles and descriptions that are missing, too long or reused on other pages, and pages with no og:title, og:description or og:image, each with a fix. The same run also checks canonicals, headings, robots directives and internal links.
What it flags
| Check | Severity | When |
|---|---|---|
title.missing | error | No <title> element |
title.empty | error | The title element is there but empty |
title.too_long | warning | Longer than 60 characters |
title.too_short | warning | Shorter than 10 characters |
title.duplicate | warning | The same title is used on more than one audited page |
description.missing | warning | No meta description, or an empty one |
description.too_long | warning | Longer than 160 characters |
description.duplicate | warning | The same description is used on more than one audited page |
opengraph.title_missing | notice | og:title is absent or empty |
opengraph.description_missing | notice | og:description is absent or empty |
opengraph.image_missing | notice | og:image is absent or empty |
60 and 160 characters are rules of thumb, not Google limits: Google cuts titles and snippets by display width and sometimes rewrites them. A duplicate finding lists every page that shares the text, so you can fix them together.
Input and output from a real run
We set up eight demo pages on this site, each with one meta tag fault (or none), and ran the Actor on them on Apify on 2026-10-01 (run f0JILBZEZDzR8rjj3). It found each fault: the correct page came back clean, and each of the other seven got the finding its name describes.
Input JSON
{
"startUrls": [
{ "url": "https://lintlab.dev/demo/meta/ok/" },
{ "url": "https://lintlab.dev/demo/meta/title-missing/" },
{ "url": "https://lintlab.dev/demo/meta/title-too-long/" },
{ "url": "https://lintlab.dev/demo/meta/description-missing/" },
{ "url": "https://lintlab.dev/demo/meta/description-too-long/" },
{ "url": "https://lintlab.dev/demo/meta/og-missing/" },
{ "url": "https://lintlab.dev/demo/meta/duplicate-a/" },
{ "url": "https://lintlab.dev/demo/meta/duplicate-b/" }
],
"discoverSitemap": false,
"maxPages": 8,
"checkLinks": false
}
For a whole site, give only the homepage and leave discoverSitemap on: the Actor finds the sitemap through robots.txt or /sitemap.xml.
Output excerpt: one of the two pages sharing a title and description
{
"url": "https://lintlab.dev/demo/meta/duplicate-a/",
"status": 200,
"title": "Meta tag demo: duplicate | lintlab",
"findings": [
{
"checkId": "title.duplicate",
"severity": "warning",
"message": "This title is used on 2 audited pages.",
"fix": "Write a unique title for each indexable page.",
"value": [
"https://lintlab.dev/demo/meta/duplicate-a/",
"https://lintlab.dev/demo/meta/duplicate-b/"
]
},
{
"checkId": "description.duplicate",
"severity": "warning",
"message": "This meta description is used on 2 audited pages.",
"fix": "Write a unique meta description for each indexable page.",
"value": [
"https://lintlab.dev/demo/meta/duplicate-a/",
"https://lintlab.dev/demo/meta/duplicate-b/"
]
}
]
}
Run summary excerpt
{
"pagesAudited": 8,
"counts": { "error": 1, "warning": 7, "notice": 3 },
"topIssues": [
{ "checkId": "description.duplicate", "count": 2 },
{ "checkId": "title.duplicate", "count": 2 },
{ "checkId": "description.missing", "count": 1 },
{ "checkId": "description.too_long", "count": 1 },
{ "checkId": "opengraph.description_missing", "count": 1 },
{ "checkId": "opengraph.image_missing", "count": 1 },
{ "checkId": "opengraph.title_missing", "count": 1 },
{ "checkId": "title.missing", "count": 1 },
{ "checkId": "title.too_long", "count": 1 }
]
}
Price and limits
$0.004 per successfully audited page ($4 per 1,000 pages). Internal link checks aren't charged. Pages that fail or return an error status are reported but not charged.
- Up to 5,000 pages per run.
- Reads the HTML the server sends. It doesn't run JavaScript, so tags added only by client-side script won't be seen.
- Checks that the Open Graph tags are present, not that the
og:imageloads or has the right size. Twitter/X card tags aren't checked. - Measures length in characters, not pixels.
- For sites you own or are allowed to audit.
When a free tool is better
To see how one URL's link preview looks on a social network, and to refresh a cached preview, use that network's own tool: Facebook Sharing Debugger or LinkedIn Post Inspector. They're free and show the actual card. This Actor is for checking every page of a site at once, any public site, with JSON you can diff between runs or check in CI. Background: Google on title links · Google on meta descriptions and snippets · the Open Graph protocol.