> ## 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: messen, wie viel die ChatGPT-Suche von einer Seite behält

> Bewertet eine Seite danach, wie viel von dem, was ein Mensch dort liest, die ChatGPT-Suche behält und ChatGPT erhält, wenn es die Seite öffnet, und zeigt, was den Rest fernhält: robots.txt, ein abgelehnter Crawler, erst nach dem Öffnen geladene Inhalte und Text in Bildern.

Prüfen Sie mit GEO Score eine Seite, die ChatGPT zitieren soll. Der Score ist der Anteil dessen, was ein Mensch auf der
Seite liest, einschließlich des Textes in ihren Bildern, den die ChatGPT-Suche in ihrer Kopie der Seite behält. `direct`
gibt den Anteil an, den ChatGPT erhält, wenn es die Seite selbst öffnet, etwa wenn jemand ihm die URL gibt. Jedes Stück,
das die ChatGPT-Suche nicht behält, kommt mit seiner Ursache, und `analysis` macht aus den Ursachen Korrekturen.

## Eine Seite bewerten

```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" }'
```

Der Task wird angenommen und in die Warteschlange gestellt:

```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 }
}
```

Lesen Sie das Ergebnis mit `GET /v1/async/task/{id}`, oder fügen Sie der Anfrage `webhook.url` hinzu und erhalten Sie es,
sobald der Task fertig ist. Die meisten Seiten brauchen 1 bis 3 Minuten; fragen Sie alle 10 bis 15 Sekunden ab. Der Task
funktioniert wie jeder andere [asynchrone Task](/de/concepts/async-tasks.md), und das Ergebnis steht in `response`. Das
Anfrageschema steht in der [API-Referenz](/de/api-reference/geo-score.md).

## Anfragefelder

| Feld | Pflicht | Beschreibung |
| - | - | - |
| `url` | Ja | Die zu bewertende Seite: eine `http`- oder `https`-URL auf einem öffentlichen Host und dem Standardport, bis zu 2.048 Zeichen. |
| `country` | Nein | Wo der Leser ist: `US` (Standard) oder `KR`. Die Seite wird von einer Adresse in diesem Land gerendert, in dessen Sprache und Zeitzone. |
| `idempotencyKey` | Nein | Macht ein wiederholtes Einreichen sicher. Siehe [Idempotenz](/de/concepts/idempotency.md). |
| `priority` | Nein | Ganzzahl `1`–`10`, Standard `1`. Werte außerhalb des Bereichs werden begrenzt. Wird in den Task-Metadaten zurückgegeben; eine Ausführungsreihenfolge ist nicht garantiert. Siehe [Asynchrone Tasks](/de/concepts/async-tasks.md). |
| `webhook.url` | Nein | Wohin der fertige Task per POST gesendet wird. Siehe [Webhooks](/de/concepts/webhooks.md). |

Jedes andere Feld ergibt `400 VALIDATION_ERROR`.

## So wird eine Seite bewertet

1. **Zugriff.** robots.txt wird für OAI-SearchBot, ChatGPT-User und GPTBot ausgewertet. Die Seite wird als jeder dieser
   Agenten und als Browser abgerufen, von einer US-Adresse, von der aus ChatGPT-User Seiten abruft.
2. **Was ein Mensch liest.** Ein Browser in `country` rendert die Seite und scrollt bis zum Ende, und der Text in ihren
   großen Bildern wird Zeile für Zeile gelesen. Zeilen zum eigenen Thema der Seite werden zu Stücken. Menüs, Fußzeilen,
   andere Produkte, Kundenbewertungen, Schaltflächen und Werbung bleiben außerhalb des Scores.
3. **Was die ChatGPT-Suche behält.** Ein Browser rendert die Seite als OAI-SearchBot, der Crawler, der die ChatGPT-Suche
   speist, von einer US-Adresse und lässt keine Datenanfrage nach außen. Die Kopie besteht aus dem Text des HTML, das der
   Server sendet, und dem Text, den die Skripte der Seite daraus zeichnen, samt verstecktem Text und Alt-Text der Bilder.
   Text in Bildern und Inhalte, die die Seite erst nach dem Öffnen lädt, fehlen darin, wie sie auch in der ChatGPT-Suche
   fehlen.
4. **Was ChatGPT beim Öffnen der Seite erhält.** Das HTML, das ChatGPT-User erhält, wird so gelesen, wie der Reader von
   ChatGPT es liest: sein Text, versteckter Text und der Alt-Text der Bilder, ohne Skripte. Ein Bild zählt, wenn ChatGPT
   es öffnen und lesen kann: Das HTML gibt das Bild als `src` eines `img` an, als JPEG, PNG oder WebP, in einer Größe, in
   der der Text lesbar bleibt.
