> ## 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 검색이 페이지를 얼마나 가져가는지 확인하기

> 페이지 하나에서 사람이 읽는 내용 중 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초마다 조회합니다. 다른 [비동기 태스크](/ko/concepts/async-tasks.md)와 똑같이 동작하며 결과는
`response`에 들어 있습니다. 요청 스키마는 [API 레퍼런스](/ko/api-reference/geo-score.md)에 있습니다.

## 요청 필드

| 필드 | 필수 | 설명 |
| - | - | - |
| `url` | 예 | 채점할 페이지. 공개 호스트와 기본 포트의 `http` 또는 `https` URL, 2,048자 이하. |
| `country` | 아니요 | 읽는 사람이 있는 국가. `US`(기본) 또는 `KR`. 그 국가의 주소에서 그 국가의 언어와 시간대로 페이지를 렌더합니다. |
| `idempotencyKey` | 아니요 | 재시도한 제출을 안전하게 만듭니다. [멱등성](/ko/concepts/idempotency.md)을 참고하세요. |
| `priority` | 아니요 | 정수 `1`–`10`, 기본 `1`. 범위를 벗어난 값은 범위 안으로 맞춰집니다. 태스크 메타데이터에 그대로 표시될 뿐 실행 순서를 보장하지 않습니다. [비동기 태스크](/ko/concepts/async-tasks.md)를 참고하세요. |
| `webhook.url` | 아니요 | 완료된 태스크를 POST할 주소. [웹훅](/ko/concepts/webhooks.md)을 참고하세요. |

다른 필드는 `400 VALIDATION_ERROR`입니다.

## 채점 방식

1. **접근.** OAI-SearchBot, ChatGPT-User, GPTBot마다 robots.txt를 판정합니다. ChatGPT-User가 페이지를 가져오는
   미국 주소에서 각 에이전트와 브라우저로 페이지를 받습니다.
2. **사람이 읽는 내용.** `country`의 브라우저가 페이지를 렌더하고 끝까지 내려 읽으며, 큰 이미지 속 글자를
   줄 단위로 읽습니다. 페이지 고유 주제에 관한 줄이 조각이 됩니다. 메뉴, 바닥글, 다른 상품, 고객 리뷰, 버튼,
   광고는 점수에서 뺍니다.
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에 페이지를 열라고 두 번 묻습니다. 답은 채점하지 않고 페이지를
   열었는지만 봅니다.
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입니다. 두 점수는 페이지가 글자를 이미지에 쓰거나 스크립트로 그리는 곳에서 갈립니다. 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[]`

조각마다 한 항목입니다.

| 필드 | 설명 |
| - | - |
| `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를 user agent와 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으로 정리한 것입니다. 이미지 안의 글자는 이미지가 있던 자리에 들어갑니다. 점수가
확인하는 페이지 고유 내용은 제목과 라벨 아래에 놓입니다. 메뉴, 리뷰처럼 내용 주변의 부분은 구간마다 한 줄로
접습니다. 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`

사람이 보는 페이지의 첫 네 화면을 담은 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개를 세 번씩 채점했을 때 10개는 점수
  차이가 3점 이하였습니다. 방문할 때마다 다른 부분을 그리는 페이지는 더 많이 움직입니다.
* GEO Score는 페이지 하나를 ChatGPT가 얼마나 가지는지 봅니다. ChatGPT 검색이 질문마다 어떤 페이지를 고르는지는
  [GEO 모니터](/ko/monitors.md)가 추적합니다.

## 오류와 과금

완료된 태스크는 페이지 10크레딧에 글자를 읽은 이미지마다 5크레딧입니다(최대 12장, 결과의 `images.read`). 호스트가
거절했거나 읽지 못한 이미지(`images.unread`)는 받지 않습니다. 계정이 90일 안에 같은 이미지를 읽었으면 그 결과를 다시 쓰고(`images.reused`), 장당 2크레딧입니다. 제출할 때 한 페이지의 최대치인 70크레딧을 잡아 두고,
태스크가 완료되면 쓴 만큼만 차감합니다. 실패한 태스크는 차감하지 않습니다. [크레딧과 한도](/ko/concepts/credits-and-limits.md)를
참고하세요.

### 제출 시 거절

| 상태 | 코드 | 원인 |
| - | - | - |
| `400` | `VALIDATION_ERROR` | 본문이 JSON 객체가 아니거나, 위에 없는 필드가 있거나, `idempotencyKey`, `priority`, `webhook`의 타입이 틀렸습니다. |
| `400` | `USE_DEDICATED_ENDPOINT` | `GEO_SCORE`를 `/v1/async/task`로 보냈습니다. |
| `402` | `INSUFFICIENT_CREDITS` | 잔액이 한 페이지의 최대치인 70크레딧보다 적습니다. |
| `409` | `RESOURCE_ALREADY_EXISTS` | 같은 `idempotencyKey`의 태스크가 이미 있습니다. |
| `422` | `VALIDATION_ERROR` | `url`이 없거나, `http`·`https`가 아니거나, 사설 호스트나 포트를 가리킵니다. `details`가 필드를 알려줍니다. |
| `422` | `REGION_UNSUPPORTED` | `country`가 `US`나 `KR`이 아닙니다. |

인증, 동시성, 속도 제한 오류는 다른 태스크와 같습니다. [오류](/ko/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가 페이지를 열어 달라는 요청에 제시간에 하나도 답하지 않았습니다. | 태스크를 다시 보냅니다. |
| `NO_IP_AVAILABLE` | 제시간에 쓸 수 있는 용량이 없었습니다. | 잠시 뒤 다시 시도합니다. |
| 그 밖의 코드 | 페이지를 채점하지 못했습니다. | 다시 시도합니다. |

## 다음 단계

> **[Citation Analysis](/ko/research/citation-analysis.md)**
>
> 답변 하나를 만든 출처를 확인합니다.

> **[GEO 모니터](/ko/monitors.md)**
>
> AI 엔진에서 브랜드를 정해진 일정으로 추적합니다.


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