> ## 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: ChatGPT 検索がページをどれだけ保持しているかを確かめる

> 1 ページについて、人が読む内容のうち ChatGPT 検索が保持する割合と、ChatGPT がページを開いたときに受け取る割合をスコアにし、残りを妨げている原因（robots.txt、拒否されたクローラー、ページが開いた後に読み込まれる内容、画像内の文字）を示します。

ChatGPT に引用してほしいページを GEO Score で点検します。スコアは、人がそのページで読む内容（画像内の文字を含む）の
うち、ChatGPT 検索が持つそのページのコピーに含まれる内容の割合です。`direct` は、誰かが URL を渡したときのように
ChatGPT がページを直接開いたときに受け取る割合です。ChatGPT 検索が逃す断片ごとに原因が付き、`analysis` が原因を
修正方法にまとめます。

## ページを採点する

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

タスクが受け付けられ、キューに入ります。

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

結果は `GET /v1/async/task/{id}` で読むか、リクエストに `webhook.url` を入れてタスク完了時に受け取ります。ほとんどの
ページは 1〜3 分かかるため、10〜15 秒ごとにポーリングします。ほかの[非同期タスク](/ja/concepts/async-tasks.md)と同じように
動作し、結果は `response` に入ります。リクエストのスキーマは [API リファレンス](/ja/api-reference/geo-score.md)にあります。

## リクエストのフィールド

| フィールド | 必須 | 説明 |
| - | - | - |
| `url` | はい | 採点するページ。公開ホストと既定ポートの `http` または `https` URL、2,048 文字以内。 |
| `country` | いいえ | 読む人がいる国。`US`（既定）または `KR`。その国のアドレスから、その国の言語とタイムゾーンでページをレンダリングします。 |
| `idempotencyKey` | いいえ | 送信の再試行を安全にします。[冪等性](/ja/concepts/idempotency.md)を参照してください。 |
| `priority` | いいえ | `1`〜`10` の整数、既定値は `1`。範囲外の値は丸められます。タスクのメタデータにそのまま返りますが、実行順序は保証しません。[非同期タスク](/ja/concepts/async-tasks.md)を参照してください。 |
| `webhook.url` | いいえ | 完了したタスクを POST する宛先。[Webhook](/ja/concepts/webhooks.md)を参照してください。 |

ほかのフィールドは `400 VALIDATION_ERROR` になります。

## 採点の仕組み

1. **アクセス。** OAI-SearchBot、ChatGPT-User、GPTBot ごとに robots.txt を判定します。ChatGPT-User がページを取得する
   米国のアドレスから、各エージェントとブラウザとしてページを取得します。
2. **人が読む内容。** `country` のブラウザがページをレンダリングして最後までスクロールし、大きな画像内の文字を
   1 行ずつ読みます。ページ固有の主題に関する行が断片になります。メニュー、フッター、他の商品、顧客レビュー、
   ボタン、広告はスコアから外します。
3. **ChatGPT 検索が保持する内容。** 米国のアドレスのブラウザが、ChatGPT 検索を支えるクローラー OAI-SearchBot として
   ページをレンダリングし、データのリクエストは外に出しません。コピーは、サーバーが送る HTML のテキストと、ページの
   スクリプトがその HTML から描くテキストで、非表示テキストと画像の alt テキストを含みます。画像内の文字と、ページが
   開いた後に読み込む内容は、ChatGPT 検索にないのと同じくこのコピーにもありません。
4. **ChatGPT がページを開いたときに受け取る内容。** ChatGPT-User が受け取る HTML を ChatGPT のリーダーと同じように
   読みます。本文テキスト、非表示テキスト、画像の alt テキストを読み、スクリプトは実行しません。画像は ChatGPT が
   開いて読めるときだけ数えます。HTML がその画像を `img` の src として渡し、形式が JPEG、PNG、WebP で、文字が読める
   大きさである必要があります。