5. **Ob ChatGPT die Seite öffnet.** Das produktive ChatGPT wird zweimal gebeten, die Seite zu öffnen. Seine Antworten
   werden nicht bewertet: Sie zeigen nur, ob es die Seite geöffnet hat.
6. **Einordnung jedes Stücks.** Ein Stück ist `read`, wenn die Kopie der Suche es enthält, sonst `missing` mit seiner
   Ursache. `direct` ordnet es auf dieselbe Weise danach ein, was ChatGPT beim Öffnen der Seite erhält. Code entscheidet
   jedes Stück, daher erhält eine unveränderte Seite denselben Score.

## Das Ergebnis lesen

Die OLIVE-YOUNG-Seite oben ergibt dieses Ergebnis, gekürzt auf die wichtigsten Felder:

```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`

Der Anteil der Stücke, die die ChatGPT-Suche behält, von 0 bis 100. Alle Stücke wiegen gleich. Der Score ist 0, wenn
robots.txt die Seite aus der ChatGPT-Suche heraushält und wenn die Website den Crawler der ChatGPT-Suche ablehnt.
`reading.score` enthält den Anteil, bevor robots.txt den Score auf 0 setzt.

### `direct`

Was ChatGPT erhält, wenn es die Seite selbst öffnet, etwa wenn jemand ihm die URL gibt. `direct.score` ist der Anteil
der Stücke im HTML, das ChatGPT-User erhält, und in den Bildern, die ChatGPT öffnen kann, und `direct.read` zählt diese
Stücke. Konnte ChatGPT die Seite nicht öffnen, ist `direct.score` 0. Die beiden Scores gehen dort auseinander, wo eine
Seite Text in Bilder schreibt oder mit Skripten zeichnet: Die ChatGPT-Suche behält keinen Text in Bildern und behält,
was Skripte aus dem HTML zeichnen, während der Reader von ChatGPT Bilder öffnet, die er lesen kann, und keine Skripte
ausführt. Eine Lebensmittel-Produktseite, deren Nährwerttabelle ein JPEG in voller Größe ist, erhielt 56 für die Suche
und 93 beim direkten Öffnen.

### `access`

| `verdict` | Bedeutung |
| - | - |
| `open` | ChatGPT hat die Seite geöffnet. `chatgpt.lines` ist die Zahl der Zeilen, die sein Reader daraus gemacht hat. |
| `search_only` | ChatGPT konnte die Seite nicht öffnen und fand sie nur in seinen Suchergebnissen. `direct.score` ist 0. |
| `blocked` | ChatGPT konnte die Seite nicht öffnen und fand sie nicht in der Suche. `direct.score` ist 0, und `blockedBy` nennt, wer abgelehnt hat. |
| `search_opt_out` | robots.txt hält die Seite aus der ChatGPT-Suche heraus, daher ist der Score 0. |

`search.refused` ist `true`, wenn die Website den Crawler der ChatGPT-Suche ablehnt, was den Score bei 0 hält, und
`search.lines` zählt die Zeilen der Kopie der Suche. `blockedBy` ist `user_agent`, wenn die Website den Agenten
ChatGPT-User von jeder Adresse ablehnt, `openai_addresses`, wenn sie diesen Agenten von unserer Adresse bedient und die
Adressen von OpenAI ablehnt, und `site`, wenn sie auch einen Browser ablehnt. `robots` nennt für jeden OpenAI-Agenten
die entscheidende robots.txt-Zeile, `noindex` meldet eine noindex-Anweisung und wo sie gesetzt ist, und `probes` listet
den Status jedes Abrufs.

### `reading.items[]`

Ein Eintrag pro Stück:

| Feld | Beschreibung |
| - | - |
| `label`, `value` | Das Stück, wie die Seite es zeigt. |
| `where` | Wo die Seite es hat: `html`, `structured_data`, `script`, `rendered_only`, `frame` oder `image`. `rendered_only` steht auf der gerenderten Seite und in keinem HTML, das ChatGPT erhält. |
| `status` | `read`, wenn die ChatGPT-Suche es behält, sonst `missing`. |
| `reason` | Warum die ChatGPT-Suche es nicht behält (unten). |
| `direct` | `status` und `reason` für das, was ChatGPT beim Öffnen der Seite erhält. |
| `rendering` | `status` in der Kopie der Seite für KI-Agenten: `read`, wenn die Kopie das Stück in ihrem Text enthält. |
| `foundIn` | Wo die Seite ein fehlendes Stück hat, etwa eine Zeile des HTML oder eine Bild-URL samt Grund, warum ChatGPT das Bild nicht lesen kann. |

`reading.locations` zählt die Stücke nach `where` und zeigt, was zu beheben bleibt, sobald ChatGPT die Seite öffnen kann.
`causes[]` gruppiert die fehlenden Stücke nach Ursache.

