> ## Documentation Index
> Fetch the complete documentation index at: https://docs.querying.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# GEO Score: mide cuánto de una página conserva la búsqueda de ChatGPT

> Puntúa una página según cuánto de lo que una persona lee en ella conserva la búsqueda de ChatGPT y recibe ChatGPT al abrirla, y muestra lo que frena el resto: robots.txt, un rastreador rechazado, contenido que se carga después de abrir la página y texto dentro de imágenes.

Usa GEO Score para revisar una página que quieres que ChatGPT cite. La puntuación es la parte de lo que una persona
lee en la página, incluido el texto dentro de sus imágenes, que la búsqueda de ChatGPT conserva en su copia de la
página. `direct` da la parte que ChatGPT recibe cuando abre la página por sí mismo, como cuando alguien le da la URL.
Cada fragmento que la búsqueda de ChatGPT no conserva trae su causa, y `analysis` convierte las causas en correcciones.

## Puntuar una página

```bash theme={"theme":"css-variables"}
curl -X POST https://api.querying.ai/v1/geo-score \
  -H "Authorization: Bearer $QUERYING_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874", "country": "US" }'
```

La tarea se acepta y queda en cola:

```json theme={"theme":"css-variables"}
{
  "success": true,
  "task": {
    "id": "0b6c1f7e-...",
    "taskType": "GEO_SCORE",
    "status": "QUEUED",
    "priority": 1,
    "createdAt": "2026-10-21T09:00:00.000Z"
  },
  "credits": { "creditsToCharge": 0, "creditsCharged": 0 }
}
```

Lee el resultado con `GET /v1/async/task/{id}`, o añade `webhook.url` a la solicitud y recíbelo cuando la tarea
termine. La mayoría de las páginas tardan de 1 a 3 minutos, así que consulta cada 10 a 15 segundos. La tarea funciona como
cualquier otra [tarea asíncrona](/es/concepts/async-tasks.md) y el resultado está en `response`. El esquema de la
solicitud está en la [referencia de la API](/es/api-reference/geo-score.md).

## Campos de la solicitud

| Campo | Obligatorio | Descripción |
| - | - | - |
| `url` | Sí | La página que se puntúa: una URL `http` o `https` de un host público y el puerto por defecto, de hasta 2.048 caracteres. |
| `country` | No | Dónde está el lector: `US` (por defecto) o `KR`. La página se renderiza desde una dirección de ese país, en su idioma y su zona horaria. |
| `idempotencyKey` | No | Hace seguro reintentar un envío. Consulta [Idempotencia](/es/concepts/idempotency.md). |
| `priority` | No | Entero de `1` a `10`, por defecto `1`. Los valores fuera de rango se ajustan al límite. Se refleja en los metadatos de la tarea; no garantiza el orden de ejecución. Consulta [Tareas asíncronas](/es/concepts/async-tasks.md). |
| `webhook.url` | No | Dónde se hace POST de la tarea terminada. Consulta [Webhooks](/es/concepts/webhooks.md). |

Cualquier otro campo devuelve `400 VALIDATION_ERROR`.

## Cómo se puntúa una página

1. **Acceso.** Se lee robots.txt para OAI-SearchBot, ChatGPT-User y GPTBot. La página se descarga como cada uno de
   ellos y como un navegador, desde una dirección de EE. UU., desde donde ChatGPT-User descarga las páginas.
2. **Lo que lee una persona.** Un navegador en `country` renderiza la página y la recorre hasta el final, y el texto
   de sus imágenes grandes se lee línea a línea. Las líneas sobre el tema propio de la página se convierten en
   fragmentos. Los menús, pies de página, otros productos, reseñas de clientes, botones y anuncios quedan fuera de la
   puntuación.
3. **Lo que conserva la búsqueda de ChatGPT.** Un navegador renderiza la página como OAI-SearchBot, el rastreador que
   alimenta la búsqueda de ChatGPT, desde una dirección de EE. UU., sin dejar salir ninguna solicitud de datos. Su
   copia es el texto del HTML que envía el servidor y el texto que los scripts de la página dibujan a partir de él,
   con el texto oculto y el texto alternativo de las imágenes. El texto dentro de las imágenes y el contenido que la
   página carga después de abrirse no están en ella, igual que no están en la búsqueda de ChatGPT.
