Fabian de la Fuente

Semanal · Vancouver, BC

Cuando GPTBot y ClaudeBot se comieron mi cuota: cómo bajé 90 % el tráfico de bots de IA en mi sitio gratis (y por qué igual terminé pagando USD 5)

Dos crawlers de IA casi agotan en una mañana los 100.000 requests diarios gratis de Cloudflare Workers en mi sitio. Qué hice para bajar 90 % las invocaciones sin pagar, qué se rompió después y qué puedes hacer en tu propio sitio.

Fabián de la Fuente ·

Ilustración estilo Norman Rockwell: un tendero sonriente con suéter de punto, en la puerta de una tienda de pueblo, sostiene un letrero pintado a mano que dice ROBOTS :00 TO :20, mientras una larga fila de robots de hojalata con placas GPT y CLAUDE espera en la acera; adentro, un cliente compra tranquilo bajo un gran medidor marcado 100,000, y un perro descansa junto a la puerta.

Un sábado de octubre, a las 9:49 de la mañana (hora del Pacífico), me llegó un correo de Cloudflare: mi cuenta ya había usado el 75 % de los 100.000 requests diarios del plan gratis de Workers. Faltaban más de siete horas para el reinicio. A ese ritmo, mi sitio se iba a caer a media tarde.

El sitio era Ultimate Passport Guide: una guía de requisitos de visa con 39.402 combinaciones de pasaporte y destino, en seis idiomas. Unas 236.000 páginas. Llevaba un par de días en línea. No tenía tráfico como para gastar 75.000 visitas antes del almuerzo.

Mis visitantes no eran personas.

Cómo me di cuenta

Lo primero fue no adivinar. Le pedí a mi equipo de bots que mirara en vivo quién estaba entrando. En una muestra de un minuto hubo 138 invocaciones, todas a páginas de pares pasaporte–destino: 94 de GPTBot (el crawler de OpenAI) y 44 de ClaudeBot (el de Anthropic). Ningún humano. Ni Googlebot ni Bingbot. El ritmo venía estable desde el día anterior: unas 150 invocaciones por minuto.

El detalle técnico importa. Cada página de par la arma en el momento un Worker de Cloudflare. En el plan gratis, cada vez que un bot pide una página, cuenta como una invocación del Worker. Con 236.000 páginas y dos crawlers incansables, la cuenta no da.

Es como abrir una tienda con un torniquete que solo deja pasar 100.000 personas al día y descubrir que dos autobuses de turistas llevan toda la mañana dando vueltas por la puerta.

La decisión dura

La salida fácil era pagar. El plan Workers Paid cuesta USD 5 al mes e incluye 10 millones de requests al mes. Pero el sitio estaba recién nacido y mi regla era clara: nada de gasto nuevo sin necesidad probada. Y tampoco quería la solución opuesta, bloquear a todos los bots de IA para siempre: si alguien le pregunta a ChatGPT o a Claude qué visa necesita, quiero que mi sitio pueda ser la respuesta.

Así que la decisión fue esta: no echar a los crawlers, ponerlos en un horario.

Qué hicimos (gratis)

Tres capas, en ese orden:

  1. Un 429 con horario. El Worker empezó a responder 429 Too Many Requests con un encabezado Retry-After a GPTBot, ClaudeBot y otros crawlers de IA conocidos (CCBot, Bytespider, Amazonbot, entre otros). Ese día, hasta el reinicio de cuota. Desde el día siguiente, solo pueden entrar durante los minutos 0 a 19 de cada hora. Los otros 40 minutos, la tienda está cerrada para ellos.
  2. Nunca tocar lo que sí quiero. Googlebot, Bingbot, los humanos y ChatGPT-User (cuando una persona le pide a ChatGPT que abra una página concreta) siguen entrando siempre. Y robots.txt y llms.txt siempre responden, a cualquiera. En robots.txt añadimos un Crawl-delay: 10 para esos crawlers, como cortesía.
  3. Un portero antes de la puerta. Un 429 del Worker frena al bot, pero el Worker igual se ejecuta y la invocación igual cuenta. Por eso, una hora después, agregamos una regla de rate limiting en el firewall (WAF) de Cloudflare, que corre antes del Worker. En el plan gratis tiene límites duros: una sola regla, ventana de 10 segundos, bloqueo de 10 segundos y no puede filtrar por user-agent. La regla apunta a la categoría de bots verificados «AI Crawler» y solo a las páginas de pares: más de 2 pedidos en 10 segundos desde la misma IP, bloqueo.

El resultado