| `reason` | Bedeutung | Korrektur |
| - | - | - |
| `blocked` | Die Website lehnt den Crawler der ChatGPT-Suche ab. In `direct` steht das Stück im HTML oder in einem Bild, das ChatGPT lesen kann, und ChatGPT konnte die Seite nicht öffnen. | OAI-SearchBot und ChatGPT-User durchlassen, nach User-Agent und den von OpenAI veröffentlichten Adressen. |
| `javascript_only` | Die Seite lädt das Stück erst nach dem Öffnen. In `direct` erscheint das Stück erst, nachdem Skripte gelaufen sind. | Es in das HTML stellen, das der Server sendet, auf dem Server oder beim Build gerendert. |
| `structured_data_only` | Es steht nur in JSON-LD oder Meta-Tags. | Zusätzlich im Text der Seite zeigen. |
| `image_only` | Das Stück steht nur in einem Bild, und die ChatGPT-Suche behält keinen Text in Bildern. In `direct` kann ChatGPT das Bild nicht lesen: Das HTML gibt das Bild nicht als `src` eines `img` an, der `src` ist eine kleinere Datei, oder es kommt als AVIF. | Als Text ins HTML oder in den Alt-Text des Bildes schreiben. |

### `analysis`

`summary` nennt den Score, das größte Problem und den Score nach Behebung der bestätigten Probleme (`potential`).
`direct` sagt, was ChatGPT erhält, wenn es die Seite selbst öffnet, oder wer es am Öffnen hindert und wie man das behebt.
Jeder Eintrag in `issues[]` enthält die Ursache (`detail`), die Korrektur (`fix`), die betroffenen Stücke (`facts`),
Belege und die Punkte, die das Problem vom Score abzieht. Zugriffsprobleme, die den Score bei 0 halten, kommen zuerst,
der Rest nach Punkten. `basis` ist `confirmed`: Unsere eigene Lesung der Seite (ihr HTML, ihre Renderings, ihre Bilder,
robots.txt, HTTP-Antworten) zeigt das Problem. Der Text von `analysis` ist auf Englisch.

### `markdown`

Die Seite, wie ein Mensch sie sieht, als Markdown, mit dem Text ihrer Bilder an der Stelle der Bilder. Der eigene
Inhalt der Seite, den der Score prüft, steht unter ihren Überschriften und Bezeichnungen. Menüs, Bewertungen und die
übrigen Teile um den Inhalt sind zu je einer Zeile zusammengefasst. Jedes Stück, das die ChatGPT-Suche nicht behält,
ist an seiner Stelle mit `_(missing: …)_` und dem Grund markiert, und die Kopfzeile nennt, wie viele Stücke ChatGPT
beim Öffnen der Seite erhält. Kopfzeile und Markierungen stehen in der Sprache der Seite: Englisch, Koreanisch,
Japanisch, Chinesisch, Spanisch, Französisch, Deutsch oder Portugiesisch, für jede andere Sprache Englisch. Eine
deutsche Seite zeigt `_(fehlt: …)_`. Ein Ausschnitt der englischsprachigen OLIVE-YOUNG-Seite:

```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`

Die ersten vier Bildschirme der Seite, wie ein Mensch sie sieht, als JPEG: ein Fenster von 1366×900, oben
aufgenommen, nachdem die Seite bis zum Ende gescrollt wurde. `url` ist ihr eigener Zugriffsschlüssel und öffnet die
Datei bis `expiresAt`, 30 Tage nach dem Task. Eine Seite, deren Bild nicht aufgenommen werden konnte, kommt ohne
`screenshot`, und ein Bild, das nicht gespeichert werden konnte, hat `status: "failed"`.

### `rendering`

Die für KI-Agenten gerenderte Seite. Die Kopie ist das HTML, das der Browser eines Menschen gezeichnet hat, ohne
Skripte und mit dem Text jedes Bildes in seinem Alt-Text, der Textalternative, die WCAG für ein Bild mit Text
verlangt. `rendering.score` ist der Anteil der Stücke, die die Kopie in ihrem Text enthält: was ein KI-Agent erhält,
dem die Kopie ausgeliefert wird, ohne ein Bild zu öffnen. `rendering.read` zählt sie, `reading.items[].rendering`
markiert jedes Stück; die Kopie selbst ist nicht Teil des Ergebnisses. Die OLIVE-YOUNG-Seite oben enthält
alle 55 Stücke in ihrer Kopie, ein Score von 100: den Text ihrer Inhaltsstoff- und FAQ-Bilder als Alt-Text und die
Preise und Bewertungen, die ihre Skripte laden.

```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` fehlt, wenn kein Browser die Seite anzeigen konnte oder ihr gezeichnetes HTML zu groß ist.

## Den Score richtig lesen

