> ## 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.

# Citation Analysis

> 프롬프트별 AI 가시성 진단: 엔진이 실행한 검색, 가져오고 인용한 페이지, 답변이 언급한 브랜드와 그 배경 페이지, 내 브랜드의 위치, 우선순위가 매겨진 조치

완료된 AI 답변을 그 배경이 된 페이지와 비교합니다. 결과는 엔진이 실행한 검색, 엔진이 가져온 페이지와
그중 인용한 페이지, 답변이 언급한 브랜드와 그 브랜드를 언급한 페이지, 내 브랜드의 위치, 그리고 우선순위가
매겨진 조치를 보여 줍니다. 또한 인용된 각 페이지의 문단을 그에 대응하는 답변 부분과 연결하고, 연결마다의
설명과 함께 인용된 페이지들의 공통점을 요약합니다.

이는 기존 답변에 대한 사후 대응 분석입니다. 출처가 모델로 하여금 문장을 생성하게 했다는 증거도, 페이지
품질 점수도 아닙니다. 판결이 아니라 살펴볼 근거로 다루세요.

```bash theme={"theme":"css-variables"}
curl -X POST https://api.querying.ai/v1/citation-analysis \
  -H "Authorization: Bearer $QUERYING_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "answer": "…the AI answer, as raw markdown…",
    "prompt": "best password manager for a small team",
    "engine": "CHATGPT",
    "brand": "1Password",
    "competitors": ["Bitwarden"],
    "citations": [
      { "url": "https://example.com/best-password-managers", "body": "…the page markdown…" },
      { "url": "https://another.example.com/pricing" }
    ]
  }'
```

`GET /v1/async/task/:id`를 폴링하거나 제출할 때 `webhook.url`을 지정하세요. 태스크는
`taskType: "CITATION_ANALYSIS"`로 보고됩니다. 이 분석은 `POST /v1/async/task`로 제출하지 말고 전용
엔드포인트를 쓰세요. GEO Audit 시절을 포함한 이전 엔드포인트 `POST /v1/geo-audit`, `POST /v1/source-influence`와 `POST /v1/research`, 태스크 유형 `GEO_AUDIT`, `SOURCE_INFLUENCE`와 `CITATION_ATTRIBUTION`, `include.geoAudit`, `include.sourceInfluence`도 계속 동작합니다. 응답에는 항상 새 이름이 쓰입니다.

### 이미 실행한 태스크 분석

답변이 이 API에서 나왔다면, 결과에서 답변과 인용을 복사하는 대신 태스크 id를 보내세요.

```bash theme={"theme":"css-variables"}
curl -X POST https://api.querying.ai/v1/citation-analysis \
  -H "Authorization: Bearer $QUERYING_API_KEY" -H "Content-Type: application/json" \
  -d '{ "taskId": "7c1f…", "brand": "1Password", "competitors": ["Bitwarden"] }'
```

태스크는 본인 소유이고 `COMPLETED` 상태이며 `GET /v1/async/task/:id`로 아직 읽을 수 있어야 합니다.
답변 Markdown(엔진이 Markdown을 반환하지 않았다면 텍스트)이 `answer`가 되고, 인용 URL이 엔진 순서대로
`citations`가 됩니다. 처음 100개까지이며 토론 스레드는 최대 10개입니다. 상품·동영상 카드 자리표시자
(`googleusercontent.com` 링크)와 Google 검색 링크는 읽을 페이지가 없으므로 건너뜁니다. 따로 보내지 않으면
태스크의 `prompt`, `country`, 엔진을 씁니다. `taskId`를 `answer`나 `citations`와 함께 보내면 `400`으로
거부되며, 끝나지 않았거나 답변 텍스트나 인용 URL이 없는 태스크도 마찬가지입니다. 알 수 없거나 만료된
태스크 id는 `404`를 반환합니다.

### 수집하면서 모든 답변 분석

수집 요청에 `include.citationAnalysis: true`를 넣으면 답변이 수집되는 즉시 분석이 이어서 실행됩니다.
답변 엔진(`CHATGPT`, `GEMINI`, `PERPLEXITY`, `GOOGLE_AIO`, `GOOGLE_AIMODE`, `NAVER_AI_BRIEF`, `NAVER_AI_TAB`, `BING_SEARCH`, `BING_COPILOT`)에서 단건 태스크, 태스크 배치, 그리드, `POST /v1/batches` 모두에 쓸 수 있습니다.

