Categoría: Uncategorized

  • El reporte de IA generativa de Search Console no está en la API: cómo automatizarlo igual (+ el fan-out de AI Mode con Gemini)

    Publicado en nicolasbillia.com — Julio 2026

    Disclaimer

    Este contenido fue generado con ayuda de IA a partir de los logs de la sesión donde armé el flujo: validación de la API de Search Console en vivo, iteración del agente de navegador hasta que el export funcionó, y los outputs del cruce con la Gemini API. El código que aparece es el que quedó corriendo en producción. Por confidencialidad no nombro al cliente del caso y todos los datos son relativos — sin absolutos de tráfico.


    Google lanzó a principios de junio el reporte de IA generativa en Search Console: impresiones de tu sitio dentro de AI Overviews y AI Mode. El problema: no está en la API. Lo validé en vivo antes de aceptarlo — todos los type candidatos devuelven 400, y searchAppearance tampoco lo expone. El reporte vive solo en la UI, con tope de 1.000 filas y sin dimensión de queries.

    Este post documenta las dos cosas que armé para trabajarlo igual: un agente de navegador que exporta el reporte programáticamente para cualquier propiedad, y — la parte que más me interesa — cómo usar la Gemini API para ver el query fan-out: las sub-queries que el motor genera detrás de un prompt, que es justo lo que el reporte de Google no te dice.

    Contenido del post

    1. Qué trae el reporte (y qué no) — validación de la API en vivo
    2. El agente Playwright: sesión persistente + los 3 gotchas que me trabaron
    3. Qué encontramos al abrir el export: 91% de la visibilidad AI en el lugar menos pensado
    4. El problema de fondo: impresiones sin queries no se pueden accionar
    5. La frutilla: el fan-out de AI Mode vía Gemini grounding
    6. El hallazgo: los prompts transaccionales fanean a queries que ya tenés
    7. Caveats y runbook

    0. Qué trae el reporte (y qué no)

    Antes de automatizar nada, validé qué expone la API de Search Console hoy:

    # searchanalytics.query — todos devuelven 400 Invalid value:
    for t in ["aiOverview", "aiMode", "generativeAi", "googleAi"]:
        body = {"startDate": ..., "endDate": ..., "type": t}
        # → HttpError 400: Invalid value at 'type'
    # Los únicos válidos siguen siendo: web, image, video, news, googleNews, discover

    El reporte de la UI trae: solo impresiones (sin clicks, sin posición, sin queries), desglose por página/país/dispositivo/día, tope de 1.000 filas, y data desde mediados de mayo de 2026. El patrón histórico de Google es UI primero y API meses después (pasó con Discover y con News) — cuando llegue, este flujo se jubila. Mientras tanto, o exportás a mano cada vez, o automatizás.

    1. El agente Playwright: sesión persistente + los 3 gotchas

    La arquitectura es simple: un script de Playwright con perfil de Chrome persistente. Te logueás a mano una sola vez (password + 2FA); la sesión queda en disco y las corridas siguientes entran directo, navegan al reporte de la propiedad que le pidas, clickean Export → CSV y descomprimen el zip (5 CSVs: Chart, Pages, Countries, Devices, Filters).

    Los tres gotchas que me costaron la tarde, para que no te cuesten la tuya:

    1. Google bloquea el login en el Chromium de Playwright (“This browser or app may not be secure”). La solución es channel="chrome" — usar el Chrome real instalado, no el bundled. Con Chrome real el login manual pasa sin drama.
    2. Verificar el login por cookies, no por fe. Mi primera versión decía “sesión guardada” sin chequear nada — y no había guardado nada. El check correcto: que existan SID/SAPISID en las cookies de google.com. La cookie NID sola no es sesión.
    3. El menú Export es un módulo JS lazy-loaded. Este es el bueno: el click en “Download CSV” entra visualmente pero no dispara nada, porque el handler todavía no existe cuando clickeás. El fix: esperar networkidle + ~2 segundos después de abrir el menú, y un loop de reintentos sobre expect_download.
    item = page.get_by_role("menuitem", name=re.compile("csv", re.I)).first
    item.wait_for(state="visible", timeout=10_000)
    page.wait_for_load_state("networkidle", timeout=30_000)
    page.wait_for_timeout(2_000)   # sin esto, el click "entra" pero no descarga
    for _ in range(3):
        try:
            with page.expect_download(timeout=15_000) as dl:
                item.click()
            download = dl.value
            break
        except PWTimeout:
            ...  # reabrir menú y reintentar

    Detalle de robustez: forzar &hl=en en la URL del reporte para que los selectores de texto no dependan del idioma de la cuenta de quien corra el script.

    2. Qué encontramos al abrir el export

    Primer export sobre un cliente B2B de servicios, ~50 días de data. La composición de la visibilidad AI fue una sorpresa incómoda:

    Sección del sitio Share de impresiones AI
    Blog TOFU viejo (glosario, definiciones, how-tos genéricos) 91%
    Home y landings 8%
    Money pages transaccionales 0,3%

    El contenido que el equipo consideraba de bajo valor — el glosario técnico de hace años — es lo que Google muestra en features de AI. Y el plan editorial nuevo, apuntado a SERPs comerciales, capturaba el 0,2%. No es que el plan falle: es que su cancha (queries comerciales de decisión) hoy casi no dispara features de AI para ese dominio, y la cancha donde el dominio SÍ es elegible es la informacional. Dos conclusiones operativas: no podar contenido TOFU sin cruzar contra este export, y no medir el contenido comercial con la vara de las impresiones AI.

    3. El problema de fondo: impresiones sin queries

    Acá aparece la limitación estructural: el reporte te dice QUÉ páginas aparecen en features de AI, pero no PARA QUÉ búsquedas. Sin queries no hay acción posible. La triangulación que armé: pull clásico de GSC (query × page) de las mismas URLs en el mismo período, y clasificación estructural de las queries. Para las páginas transaccionales del caso, el 57% de la demanda era exact-match transaccional corto (“hire a [rol]”) y solo el 8% conversacional. Hipótesis razonable, pero seguía siendo correlación. Faltaba ver el mecanismo.

    4. La frutilla: el fan-out de AI Mode vía Gemini grounding

    Cuando le preguntás algo a AI Mode, el motor no busca tu prompt literal: lo descompone en 2 a 10 sub-queries (el query fan-out), busca cada una, y sintetiza. Ser visible en AI es tener el mejor passage para alguna de esas sub-queries. Google no expone el fan-out en ningún lado — ni la UI, ni GSC, ni los endpoints de scraping de SERP (lo verifiqué contra la response completa: solo trae el markdown de la respuesta y las fuentes).

    La vía first-party: la Gemini API con google_search como tool devuelve en groundingMetadata.webSearchQueries las queries reales que disparó contra Google para fundamentar la respuesta. Como Gemini es el modelo detrás de AI Mode, es el proxy más cercano disponible al fan-out real:

    body = {
      "contents": [{"parts": [{"text": prompt}]}],
      "tools": [{"google_search": {}}],
    }
    # → response.candidates[0].groundingMetadata.webSearchQueries
    #   = las sub-queries que el modelo buscó en Google

    Ejemplo real de un prompt tipo listicle (“best companies to hire a nearshore executive assistant”): el fan-out fueron 2 queries de descubrimiento + 10 queries “[marca] reviews”, verificadas contra Clutch, Trustpilot y G2. El motor primero descubre el set de marcas y después verifica cada una. Si no estás en las queries de descubrimiento Y no tenés capa de reviews, no existís en la respuesta — no importa qué tan bueno sea tu contenido.

    5. El hallazgo: los prompts transaccionales fanean a queries que ya tenés

    Corrí 38 prompts (los 30 del panel de negocio + 8 transaccionales role-level derivados de queries reales de GSC) y crucé las 137 sub-queries resultantes contra la demanda GSC de las páginas transaccionales del caso, con embeddings:

    Tipo de prompt Sub-queries que matchean demanda existente (cosine ≥ 0,8)
    Role-level (“hire an executive assistant”) 22 de 33
    Cluster-level (listicles, conversacionales, servicio) 0

    La anatomía del fan-out de un prompt transaccional es literalmente un blueprint de contenido: detrás de “hire a [rol]” el motor busca how to hire, what to look for, job description example, interview questions, hiring process, cost/salary, skills. Las páginas del caso ya servían la mayoría — ahí está el mecanismo probable de sus impresiones AI — y las dos sub-queries sin match (interview questions, skills assessment) pasaron directo al backlog como secciones a crear. De correlación a mecanismo a acción, en una corrida que cuesta centavos por prompt.

    6. Caveats y runbook

    • webSearchQueries es un proxy del fan-out de AI Mode (mismo modelo, misma infraestructura de grounding), no el fan-out literal. En entregables se presenta como aproximación, siempre.
    • El fan-out no es determinístico: varía entre corridas. Sirve para tendencias y blueprints, no para obsesionarse con una sub-query puntual.
    • La sesión de Google del agente expira cada algunas semanas → re-login manual. Es el eslabón frágil si lo querés como cron.
    • El flujo completo (export UI + fan-out + cruce GSC) queda documentado en runbooks internos replicables por cualquiera del equipo — la parte no negociable es esa: si el flujo vive solo en la cabeza del que lo armó, no es un flujo, es un truco.

    Cierre

    Google te da un reporte nuevo sin API, sin queries y con tope de filas. Se puede mirar la limitación o se puede rodear: el agente de navegador resuelve el acceso programático, GSC clásico aporta las queries, y Gemini grounding aporta el mecanismo que ninguna de las otras dos fuentes tiene. Ninguna pieza sola alcanza; las tres juntas convierten un reporte de solo-impresiones en decisiones de contenido concretas.

    Si lo estás automatizando de otra forma — o si encontraste dónde Google esconde las queries del reporte — contame, en serio.

  • Corrí los mismos 30 prompts en AI Overviews, ChatGPT y Claude: cada motor elige fuentes distinto

    Publicado en nicolasbillia.com — Julio 2026

    Disclaimer

    Este contenido fue generado con ayuda de IA a partir de la ingesta de contexto: los logs completos de un pipeline de auditoría de visibilidad en motores generativos que corrí para un cliente B2B de staffing en LATAM que vende a empresas de USA, más los outputs crudos de cada motor (JSON por prompt y por motor). Todos los porcentajes salen de esos outputs; las interpretaciones son mías. Por confidencialidad no nombro al cliente y todos los datos son relativos — sin absolutos de tráfico ni de negocio.


    Corrí los mismos 30 prompts de negocio contra AI Overviews, ChatGPT y Claude. La pregunta era simple: cuando un buyer le pregunta a la IA “¿a quién contrato para X?”, ¿de dónde saca los nombres cada motor?

    La respuesta corta: los tres motores eligen fuentes con mecánicas distintas, y “optimizar para la IA” como si fuera un solo canal es una estrategia rota de nacimiento. Este post documenta la metodología, los patrones de retrieval por motor, y las dos o tres cosas que me sorprendieron de verdad.

    Contenido del post

    1. Metodología — de dónde salen los 30 prompts y qué corre el pipeline
    2. AI Overviews: la bola de nieve — nadie es recomendado sin estar en las fuentes
    3. ChatGPT: 82% de las citas son home o landing del proveedor (y suprime listicles propios)
    4. Claude: 64% editorial — la especialización le gana a la frecuencia (y el disclaimer que muestra)
    5. Plataformas de reviews: solo Clutch pesó. G2, Trustpilot y Glassdoor: cero
    6. El contraste diagnóstico: a lo flojo Google lo degrada, a lo self-promote lo expulsa
    7. El loop cerrado: el primer lead con atribución dura a un asistente de IA
    8. Implicancias: una estrategia por motor, no una estrategia “para la IA”
    9. Gotchas técnicos del pipeline

    0. Metodología — de dónde salen los 30 prompts

    El error típico de estos experimentos es inventar los prompts — o peor, pedirle a un LLM que los genere. Acá salieron de una fuente real: Search Console. Pull de query × page de 6 meses, filtro semántico del negocio, y curaduría de 30 prompts reales — short-tail y conversacionales — mapeados sobre las tipologías de contenido MOFU-BOFU del negocio del cliente (staffing B2B en LATAM para empresas de USA):

    • Conversacionales (MOFU research) — preguntas completas del buyer evaluando opciones: “what are the best companies to…”, “we want to compare providers for…”
    • Listicles (MOFU consideración) — “best/top [servicio] providers”: el buyer ya sabe qué necesita y arma su short list
    • Hire/transaccionales (BOFU decisión) — “hire [talento] from [región]”: intención de contratación directa
    • Servicio (categoría) — la categoría a secas, tal como se tipea

    Este mapeo por funnel no es cosmético: como se ve en la sección 5, cada motor cambia el tipo de página que cita según el cluster de prompt — y esa es la tabla que ordena todo el plan de trabajo.

    El pipeline corre cada prompt contra los 3 motores: AI Overviews vía DataForSEO (SERP + load_async_ai_overview), ChatGPT y Claude vía los endpoints de ai_optimization con web search habilitado (mercado US). Cache por prompt × motor para no re-pagar corridas. Después: fetch de las 107 fuentes que citó AIO, grep de ~80 marcas del vertical sobre cada fuente, y matriz de quién aparece dónde.

    Costo total de la corrida completa: ~6 dólares. Eso convierte lo que era “un estudio” en un panel mensual.

    1. AI Overviews: la bola de nieve

    22 de los 30 prompts dispararon AI Overview. El patrón más claro de todo el experimento: nadie es recomendado sin estar antes en las fuentes que el AIO cita. Y la correlación fuente → recomendación es casi mecánica. Los 3 dominios más usados como fuente son exactamente las 3 marcas más recomendadas:

    Marca Share de las citas-fuente de AIO Prompts donde AIO la recomienda
    Marca #1 13% de todas las citas 10 de 22
    Marca #2 12% 12 de 22
    Marca #3 10% 7 de 22
    El cliente del experimento 0% como fuente · mencionado en 1% de las fuentes de terceros 0

    Así se arma la bola de nieve: el playbook del mercado es publicar tu propio listicle “best X companies” poniéndote primero y completando la lista con las marcas que la IA ya cita (para que la nota parezca neutral y matchee lo que el motor espera encontrar). AIO levanta ese listicle como fuente → te recomienda → el próximo que escribe un listicle te incluye porque “ya te cita la IA” → más fuentes te mencionan → más recomendaciones. La fuente individual más usada de todo el set es exactamente eso: el self-listicle de un proveedor, citado como fuente en 11 de los 22 prompts con AIO. Todos terminan recomendando a las mismas marcas — no porque sean las mejores, sino porque son las que el circuito ya retroalimenta.

    De las fuentes citadas, cerca de un tercio eran self-listicles. AIO las sigue usando. Eso explica por qué la táctica funcionó tanto tiempo — y los puntos 2 y 5 explican por qué se está terminando.

    2. ChatGPT: gana la home, no el contenido

    El desglose de citas de ChatGPT fue el más contraintuitivo para alguien que viene del SEO editorial:

    Tipo de página citada ChatGPT Claude AI Overviews
    Home del proveedor 54% 11% 4%
    Landing de servicio 28% 20% 30%
    Blog post 2% 27% 19%
    Listicle 5% 37% 34%
    Otras (reviews, foros, etc.) 12% 5% 14%

    ChatGPT premia el exact-match lexical entre la página comercial y la categoría que el buyer pregunta. Al extremo: los proveedores más citados tienen la keyword en el propio nombre de dominio — si el prompt es “nearshore finance and accounting”, el dominio citado es del tipo nearshorefinance[.]com. El nombre del sitio ES la categoría. Son boutiques reales, no sitios programáticos — lo verifiqué fuente por fuente.

    Y el detalle que explica el ranking que ves en la respuesta: el reasoning. En su cadena de razonamiento ChatGPT registra explícitamente el sesgo de los self-listicles (“this list may be biased” sobre una nota best-X publicada por el propio proveedor) — y no lo verbaliza en la respuesta final: lo ejecuta. En vez de reproducir el típico listicle autopromocionado que rankea en Google, responde con las marcas que los third parties validan. El filtro anti-autopromoción ya está operativo dentro del motor, aunque la SERP clásica todavía lo premie.

    3. Claude: la especialización le gana a la frecuencia

    Claude es el espejo invertido de ChatGPT: 64% de sus citas son editorial (27% blog posts + 37% listicles). Y acá está el resultado que valida un año de trabajo: para este cliente veníamos ejecutando una estrategia de contenido deliberada — potenciar su especialización en nearshore staffing para el vertical de finanzas y accounting, con profundidad editorial por sub-nicho en lugar de contenido genérico de volumen.

    El resultado medido: Claude lo recomienda y linkea en el 55% de los prompts de su sub-especialidad F&A (0% en los prompts genéricos de staffing), reproduciendo frases textuales de su contenido editorial. Todo eso apareciendo en apenas el 1% de las fuentes del ecosistema — contra marcas que están en el 10-16% de las fuentes. Claude no cuenta apariciones: evalúa si la fuente es LA especialista en la pregunta puntual. Se puede posicionar sin ser fuente masiva, si la especialización es real y está escrita.

    El otro comportamiento distintivo: Claude usa listicles pero te avisa. En la interfaz de claude.ai la respuesta incluye la aclaración explícita de que la mayoría de esos listados “top 10” los publican los propios proveedores autodenominándose los mejores — y recién después menciona los nombres que se repiten de forma consistente entre fuentes. El sesgo del self-listicle ya está internalizado en los dos modelos grandes; lo administran distinto: ChatGPT lo filtra en silencio (lo suprime del set de citas), Claude lo usa y lo declara.

    4. Plataformas de reviews: solo Clutch (y esto es vertical-dependiente)

    Si estás invirtiendo en presencia en plataformas de reviews “para la IA”, este dato te ahorra plata: en 30 prompts × 3 motores, Clutch apareció citado en 7 prompts (siempre sus páginas de categoría) y G2, Trustpilot y Glassdoor sumaron exactamente cero citas. LinkedIn apareció solo en AIO (jobs y Pulse).

    La aclaración importante: las “fuentes de verdad” varían por vertical de negocio. Este experimento es B2B de servicios de staffing — y en B2B services Clutch es LA plataforma que los motores usan para verificar marcas. En SaaS probablemente el mapa sea otro (G2 pesaría distinto), y en consumer otro más. La conclusión transferible no es “invertí en Clutch”: es identificá cuál es la plataforma de verificación de TU vertical antes de invertir en cualquiera.

    4b. La tabla que ordena todo: tipo de página citada × cluster de prompt

    El agregado por motor esconde el hallazgo más accionable. Segmentando las 1.143 citas por cluster de prompt, el share de citas a money pages (home + landings de servicio) queda así:

    Cluster de prompt ChatGPT Claude AIO
    Transaccional BOFU (“hire X from…”) 100% 59% 54%
    Conversacional (MOFU research) 89% 10% 35%
    Listicle (MOFU consideración) 67% 13% 30%
    Servicio (categoría) 88% 44% 30%

    Dos lecturas:

    • En prompts transaccionales MOFU-BOFU, los TRES motores viran a páginas comerciales. ChatGPT directamente no cita un solo blog post en ese cluster: 85% homes + 15% landings. Para el momento de decisión del buyer, tener home y landings optimizadas para LLMs no es un nice-to-have — es donde los motores van a buscar.
    • En research, los motores divergen: Claude se va 80-84% a editorial (blogs y listicles especializados), ChatGPT sigue yendo a homes (89%). El mismo prompt de research te encuentra por caminos distintos según el motor — por eso la estrategia es por motor y por etapa del funnel, no global.

    5. A lo flojo lo degrada, a lo self-promote lo expulsa

    En paralelo al experimento, un competidor del vertical — que venía creciendo fuerte con contenido programático escalado con IA — perdió el 41% de su tráfico estimado en 5 semanas. El spam update de fines de junio aceleró una caída que ya venía. Lo diagnóstico está en el desglose por tipología de contenido:

    • Self-promote listicles: -71%, con una de cada cuatro keywords directamente expulsada del top 100.
    • Contenido flojo pero neutro (calendarios, feriados, datos utilitarios): -55%, sin expulsiones — degradado, no penalizado.

    La lectura: Google está separando el contenido mediocre (lo baja) del contenido con conflicto de interés estructural (lo saca). Si tu estrategia AEO depende de listicles donde te ponés primero, tenés fecha de vencimiento en los dos frentes: los motores los suprimen y Google los expulsa.

    6. El loop cerrado: el primer lead con atribución a un asistente de IA

    La parte que convierte esto en algo más que un ejercicio de visibilidad: en la medición mensual de leads apareció por primera vez un lead con atribución dura en GA4 a claude.ai como fuente — aterrizando exactamente en el cluster editorial que Claude más cita en el experimento. Una muestra de uno, no una tendencia. Pero es la primera vez que el circuito completo (contenido especializado → citado por el motor → visita → lead) queda trazado de punta a punta con datos y no con fe.

    Contexto que acompaña: las búsquedas de marca del cliente en su mercado objetivo crecieron 3,7x año contra año, y en los meses sin inversión paga la entrada por marca explicó entre el 43% y el 86% de los leads orgánicos. La visibilidad en motores generativos no reemplaza al SEO: lo alimenta por el costado de la marca.

    7. Implicancias: una estrategia por motor

    Motor Qué premia Frente de trabajo
    ChatGPT Exact-match lexical, homes y landings Home y landings alineadas semánticamente con la categoría
    Claude Especialización editorial Contenido profundo por sub-vertical, aunque el dominio sea chico
    AI Overviews Presencia en las fuentes que ya cita Digital PR sobre la target list de fuentes + Clutch

    Y el anti-playbook, con datos: no invertir en G2/Trustpilot/Glassdoor por AEO, y no construir sobre self-listicles.

    8. Gotchas técnicos

    • Las responses de los endpoints LLM vienen anidadas (items → message → sections → text + annotations) — un parse ingenuo devuelve null y te hace creer que el motor no respondió.
    • Cache por prompt × motor es obligatorio: sin cache, cada iteración del análisis re-paga la corrida entera.
    • El fetch de fuentes necesita fallback (trafilatura + bs4): un tercio de los sitios citados por AIO tienen HTML hostil.

    Cierre

    30 prompts, un vertical, una corrida mensual de ~6 dólares. No es un estudio académico y el disclaimer es honesto: señal temprana, muestra chica, un solo vertical B2B. Pero los patrones de retrieval son tan distintos entre motores que la conclusión operativa no necesita más muestra: medí en qué motor está tu buyer, y optimizá para la mecánica de ese motor. Lo demás es astrología con branding de AEO.

    Si estás corriendo experimentos parecidos, contame qué patrones estás viendo — especialmente si tenés datos de otros verticales.