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

# AI 검색 엔진: 답변, 인용, 응답 필드

> 모든 taskType이 읽는 payload 필드, 반환하는 내용, 실제로 동작하는 include 플래그.

`taskType`이 엔진을 고릅니다. 결과를 감싸는 봉투는 모든 엔진이 같고, 달라지는 것은 그 안의
`response` 객체입니다.

<Note>
  **답변 화면 9종을 제공합니다**: `CHATGPT`, `GEMINI`, `PERPLEXITY`, `BING_COPILOT`, `GOOGLE`,
  `AIMODE`, `BING_SEARCH`, `NAVER_AI_BRIEF`, `NAVER_AI_TAB`. `GOOGLE_SERP`는 AI 개요 없이 Google 검색
  결과를, `NAVER_SERP`는 네이버 웹문서 결과를, `REDDIT`은 Reddit 게시물과 댓글을 반환합니다.
</Note>

## 엔진이 읽는 payload 필드

검증은 `prompt`와 `query` 중 하나만 있으면 통과하고, 모든 엔진이 다른 쪽으로 대체해 읽으므로
"틀린" 키로 보낸 요청도 실행됩니다. 아래 두 카드는 각 엔진이 **먼저** 읽는 필드로, API 레퍼런스가
문서화하고 대시보드 Playground가 그 엔진에 보내는 필드입니다.

<CardGroup cols={2}>
  <Card title="prompt를 읽는 엔진" icon="message-square">
    `CHATGPT` `PERPLEXITY` `GEMINI` `BING_COPILOT`

    `prompt`가 없으면 `query`를 읽습니다.
  </Card>

  <Card title="query를 읽는 엔진" icon="search">
    `GOOGLE` `AIMODE` `GOOGLE_SERP` `NAVER_AI_BRIEF` `NAVER_AI_TAB` `NAVER_SERP` `BING_SEARCH` `REDDIT`

    `query`가 없으면 `prompt`를 읽습니다.
  </Card>
</CardGroup>

## 응답 옵션

모든 답변 엔진은 기본적으로 원본 응답을 포함합니다. 빼려면 `payload.include.rawResponse`를
`false`로 설정하세요. 다른 옵션은 엔진마다 다릅니다.

| 엔진 | 적용되는 플래그 | 원본 응답 위치 |
| - | - | - |
| `CHATGPT` | `markdown` `html` `rawResponse` `searchQueries` `ads` `shopping` | `rawResponse` |
| `PERPLEXITY` | `markdown` `rawResponse` `searchQueries` | `rawResponse` |
| `GEMINI` | `markdown` `rawResponse` | `rawResponse` |
| `BING_COPILOT` | `markdown` `rawResponse` | `rawResponse` |
| `BING_SEARCH` | `markdown` `rawResponse` | **`rawContent`** (결과 페이지 HTML) |
| `GOOGLE_SERP` | `rawResponse` (기본값 꺼짐) | **`rawContent`** (결과 페이지 HTML) |
| `GOOGLE` `AIMODE` `NAVER_AI_BRIEF` `NAVER_AI_TAB` | `rawResponse` | **`rawContent`** |
| `NAVER_SERP` `REDDIT` | 없음 | 원본 페이로드 없음 |

<Note>
  `rawResponse`에는 파싱된 스트림 이벤트가 담깁니다. Google AI 개요, AI 모드, Bing 검색은 렌더링된
  페이지 HTML 전체를 `rawContent`로 반환하고, 네이버는 원본 이벤트 스트림을 `rawContent` 문자열로
  반환합니다. 이 필드는 클 수 있으니 구조화된 결과만 필요하면 `include.rawResponse: false`로
  설정하세요. 예외는 `GOOGLE_SERP`로, `include.rawResponse: true`일 때만 페이지 HTML을 반환합니다.
</Note>