```bash theme={"theme":"css-variables"}
curl -X POST https://api.querying.ai/v1/async/task \
  -H "Authorization: Bearer $QUERYING_API_KEY" -H "Content-Type: application/json" \
  -d '{
    "taskType": "CHATGPT",
    "payload": { "prompt": "best password manager for a small team", "country": "US", "include": { "citationAnalysis": true } },
    "webhook": { "url": "https://example.com/hook" }
  }'
```

분석은 위의 `taskId`와 같은 방식으로 답변과 인용 URL을 읽습니다. 그러면 답변 결과에
`response.citationAnalysis`가 실립니다. `GET /v1/async/task/:id`가 반환하는 분석 태스크 그대로이며
`task`, `credits`, 그리고 `response` 또는 `error`를 담습니다.

* **Webhook**: 분석이 끝난 뒤 답변과 분석을 함께 담아 한 번 보냅니다.
* **폴링**: 답변 태스크는 답변이 준비되면 바로 `COMPLETED`가 됩니다. `response.citationAnalysis.task.status`가 `COMPLETED`나 `FAILED`가 될 때까지 계속 조회하세요.
* **배치**는 모든 답변과 그 분석이 끝나야 완료됩니다.
* **분석이 없는 경우**: 답변이 읽을 URL을 인용하지 않았거나, 크레딧이나 키의 일일 한도로 분석 hold를 잡을 수 없으면 `response.citationAnalysis`는 `{ "error": "…" }`이고 답변은 바로 전달됩니다.
* **과금**: 분석은 다른 Citation Analysis 태스크처럼 사용량대로 따로 차감됩니다. 답변 차감액은 그대로입니다. 특정 태스크 유형만 허용한 키라면 `CITATION_ANALYSIS`도 허용해야 합니다.

## Payload

| 필드 | 필수 | 설명 |
| - | - | - |
| `taskId` | `answer` + `citations` 대신 | 본인의 완료된 답변 태스크. 위를 참고하세요. |
| `answer` | 예 (`taskId`가 없을 때) | 원본 답변 Markdown, 1–200,000자. 수정하지 마세요. 모든 범위는 바로 이 텍스트의 UTF-16 오프셋입니다. |
| `citations[]` | 예 (`taskId`가 없을 때) | 엔진이 인용한 페이지, 그리고 선택적으로 가져왔지만 인용하지 않은 페이지. 인용 최대 100개, 비인용 최대 50개, 인용 최소 1개, 토론 스레드 URL은 최대 10개. |
| `citations[].url` | 예 | HTTP(S) URL, 최대 2,048자. |
| `citations[].body` | 아니요 | 출처 Markdown, 인용당 최대 300,000자이며 요청 본문 전체는 최대 1 MiB. 보낸 본문은 그대로 분석하며 새로 가져온 내용으로 바꾸지 않습니다. 본문이 없으면 페이지를 가져오고, 읽지 못한 페이지는 해당 출처에 `error`로 보고합니다. |
| `citations[].kind` | 아니요 | `inline` 또는 `panel`. 생략하면 답변 링크로 판별합니다. |
| `citations[].cited` | 아니요 | 기본값 `true`. `false`는 엔진이 가져왔지만(검색 결과) 인용하지 않은 페이지를 뜻합니다. |
| `citations[].position` | 아니요 | 1 이상의 정수. 엔진 자체 검색 결과에서 그 페이지의 순위. |
| `citations[].query` | 아니요 | 그 페이지를 찾은 검색(500자 이하). `queries`에 없으면 추가됩니다. |
| `citations[].citedText[]` | 아니요 | 엔진이 직접 인용했다고 보고한 구절 최대 20개(각 2,000자 이하). |
| `citations[].publishedAt` | 아니요 | 엔진이 보고한 게시일, 64자 이하. |
| `queries[]` | 아니요 | 엔진이 실행한 검색 최대 20개, 각 500자 이하. |
| `prompt` | 아니요 | 원래 질문. |
| `engine` | 아니요 | 답변을 만든 AI 엔진. |
| `brand` | 아니요 | 내 브랜드 이름. 지정하면 결과에 `visibility`와 `actions`가 추가됩니다. |
| `brandDomains[]` | 아니요 | 내 브랜드 자체 사이트의 호스트 이름 최대 10개(예: `coway.com`). 스킴이나 경로 없이 영문자·숫자·점·하이픈으로 된 253자 이하의 호스트 이름만 받습니다. `brand`가 있어야 하며, 없이 보내면 요청이 `422`로 거부됩니다. `brandDomains`가 없으면 호스트 이름에 브랜드 이름이 들어간 사이트를 브랜드 자체 사이트로 봅니다. |
| `brandAliases[]` | 아니요 | 내 브랜드의 다른 이름(제품 라인, 현지 표기) 최대 10개, 각 200자 이하. `brand`가 있어야 하며, 없이 보내면 요청이 `422`로 거부됩니다. |
| `competitors[]` | 아니요 | 경쟁사 이름 최대 25개. `brands`에 역할 `competitor`로 보고됩니다. |
| `country` | 아니요 | 출처를 가져올 국가, 기본값 `US`. |