5. **ChatGPT がページを開くか。** 本番の ChatGPT にページを開くよう 2 回尋ねます。回答は採点せず、ページを開いたか
   だけを見ます。
6. **断片の判定。** 検索のコピーにある断片は `read`、ない断片は理由とともに `missing` です。`direct` は ChatGPT が
   ページを開いたときに受け取る内容で同じ判定をします。コードがすべての断片を判定するため、変わっていないページは
   同じスコアになります。

## 結果を読む

上の OLIVE YOUNG のページの結果を主なフィールドだけに絞ると次のとおりです。

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

ChatGPT 検索が保持する断片の割合で、0 から 100 です。断片はすべて同じ重みです。robots.txt が ChatGPT 検索から
ページを外しているときと、サイトが ChatGPT 検索のクローラーを拒否しているときは 0 です。`reading.score` には
robots.txt で 0 になる前の割合が残ります。

### `direct`

誰かが URL を渡したときのように、ChatGPT がページを直接開いたときに受け取る内容です。`direct.score` は
ChatGPT-User が受け取る HTML と ChatGPT が開ける画像にある断片の割合で、`direct.read` はその数です。ChatGPT が
ページを開けなかったときは 0 です。2 つのスコアは、ページが文字を画像に書いたりスクリプトで描いたりするところで
分かれます。ChatGPT 検索は画像内の文字を保持せず、スクリプトが HTML から描く内容は保持します。ChatGPT のリーダーは
読める画像を開き、スクリプトは実行しません。栄養成分表示が原寸の JPEG である食品の商品ページは、検索で 56、
直接開いて 93 でした。

### `access`

| `verdict` | 意味 |
| - | - |
| `open` | ChatGPT がページを開きました。`chatgpt.lines` は ChatGPT のリーダーが作った行数です。 |
| `search_only` | ChatGPT はページを開けず、検索結果でだけ見つけました。`direct.score` は 0 です。 |
| `blocked` | ChatGPT はページを開けず、検索でも見つけられませんでした。`direct.score` は 0 で、`blockedBy` が拒否した側を示します。 |
| `search_opt_out` | robots.txt が ChatGPT 検索からページを外しているため、スコアは 0 です。 |

サイトが ChatGPT 検索のクローラーを拒否すると `search.refused` が `true` になり、スコアは 0 です。`search.lines` は
検索のコピーの行数です。`blockedBy` は、サイトがどのアドレスからでも ChatGPT-User エージェントを拒否するなら
`user_agent`、私たちのアドレスからのそのエージェントは受け入れ OpenAI のアドレスは拒否するなら
`openai_addresses`、ブラウザも拒否するなら `site` です。`robots` は OpenAI のエージェントごとに判定を決めた
robots.txt の行を、`noindex` は noindex の指示とその場所を、`probes` は各リクエストが受け取ったステータスを示します。

### `reading.items[]`

断片ごとに 1 項目です。

| フィールド | 説明 |
| - | - |
| `label`, `value` | ページに表示されたままの断片。 |
| `where` | ページ内の場所: `html`、`structured_data`、`script`、`rendered_only`、`frame`、`image`。`rendered_only` はレンダリングした画面にだけあり、ChatGPT が受け取る HTML にはありません。 |
| `status` | ChatGPT 検索が保持していれば `read`、そうでなければ `missing`。 |
| `reason` | ChatGPT 検索が逃した理由（下記）。 |
| `direct` | ChatGPT がページを開いたときに受け取るかどうかの `status` と `reason`。 |
| `rendering` | AI エージェント向けコピーでの `status`。コピーのテキストにその断片があれば `read` です。 |
| `foundIn` | 逃した断片がページ内にある場所。HTML の行、または画像の URL と ChatGPT がその画像を読めない理由です。 |

`reading.locations` は断片を `where` ごとに数え、ChatGPT がページを開けるようになった後にも残る問題を示します。
`causes[]` は逃した断片を原因ごとにまとめます。