`markdown`을 반환하는 모든 엔진에서 이것이 플래그인 것은 아닙니다. 네이버는 `markdown`을 항상
보냅니다. 네이버에서는 이것이 `text`의 사본이 아니라 답변의 실제 형태이기 때문입니다.

<Warning>
  적용되지 않는 플래그는 오류도 필드도 없이 조용히 무시됩니다. 특히 `html`은 여러 엔진이 플래그를
  받더라도 `CHATGPT`만 실제로 만들어 냅니다.
</Warning>

## 응답 형태

<AccordionGroup>
  <Accordion title="PERPLEXITY">
    `prompt`를 읽습니다. 항상 `text`와 `sources[]`를 반환합니다.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "description": "..." }],
      "markdown": "...",
      "rawResponse": ["..."],
      "related_queries": ["..."],
      "search_model_queries": ["..."]
    }
    ```

    Perplexity가 보여줄 때만 붙는 추가 필드: `videos`, `images`, `hotels`, `places`, `shopping_cards`.
  </Accordion>

  <Accordion title="GEMINI">
    `prompt`를 읽습니다. 항상 `text`와 `sources[]`를 반환합니다.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "confidence_level": "..." }],
      "markdown": "...",
      "rawResponse": ["..."],
      "model": "...",
      "shoppingCards": [{ "title": "...", "position": 1, "price": { "value": 249.99, "currency": "$", "raw": "$249.99" }, "store": "...",
                         "rating": 4.7, "reviews": "14292", "thumbnail": "https://...", "productLink": "https://google.com/search?...&ibp=oshop..." }],
      "inlineProducts": [{ "title": "...", "position": 1, "productLink": "https://google.com/search?...&ibp=oshop..." }]
    }
    ```

    답변에 상품이 나오면 `shoppingCards`(Gemini가 답변 안에 그리는 상품 카드)와 `inlineProducts`(문장 안에 링크된 상품 이름)가 GOOGLE 개요와 같은 필드로 실립니다. 카드 이름은 `text`에도 남고, 문장 속 상품 링크는 Google 상품 페이지를 가리킵니다.
  </Accordion>

  <Accordion title="GOOGLE: SERP 봉투 안의 AI 개요">
    `query`를 읽습니다. 단독 AI 개요 객체가 **아니라**, AI 개요를 nullable 멤버 하나로 담은 검색 결과
    봉투입니다.

    ```json theme={null}
    {
      "aioverview": {
        "text": "...",
        "sources": [{ "position": 1, "url": "https://..." }],
        "shoppingCards": [{ "title": "...", "position": 1, "price": { "value": 299.99, "currency": "$", "raw": "$299.99" },
                            "oldPrice": { "value": 399.99, "currency": "$", "raw": "$399.99" }, "store": "...",
                            "rating": 4.5, "reviews": "2.3K", "thumbnail": "https://...", "productLink": "https://www.google.com/search?ibp=oshop..." }],
        "inlineProducts": [{ "title": "...", "position": 1, "productLink": "https://www.google.com/search?ibp=oshop..." }]
      },
      "organicResults": [{ "...": "..." }],
      "peopleAlsoAsk": [{ "...": "..." }],
      "relatedSearches": [{ "...": "..." }],
      "knowledgeGraph": { "...": "..." },
      "ads": [{ "...": "..." }],
      "serp": { "topStories": [], "videoResults": [], "localResults": [] }
    }
    ```

    <Warning>
      `aioverview: null`은 해당 검색어에 **Google이 AI 개요를 보여주지 않았다**는 공식 신호입니다. 오류가
      아니며, 주변 SERP 필드는 그대로 채워집니다.
    </Warning>

    최상위 `text`와 `sources`는 `aioverview.text`와 `aioverview.sources`를 복제한 **지원 중단 별칭**입니다.
    예전 단독 AIO 형태를 쓰던 소비자가 계속 동작하도록 남아 있습니다. 새 코드에서는 `aioverview.*`를
    읽으세요.

    SERP 패널은 없을 때 `null`이나 `[]`로 내보내지 않고 **생략**합니다. 모든 패널을 선택 필드로 다루세요.

    `aioverview.shoppingCards`와 `aioverview.inlineProducts`는 개요에 상품이 나올 때만 실립니다. 카드는 Google이 답변 옆에 그리는 상품 타일이고, inline 상품은 문장 안에 링크된 상품 이름입니다. 카드 제목은 `aioverview.text`에도 들어갑니다. `price.currency`는 화면에 보인 기호(`$`, `₩`, `円`) 그대로이고, `reviews`는 Google의 축약 표기(`2.3K`)를 유지하며, `productLink`는 Google 상품 페이지입니다.
  </Accordion>

  <Accordion title="AIMODE: Google AI 모드">
    `query`를 읽습니다. 고정 형태이며 markdown이 없습니다.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
      "shoppingCards": [{ "...": "..." }],
      "inlineProducts": [{ "...": "..." }]
    }
    ```

    `shoppingCards`와 `inlineProducts`는 답변에 상품이 나올 때만 실리며, 필드는 GOOGLE 개요와 같습니다.
  </Accordion>

  <Accordion title="GOOGLE_SERP: AI 개요 없는 Google 검색 결과">
    `query`를 읽습니다. google.com 결과 페이지 하나를 `GOOGLE`과 같은 봉투로 반환하되 AI 개요는 빠집니다.
    `aioverview`, `text`, `sources`가 없습니다. AI 개요를 기다리지 않으므로 `GOOGLE`보다 빠르고 1 크레딧입니다.
    더 깊은 페이지는 `payload.page`(1-10)로 지정하세요.

    ```json theme={null}
    {
      "organicResults": [
        { "position": 11, "title": "...", "link": "https://...", "displayedLink": "...", "snippet": "...", "page": 2 }
      ],
      "peopleAlsoAsk": [{ "...": "..." }],
      "relatedSearches": [{ "...": "..." }],
      "ads": [{ "...": "..." }],
      "page": 2
    }
    ```

    `organicResults`는 항상 있습니다. `position`은 페이지를 넘어 이어서 세므로 2페이지 첫 결과는 11이고,
    모든 행에 출처 페이지 `page`가 붙습니다. `organicResults`가 비어 있으면 Google 자체가 그 검색어에
    결과를 내지 않았다는 뜻입니다. 다른 패널은 페이지에 없으면 생략됩니다. 결과 페이지 HTML도 받으려면
    `include.rawResponse: true`로 설정하세요. `rawContent`로 돌아옵니다.
  </Accordion>

  <Accordion title="NAVER_SERP: 네이버 검색 결과">
    `query`를 읽습니다. 네이버 웹문서 탭 결과 한 페이지(페이지당 15건)를 1 크레딧에 반환합니다. 더 깊은
    페이지는 `payload.page`(1-10)로 지정하세요. `country` 기본값은 `KR`입니다.

    ```json theme={null}
    {
      "organicResults": [
        { "position": 16, "title": "...", "link": "https://...", "displayedLink": "example.com›path",
          "snippet": "...", "page": 2 }
      ]
    }
    ```

    `position`은 페이지를 넘어 이어서 세므로 2페이지 첫 문서는 16입니다. 완료된 태스크의 `organicResults`가
    비어 있으면 네이버 자체가 문서를 돌려주지 않았다는 뜻입니다. 네이버가 연령 확인 뒤로 결과를 숨긴 경우에는
    응답에 `type`이 `age_verification_required`인 `notice`도 함께 옵니다.

    검색 대신 네이버 페이지 하나를 읽으려면 `"action": "page"`와 naver.com `url`(블로그, 카페, 뉴스, 지식백과,
    지식iN 등 모든 naver.com 페이지)을 보내세요. 응답은 `{ type, url, title, text, images, truncated }`이고,
    페이지에 있으면 `author`, `publishedAt`, `cafeName`이 더해집니다. `text`는 `maxChars`(1,000-50,000, 기본
    20,000)에서 잘립니다. https naver.com URL만 받으며(그 외는 422), naver.com을 벗어나는 리다이렉트는 태스크를
    실패시킵니다. 회원만 읽을 수 있는 카페 글도 마찬가지입니다.

    이 엔진은 원본 페이로드를 반환하지 않으므로 `include` 플래그는 효과가 없습니다.
  </Accordion>

  <Accordion title="REDDIT: Reddit 게시물, 댓글, 피드">
    `query`를 읽고 1 크레딧에 Reddit 게시물을 검색합니다. 한 서브레딧만 검색하려면 `subreddit`(`r/` 없는
    이름)을 추가하세요.

    ```json theme={null}
    {
      "results": [
        { "postId": "1uzk9m4", "title": "...", "url": "https://www.reddit.com/r/.../comments/1uzk9m4/...",
          "subreddit": "AskRunningShoeGeeks", "preview": "..." }
      ]
    }
    ```

    `query` 대신 게시물 `url`(`https://www.reddit.com/r/{subreddit}/comments/{postId}/...`)을 보내면 그 게시물과
    댓글 첫 페이지(약 20-25개)를 읽습니다. `commentSort`(기본값 `top`, 또는 `new`, `controversial`, `old`,
    `qa`)는 그 페이지의 정렬을 정하고, `commentMaxDepth`는 더 깊은 답글을 뺍니다(`0`이면 최상위 댓글만).

    ```json theme={null}
    {
      "post": { "postId": "1uer62n", "title": "...", "body": "...", "author": "...", "subreddit": "...",
                "score": 12, "upvoteRatio": 0.9, "commentCount": 48, "createdAt": "2026-06-24T21:51:21.586000+0000",
                "archived": false, "url": "https://www.reddit.com/r/..." },
      "comments": {
        "availableCount": 24, "returnedCount": 24,
        "items": [{ "commentId": "otlz8m5", "author": "...", "body": "...", "score": 5, "depth": 0,
                    "isSubmitter": false, "createdAt": "...", "url": "https://www.reddit.com/r/..." }]
      }
    }
    ```

    `post.commentCount`는 게시물의 전체 댓글 수이고, `comments`는 실제로 읽은 페이지입니다. `archived`는
    게시물 나이로 추정합니다(Reddit은 약 180일 뒤 댓글을 잠급니다). `"action": "feed"`는 `subreddit`의 최신
    게시물을(없으면 r/popular), `"action": "user_posts"`와 `username`은 그 사용자가 올린 게시물을 나열합니다.
    둘 다 검색과 같은 `results`를 `limit`(기본 25)까지 반환합니다.

    완료된 태스크의 `results`가 비어 있으면 Reddit에서 찾은 것이 없다는 뜻입니다. 이 엔진은
    원본 페이로드를 반환하지 않으므로 `include` 플래그는 효과가 없습니다.
  </Accordion>

  <Accordion title="CHATGPT">
    `prompt`를 읽습니다. 이 API에서 가장 풍부한 응답이며, 모든 `include` 플래그가 동작하는 유일한
    엔진입니다. 모든 플래그의 기본값은 켜짐입니다.

    ```json theme={null}
    {
      "text": "...",
      "model": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "footnote": "...", "datePublished": "..." }],
      "markdown": "...",
      "html": "...",
      "rawResponse": ["..."],
      "searchQueries": ["..."],
      "shoppingCards": [{ "...": "..." }],
      "inlineProducts": [{ "...": "..." }],
      "ads": [{ "...": "..." }],
      "entities": { "...": "..." },
      "citationPills": [{ "...": "..." }]
    }
    ```

    ChatGPT는 멀티턴 대화도 지원합니다. 아래 멀티턴 섹션을 참고하세요.
  </Accordion>

  <Accordion title="BING_COPILOT: Bing Copilot">
    `prompt`를 읽습니다. copilot.com의 Copilot 채팅 답변을 웹 검색을 항상 켠 상태로 반환합니다. 계정이나
    로그인은 쓰지 않습니다. `COPILOT`도 여전히 받으며 `BING_COPILOT`으로 실행됩니다.

    ```json theme={null}
    {
      "text": "Solar panels cut electricity bills ...",
      "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
      "shoppingCards": [{ "type": "shoppingProducts", "layout": "inline", "products": [{ "position": 1, "name": "...", "url": "https://...", "price": { "amount": 69, "currencySymbol": "$" } }] }],
      "map": [{ "position": 1, "name": "...", "placeId": "...", "location": { "address": "...", "latitude": 40.75, "longitude": -73.98 }, "layerLabel": "..." }],
      "searchQueries": ["..."],
      "markdown": "...",
      "rawResponse": [{ "event": "appendText", "text": "..." }]
    }
    ```

    `sources`는 Copilot이 인용한 페이지입니다. 쇼핑 질문은 인용 없이 상품 카드만 반환하는 경우가 많으므로
    `sources: []`도 정상 답변입니다. `shoppingCards`, `map`, `searchQueries`는 항상 있으며 Copilot이 만들지
    않았으면 비어 있습니다. 상품 위치는 모든 카드에 걸쳐 이어집니다. `markdown`은 `include.markdown`이
    `true`일 때 반환됩니다.
  </Accordion>

  <Accordion title="BING_SEARCH: AI 요약이 있는 Bing 검색 결과">
    `query`를 읽습니다. bing.com 결과 페이지를 `GOOGLE`과 같은 봉투로 반환합니다. 자연 검색 결과, 광고,
    관련 검색어와 함께, Bing이 그 위에 보여주는 AI 요약을 `aioverview`로 담습니다. 계정이나 로그인은 쓰지
    않습니다. `BING`과 `BING_COPILOT_SEARCH`도 여전히 받으며 `BING_SEARCH`로 실행됩니다.

    ```json theme={null}
    {
      "surface": "bing_search",
      "organicResults": [
        { "position": 1, "title": "...", "link": "https://...", "displayedLink": "...", "snippet": "...", "date": "Aug 3, 2026", "page": 1 }
      ],
      "ads": [{ "position": 1, "title": "...", "link": "https://...", "displayedLink": "...", "description": "...", "blockPosition": "top" }],
      "relatedSearches": [{ "query": "...", "link": "https://www.bing.com/search?q=..." }],
      "aioverview": {
        "text": "Heat pumps move heat instead of generating it [1]. ...",
        "sources": [{ "position": 1, "url": "https://...", "label": "..." }],
        "citationPills": [
          { "citationPillId": 1, "position": 1, "url": "https://...", "label": "...", "domain": "example.com" }
        ],
        "markdown": "..."
      },
      "rawContent": "<!DOCTYPE html>..."
    }
    ```

    <Warning>
      `aioverview: null`은 해당 검색어에 **Bing이 AI 요약을 보여주지 않았다**는 뜻입니다. 오류가 아니며,
      주변 결과 필드는 그대로 채워집니다.
    </Warning>

    `aioverview.text`에서 `[n]`은 `sources[n-1]`을 가리킵니다. `citationPills[]` 항목 하나는 인라인 인용 하나
    뒤의 출처 하나이며, 함께 인용된 출처는 같은 `citationPillId`를 공유합니다. 요약에 인라인 인용이 없으면
    이 필드는 생략됩니다. `markdown`은 제목, 목록, 표를 유지하며 `include.markdown`이 `true`일 때
    반환됩니다.

    Bing은 요약을 보여줄 때 자연 검색 결과 대부분을 다음 페이지로 넘기므로, 요약이 있으면
    `organicResults`가 두세 개, 없으면 약 아홉 개라고 보면 됩니다. `ads`와 `relatedSearches`는 페이지에
    없으면 생략됩니다. `rawContent`는 결과 페이지 전체이며, `include.rawResponse: false`로 뺄 수 있습니다.
    최상위 `text`와 `sources`는 `aioverview.text`와 `aioverview.sources`의 지원 중단 사본입니다(요약이 없으면
    비어 있음).

    Bing이 모든 검색어에 요약을 쓰지는 않습니다. "추운 날씨에 히트펌프는 어떻게 작동하나" 같은 검색형
    질문은 "두 가지 장점을 설명해…" 같은 지시형보다 요약을 훨씬 자주 받으며, 영어 외 언어의 커버리지는
    제한적입니다.
  </Accordion>

  <Accordion title="NAVER_AI_BRIEF와 NAVER_AI_TAB">
    둘 다 `query`를 읽고 같은 응답 형태를 공유합니다.

    ```json theme={null}
    {
      "text": "...",
      "sources": [{ "position": 1, "url": "https://...", "label": "...", "description": "..." }]
    }
    ```

    `NAVER_AI_BRIEF`는 네이버 SERP에 조건부로 나타나는 AI 요약 박스로, 검색어에 따라 나타나지 않을 수
    있습니다. `NAVER_AI_TAB`은 항상 켜져 있는 대화형 AI 탭이자 네이버의 주 화면이며, `text`는 markdown
    형식입니다.

    `NAVER_AI_BRIEF`는 요약 박스 아래의 웹문서 결과도 `organicResults`로 반환합니다. `GOOGLE`이 AI 개요 옆에
    보내는 것과 같은 필드입니다.

    ```json theme={null}
    {
      "organicResults": [
        { "position": 1, "title": "...", "link": "https://...", "displayedLink": "example.com",
          "snippet": "...", "date": "2026.7.30.", "page": 1 }
      ]
    }
    ```

    요약과 문서는 서로 다른 네이버 엔드포인트에서 오므로 `NAVER_AI_BRIEF`는 `NAVER_AI_TAB`과 같은 2
    크레딧입니다. 문서 조회가 실패하면 필드는 비어 있지 않고 아예 없습니다.

    <Note>
      `NAVER`는 `NAVER_AI_BRIEF`의 지원 중단 별칭입니다. 명시적인 이름을 쓰세요.
    </Note>
  </Accordion>