4. **Lo que recibe ChatGPT al abrir la página.** El HTML que recibe ChatGPT-User se lee como lo lee el lector de
   ChatGPT: su texto, el texto oculto y el texto alternativo de las imágenes, sin scripts. Una imagen cuenta cuando
   ChatGPT puede abrirla y leerla: el HTML da la imagen como `src` de un `img`, en JPEG, PNG o WebP, a un tamaño en
   que el texto sigue siendo legible.
5. **Si ChatGPT abre la página.** Se pide dos veces a ChatGPT en producción que abra la página. Sus respuestas no se
   puntúan: solo muestran si abrió la página.
6. **Situar cada fragmento.** Un fragmento es `read` cuando la copia de la búsqueda lo contiene, y `missing` con su
   motivo en caso contrario. `direct` lo sitúa igual en lo que ChatGPT recibe al abrir la página. El código decide
   cada fragmento, así que una página que no ha cambiado obtiene la misma puntuación.

## Leer el resultado

La página de OLIVE YOUNG de arriba se lee así, recortada a los campos principales:

```json theme={"theme":"css-variables"}
{
  "level": "url",
  "url": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874",
  "finalUrl": "https://global.oliveyoung.com/product/detail?prdtNo=GA240322874",
  "score": 29,
  "direct": { "score": 29, "read": 16 },
  "pageType": "product",
  "access": {
    "verdict": "open",
    "chatgpt": { "opened": true, "inSearch": false, "lines": 819, "searchedFor": [], "observedAt": "2026-10-21T17:35:37.050Z" },
    "search": { "refused": false, "lines": 1343 },
    "robots": {
      "OAI-SearchBot": { "allowed": true, "named": false },
      "ChatGPT-User": { "allowed": true, "named": false },
      "GPTBot": { "allowed": true, "named": false }
    },
    "noindex": { "noindex": false },
    "probes": [
      { "agent": "ChatGPT-User", "status": 200, "blocked": false },
      { "agent": "OAI-SearchBot", "status": 200, "blocked": false },
      { "agent": "browser", "status": 200, "blocked": false }
    ]
  },
  "reading": {
    "score": 29,
    "facts": 55,
    "read": 16,
    "locations": { "html": 16, "rendered_only": 13, "image": 26 },
    "items": [
      {
        "label": "COSRX Vitamin E Vitalizing Sunscreen SPF 50+",
        "value": "COSRX Vitamin E Vitalizing Sunscreen SPF 50+",
        "where": "html",
        "line": 1,
        "status": "read",
        "direct": { "status": "read" }
      },
      {
        "label": "US$24.00",
        "value": "US$24.00",
        "where": "rendered_only",
        "status": "missing",
        "reason": "javascript_only",
        "direct": { "status": "missing", "reason": "javascript_only" }
      },
      {
        "label": "Strong and effective sun protection",
        "value": "Strong and effective sun protection",
        "where": "image",
        "status": "missing",
        "reason": "image_only",
        "direct": { "status": "missing", "reason": "image_only" },
        "foundIn": "image https://cdn-image.oliveyoung.com/slicedImg/editor/1157/f9e08334-....jpg (no alt text): the HTML ChatGPT receives has no img with this picture as its src"
      }
    ]
  },
  "causes": [
    { "reason": "javascript_only", "labels": ["4.6", "21 review", "30%", "US$24.00", "US$16.80", "..."] },
    { "reason": "image_only", "labels": ["Strong and effective sun protection", "Key Ingredients", "..."] }
  ],
  "analysis": {
    "summary": "ChatGPT search keeps 16 of 55 facts of the page. The biggest issue: 26 facts are written only inside an image, among them Strong and effective sun protection; Key Ingredients; Tocopherol (Vitamin E) (47 points). Fixing the confirmed issues could raise the score to about 100.",
    "potential": 100,
    "direct": "When ChatGPT opens the page itself, as when a person gives it the URL, it receives 16 of 55 facts (score 29).",
    "issues": [
      {
        "code": "image_only",
        "basis": "confirmed",
        "points": 47,
        "title": "26 facts are written only inside an image",
        "detail": "People read these values in the page's image, but the HTML has no text for them. ChatGPT search keeps a page's text and its images' alt text, not the text inside its images.",
        "fix": "Write this content as text in the page's HTML, next to the image or in place of it (a size chart as a table, rules and notes as sentences), or at least in the image's alt text.",
        "facts": [{ "label": "Key Ingredients", "value": "Key Ingredients", "foundIn": "image https://cdn-image.oliveyoung.com/... (no alt text): the HTML ChatGPT receives has no img with this picture as its src" }],
        "evidence": ["image https://cdn-image.oliveyoung.com/... (no alt text): the HTML ChatGPT receives has no img with this picture as its src"]
      },
      { "code": "javascript_only", "basis": "confirmed", "points": 24, "title": "13 facts are loaded only after the page opens", "...": "..." }
    ]
  },
  "reference": "rendered"
}
```