`taskId`나 `include.citationAnalysis`를 쓰면 이 필드들은 답변의 원시 데이터로 채워집니다. `CHATGPT`에서는
엔진의 검색이 `queries`가 되고, 엔진이 가져온 모든 페이지가 `cited`, `position`, `citedText`,
`publishedAt`, `query`를 가진 인용이 됩니다. 추적 파라미터만 다른 같은 URL은 하나로 합칩니다. Google AI
Overview에서는 개요의 출처가 인용이고, 그 밖의 자연 검색 결과는 비인용이며 `position`은 자연 검색 순위입니다.
다른 엔진은 인용된 출처만 제공합니다.

> [!WARNING]
>
> 요청에 `analysis`를 보내면 `400`으로 거절됩니다. 인사이트는 모든 결과에 포함됩니다.

## 결과

v4 이전에 저장된 결과는 `version` 필드 없이 이전 형태를 유지합니다.

```json theme={"theme":"css-variables"}
{
  "version": 4,
  "answer": "For most homes, the Coway Airmega 250 is the best all-round pick. Levoit Core 300 is a strong budget choice, and Blueair Blue Pure 211+ suits large rooms.",
  "queries": [
    { "id": "q0", "text": "best air purifiers 2026 reviews", "sourceIds": ["s0", "s1", "s2"] }
  ],
  "sources": [
    {
      "id": "s0",
      "url": "https://www.example-reviews.com/best-air-purifiers",
      "domain": "example-reviews.com",
      "channel": "editorial",
      "cited": true,
      "position": 1,
      "queryIds": ["q0"],
      "publishedAt": "October 7, 2026",
      "citedText": ["Levoit Core 300 is the best budget purifier we tested."],
      "brandIds": ["b1", "b2"],
      "own": false,
      "paragraphs": [
        { "id": "s0p0", "text": "Levoit Core 300 is the best budget purifier we tested." },
        { "id": "s0p1", "text": "For large rooms, the Blueair Blue Pure 211+ cleared the air fastest." }
      ]
    },
    {
      "id": "s1",
      "url": "https://www.coway.com/airmega-250",
      "domain": "coway.com",
      "channel": "own",
      "cited": false,
      "position": 4,
      "queryIds": ["q0"],
      "publishedAt": null,
      "citedText": [],
      "brandIds": ["b0"],
      "own": true,
      "paragraphs": []
    },
    {
      "id": "s2",
      "url": "https://www.reddit.com/r/AirPurifiers/comments/abc123/budget_pick",
      "domain": "reddit.com",
      "channel": "community",
      "cited": true,
      "position": 6,
      "queryIds": ["q0"],
      "publishedAt": null,
      "citedText": [],
      "brandIds": ["b1"],
      "own": false,
      "paragraphs": [
        { "id": "s2p0", "text": "Two years with the Levoit Core 300 and it is still quiet on sleep mode." }
      ]
    }
  ],
  "brands": [
    { "id": "b0", "name": "Coway", "role": "target", "rank": 1, "answerRanges": [{ "start": 20, "end": 25 }], "citedSourceIds": [], "retrievedSourceIds": ["s1"], "ownSourceIds": ["s1"] },
    { "id": "b1", "name": "Levoit", "role": "competitor", "rank": 2, "answerRanges": [{ "start": 66, "end": 72 }], "citedSourceIds": ["s0", "s2"], "retrievedSourceIds": [], "ownSourceIds": [] },
    { "id": "b2", "name": "Blueair", "role": "answer", "rank": 3, "answerRanges": [{ "start": 113, "end": 120 }], "citedSourceIds": ["s0"], "retrievedSourceIds": [], "ownSourceIds": [] }
  ],
  "links": [
    { "id": "l0", "paragraphId": "s0p0", "answerRanges": [{ "start": 66, "end": 154 }], "explanation": "Names the Levoit Core 300 as the budget pick." },
    { "id": "l1", "paragraphId": "s0p1", "answerRanges": [{ "start": 66, "end": 154 }], "explanation": "Recommends the Blueair Blue Pure 211+ for large rooms." },
    { "id": "l2", "paragraphId": "s2p0", "answerRanges": [{ "start": 66, "end": 154 }], "explanation": "Reports long-term use of the Levoit Core 300." }
  ],
  "visibility": { "brandId": "b0", "stage": "mentioned", "rank": 1, "answerBrands": 3 },
  "actions": [
    {
      "id": "a0",
      "type": "improve_page",
      "control": "owned",
      "priority": 1,
      "summary": "Coway's Airmega 250 page was retrieved for this search but not cited.",
      "steps": [
        "Add a table of room coverage, noise level and yearly filter cost, the criteria the cited review compares.",
        "Show when the specifications were last updated."
      ],
      "sourceIds": ["s1"],
      "brandIds": ["b0"],
      "queryIds": ["q0"],
      "linkIds": []
    },
    {
      "id": "a1",
      "type": "publish_page",
      "control": "owned",
      "priority": 2,
      "summary": "No Coway page was cited for this search; the cited review is a dated buying guide.",
      "steps": [
        "Publish a 2026 air purifier buying guide on coway.com, organized by room size and budget.",
        "Explain how models were compared, show measured results, and name the author and date."
      ],
      "sourceIds": ["s0"],
      "brandIds": ["b0"],
      "queryIds": ["q0"],
      "linkIds": ["l0", "l1"]
    },
    {
      "id": "a2",
      "type": "post_on_platform",
      "control": "platform",
      "priority": 3,
      "summary": "A cited Reddit thread recommends Levoit and never mentions Coway.",
      "steps": [
        "Reply as an identified Coway representative with the Airmega 250 details the thread asks about."
      ],
      "sourceIds": ["s2"],
      "brandIds": ["b1"],
      "queryIds": ["q0"],
      "linkIds": ["l2"]
    },
    {
      "id": "a3",
      "type": "pitch_publisher",
      "control": "outreach",
      "priority": 4,
      "summary": "The top cited review names Levoit and Blueair but not Coway; only its publisher can add the Airmega 250.",
      "steps": [
        "Offer the editors an Airmega 250 for testing.",
        "Send test data for the criteria the review uses: room coverage, noise and filter cost."
      ],
      "sourceIds": ["s0"],
      "brandIds": ["b1", "b2"],
      "queryIds": ["q0"],
      "linkIds": ["l0", "l1"]
    }
  ],
  "insights": [
    { "summary": "Both cited pages recommend Levoit for a budget; the review also backs Blueair for large rooms.", "sourceIds": ["s0", "s2"], "linkIds": ["l0", "l1", "l2"] },
    { "summary": "The answer names Coway first, yet no cited page names it; only its own page, which was not cited, does.", "sourceIds": ["s1"], "linkIds": [] }
  ]
}
```

