All lintlab tools

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.

Open the Actor on Apify

What it flags

CheckSeverityWhen
title.missingerrorNo <title> element
title.emptyerrorThe title element is there but empty
title.too_longwarningLonger than 60 characters
title.too_shortwarningShorter than 10 characters
title.duplicatewarningThe same title is used on more than one audited page
description.missingwarningNo meta description, or an empty one
description.too_longwarningLonger than 160 characters
description.duplicatewarningThe same description is used on more than one audited page
opengraph.title_missingnoticeog:title is absent or empty
opengraph.description_missingnoticeog:description is absent or empty
opengraph.image_missingnoticeog: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:image loads 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.