### `score`

La parte de los fragmentos que conserva la búsqueda de ChatGPT, de 0 a 100. Todos los fragmentos pesan lo mismo. La
puntuación es 0 cuando robots.txt deja la página fuera de la búsqueda de ChatGPT y cuando el sitio rechaza al
rastreador de la búsqueda de ChatGPT. `reading.score` guarda la parte antes de que robots.txt ponga la puntuación en 0.

### `direct`

Lo que ChatGPT recibe cuando abre la página por sí mismo, como cuando alguien le da la URL. `direct.score` es la parte
de los fragmentos que están en el HTML que recibe ChatGPT-User y en las imágenes que ChatGPT puede abrir, y
`direct.read` los cuenta. Es 0 cuando ChatGPT no pudo abrir la página. Las dos puntuaciones se separan donde la
página escribe texto en imágenes o lo dibuja con scripts: la búsqueda de ChatGPT no conserva el texto dentro de las
imágenes y sí lo que los scripts dibujan a partir del HTML, mientras que el lector de ChatGPT abre las imágenes que
puede leer y no ejecuta scripts. Una página de producto de alimentación cuya etiqueta nutricional es un JPEG a tamaño
completo obtuvo 56 en la búsqueda y 93 al abrirla directamente.

### `access`

| `verdict` | Significado |
| - | - |
| `open` | ChatGPT abrió la página. `chatgpt.lines` es el número de líneas que su lector obtuvo de ella. |
| `search_only` | ChatGPT no pudo abrir la página y solo la encontró entre sus resultados de búsqueda. `direct.score` es 0. |
| `blocked` | ChatGPT no pudo abrir la página ni la encontró en la búsqueda. `direct.score` es 0 y `blockedBy` indica quién la rechazó. |
| `search_opt_out` | robots.txt deja la página fuera de la búsqueda de ChatGPT, así que la puntuación es 0. |

`search.refused` es `true` cuando el sitio rechaza al rastreador de la búsqueda de ChatGPT, lo que deja la
puntuación en 0, y `search.lines` cuenta las líneas de la copia de la búsqueda. `blockedBy` es `user_agent` cuando el
sitio rechaza el agente ChatGPT-User desde cualquier dirección, `openai_addresses` cuando atiende a ese agente desde
nuestra dirección y rechaza las de OpenAI, y `site` cuando también rechaza a un navegador. `robots` da la línea de
robots.txt que decide para cada agente de OpenAI, `noindex` informa de una directiva noindex y dónde se puso, y
`probes` lista el estado que recibió cada descarga.

### `reading.items[]`

Una entrada por fragmento:

| Campo | Descripción |
| - | - |
| `label`, `value` | El fragmento tal como lo muestra la página. |
| `where` | Dónde lo tiene la página: `html`, `structured_data`, `script`, `rendered_only`, `frame` o `image`. `rendered_only` está en la página renderizada y en ningún HTML que reciba ChatGPT. |
| `status` | `read` cuando la búsqueda de ChatGPT lo conserva, o `missing`. |
| `reason` | Por qué la búsqueda de ChatGPT no lo conserva (abajo). |
| `direct` | `status` y `reason` para lo que ChatGPT recibe al abrir la página. |
| `rendering` | `status` en la copia de la página para agentes de IA: `read` cuando la copia tiene el fragmento en su texto. |
| `foundIn` | Dónde tiene la página un fragmento que falta, como una línea del HTML, o la URL de una imagen y por qué ChatGPT no puede leerla. |

`reading.locations` cuenta los fragmentos por `where`, lo que muestra qué queda por corregir cuando ChatGPT ya puede
abrir la página. `causes[]` agrupa los fragmentos que faltan por motivo.