### `version`

이 형태에서는 항상 `4`입니다.

### `answer`

제출한 답변을 그대로 돌려줍니다. `answerRanges`는 바로 이 문자열의 오프셋입니다. JavaScript UTF-16 코드
단위이며, `start`는 포함, `end`는 제외입니다. 텍스트를 다시 나누지 말고 `answer.slice(start, end)`처럼
그대로 잘라 쓰세요. `links[]`의 범위는 답변의 온전한 의미 단위(문장, 목록 항목, 표 셀) 하나를 가리키고,
`brands[]`의 범위는 쓰인 그대로의 이름을 가리킵니다. 경계는 원문 기준입니다.

### `queries[]`

엔진이 이 답변을 위해 실행한 검색입니다. 각각 `id`, 검색어 `text`, 그 검색이 찾은 출처인 `sourceIds`를
가집니다. 엔진이 검색을 공개하지 않았고 직접 보내지도 않았다면 비어 있습니다.

### `sources[]`: 페이지마다 한 항목

* `id`: 불투명 식별자, 결과 안에서 고유합니다.
* `url`: 페이지 URL. `domain`: 그 호스트.
* `channel`: 페이지를 누가 통제하는지로, 호스트로 판단합니다.
  * `own`: 내 브랜드 자체 사이트(`own`이 `true`일 때와 정확히 같음).
  * `brand`: 결과가 언급한 다른 브랜드의 자체 사이트.
  * `editorial`: 발행처. 발행처만 페이지를 바꿀 수 있습니다. 인식되지 않은 호스트는 `editorial`로 보고됩니다.
  * `retailer`: 온라인 스토어나 마켓플레이스.
  * `review_platform`: 고객 또는 비즈니스 리뷰 사이트.
  * `community`: 포럼이나 Q\&A 사이트.
  * `video`: 동영상 플랫폼.
  * `social`: 소셜 네트워크.
  * `blog_platform`: 호스팅 블로그 서비스.
  * `reference`: 백과사전이나 위키. 조치의 대상이 되지 않습니다.
