---
title: "Response Schema"
description: "모든 AI 엔진이 돌려주는 Answer 타입: 답변 본문, 인용과 출처, 카드, 언급, 후속 질문."
---

> Every apinoa docs page as markdown: https://apinoa.com/llms.txt (all in one file: https://apinoa.com/llms-full.txt; this API family in one file: https://apinoa.com/docs/answers/llms.txt)

모든 엔진이 `Answer` 타입 하나를 돌려줍니다. 필드 하나는 모든 엔진에서 같은 뜻입니다.

선택 필드는 정말로 선택입니다. **없으면 엔진이 말하지 않았다는 뜻입니다.** `rating`이 없는 카드는 별점을 보여 주지
않았습니다. 시각은 ISO 8601, UTC입니다. 금액은 기본 단위(소수 포함)와 ISO 4217 통화 코드로 나타냅니다. 모든 객체에는
`ext`가 있을 수 있고, 여기에는 그 엔진에만 있는 정보가 들어갑니다.

## Answer

| 필드 | 타입 | 설명 |
|---|---|---|
| `engine` | string | `chatgpt` `gemini` `google-aio` `google-ai-mode` `naver-ai-brief` `naver-ai-tab` |
| `outcome` | string | 아래 참고 |
| `prompt` | string | 요청한 질문 |
| `askedAt` | string | 질문한 시각 |
| `country` | string | 질문한 시장(`US`, `KR`) |
| `language` | string? | |
| `conversation` | object? | `{id, turn, expiresAt?}`. `id`를 `conversation`으로 넘기면 이어서 질문합니다 |
| `title` | string? | 엔진이 붙인 대화 제목 |
| `blocks` | Block[] | 순서대로 나열한 답변 블록. 아래 참고 |
| `text` | string | `blocks`에서 만든 일반 텍스트 답변 |
| `markdown` | string | `blocks`에서 만든 마크다운 답변 |
| `citations` | Citation[] | `text`의 어느 부분이 어느 출처를 인용하는지 |
| `sources` | Source[] | 엔진이 보여 준 모든 출처. 인용 여부와 상관없이 |
| `mentions` | Mention[] | 엔진이 직접 표시한 브랜드, 상품, 장소 |
| `cards` | Card[] | 상품, 장소, 동영상, 이미지 카드. 광고 포함 |
| `suggestions` | array | `{text, prompt?}`: 엔진이 제안한 후속 질문 |
| `results` | Result[]? | 답변 주변의 검색 결과(Google AI 개요, Naver AI 브리핑) |
| `page` | string? | `include=page`일 때: 답변을 담은 독립된 HTML 페이지 |

### Outcome

| 값 | 뜻 |
|---|---|
| `answered` | 엔진이 답했습니다 |
| `noAnswer` | 이 질문에는 답을 보여 주지 않았습니다. Google은 많은 검색에서 AI 개요를, Naver는 브리핑을 보여 주지 않습니다. 에러가 아니며, 페이지의 나머지(`results`)는 그대로 돌려줍니다 |
| `refused` | 엔진이 답을 거절했습니다. 엔진이 한 말은 `text`에 있습니다 |
| `partial` | 엔진이 중간에 멈췄지만 일부 본문이 왔습니다 |

### Blocks

`text`, `markdown`, `blocks`는 한 답변의 세 가지 모습이며 항상 일치합니다. 블록은 다음 중 하나입니다.

| `type` | 필드 |
|---|---|
| `heading` | `level`(1–6), `markdown` |
| `paragraph` `quote` | `markdown` |
| `list` | `ordered`, `items`: `{markdown, depth}[]` |
| `table` | `header`: string[], `rows`: string[][] |
| `code` | `language?`, `text` |
| `cards` | `cards`: 엔진이 답변 중 그 자리에 보여 준 카드의 `cards` 인덱스 |
| `rule` | |

## Citation

| 필드 | 타입 | 설명 |
|---|---|---|
| `start` `end` | integer | `text`의 문자 범위 `[start, end)` |
| `sources` | integer[] | `sources`의 인덱스 |

## Source

| 필드 | 타입 | 설명 |
|---|---|---|
| `url` | string | |
| `title` `site` `favicon` `image` `snippet` | string? | `site`는 사이트 표시 이름 |
| `publishedAt` | string? | |
| `cited` | boolean | 인용이 가리키면 `true`, 엔진이 읽기만 하고 인용하지 않았으면 `false` |

## Card

| 필드 | 타입 | 설명 |
|---|---|---|
| `type` | string | `product` `place` `video` `image` `other` |
| `title` `url` | string? | |
| `image` `thumbnail` | string? | 이미지 카드에서는 `image`가 이미지 자체 |
| `width` `height` | integer? | |
| `price` `originalPrice` | object? | `{text, amount?, currency?}`. `text`는 표시된 그대로이고, `amount`는 금액 하나로 분명할 때만 |
| `rating` `reviews` | number? | |
| `merchant` `site` | string? | |
| `badges` | string[]? | 카드에 붙은 라벨, 글자 그대로("Best overall") |
| `address` | string? | |
| `coordinates` | object? | `{lat, lng}` |
| `sponsored` | boolean | 광고. 광고도 카드이며 따로 모으지 않습니다 |

## Mention

| 필드 | 타입 | 설명 |
|---|---|---|
| `name` | string | |
| `kind` | string | `brand` `product` `place` `other` |
| `category` | string? | 엔진이 붙인 라벨, 글자 그대로 |
| `at` | integer? | 엔진이 표시한 `text` 안의 위치 |
| `card` | integer? | 엔진이 카드를 보여 줬다면 `cards`에서의 인덱스 |

언급은 엔진이 직접 표시한 것뿐입니다. 본문에서 추측하지 않습니다.

## Result

답변 주변 검색 결과 하나입니다.

| 필드 | 타입 | 설명 |
|---|---|---|
| `position` | integer | 1부터 |
| `title` `url` | string | |
| `site` `favicon` `image` `snippet` | string? | |
| `publishedAt` | string? | |
| `breadcrumbs` | string[]? | 페이지가 결과에 표시한 경로 |
| `sitelinks` | array? | `{title, url}` |

같은 `Answer`가 [SERP API](/docs/api-reference/serp/response-schema#resultspage)의 Google 검색 결과에 있는 `aiOverview`
항목의 `answer`이기도 합니다.