| `reason` | 意味 | 修正方法 |
| - | - | - |
| `blocked` | サイトが ChatGPT 検索のクローラーを拒否しています。`direct` では、断片は HTML か ChatGPT が読める画像にあるが、ChatGPT がページを開けなかった場合です。 | OAI-SearchBot と ChatGPT-User を、ユーザーエージェントと OpenAI が公開しているアドレスで通します。 |
| `javascript_only` | ページが開いた後に読み込む断片です。`direct` では、スクリプトが実行された後にだけ表示される断片です。 | サーバーかビルド時にレンダリングし、サーバーが送る HTML に入れます。 |
| `structured_data_only` | JSON-LD か meta タグにだけあります。 | ページの本文テキストにも書きます。 |
| `image_only` | 画像の中にだけ文字としてあり、ChatGPT 検索は画像内の文字を保持しません。`direct` では、ChatGPT がその画像を読めない場合です。HTML がその画像を `img` の src として渡していない、src が小さいファイルである、または AVIF で届きます。 | HTML のテキストか画像の alt テキストに書きます。 |

### `analysis`

`summary` はスコア、最大の問題、確認された問題を直したときのスコア（`potential`）を書きます。`direct` は ChatGPT が
ページを直接開いたときに受け取る内容を、開けないときは妨げている側と修正方法を書きます。`issues[]` の各項目には、
原因（`detail`）、修正方法（`fix`）、その問題で逃した断片（`facts`）、根拠、その問題が下げた点数が入ります。スコアを
0 にとどめるアクセスの問題が先に来て、残りは下げた点数の大きい順です。`basis` は `confirmed` で、私たちが直接読んだ
ページ（HTML、レンダリング、画像、robots.txt、HTTP の応答）で確かめた問題であることを示します。`analysis` の文章は
英語です。

### `markdown`

人が見るページを Markdown にまとめたものです。画像内の文字は画像があった位置に入ります。スコアが確認するページ固有の
内容は見出しとラベルの下に置かれます。メニューやレビューなど内容の周りの部分は、区間ごとに 1 行に折りたたみます。
ChatGPT 検索が逃す断片はその位置に理由とともに `_(missing: …)_` と印を付け、冒頭には ChatGPT がページを開いたときに
受け取る断片の数も書きます。冒頭と印はページの言語で書きます。対応する言語は英語、韓国語、日本語、中国語、
スペイン語、フランス語、ドイツ語、ポルトガル語で、それ以外は英語です。日本語のページでは `_(欠落: …)_` です。
以下は英語の OLIVE YOUNG のページの一部です。

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

人が見るページの最初の 4 画面を収めた JPEG です。1366×900 のウィンドウでページを最後までスクロールしたあと、先頭で撮影します。
`url` 自体がアクセスキーで、`expiresAt`（タスクから 30 日後）まで開けます。撮影できなかったページには `screenshot` がなく、
保存できなかった画像は `status: "failed"` です。

### `rendering`

AI エージェント向けにレンダリングしたページです。コピーは、人のブラウザが描いた HTML からスクリプトを除き、各画像の中の文字をその alt
に加えたものです。WCAG が文字画像に求める代替テキストです。`rendering.score` はコピーのテキストに含まれる断片の割合で、コピーを受け取った
AI エージェントが画像を開かずに受け取る量です。`rendering.read` はその断片数、`reading.items[].rendering` は断片ごとの判定です。
コピー自体は結果に含まれません。上の OLIVE YOUNG のページは、コピーに 55 個の断片がすべて入り 100 点です。
成分と FAQ の画像の文字は alt に、スクリプトが読み込む価格と評価は本文に入ります。

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

ブラウザがページを表示できなかったか、描いた HTML が大きすぎる場合、`rendering` はありません。

## スコアを正しく読む