* `cited`: 답변이 페이지를 인용하면 `true`, 엔진이 가져오기만 했으면 `false`.
* `position`: 엔진 자체의 페이지 순위. 없으면 `null`.
* `queryIds[]`: 그 페이지를 찾은 검색.
* `publishedAt`: 엔진이 보고한 게시일. 없으면 `null`.
* `citedText[]`: 엔진이 직접 인용했다고 보고한 구절. 없으면 `[]`.
* `brandIds[]`: 읽은 페이지 본문, 제목, `citedText`에서 언급된 브랜드.
* `own`: 페이지가 내 브랜드 자체 사이트에 있으면 `true`.
* `paragraphs[]`: 결과에 포함된 인용 페이지의 문단. 각각 `id`(결과 전체에서 고유)와 문단 `text`를 가집니다.
  연결 없이 포함되는 문단도 있습니다. 비인용 페이지에서는 항상 비어 있습니다.
* `error`: 페이지를 읽지 못했을 때만 있습니다. 이때 `paragraphs`는 비어 있고, 문자열은 그 출처에 대한
  짧은 이유입니다.

### `brands[]`

결과가 추적하는 모든 브랜드입니다. 내 `brand`(`role: "target"`), `competitors`(`"competitor"`), 그리고
답변이 언급한 그 밖의 브랜드(`"answer"`)입니다.

* `rank`: 답변에서 그 브랜드 이름이 처음 나온 순서, 1부터 시작. 답변이 브랜드를 언급하지 않으면 `null`.
* `answerRanges[]`: 답변이 브랜드나 그 제품명을 언급한 정확한 구간, 같은 UTF-16 오프셋. `answer.slice(start, end)`는 쓰인 그대로의 이름을 돌려줍니다. 대소문자를 구분하지 않고 단어 단위로 찾으며(띄어쓰기 없는 문자 체계는 예외), 제목과 표 셀도 포함하지만 링크 URL이나 이미지 마크업 안은 제외합니다. `links[]`의 범위와 달리 온전한 답변 단위가 아닙니다.
* `citedSourceIds[]`: 페이지에서 그 브랜드를 언급한 인용 출처.
* `retrievedSourceIds[]`: 페이지에서 그 브랜드를 언급한 비인용 출처.
* `ownSourceIds[]`: 브랜드 자체 사이트의 출처. target에만 채워집니다.

### `links[]`: 문단마다 한 관계

* `paragraphId`: 이 연결이 가리키는 문단. 항상 `sources[]`에 있는 문단을 가리킵니다.
* `answerRanges[]`: 이 문단에 대응하는 답변 부분으로, 위와 같은 UTF-16 오프셋의 `start`/`end` 쌍입니다.
  한 연결에 범위가 여러 개일 수 있으며, 같은 답변 텍스트가 범위 사이에 중복되지 않습니다. 각 범위는
  온전한 답변 단위(문장, 목록 항목, 표 셀)입니다.
* `explanation`: 대응을 설명하는 짧은 문장. 문단이 답변의 그 부분에 대해 무엇을 말하는지 적습니다.

### `visibility`