* Die ChatGPT-Suche arbeitet mit einer Kopie, die ihr Crawler von der Seite gemacht hat: dem Text des HTML und dem,
  was Skripte daraus zeichnen, ohne den Text in Bildern und ohne das, was die Seite erst nach dem Öffnen lädt. Die
  Kopie stammt vom letzten Crawl, daher erreicht eine Änderung die ChatGPT-Suche erst, nachdem der Crawler die Seite
  erneut abgerufen hat.
* Wenn ChatGPT eine Seite selbst öffnet, liest es das HTML, das der Server sendet. Es führt keine Skripte aus, liest
  bei Bildern den Alt-Text und öffnet ein Bild nur über den `src` des `img`, den dieses HTML angibt. OpenAI verwendet
  eine geöffnete Seite etwa 30 Minuten lang wieder.
* Der Score ändert sich nur, wenn sich die Seite oder die Art ihrer Darstellung ändert. Von fünfzehn Seiten, je dreimal
  bewertet, schwankten zehn um höchstens 3 Punkte. Eine Seite, die bei jedem Besuch andere Teile zeigt, schwankt stärker.
* GEO Score betrachtet, was ChatGPT von einer Seite hat. Welche Seiten die ChatGPT-Suche für eine Frage auswählt,
  verfolgen die [GEO-Monitore](/de/monitors.md).

## Fehler und Abrechnung

Ein abgeschlossener Task kostet 10 Credits für die Seite und 5 für jedes Bild, dessen Text gelesen wird, höchstens 12
Bilder: `images.read` im Ergebnis. Ein Bild, das der Host verweigert oder das nicht gelesen werden konnte
(`images.unread`), ist kostenlos. Hat Ihr Konto dasselbe Bild in den letzten 90 Tagen gelesen, wird diese Lesung wiederverwendet (`images.reused`), für 2 Credits. Beim Einreichen werden 70 Credits reserviert, das Höchste, was eine Seite kostet, und
bei Abschluss wird berechnet, was der Task verbraucht hat. Ein fehlgeschlagener Task wird nicht berechnet. Siehe
[Credits und Limits](/de/concepts/credits-and-limits.md).

### Beim Einreichen abgelehnt

| Status | Code | Ursache |
| - | - | - |
| `400` | `VALIDATION_ERROR` | Der Body ist kein JSON-Objekt, enthält ein anderes Feld als die oben genannten, oder `idempotencyKey`, `priority` oder `webhook` hat den falschen Typ. |
| `400` | `USE_DEDICATED_ENDPOINT` | `GEO_SCORE` wurde an `/v1/async/task` gesendet. |
| `402` | `INSUFFICIENT_CREDITS` | Das Guthaben liegt unter 70 Credits, dem Höchstpreis einer Seite. |
| `409` | `RESOURCE_ALREADY_EXISTS` | Ein Task mit diesem `idempotencyKey` existiert bereits. |
| `422` | `VALIDATION_ERROR` | `url` fehlt, ist weder `http` noch `https` oder verweist auf einen privaten Host oder Port. `details` nennt das Feld. |
| `422` | `REGION_UNSUPPORTED` | `country` ist weder `US` noch `KR`. |

Authentifizierungs-, Parallelitäts- und Ratenfehler sind dieselben wie bei jedem Task. Siehe [Fehler](/de/concepts/errors.md).

### Fehlgeschlagene Tasks

Ein fehlgeschlagener Task hat `status: "FAILED"` und einen `error`-String, der mit seinem Code beginnt:

```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)"
}
```

| Code | Bedeutung | Was tun |
| - | - | - |
| `PAGE_UNAVAILABLE` | Ein Browser konnte die Seite nicht anzeigen, wie ein Mensch sie sieht oder wie der Crawler der ChatGPT-Suche sie abruft: eine Bot-Prüfung, ein Fehlerstatus oder eine nicht vorhandene Seite. Die Meldung nennt den Grund. | Prüfen, ob sich die URL in einem Browser öffnet. Dieselbe URL schlägt erneut auf dieselbe Weise fehl. |
| `CHATGPT_UNAVAILABLE` | ChatGPT hat keine der Bitten, die Seite zu öffnen, rechtzeitig beantwortet. | Den Task erneut senden. |
| `NO_IP_AVAILABLE` | Es war nicht rechtzeitig Kapazität verfügbar. | Später erneut versuchen. |
| Jeder andere Code | Die Seite konnte nicht bewertet werden. | Erneut versuchen. |

## Nächste Schritte

> **[Citation Analysis](/de/research/citation-analysis.md)**
>
> Sehen, welche Quellen eine Antwort geprägt haben.

> **[GEO-Monitore](/de/monitors.md)**
>
> Ihre Marke in KI-Engines nach Zeitplan verfolgen.


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