</AccordionGroup>

## 멀티턴 (ChatGPT)

ChatGPT는 대화를 이어갈 수 있습니다. 두 필드를 모두 생략하면 기본 단발 동작입니다.

<Steps>
  <Step title="대화 시작">
    `newConversation: true`를 보내세요. 응답에 `conversationId`가 담깁니다.

    ```json theme={null}
    { "taskType": "CHATGPT", "payload": { "prompt": "...", "newConversation": true } }
    ```
  </Step>

  <Step title="대화 이어가기">
    다음 턴에 그 `conversationId`를 다시 보내세요.

    ```json theme={null}
    { "taskType": "CHATGPT", "payload": { "prompt": "...", "conversationId": "..." } }
    ```
  </Step>
</Steps>

<Warning>
  대화는 만든 기기에 묶이며 약 두 시간 뒤 만료됩니다. 오래된 `conversationId`로는 이어갈 수 없습니다.
</Warning>

## 엔진 가이드

* [ChatGPT](https://querying.ai/ko/engines/chatgpt)
* [Gemini](https://querying.ai/ko/engines/gemini)
* [Perplexity](https://querying.ai/ko/engines/perplexity)
* [Bing Copilot](https://querying.ai/ko/engines/bing-copilot)
* [Google AI 개요](https://querying.ai/ko/engines/google-ai-overviews)
* [Google AI 모드](https://querying.ai/ko/engines/google-ai-mode)
* [네이버 AI 브리핑](https://querying.ai/ko/engines/naver-ai-brief)
* [네이버 AI 탭](https://querying.ai/ko/engines/naver-ai-tab)