이 답변에서 내 브랜드의 위치입니다. `brand`를 보내지 않았으면 `null`입니다.

* `brandId`: `brands[]`의 내 브랜드.
* `stage`: 다음 중 하나.
  * `mentioned`: 답변이 내 브랜드를 언급합니다.
  * `on_cited_page`: 답변은 언급하지 않지만 인용된 페이지가 언급합니다.
  * `on_retrieved_page`: 엔진이 인용 없이 가져온 페이지만 언급합니다.
  * `not_found`: 읽은 페이지 중 어디에도 언급이 없습니다.
* `rank`: `brands[]`에서 내 브랜드의 `rank`.
* `answerBrands`: 답변이 언급한 브랜드 수.

### `actions[]`

내 브랜드를 위한 우선순위가 매겨진 다음 단계입니다. `brand`를 보내지 않았으면 `[]`입니다. `priority`는
1(가장 먼저)부터 빠짐없이 이어집니다. 조치는 `control` 순서로 정렬됩니다. 내 브랜드가 통제하는 것(`owned`)이
먼저, 그다음 게시할 수 있는 플랫폼(`platform`), 그다음 외부 협업(`outreach`)입니다. `summary`는 한 문장,
`steps[]`는 구체적인 단계 1–5개이며 둘 다 답변 언어로 작성됩니다. `sourceIds`, `brandIds`, `queryIds`,
`linkIds`는 이 결과 안의 근거를 가리킵니다.

| `type` | `control` | 나타나는 경우 | `sourceIds` |
| - | - | - | - |
| `improve_page` | `owned` | 내 사이트마다 하나: 그 사이트의 내 페이지를 엔진이 가져왔지만 인용하지 않았거나, 인용되었지만 답변이 내 브랜드를 언급하지 않습니다. 단계는 인용된 페이지처럼 프롬프트에 답하도록 무엇을 추가하거나 바꿀지(기준, 수치, 최신성) 알려 줍니다. | 그 사이트의 내 페이지 최대 3개, 인용되지 않은 페이지 먼저. |
| `publish_page` | `owned` | 내 페이지가 하나도 인용되지 않은 검색에 대해, 인용된 페이지를 본뜬 내 사이트의 새 페이지 개요를 제시합니다. 페이지 유형과 제목, 섹션과 기준, 보여 줄 근거, 날짜, 명확한 브랜드 작성자 표시를 담습니다. | 본뜰 인용 페이지. |
| `post_on_platform` | `platform` | 리테일러, 리뷰 플랫폼, 커뮤니티, 동영상, 소셜, 블로그 플랫폼의 페이지가 경쟁 브랜드는 언급하지만 내 브랜드는 언급하지 않습니다. 할 일은 내 브랜드 계정으로 그 플랫폼에 올리는 내 상품 등록, 프로필, 답변, 게시물입니다. 제품 등록이나 개선, 프로필 소유권 확인과 실제 고객에게 리뷰 요청, 브랜드 담당자임을 밝히고 답변하기, 데모나 비교 콘텐츠 게시를 다룹니다. 플랫폼이나 페이지 주인에게 무언가를 요청하지 않습니다. 도메인당 최대 하나. | 그 플랫폼에서 인용된 페이지(다른 사람의 페이지). |
| `pitch_publisher` | `outreach` | 인용된 편집 페이지가 경쟁 브랜드는 언급하지만 내 브랜드는 언급하지 않거나, 내 브랜드를 언급하지만 답변은 언급하지 않습니다. 발행처만 페이지를 바꿀 수 있으므로 단계는 무엇을 보낼지 알려 줍니다. | 제안할 페이지. |

`brandIds`는 내 브랜드, 또는 그 페이지들이 언급한 경쟁 브랜드를 가리킵니다. 조치는 가짜 리뷰나 밝히지 않은
리뷰, 독립 리뷰어 행세, 링크 구매, 내 브랜드가 소유하지 않은 페이지 수정을 절대 제안하지 않습니다. 내
브랜드를 언급했지만 인용되지 않은 제3자 페이지는 조치가 아니라 `brands[].retrievedSourceIds`에 나옵니다.

### `insights[]`

