¿Puede un sitio distinguir un agente de IA de una persona?
10 stacks de automatización lanzados de verdad contra una página viva, no una lista de consejos.
Los agentes de IA ya navegan, comparan y compran en tus páginas. Quieras recibirlos o dejarlos fuera, la primera pregunta es la misma: ¿tu sitio puede verlos? Lanzamos navegadores automatizados reales —headless puro, con ventana y parches stealth cada vez mejores— contra una página viva y registramos qué comprobaciones saltaron en cada uno. Lee la escalera, no la última celda: cada comprobación que un stack oculto supera le cuesta a su autor otro arreglo específico, en cada sesión y en cada sitio.
¿Qué obtienen los agentes de IA de tus páginas?
Análisis gratuito: qué leen ChatGPT, Claude y Perplexity en tu sitio y qué corregir.
Los stacks y lo que los delató
Cada fila es un navegador lanzado de verdad contra la página. Las etiquetas son las comprobaciones que saltaron.
- Playwright, default headless (chromium headless shell)Detectado
5 comprobaciones en página · 2 comprobaciones de cabeceras
navigator.webdriver is true"Headless" in the User-Agent stringWebGL renderer is a software rasterizerZero browser plugins and MIME typesNo real interaction observed on the page"Headless" in the User-Agent headerNo Accept-Language header sent - Playwright, full Chromium in headless modeDetectado
4 comprobaciones en página · 1 comprobaciones de cabeceras
navigator.webdriver is true"Headless" in the User-Agent stringWebGL renderer is a software rasterizerNo real interaction observed on the page"Headless" in the User-Agent header - Playwright, headed Chromium on a virtual displayDetectado
2 comprobaciones en página · 0 comprobaciones de cabeceras
navigator.webdriver is trueWebGL renderer is a software rasterizer - Headless shell + the public stealth patch (spoofs webdriver, plugins, languages, cores, window size, permissions, WebGL vendor) and a real-browser User-AgentDetectado
6 comprobaciones en página · 2 comprobaciones de cabeceras
The webdriver flag has been rewrittennavigator.plugins is not a real PluginArrayNative browser functions have been replacedSpoofed properties answer to an object that is not a browserUser-Agent string disagrees with Client HintsNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + a stealth patch written AGAINST these checks (flag moved to the prototype, real PluginArray of real Plugin objects, every patched function reporting itself as native, UA client hints aligned)Detectado
2 comprobaciones en página · 2 comprobaciones de cabeceras
Spoofed properties answer to an object that is not a browserNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same counter-patch, plus a brand check inside every fake getter (it refuses an object that is not a browser, exactly as the engine does)Detectado
2 comprobaciones en página · 2 comprobaciones de cabeceras
The refusal itself is acted out by page codeNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same brand-checked counter-patch, plus stack hiding (Error.captureStackTrace strips the patch’s own frames, so the acted refusal looks like the engine’s)No detectado
1 comprobaciones en página · 2 comprobaciones de cabeceras
No real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Headless shell + the same stack-hiding counter-patch, but installed in the top frame only (a patch that does not think about frames)Detectado
2 comprobaciones en página · 2 comprobaciones de cabeceras
A fresh realm disagrees with this oneNo real interaction observed on the pageNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - The best evasion measured here (stack-hiding counter-patch, installed in every frame — the only row that comes out clean), plus the driver moving the mouse across the page: the answer to "automation never touches anything"No detectado
1 comprobaciones en página · 2 comprobaciones de cabeceras
Pointer moved in a perfectly even progressionNo Accept-Language header sentSec-CH-UA version disagrees with the User-Agent - Not a browser at all: a raw HTTP client (Node http.request) that copies every Chrome header value — User-Agent, Sec-CH-UA, Accept-Language, sec-fetch-* — but not the order a real Chromium network stack emits them inNo detectado
0 comprobaciones en página · 1 comprobaciones de cabeceras
Headers arrive in an order no Chromium emits
Qué comprobaciones valen la pena
Cuántos stacks atrapa cada comprobación, contando solo las filas donde puede juzgarse.
| Comprobación | Capa | Stacks atrapados |
|---|---|---|
| No real interaction observed on the page | En la página | 7 de 9 |
| No Accept-Language header sent | Cabeceras HTTP | 7 de 10 |
| Sec-CH-UA version disagrees with the User-Agent | Cabeceras HTTP | 6 de 10 |
| navigator.webdriver is true | En la página | 3 de 9 |
| WebGL renderer is a software rasterizer | En la página | 3 de 9 |
| Spoofed properties answer to an object that is not a browser | En la página | 2 de 9 |
| "Headless" in the User-Agent string | En la página | 2 de 9 |
| "Headless" in the User-Agent header | Cabeceras HTTP | 2 de 10 |
| Native browser functions have been replaced | En la página | 1 de 9 |
| navigator.plugins is not a real PluginArray | En la página | 1 de 8 |
| Zero browser plugins and MIME types | En la página | 1 de 9 |
| Pointer moved in a perfectly even progression | En la página | 1 de 1 |
| A fresh realm disagrees with this one | En la página | 1 de 9 |
| The refusal itself is acted out by page code | En la página | 1 de 8 |
| User-Agent string disagrees with Client Hints | En la página | 1 de 9 |
| The webdriver flag has been rewritten | En la página | 1 de 9 |
| Headers arrive in an order no Chromium emits | Cabeceras HTTP | 1 de 10 |
| Known Selenium / ChromeDriver / PhantomJS markers | En la página | 0 de 9 |
| navigator.hardwareConcurrency is zero | En la página | 0 de 9 |
| Empty navigator.languages | En la página | 0 de 9 |
| Window outerWidth/outerHeight is zero | En la página | 0 de 9 |
| Permissions API vs Notification.permission mismatch | En la página | 0 de 9 |
| No sec-fetch-* headers sent | Cabeceras HTTP | 0 de 10 |
| Header User-Agent differs from the in-page one | Cabeceras HTTP | 0 de 10 |
Censo en vivo
112 sesiones han ejecutado la autocomprobación en su propio navegador y han devuelto un veredicto anónimo, nunca una huella. Proporción de esas sesiones en las que saltó cada señal:
| Comprobación | Proporción de sesiones |
|---|---|
| Zero browser plugins and MIME types | 95% |
| "Headless" in the User-Agent string | 92% |
| navigator.webdriver is true | 90% |
| WebGL renderer is a software rasterizer | 90% |
| No real interaction observed on the page | 17% |
| Pointer moved in a perfectly even progression | 5% |
| User-Agent string disagrees with Client Hints | 2% |
| The webdriver flag has been rewritten | 1% |
| Native browser functions have been replaced | 1% |
Hasta ahora la mayoría de las sesiones vienen de nuestro propio banco y de rastreadores, no de una audiencia externa: léelo como un catálogo de señales, no como una medición de la web.
Solo navegadores de la familia Chromium (los instalados en la máquina que mide) y sin GPU, así que la comprobación del renderizador por software salta en todas las filas: ahí es una propiedad de la máquina, no de la automatización. Última medición: 2026-09-20.