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를 보내세요.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 모두에 쓸 수 있습니다.
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나 include.citationAnalysis를 쓰면 이 필드들은 답변의 원시 데이터로 채워집니다. CHATGPT에서는
엔진의 검색이 queries가 되고, 엔진이 가져온 모든 페이지가 cited, position, citedText,
publishedAt, query를 가진 인용이 됩니다. 추적 파라미터만 다른 같은 URL은 하나로 합칩니다. Google AI
Overview에서는 개요의 출처가 인용이고, 그 밖의 자연 검색 결과는 비인용이며 position은 자연 검색 순위입니다.
다른 엔진은 인용된 출처만 제공합니다.
결과
v4 이전에 저장된 결과는version 필드 없이 이전 형태를 유지합니다.
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는 이 결과 안의 근거를 가리킵니다.
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의 나머지와 마찬가지로 사용량으로 계량합니다. 제출 응답은 임시 크레딧 홀드를 보여주고, 최종 과금은 태스크가 종료 상태에 도달할 때 정산됩니다.