| `reason` | Significado | Corrección |
| - | - | - |
| `blocked` | El sitio rechaza al rastreador de la búsqueda de ChatGPT. En `direct`, el fragmento está en el HTML o en una imagen que ChatGPT puede leer, y ChatGPT no pudo abrir la página. | Deja pasar a OAI-SearchBot y ChatGPT-User por su agente de usuario y las direcciones que publica OpenAI. |
| `javascript_only` | La página carga el fragmento después de abrirse. En `direct`, el fragmento solo aparece después de ejecutar los scripts. | Ponlo en el HTML que envía el servidor, renderizado en el servidor o en la compilación. |
| `structured_data_only` | Solo está en JSON-LD o en etiquetas meta. | Muéstralo también en el texto de la página. |
| `image_only` | Solo está escrito dentro de una imagen, y la búsqueda de ChatGPT no conserva el texto dentro de las imágenes. En `direct`, ChatGPT no puede leer la imagen: el HTML no da la imagen como `src` de un `img`, el `src` es un archivo más pequeño o llega en AVIF. | Escríbelo como texto en el HTML o en el texto alternativo de la imagen. |

### `analysis`

`summary` indica la puntuación, el mayor problema y la puntuación con los problemas confirmados corregidos
(`potential`). `direct` dice qué recibe ChatGPT cuando abre la página por sí mismo, o quién le impide abrirla y cómo
corregirlo. Cada entrada de `issues[]` tiene la causa (`detail`), la corrección (`fix`), los fragmentos que cuesta
(`facts`), su evidencia y los puntos que resta a la puntuación. Los problemas de acceso que dejan la puntuación en 0
van primero y el resto, por puntos. `basis` es `confirmed`: nuestra propia lectura de la página (su HTML, renders,
imágenes, robots.txt, respuestas HTTP) muestra el problema. El texto de `analysis` está en inglés.

### `markdown`

La página que ve una persona, en Markdown, con el texto de sus imágenes donde están las imágenes. El contenido propio
de la página, que la puntuación comprueba, queda bajo sus encabezados y etiquetas. Los menús, reseñas y demás partes
alrededor se pliegan en una línea cada una. Cada fragmento que la búsqueda de ChatGPT no conserva se marca donde está,
`_(missing: …)_` con el motivo, y el encabezado da cuántos fragmentos recibe ChatGPT al abrir la página. El
encabezado y las marcas están en el idioma de la página: inglés, coreano, japonés, chino, español, francés, alemán o
portugués, e inglés para cualquier otro. Una página en español dice `_(falta: …)_`. Un extracto de la página de
OLIVE YOUNG, que está en inglés:

```markdown theme={"theme":"css-variables"}
4.6 _(missing: loaded after the page opens)_
21 review _(missing: loaded after the page opens)_
US$16.80 _(missing: loaded after the page opens)_

> **Text in image** f9e08334-9760-45c5-89bb-…66eb1752.jpg · 52 lines · ChatGPT search keeps 10 of its 37 pieces
>
> Strong and effective sun protection _(missing)_
> Key Ingredients _(missing)_
> Tocopherol (Vitamin E) _(missing)_

_Other items (112 lines), reviews and questions (90), site menus and notices (57), buttons and tabs (46): Most Helpful · filter · Best …_
```

### `screenshot`

Las cuatro primeras pantallas de la página tal como la ve una persona, en JPEG: una ventana de 1366×900, capturada
arriba después de recorrer la página hasta el final. `url` es su propia clave de acceso y abre el archivo hasta
`expiresAt`, 30 días después de la tarea. Una página cuya imagen no se pudo capturar llega sin `screenshot`, y una
imagen que no se pudo guardar tiene `status: "failed"`.

### `rendering`

La página renderizada para agentes de IA. La copia es el HTML que dibujó el navegador de una persona, sin scripts y
con el texto de cada imagen añadido a su texto alt, la alternativa textual que WCAG pide para una imagen de texto.
`rendering.score` es la proporción de fragmentos que la copia tiene en su texto: lo que recibe un agente de IA al
que se sirve la copia, sin abrir ninguna imagen. `rendering.read` los cuenta y `reading.items[].rendering` marca
cada fragmento; la copia en sí no forma parte del resultado. La página de OLIVE YOUNG de arriba tiene sus
55 fragmentos en la copia, una puntuación de 100: el texto de sus imágenes de ingredientes y preguntas frecuentes
como texto alt, y los precios y valoraciones que cargan sus scripts.

```json theme={"theme":"css-variables"}
{
  "screenshot": { "status": "ok", "url": "https://api.querying.ai/v1/evidence/1792627200-0f1e….jpg", "expiresAt": "2026-11-21T04:05:43.048Z" },
  "rendering": {
    "score": 100,
    "read": 55
  }
}
```

`rendering` no aparece cuando ningún navegador pudo mostrar la página o su HTML dibujado es demasiado grande.

