squirrelscan
GitHub

noai and nosnippet: the AI opt-out tags squirrel reports

Which pages declare noai, noimageai, nosnippet or max-snippet:0, and where the directive came from. squirrel reports, and never penalises.

What noai and nosnippet are

noai and noimageai are an informal convention. Some AI companies said they would honour them for text and image use, no specification defines them, and nothing enforces them. They express intent, which is worth recording even where it is not binding.

nosnippet and max-snippet:0 are different. They are long-standing robots directives that Google documents, they tell a search engine not to show a text snippet from the page, and answer engines treat them as instructions not to quote the page verbatim. All four can be declared in a <meta name="robots"> tag or in an X-Robots-Tag response header.

What squirrel checks

The rule runs on every crawled page. It reads the X-Robots-Tag response header and every <meta> element whose name is robots, ai, googlebot or bingbot, and matches four tokens case-insensitively in each: noai, noimageai, nosnippet, and max-snippet:0 with optional spaces around the colon. It emits one check:

  • noai-signals: passes with the message No noai / noimageai / snippet-limit signals declared and the value none when nothing matched. Otherwise it reports at info status with Declares AI opt-out signals: <signals>., joining the signals found with , and closing with a full stop. The four descriptions are noai (advisory opt-out from AI text use), noimageai (advisory opt-out from AI image use), nosnippet (limits AI-search quoting) and max-snippet:0 (limits AI-search quoting). When noai or noimageai is among them the message ends with noai/noimageai are advisory only — honoring them is up to each crawler, with no enforcement behind the tag. Each item names the token and the source it came from, such as noai in X-Robots-Tag header.

The noai match is word-bounded, so it never fires inside noimageai. The X-Robots-Tag header is always read. When the page has no parsed document, which happens on an error page or a stored parse, the meta side falls back to the extracted robots value instead of scanning the DOM. This rule reports and never penalises: the only non-info result is the pass.

How to fix it

There is nothing to fix unless the declaration is missing or wrong. To declare the intent:

<meta name="robots" content="noai, noimageai, nosnippet" />

Put it in <head>, or send the same directives in an X-Robots-Tag header when you want them on non-HTML responses too.

Treat these tags as the declared-intent layer and robots.txt crawler blocks, covered by ax/ai-crawlers, as the layer a cooperative crawler is more likely to act on. Neither is a control: robots.txt is also honoured voluntarily. Blocking at the edge is the only layer that enforces anything.

Rule IDax/noai-signals
CategoryAgent Experience
ScopePer-page
Severityinfo
Weight1/10

Enable / disable

Disable this rule

[rules]
disable = ["ax/noai-signals"]

Disable all Agent Experience rules

[rules]
disable = ["ax/*"]

Enable only this rule

[rules]
enable = ["ax/noai-signals"]

enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.

Agent experience findings ship in every audit next to the SEO, performance and security rules. See AI crawlers for how an agent works through a report.

References

Check your site

Run squirrel audit https://example.com and open the Agent Experience section of the report. Each declared token is listed with the tag or header it came from. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.

Type to search…

↑↓ navigate↵ openesc close