페이지들이 종합해 말하는 바를 짧게 요약한 것으로 최대 네 개입니다. 어떤 채널이 인용되었는지, 인용된 페이지가
공유하는 형식·최신성·기준, 답변의 브랜드 순서가 인용된 페이지가 다루는 내용과 어떻게 비교되는지, 내 브랜드가
어디에 있는지를 다룹니다. `sourceIds`는 각 요약의 근거가 된 페이지를, `linkIds`는 연결을 가리킵니다. 둘 중
적어도 하나는 비어 있지 않으며, 이 결과 안의 항목만 가리킵니다. 인사이트는 대응을 설명할 뿐 조언이 아닙니다.

## 결과를 올바르게 읽기

* **연결이 없다고 판결이 아닙니다.** 연결 없는 문단은 답변 범위와 맞지 않았을 뿐이고, 범위가 없는 답변
  부분은 연결된 문단이 없다는 뜻일 뿐입니다. 둘 다 페이지가 무관하다거나, 쓰이지 않았다거나, 신뢰할 수
  없다는 뜻이 아닙니다.
* **읽지 못한 페이지는 불확실한 채로 남습니다.** `sources[].error`가 있으면 그 인용은 분석에서 빠졌습니다.
  연결이 없는 것을 부정적 결과로 보지 마세요. 중요하다면 재시도하거나 `body`를 보내세요.
* **대응이지 인과가 아닙니다.** 결과는 기존 답변과 기존 페이지 텍스트가 사후에 어떻게 맞물리는지, 그리고
  그 페이지들이 어떤 브랜드를 언급하는지를 설명합니다. 생성 영향력을 재거나, 페이지를 채점하거나, 답변이
  어떻게 만들어졌는지 보고하지 않습니다.
* **`not_found`는 읽은 어느 페이지에도 없다는 뜻입니다.** 내 브랜드가 웹에 없다는 뜻이 아닙니다.
* **검색 데이터는 엔진에 따라 다릅니다.** 비인용 페이지는 엔진이 공개하거나(ChatGPT, Google AI Overview)
  `cited: false` 페이지를 직접 보낸 경우에만 나타납니다. 그 밖에는 모든 출처가 인용이며, 내 자체 페이지도
  인용된 페이지로만 나타날 수 있습니다.
* **채널은 호스트로 판단합니다.** `channel`은 누가 썼는지 읽어서가 아니라 페이지의 호스트로 추정합니다.
* **조치는 제안이지 보장이 아닙니다.** 이 결과에 나열된 페이지를 바탕으로 우선순위를 매긴 것이며, 실행한다고
  답변이 바뀐다는 보장은 없습니다.
* **id는 내부용입니다.** `s…`/`q…`/`b…`/`l…`/`a…` 식별자를 실행 간 안정적인 키로 저장하지 마세요. 결과
  하나에만 유효합니다.

## 실행과 한도

* **크기는 실패 사유가 아닙니다.** 요청 계약이 받는 것, 즉 최대 200,000자의 `answer`와 최대 100개 인용은
  모두 분석합니다. 긴 답변, 많은 출처, 아주 긴 페이지는 거부하지 않고 작업을 나눠 처리합니다.
* **깊이는 페이지가 아니라 답변에 비례합니다.** 긴 페이지라고 답변이 뒷받침할 수 있는 것보다 많은 연결이
  나오지 않습니다. 분석은 답변과 대응할 가능성이 가장 높은 구절에 집중하며, 대응이 있는 모든 출처가
  결과에 나타납니다. 큰 페이지나 같은 내용을 내비게이션, 목록, 리뷰에 반복하는 페이지에서는 모든 등장이
  아니라 가장 강한 구절을 기대하세요.
* **마크업은 근거가 아닙니다.** 사이트맵, 링크 색인, 이미지 갤러리는 연결을 만들지 않습니다. 이것들로만
  이루어진 페이지는 대응을 지어내지 않고 문단 없이 보고합니다.
* 읽지 못한 출처는 다른 출처를 읽을 수 있으면 태스크를 실패시키지 않고 `sources[].error`로 보고합니다.
  어떤 출처도 읽지 못했거나, 분석 실패, 타임아웃, 서비스 설정 오류가 있으면 태스크가 실패합니다.
* 요청은 API의 나머지와 마찬가지로 사용량으로 계량합니다. 제출 응답은 임시 크레딧 홀드를 보여주고, 최종
  과금은 태스크가 종료 상태에 도달할 때 정산됩니다.


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