## Interpretar bien la puntuación

* La búsqueda de ChatGPT trabaja con una copia de la página que hizo su rastreador: el texto del HTML y lo que los
  scripts dibujan a partir de él, sin el texto dentro de las imágenes ni lo que la página carga después de abrirse.
  La copia es de la última vez que se rastreó, así que un cambio llega a la búsqueda de ChatGPT cuando el rastreador
  vuelve a descargar la página.
* Cuando ChatGPT abre una página por sí mismo, lee el HTML que envía el servidor. No ejecuta scripts, lee el texto
  alternativo de las imágenes y solo abre una imagen a través del `src` del `img` que da ese HTML. OpenAI reutiliza
  una página que abrió durante unos 30 minutos.
* La puntuación solo cambia cuando cambian la página o su forma de renderizarse. De quince páginas puntuadas tres
  veces cada una, diez variaron 3 puntos o menos. Una página que dibuja partes distintas en cada visita varía más.
* GEO Score mide lo que ChatGPT tiene de una página. Qué páginas elige la búsqueda de ChatGPT para una pregunta es lo
  que siguen los [monitores GEO](/es/monitors.md).

## Errores y facturación

Una tarea completada cuesta 10 créditos por la página y 5 por cada imagen cuyo texto se lee, hasta 12 imágenes:
`images.read` en el resultado. Una imagen que el host rechaza o que no se pudo leer (`images.unread`) es gratis. Si tu cuenta leyó la misma imagen en los últimos 90 días, se reutiliza esa lectura (`images.reused`) por 2 créditos. Al
enviar se reservan 70 créditos, lo máximo que cuesta una página, y al terminar se cobra lo que la tarea usó. Una tarea
fallida no se cobra. Consulta [Créditos y límites](/es/concepts/credits-and-limits.md).

### Rechazos al enviar

| Estado | Código | Causa |
| - | - | - |
| `400` | `VALIDATION_ERROR` | El cuerpo no es un objeto JSON, tiene un campo distinto de los anteriores, o `idempotencyKey`, `priority` o `webhook` tiene un tipo incorrecto. |
| `400` | `USE_DEDICATED_ENDPOINT` | Se envió `GEO_SCORE` a `/v1/async/task`. |
| `402` | `INSUFFICIENT_CREDITS` | El saldo es inferior a 70 créditos, lo máximo que cuesta una página. |
| `409` | `RESOURCE_ALREADY_EXISTS` | Ya existe una tarea con este `idempotencyKey`. |
| `422` | `VALIDATION_ERROR` | Falta `url`, no es `http` ni `https`, o apunta a un host o puerto privado. `details` indica el campo. |
| `422` | `REGION_UNSUPPORTED` | `country` no es `US` ni `KR`. |

Los errores de autenticación, concurrencia y frecuencia son los mismos que en cualquier tarea. Consulta [Errores](/es/concepts/errors.md).

### Tareas fallidas

Una tarea fallida tiene `status: "FAILED"` y una cadena `error` que empieza por su código:

```json theme={"theme":"css-variables"}
{
  "success": true,
  "task": { "id": "0b6c1f7e-...", "taskType": "GEO_SCORE", "status": "FAILED", "...": "..." },
  "credits": { "creditsToCharge": 0, "creditsCharged": 0 },
  "error": "PAGE_UNAVAILABLE: No browser could show the page (bot wall)"
}
```

| Código | Significado | Qué hacer |
| - | - | - |
| `PAGE_UNAVAILABLE` | Ningún navegador pudo mostrar la página como la ve una persona o como la copia el rastreador de la búsqueda de ChatGPT: una comprobación antibots, un estado de error o una página que no existe. El mensaje da el motivo. | Comprueba que la URL se abre en un navegador. La misma URL vuelve a fallar del mismo modo. |
| `CHATGPT_UNAVAILABLE` | ChatGPT no respondió a tiempo ninguna de las peticiones de abrir la página. | Envía la tarea de nuevo. |
| `NO_IP_AVAILABLE` | No hubo capacidad disponible a tiempo. | Reintenta más tarde. |
| Cualquier otro código | No se pudo puntuar la página. | Reintenta. |

## Siguientes pasos

> **[Citation Analysis](/es/research/citation-analysis.md)**
>
> Mira qué fuentes dieron forma a una respuesta.

> **[Monitores GEO](/es/monitors.md)**
>
> Sigue tu marca en los motores de IA con una programación.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.