En cuatro minutos, las invocaciones bajaron de 138–163 por minuto a 46, 16, 15 y 8: alrededor de −90 %. Las pruebas con curl dieron lo que esperábamos: Googlebot, Bingbot y un navegador normal, 200; GPTBot y ClaudeBot, 429.

Ese día cerró en 82 % de la cuota, según la alerta de Cloudflare. Nunca llegó al 100 %. Costo: USD 0.

Qué se rompió

Tres días después, un martes a las 6:16 de la tarde, apareció otro bot. Se identificaba como ShapBot, venía de servidores de Google Cloud y Cloudflare no lo clasificaba como «AI Crawler» sino como «AI Search». Mi regla no lo veía. Hizo unos 159.000 requests en 30 minutos a páginas de pares al azar.

A las 6:39 lo bloqueamos con una regla gratis del firewall (por su user-agent y sus IP) y las invocaciones bajaron de 7.000–9.000 por minuto a 13–15. Pero el daño ya estaba hecho: el día contable de Cloudflare iba en 169.863 requests, muy por encima de los 100.000. A la mañana siguiente, a las 4:05, mi vigilante automático encontró el sitio respondiendo «This website has been temporarily rate limited». A las 6:04 seguía igual.

A las 6:35 aprobé el plan pagado. A las 6:52 el sitio volvió a responder 200. Desde entonces pago USD 5 al mes.

El principio: el plan gratis es una presa, no un río

No me arrepiento de haber empezado gratis. Las tres capas funcionaron contra el problema que teníamos. Lo que aprendí es que en un plan gratis no decides tú cuándo llegas al límite: lo decide el bot más agresivo que todavía no conoces. Un río se reparte. Una presa, cuando se llena, se desborda de golpe.

Hoy separo dos preguntas que antes mezclaba. La primera es técnica: ¿cómo freno a los bots que no quiero sin echar a los que sí quiero? La segunda es de liderazgo: ¿cuánto vale para mí que el sitio no se caiga? Si la respuesta es más de USD 5 al mes, la decisión no es de ingeniería. Es de sentido común, y conviene tomarla antes de las 4 de la mañana.

Qué puedes hacer en tu propio sitio gratis

  1. Mira antes de culpar. Revisa en tus logs o en las analíticas de Cloudflare quién te visita. En mi caso fueron dos crawlers con nombre y apellido; en el tuyo puede ser otro.
  2. Sirve estático todo lo que puedas. En Cloudflare, los requests a archivos estáticos son gratis e ilimitados; los que ejecutan un Worker cuentan contra los 100.000 diarios del plan gratis. En mi caso no se pudo: el plan gratis admite 20.000 archivos estáticos por versión y yo tenía más de 236.000 páginas.
  3. Pon el portero antes de la puerta. Si filtras dentro de tu código, cada bloqueo igual cuenta. Usa las políticas de acceso para crawlers y agentes de IA o una regla de rate limiting, que corren antes.
  4. Usa robots.txt como cortesía, no como muro. Es una petición; los bots pueden ignorarla.
  5. No bloquees lo que te trae clientes. Decide de antemano qué hacer con los buscadores, con los crawlers de IA y con los agentes que abren una página porque una persona se lo pidió.
  6. Activa la alerta de uso y decide tu precio de antemano. La alerta del 75 % me dio siete horas de margen. Saber de antemano que pagaría USD 5 antes de dejar caer el sitio me habría ahorrado una madrugada.

Preguntas frecuentes

¿Qué son GPTBot y ClaudeBot?

Son los crawlers de OpenAI y de Anthropic. Recorren la web y recopilan contenido para sus modelos de IA. Se identifican por su user-agent y Cloudflare los clasifica como bots verificados de IA.

¿Bloquear crawlers de IA me saca de Google?

No, si lo haces bien. En mi caso, Googlebot y Bingbot siguieron recibiendo 200 en todas las páginas. Lo que bloquees o limites debe apuntar a los crawlers de IA, no a todos los bots.

¿Basta con robots.txt?

No. robots.txt es una petición voluntaria. Sirve como cortesía, pero si el bot no la respeta, o es uno nuevo que no tenías en la lista, tu cuota sigue bajando.

¿Por qué responder 429 en vez de bloquear?

Un 429 Too Many Requests con Retry-After le dice al bot «ahora no, vuelve más tarde». No lo echas para siempre; lo pones en un horario. Ojo: si ese 429 lo da tu Worker, la invocación igual cuenta. Por eso hace falta una capa antes.

¿Cuánto cuesta dejar de preocuparse?

En Cloudflare, el plan Workers Paid cuesta desde USD 5 al mes con 10 millones de requests incluidos. Yo lo activé cuando el sitio ya estaba caído. Lo mejor es decidirlo antes.

← Blog