* ChatGPT 検索は、クローラーが作ったページのコピーをもとに動きます。コピーには HTML のテキストとスクリプトがその
  HTML から描く内容があり、画像内の文字とページが開いた後に読み込む内容はありません。コピーは最後に収集した時点の
  もので、ページを直した内容はクローラーがページを取得し直した後に ChatGPT 検索に入ります。
* ChatGPT がページを直接開くと、サーバーが送る HTML を読みます。スクリプトは実行せず、画像は alt テキストと、その
  HTML が渡す `img` の src からだけ開きます。OpenAI は開いたページを約 30 分間再利用します。
* スコアが動くのは、ページかページの描かれ方が変わったときだけです。15 ページをそれぞれ 3 回採点すると、
  10 ページは差が 3 点以下でした。訪問のたびに違う部分を描くページはもっと動きます。
* GEO Score は 1 ページを ChatGPT がどれだけ持つかを見ます。質問ごとに ChatGPT 検索がどのページを選ぶかは
  [GEO モニター](/ja/monitors.md) が追跡します。

## エラーと課金

完了したタスクは、ページ 10 クレジットと、文字を読んだ画像 1 枚ごとに 5 クレジットです(最大 12 枚、結果の `images.read`)。
ホストが拒否した画像や読めなかった画像(`images.unread`)は無料です。アカウントが 90 日以内に同じ画像を読んでいれば、その結果を再利用し(`images.reused`)、1 枚 2 クレジットです。送信時に 1 ページの上限である 70 クレジットを確保し、
完了時に使った分だけ請求します。失敗したタスクは請求しません。[クレジットと制限](/ja/concepts/credits-and-limits.md)を参照してください。

### 送信時の拒否

| ステータス | コード | 原因 |
| - | - | - |
| `400` | `VALIDATION_ERROR` | 本文が JSON オブジェクトでない、上にないフィールドがある、または `idempotencyKey`、`priority`、`webhook` の型が違います。 |
| `400` | `USE_DEDICATED_ENDPOINT` | `GEO_SCORE` を `/v1/async/task` に送りました。 |
| `402` | `INSUFFICIENT_CREDITS` | 残高が 1 ページの上限である 70 クレジット未満です。 |
| `409` | `RESOURCE_ALREADY_EXISTS` | 同じ `idempotencyKey` のタスクがすでにあります。 |
| `422` | `VALIDATION_ERROR` | `url` がない、`http`・`https` でない、またはプライベートなホストやポートを指しています。`details` がフィールドを示します。 |
| `422` | `REGION_UNSUPPORTED` | `country` が `US` でも `KR` でもありません。 |

認証、同時実行数、レート制限のエラーはほかのタスクと同じです。[エラー](/ja/concepts/errors.md)を参照してください。

### 失敗したタスク

失敗したタスクは `status: "FAILED"` で、`error` 文字列がコードで始まります。

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

| コード | 意味 | 対応 |
| - | - | - |
| `PAGE_UNAVAILABLE` | 人が見るページか ChatGPT 検索のクローラーのコピーを、どのブラウザも表示できませんでした。ボット検査、エラーステータス、存在しないページが原因で、メッセージに理由があります。 | URL がブラウザで開くか確かめます。同じ URL は同じ理由で再び失敗します。 |
| `CHATGPT_UNAVAILABLE` | ChatGPT がページを開く依頼に時間内に 1 つも答えませんでした。 | タスクをもう一度送ります。 |
| `NO_IP_AVAILABLE` | 時間内に使える容量がありませんでした。 | 少し待って再試行します。 |
| その他のコード | ページを採点できませんでした。 | 再試行します。 |

## 次のステップ

> **[Citation Analysis](/ja/research/citation-analysis.md)**
>
> 1 つの回答を形作った情報源を確かめます。

> **[GEO モニター](/ja/monitors.md)**
>
> AI エンジンでのブランドを決まったスケジュールで追跡します。


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