v1 · 엔드포인트 8개
API 문서
사이트 진단 결과와 브랜드의 AI 답변·검색 노출 데이터를 조회하는 API입니다. 진단·데이터 수집을 요청하고, AI 답변 모니터링에 사용할 질문을 조회·추가·삭제할 수 있습니다.
개요
API는 HTTPS로 호출합니다. 요청 본문과 응답은 JSON 형식을 사용합니다. API 기본 주소는 다음과 같습니다.
https://{host}/api/v1
{host}는 연동 시 안내하는 API 호스트입니다.
데이터는 워크스페이스별로 조회합니다.
요청 경로의 {workspaceId}에는 대상 워크스페이스의 ID를 지정합니다.
외부 연동은 이 문서에 명시된 /api/v1 경로만 지원합니다.
API 시작하기
1. API 키 발급
팀 관리자 또는 워크스페이스 관리자가 콘솔의 설정 > 워크스페이스 > API 키에서 키 이름을 입력하고 발급을 선택합니다(이용가이드 5.2 워크스페이스). 발급된 키는 한 번만 표시되므로 복사해 안전하게 보관합니다.
API 키는 사용이 승인된 조직에서만 발급할 수 있습니다. 사용 신청은 geotracker@humuson.com로 문의해 주세요.
2. 최근 진단 결과 조회
{workspaceId}를 조회할 워크스페이스의 ID로,
{apiKey}를 해당 워크스페이스에서 발급한 API 키로 대체합니다.
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/diagnostics/latest' \
-H 'Authorization: Bearer {apiKey}'
저장된 진단 결과가 없으면 404와 오류 코드 no_data를 반환합니다.
인증
Authorization 헤더에 API 키를 Bearer {apiKey} 형식으로 지정합니다.
쿼리 파라미터나 쿠키를 통한 인증은 지원하지 않습니다.
Authorization: Bearer {apiKey}
인증이 필요한 요청에 API 키가 없거나 유효하지 않으면 401과 오류 코드 unauthorized를 반환합니다.
- 적용 범위: API 키는 발급된 워크스페이스에서만 사용할 수 있습니다.
요청 경로의 워크스페이스 ID가 다르면
403과 오류 코드workspace_mismatch를 반환합니다. - 권한: 모든 키로 데이터 조회, 질문 관리, 진단·수집 요청이 가능합니다. 키별 권한 설정은 지원하지 않습니다.
- 유효 기간: 만료일은 없습니다. 콘솔에서 삭제한 키는 더 이상 인증에 사용할 수 없습니다.
- 발급 한도: 워크스페이스당 최대 5개입니다.
분실한 API 키는 다시 조회할 수 없습니다. 새 키를 발급하고 기존 키를 삭제해야 합니다.
오류
오류가 발생하면 HTTP 상태 코드와 함께 다음 형식의 JSON 본문을 반환합니다.
{
"error": {
"code": "workspace_mismatch",
"message": "This API key does not belong to the requested workspace.",
"requestId": "73afb161-0238-418c-bc45-00fc6b32dbd8"
}
}
| Path | Type | Description |
|---|---|---|
error.code | String | 오류 코드입니다. 오류별 처리 조건으로 사용합니다. |
error.message | String | 오류 설명입니다. 문구가 변경될 수 있으므로 처리 조건에는 error.code를 사용합니다. |
error.requestId | String | 요청 식별자입니다. 오류 문의 시 이 값을 전달해 주세요. x-request-id 응답 헤더에도 같은 값이 포함됩니다. |
코드별 HTTP 상태와 발생 조건은 오류 코드 목록을 참고하세요.
최근 진단 결과 조회
완료된 진단 중 최신 결과의 종합 점수, 등급, 항목별 판정 결과를 조회합니다. 같은 브랜드에 속한 워크스페이스는 진단 결과를 공유합니다.
Path Parameters
| Name | Type | Description |
|---|---|---|
workspaceId | String | 조회할 워크스페이스의 ID입니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
scanId | String | 진단 ID입니다. |
scannedAt | String | 진단 시각입니다. ISO 8601 형식의 UTC 문자열입니다. |
url | String | 진단한 페이지 주소입니다. |
domain | String | 진단한 페이지의 호스트입니다. |
score | Number | 종합 점수입니다. 0부터 100까지입니다. |
grade | String | 진단 등급입니다. 우수, 양호, 보통, 개선 필요, 측정 불충분, 수집 차단 중 하나입니다. 점수 외에 핵심 항목의 판정 결과와 측정 가능 여부도 반영합니다. |
items[] | Array | 진단 항목 목록입니다. |
items[].key | String | 진단 항목 코드입니다. 예: robots_txt |
items[].label | String | 항목 이름입니다. |
items[].category | String | crawl(수집 가능성) meta(메타 정보) perf(콘텐츠 전달) aeo(검색 답변 대비) geo(AI 인용 대비) 중 하나입니다. |
items[].result | String | pass(통과), warn(주의), fail(실패), unknown(판정 불가), not_applicable(해당 없음) 중 하나입니다. |
items[].score | Number | 항목 점수입니다. |
items[].weight | Number | 항목 배점입니다. |
items[].message | String | 판정 결과 요약입니다. |
Example Request
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/diagnostics/latest' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"scanId" : "01a02d34-7e21-72c1-bc5b-95efea519b11",
"scannedAt" : "2026-08-20T01:00:09.983Z",
"url" : "https://www.movefit.co.kr/",
"domain" : "www.movefit.co.kr",
"score" : 78,
"grade" : "보통",
"items" : [ {
"key" : "robots_txt",
"label" : "robots.txt",
"category" : "crawl",
"result" : "pass",
"score" : 7,
"weight" : 7,
"message" : "1/1 기준 모두 통과"
}, {
"key" : "sitemap",
"label" : "sitemap.xml",
"category" : "crawl",
"result" : "fail",
"score" : 0,
"weight" : 8,
"message" : "sitemap을 가져오지 못함 · 크롤러도 읽을 수 없음"
}, {
"key" : "geo_ai_crawler_access",
"label" : "AI crawler 접근 정책",
"category" : "geo",
"result" : "pass",
"score" : 8,
"weight" : 8,
"message" : "3/3 기준 모두 통과"
} ]
}
Errors
| Status | Code | Description |
|---|---|---|
404 | no_data | 조회할 진단 결과가 없습니다. |
AI 답변 노출 조회
지정한 기간의 AI 답변에서 브랜드의 언급 건수, 평균 순위, 상위 3위 노출 건수와 경쟁 브랜드별 지표를 조회합니다.
Path Parameters
| Name | Type | Description |
|---|---|---|
workspaceId | String | 조회할 워크스페이스의 ID입니다. |
Query Parameters
| Name | Type | Description |
|---|---|---|
period | String | 선택입니다. 7d 30d 90d all 중 하나이며 기본값은 30d입니다. 최근 수집일을 기준으로 7일, 30일, 90일 또는 전체 기간을 조회합니다. from·to와 함께 사용할 수 없습니다. |
from | String | 선택입니다. 시작일을 YYYY-MM-DD로 지정합니다. to와 함께 사용합니다. |
to | String | 선택입니다. 종료일을 YYYY-MM-DD로 지정합니다. from과 함께 사용하며, 시작일보다 빠를 수 없습니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
range.from | String | 집계 시작일입니다. YYYY-MM-DD 형식입니다. |
range.to | String | 집계 종료일입니다. YYYY-MM-DD 형식입니다. |
range.snapshotCount | Number | 집계 기간 중 데이터가 있는 날짜 수입니다. |
sampleSize | Number | 집계에 포함된 AI 답변 수입니다. |
mentionRate.mentioned | Number | 브랜드가 언급된 답변 수입니다. |
mentionRate.total | Number | 집계에 포함된 전체 답변 수입니다. |
averageRank | Number | 브랜드가 언급된 답변의 평균 순위입니다. 순위가 없으면 언급 순서를 사용합니다. 계산할 순위나 언급 순서가 없으면 null입니다. |
top3Count | Number | 브랜드 순위가 3위 이내인 답변 수입니다. 순위가 없는 답변은 제외합니다. |
competitors[] | Array | 등록된 경쟁 브랜드와 답변에서 확인된 경쟁 브랜드의 지표입니다. 자사는 제외합니다. |
competitors[].name | String | 경쟁 브랜드 이름입니다. |
competitors[].isPrimary | Boolean | 주요 경쟁 브랜드로 지정되어 있으면 true입니다. |
competitors[].exposedCount | Number | 이 브랜드가 언급된 답변 수입니다. |
competitors[].totalCount | Number | 집계에 포함된 전체 답변 수입니다. |
competitors[].averageRank | Number | 경쟁 브랜드의 평균 순위입니다. 순위가 없으면 언급 순서를 사용합니다. 계산할 순위나 언급 순서가 없으면 null입니다. |
Example Request
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/geo?period=30d' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"range" : {
"from" : "2026-07-22",
"to" : "2026-08-20",
"snapshotCount" : 17
},
"sampleSize" : 504,
"mentionRate" : {
"mentioned" : 271,
"total" : 504
},
"averageRank" : 2.8,
"top3Count" : 46,
"competitors" : [ {
"name" : "요가라인",
"isPrimary" : true,
"exposedCount" : 188,
"totalCount" : 504,
"averageRank" : 1.9
}, {
"name" : "핏하우스",
"isPrimary" : false,
"exposedCount" : 124,
"totalCount" : 504,
"averageRank" : 2.5
} ]
}
Errors
| Status | Code | Description |
|---|---|---|
400 | invalid_parameter | 기간 값이나 날짜 형식·순서가 잘못되었거나, from·to 중 하나가 누락되었거나, period와 날짜를 함께 지정했습니다. |
404 | no_data | 조회할 AI 답변 데이터가 없습니다. |
검색 답변 노출 조회
지정한 기간의 Google·Naver·YouTube 검색 결과와 Google AI Overview·Naver AI 브리핑에서 브랜드 언급률과 자사 콘텐츠 노출률을 조회합니다.
Path Parameters
| Name | Type | Description |
|---|---|---|
workspaceId | String | 조회할 워크스페이스의 ID입니다. |
Query Parameters
| Name | Type | Description |
|---|---|---|
period | String | 선택입니다. 7 30 90 all 중 하나이며 기본값은 30입니다. 한국 시간 기준 오늘을 포함한 최근 7일, 30일, 90일 또는 전체 기간을 조회합니다. from·to와 함께 사용할 수 없습니다. |
from | String | 선택입니다. 시작일을 YYYY-MM-DD로 지정합니다. to와 함께 사용합니다. |
to | String | 선택입니다. 종료일을 YYYY-MM-DD로 지정합니다. from과 함께 사용하며, 시작일보다 빠를 수 없습니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
range.from | String | 집계 시작일입니다. YYYY-MM-DD 형식이며, period=all이면 null입니다. |
range.to | String | 집계 종료일입니다. YYYY-MM-DD 형식입니다. |
kpi.organicBrandMention | Object | 일반 검색 결과에 브랜드명이나 등록된 별칭이 포함된 비율입니다. |
kpi.organicExposure | Object | 일반 검색 결과에 자사 콘텐츠가 하나 이상 포함된 비율입니다. |
kpi.averageGoogleRank.value | Number | Google 일반 검색 상위 20위에 노출된 자사 페이지의 평균 순위입니다. 순위가 있는 자사 페이지가 없으면 null입니다. |
kpi.averageGoogleRank.sampleSize | Number | 평균 순위 계산에 포함된 자사 페이지 노출 건수입니다. |
kpi.aiGeneration | Object | Google AI Overview·Naver AI 브리핑 수집 결과 중 AI 답변이 생성된 비율입니다. 수집에 실패한 건은 제외합니다. |
kpi.aiBrandMention | Object | 생성된 AI 답변 중 본문에 브랜드명이나 등록된 별칭이 포함된 비율입니다. |
kpi.aiOwnedCitation | Object | 생성된 AI 답변 중 자사 URL이 출처로 하나 이상 인용된 비율입니다. |
kpi.*.count | Number | 각 비율 지표의 조건에 해당하는 수집 건수입니다. |
kpi.*.total | Number | 각 비율 지표의 집계 대상 수집 건수입니다. 일반 검색 지표는 검색 결과가 있는 건만 포함합니다. |
kpi.*.rate | Number | count / total × 100을 소수점 첫째 자리로 반올림한 값입니다. total이 0이면 null입니다. |
keywords[] | Array | 조회 기간에 수집 이력이 있는 키워드 목록입니다. |
keywords[].keyword | String | 검색 키워드입니다. |
keywords[].isActive | Boolean | 현재 수집 대상으로 활성화되어 있으면 true입니다. |
Example Request
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/aeo?period=30' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"range" : {
"from" : "2026-07-27",
"to" : "2026-08-25"
},
"kpi" : {
"organicBrandMention" : { "count" : 16, "total" : 16, "rate" : 100 },
"organicExposure" : { "count" : 7, "total" : 16, "rate" : 43.8 },
"averageGoogleRank" : { "value" : 4.5, "sampleSize" : 4 },
"aiGeneration" : { "count" : 16, "total" : 16, "rate" : 100 },
"aiBrandMention" : { "count" : 7, "total" : 16, "rate" : 43.8 },
"aiOwnedCitation" : { "count" : 1, "total" : 16, "rate" : 6.3 }
},
"keywords" : [ {
"keyword" : "요가매트 추천",
"isActive" : true
}, {
"keyword" : "홈트 매트 두께",
"isActive" : true
} ]
}
Errors
| Status | Code | Description |
|---|---|---|
400 | invalid_parameter | period가 7 30 90 all 중 하나가 아니거나, period와 from·to를 함께 지정했거나, 날짜 형식·순서가 맞지 않거나, from·to 중 하나만 지정했습니다. |
404 | no_data | 조회 기간에 수집 이력이 없습니다. |
종합 리포트 조회
진단 결과와 AI 답변·검색 노출을 종합한 리포트를 조회합니다.
응답은 장(chapters)과 각 장의 내용인 블록(blocks)으로 구성됩니다.
Path Parameters
| Name | Type | Description |
|---|---|---|
workspaceId | String | 대상 워크스페이스의 ID입니다. |
Query Parameters
| Name | Type | Description |
|---|---|---|
period | String | 선택입니다. 7d 30d 90d all 중 하나이며 기본값은 30d입니다. 진단·AI 답변·검색 데이터가 있는 최근 날짜를 기준으로 7일, 30일, 90일 또는 전체 기간을 조회합니다. from·to와 함께 사용할 수 없습니다. |
from, to | String | 선택입니다. 시작일과 종료일을 YYYY-MM-DD 형식으로 모두 지정합니다. 종료일은 시작일보다 빠를 수 없습니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
range.from | String | 집계 시작일입니다. YYYY-MM-DD 형식입니다. |
range.to | String | 집계 종료일입니다. YYYY-MM-DD 형식입니다. |
range.snapshotCount | Number | 집계 기간 중 진단·AI 답변·검색 데이터가 있는 날짜 수입니다. |
brand | String | 브랜드 이름입니다. |
domain | String | 브랜드의 대표 도메인입니다. |
chapters[] | Array | 리포트 순서대로 정렬된 장 목록입니다. 데이터가 없는 항목의 장은 제외됩니다. |
chapters[].key | String | summary(요약) competitor(경쟁 브랜드 비교) llm(LLM 답변 노출) aeo(검색 답변 영역 노출) seo(자사 사이트의 인용 준비도) action(실행 계획) 중 하나입니다. |
chapters[].title | String | 장 제목입니다. |
chapters[].blocks[] | Array | 장의 내용을 구성하는 블록 목록입니다. 필드는 블록 종류에 따라 다릅니다. |
Example Request
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/report?period=30d' \
-H 'Authorization: Bearer {apiKey}'
Example Response (일부)
HTTP/1.1 200 OK
Content-Type: application/json
{
"range" : {
"from" : "2026-07-25",
"to" : "2026-08-23",
"snapshotCount" : 19
},
"brand" : "무브핏",
"domain" : "movefit.co.kr",
"chapters" : [ {
"key" : "summary",
"title" : "요약",
"blocks" : [ {
"kind" : "paragraphs",
"items" : [ "최근 30일 동안 AI 답변에서 브랜드가 언급된 비율은 54%입니다." ]
} ]
}, {
"key" : "competitor",
"title" : "경쟁 브랜드 비교",
"blocks" : [ {
"kind" : "heading",
"text" : "브랜드 언급률"
}, {
"kind" : "bars",
"rows" : [ {
"name" : "무브핏",
"value" : 271,
"max" : 504,
"label" : "54%",
"mark" : true
}, {
"name" : "요가라인",
"value" : 188,
"max" : 504,
"label" : "37%"
} ]
} ]
} ]
}
블록 종류
kind는 블록 종류를 나타냅니다. 지원하지 않는 kind는 표시에서 제외합니다.
| kind | 필드 | Description |
|---|---|---|
paragraphs | items[] | 문단 문자열 목록입니다. |
heading | text | 장 안의 소제목입니다. |
note | label, text | 안내 문구입니다. |
figures | items[].label, items[].value, items[].note | 지표의 이름·값·보충 설명입니다. |
bars | caption, rows[].name, rows[].nameSub, rows[].value, rows[].max, rows[].label, rows[].mark | 가로 막대 차트입니다. value는 값, max는 막대 길이의 기준값, mark는 강조 여부입니다. |
table | columns[].label, columns[].num, rows[].self, rows[].cells[].text, rows[].cells[].sub | 표입니다. num은 숫자 열 여부, self는 자사 행 여부입니다. |
heatmap | rowHeader, columnLabels[], caption, rows[].name, rows[].nameSub, rows[].cells[], rows[].labels[], rows[].total, rows[].isSelf | 히트맵입니다. cells는 각 셀의 수치, labels는 표시 문구입니다. |
lineChart | dates[], series[].name, series[].isSelf, series[].values[] | 시계열 차트입니다. values는 dates와 같은 순서이며, null은 해당 날짜의 값이 없음을 나타냅니다. |
gates | rows[].order, rows[].label, rows[].value, rows[].status, rows[].detail, rows[].blocked | 단계별 평가 결과입니다. blocked는 리포트에서 진행을 제한하는 단계로 판정되었는지를 나타냅니다. |
questionKeys | items[].label, items[].question | 질문 약칭과 원문 목록입니다. |
group | blocks[] | 하위 블록 목록입니다. 각 블록은 이 표의 구조를 따릅니다. |
Errors
| Status | Code | Description |
|---|---|---|
400 | invalid_parameter | 기간 값이나 날짜 형식·순서가 올바르지 않거나, from·to 중 하나만 지정했거나, period와 날짜를 함께 지정했습니다. |
404 | no_data | 리포트를 생성할 데이터가 없거나 대표 URL이 등록되어 있지 않습니다. |
질문 목록 조회
AI 답변 수집에 사용하는 질문 목록을 조회합니다. 보관된 질문은 포함하고 삭제된 질문은 제외합니다.
Response Structure
| Path | Type | Description |
|---|---|---|
questions[] | Array | 질문 목록입니다. |
questions[].id | String | 질문 ID입니다. |
questions[].query | String | 질문 문구입니다. |
questions[].isActive | Boolean | 수집 대상이면 true, 보관된 질문이면 false입니다. |
questions[].createdAt | String | 질문 등록 시각입니다. ISO 8601 형식의 UTC 문자열입니다. |
activeLimit | Number | 활성 질문 수의 한도입니다. null이면 제한이 없습니다. |
Example Request
curl -i 'https://{host}/api/v1/workspaces/{workspaceId}/questions' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"questions" : [ {
"id" : "019fcbfb-e57f-702f-bc63-c0827329ac8f",
"query" : "요가매트 추천",
"isActive" : true,
"createdAt" : "2026-08-04T08:55:10.975Z"
}, {
"id" : "019fcbfb-f883-7d0b-8af6-219877f23a81",
"query" : "홈트 매트 두께 어느 정도가 좋아?",
"isActive" : false,
"createdAt" : "2026-08-04T08:55:15.843Z"
} ],
"activeLimit" : 10
}
질문 추가
AI 답변 수집에 사용할 질문을 추가합니다. 같은 문구의 질문이 있으면 기존 질문을 반환하며,
보관되거나 삭제된 질문은 다시 활성화합니다. 기존 id와 createdAt은 유지됩니다.
Request Structure
| Path | Type | Description |
|---|---|---|
query | String | 필수입니다. 앞뒤 공백을 제거하고 연속 공백을 한 칸으로 바꾼 후 1~500자여야 합니다. 중복 여부는 대소문자를 구분하여 판단합니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
id | String | 질문 ID입니다. |
query | String | 공백을 정리하여 저장한 질문 문구입니다. |
isActive | Boolean | 추가된 질문은 true입니다. |
createdAt | String | 질문 등록 시각입니다. ISO 8601 형식의 UTC 문자열입니다. |
Example Request
curl -i -X POST 'https://{host}/api/v1/workspaces/{workspaceId}/questions' \
-H 'Authorization: Bearer {apiKey}' \
-H 'Content-Type: application/json' \
-d '{"query":"요가매트 추천"}'
Example Response
HTTP/1.1 201 Created
Content-Type: application/json
{
"id" : "019fcbfb-e57f-702f-bc63-c0827329ac8f",
"query" : "요가매트 추천",
"isActive" : true,
"createdAt" : "2026-08-04T08:55:10.975Z"
}
기존 질문의 문구 수정은 지원하지 않습니다. 변경하려면 기존 질문을 삭제하고 새 문구로 추가합니다.
Errors
| Status | Code | Description |
|---|---|---|
400 | invalid_parameter | 본문이 JSON이 아니거나, query가 문자열이 아니거나, 공백 정리 후 길이가 1~500자가 아닙니다. |
409 | limit_exceeded | 활성 질문 수의 한도에 도달했습니다. |
질문 삭제
질문을 목록에서 삭제하고 수집 대상에서 제외합니다. 기존 수집 결과는 삭제하지 않습니다.
Path Parameters
| Name | Type | Description |
|---|---|---|
workspaceId | String | 대상 워크스페이스의 ID입니다. |
questionId | String | 삭제할 질문의 ID입니다. |
Response Structure
| Path | Type | Description |
|---|---|---|
id | String | 삭제한 질문의 ID입니다. |
collectionInProgress | Boolean | 오늘(한국 시간) 해당 워크스페이스의 AI 답변 수집이 진행 중이면 true입니다. |
Example Request
curl -i -X DELETE 'https://{host}/api/v1/workspaces/{workspaceId}/questions/{questionId}' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"id" : "019fcbfb-e57f-702f-bc63-c0827329ac8f",
"collectionInProgress" : false
}
Errors
| Status | Code | Description |
|---|---|---|
404 | not_found | 해당 워크스페이스에 질문이 없거나 이미 삭제되었습니다. |
진단·수집 요청
사이트 진단, AI 답변 수집, 검색 수집을 요청합니다. 작업은 비동기로 실행하며, 응답에는 접수 결과를 반환합니다.
요청 본문은 없습니다. 세 종류의 작업을 모두 요청합니다.
Response Structure
| Path | Type | Description |
|---|---|---|
accepted[] | Array | 접수된 작업 종류의 목록입니다. 각 값은 diagnostic(사이트 진단), geo(AI 답변 수집), aeo(검색 수집) 중 하나입니다. |
skipped[] | Array | 접수되지 않은 작업 목록입니다. |
skipped[].kind | String | 접수되지 않은 작업 종류입니다. |
skipped[].reason | String | 미접수 사유입니다. 아래 사유 목록을 참고하세요. |
Example Request
curl -i -X POST 'https://{host}/api/v1/workspaces/{workspaceId}/runs' \
-H 'Authorization: Bearer {apiKey}'
Example Response
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"accepted" : [ "diagnostic", "geo" ],
"skipped" : [ {
"kind" : "aeo",
"reason" : "aeo_quota_exceeded"
} ]
}
하나 이상 접수되면 202, 세 작업 모두 접수되지 않으면 409 conflict를 반환합니다.
409 응답의 error.message에는 작업별 미접수 사유가 포함됩니다.
HTTP/1.1 409 Conflict
Content-Type: application/json
{
"error" : {
"code" : "conflict",
"message" : "Nothing could be started: diagnostic=recently_scanned, geo=no_active_questions, aeo=aeo_unavailable",
"requestId" : "e023e4ce-6be2-4e29-8e35-1333373336d8"
}
}
미접수 사유
| 실행 | reason | Description |
|---|---|---|
diagnostic | no_primary_url | 진단할 대표 URL이 등록되어 있지 않습니다. |
recently_scanned | 최근 1시간 안에 같은 조건으로 진단했습니다. | |
already_running | 진단이 이미 진행 중입니다. | |
no_canonical_domain | 브랜드 도메인이 등록되어 있지 않습니다. | |
url_outside_workspace | 진단 URL이 워크스페이스의 도메인에 속하지 않습니다. | |
url_not_public | 진단 URL이 공개 웹 주소가 아닙니다. | |
dns_lookup_failed | 진단 URL의 DNS 조회에 실패했습니다. | |
invalid_url | 진단 URL의 형식이 올바르지 않습니다. | |
internal_error | 서버 오류로 진단을 시작하지 못했습니다. | |
geo | no_canonical_domain | 브랜드 도메인이 등록되어 있지 않습니다. |
no_active_questions | 활성 질문이 없습니다. | |
geo_quota_exceeded | 조직의 월 한도를 모두 사용했습니다. | |
daily_run_limit | 일일 수동 실행 한도에 도달했습니다. | |
already_running | 오늘(한국 시간) AI 답변 수집이 이미 진행 중입니다. | |
aeo | aeo_unavailable | 검색 수집이 비활성화되어 있거나, 도메인·대표 URL·활성 키워드 중 필요한 설정이 없습니다. |
aeo_quota_exceeded | 조직의 월 한도를 모두 사용했습니다. | |
serpapi_limit_exhausted | 서비스 전체가 공유하는 검색 한도가 소진되었습니다. |
진단 결과는 최근 진단 결과 조회에서 scanId와 scannedAt으로 구분합니다.
수집 결과는 AI 답변 노출 조회와 검색 답변 노출 조회에서 확인합니다.
작업별 상태 조회 API와 완료 알림 웹훅은 제공하지 않습니다.
Errors
| Status | Code | Description |
|---|---|---|
404 | not_found | 워크스페이스가 속한 조직을 찾을 수 없습니다. |
409 | conflict | 세 작업 모두 접수되지 않았습니다. |
부록: 오류 코드
| Code | Status | Description |
|---|---|---|
unauthorized | 401 | API 키가 없거나 유효하지 않습니다. |
workspace_mismatch | 403 | 요청한 워크스페이스와 API 키의 워크스페이스가 다릅니다. |
invalid_parameter | 400 | 필수 값이 없거나 요청 값의 형식·범위가 올바르지 않습니다. |
method_not_allowed | 405 | 해당 경로에서 지원하지 않는 HTTP 메서드입니다. |
no_data | 404 | 조회할 데이터가 없습니다. |
not_found | 404 | 요청한 리소스가 없습니다. |
limit_exceeded | 409 | 활성 질문 수의 한도에 도달했습니다. |
conflict | 409 | 현재 상태에서는 요청을 수행할 수 없습니다. |
internal_error | 500 | 서버 내부 오류입니다. 오류 문의 시 requestId를 전달해 주세요. |