Glossary
X-Robots-Tag
The short answer
What is the X-Robots-Tag header?
The X-Robots-Tag is an HTTP response header that carries the same indexing and serving rules as the robots meta tag. Google documents that any rule usable in a robots meta tag can also be specified as an X-Robots-Tag. Because it travels in the response rather than the markup, 1 stray noindex header sits on a page that looks completely normal in a browser.
The X-Robots-Tag is an HTTP response header that carries the same indexing and serving rules as the robots meta tag. Google's specification states it plainly: "Any rule that can be used in a robots meta tag can also be specified as an X-Robots-Tag."
The rules are identical. What differs is the transport, and the transport is the whole reason this term needs its own entry: instructions delivered in a header are set by infrastructure, not by whoever writes the page.
What can an X-Robots-Tag actually say?
Anything the robots meta tag can say, in the same vocabulary — noindex, nofollow, nosnippet, max-snippet, and the rest. Google's example of the header in a response is a single line alongside the status code:
HTTP/1.1 200 OK
Date: Tue, 25 May 2010 21:42:43 GMT
(…)
X-Robots-Tag: noindex
(…)
Three further mechanics are documented on the same page. The header may optionally name a user agent before the rule, in the form X-Robots-Tag: googlebot: nofollow, which scopes the instruction to one crawler. Multiple headers can be combined in one response, or several rules given as a comma-separated list. And because a meta tag cannot exist inside an image or a PDF, the header is the only way to apply robots rules to non-HTML files — Google publishes Apache and NGINX configuration examples for that case specifically (Google, robots meta tag and X-Robots-Tag specifications).
Why is a header more dangerous than a meta tag?
Because nobody looks at it. A meta tag is in the page source, where a developer, an auditor, or a curious client will eventually see it. A response header is invisible in the browser, invisible in view-source, and invisible in every content management interface — and it can be set by any layer between your application and the visitor:
| Layer that can set the header | How it typically happens | Where you would have to look |
|---|---|---|
| Application or framework | A response-header rule attached to a route or a build target | Application code |
| Hosting or staging platform | A platform default on preview deployments — the staging platform on our auto-finance rebuild sets exactly this [our data] | Host settings |
| CDN or edge worker | A header transform or a proxy script running in front of the origin | Edge configuration |
| Web server or reverse proxy | Apache Header set or NGINX add_header, the forms Google documents for non-HTML files | Server configuration |
The failure this produces is quiet by construction. The page renders, the content is correct, the markup is clean, and the page is simply gone from search — with no error, no alert, and nothing in the HTML to explain it.
One documented interaction makes the diagnosis harder. Google states that "if a page is disallowed from crawling through the robots.txt file, then any information about indexing or serving rules will not be found and will therefore be ignored." Blocking a URL does not deliver a noindex; it prevents the crawler from ever reading one.
Does an X-Robots-Tag change what AI surfaces can use?
Yes, through the same directives, because Google's AI features are documented as consumers of the snippet system. A noindex delivered by header removes the page from the index, and Google's AI features documentation ties AI Overview and AI Mode eligibility to pages being indexed and snippet-eligible — so one header removes classic results and AI surfaces at the same moment.
nosnippet and max-snippet behave the same way in a header as in a tag, including their documented AI effects. What each directive trades away, and why no AI-only opt-out exists, is worked through in the only granular AI Overview controls; the object all of them act on is defined in snippet. This page owns only the delivery mechanism.
How do you check for one?
Read the response headers, not the page. One request does it:
curl -sI https://example.com/page/ | grep -i x-robots-tag
Silence means no header on that response, which is the normal state. Check each environment separately — production, staging, and the URL as served through any CDN or proxy — because a header set at the edge will not appear when you request the origin directly, and a header set by a staging platform will not appear when you request production. Check after every infrastructure change, not only after content changes, since the header has nothing to do with content.
What do we do about it on our own builds?
Two layers, in-band and out-of-band. On our auto-finance rebuild the edge Worker deletes the x-robots-tag header from every response it proxies from the static origin, because the staging platform behind it sets that header by default; separately, an hourly external check requests the live site and watches for a stray noindex from any source [our data]. The routing architecture both live inside is described in adding a citable content layer to a live WordPress domain.
Be exact about what that record is. Both measures are precautions designed into the build. Nothing leaked, no page was deindexed, and this is not an incident report — the reason the defense exists is that the failure is invisible, not that we have watched it happen [our data].
Against our own interest: for a single-origin site with no CDN rules and no staging platform, this is a two-minute curl check once, not a monitoring project. The layer count is what creates the risk, and most sites do not have the layers. Where header-level controls sit in the wider visibility picture is mapped in our generative engine optimization guide.
Frequently asked questions
What is the X-Robots-Tag header?
An HTTP response header that carries robots rules for a URL. Google documents that any rule usable in a robots meta tag can also be specified as an X-Robots-Tag, so noindex, nofollow, nosnippet and max-snippet all travel this way as well.
What is the difference between X-Robots-Tag and the robots meta tag?
Transport, not meaning. The meta tag lives in the HTML head where anyone can read it in page source; the header lives in the HTTP response, where only a request inspector shows it. Non-HTML files such as PDFs and images are reached by the header.
How do I check whether a page is sending an X-Robots-Tag?
Request the URL and read the response headers rather than the HTML — 'curl -sI https://example.com/page/' prints them in 1 command. Check every environment separately, because the header is often set by a layer that does not ship with the page's markup.
Can an X-Robots-Tag affect AI Overviews?
Indirectly and directly. Google's AI features documentation ties AI Overview and AI Mode eligibility to indexed, snippet-eligible pages, so a noindex header removes both at once. nosnippet and max-snippet also travel as headers and limit content used as direct input.
Why would a page carry an X-Robots-Tag nobody added?
Because several layers can set response headers: the application, the hosting or staging platform, a CDN or edge worker, and the web server or reverse proxy. A preview-deployment default that follows a build to production is the classic version of this.
Does blocking a URL in robots.txt make its noindex header work faster?
It does the opposite. Google states that if a page is disallowed from crawling, any indexing or serving rules will not be found and will be ignored. A crawler has to fetch the response to read the header at all.