{"components":{"schemas":{"domain.AnswerDTO":{"properties":{"content":{"description":"분류된 답변 본문 (status 가 SUCCESS 가 아니면 빈 문자열)","example":"AI 검색 노출을 늘리려면 먼저 어떤 질문에서 브랜드가 인용되는지 측정하고, 인용이 많은 출처 유형에 맞춰 콘텐츠를 보강하는 순서로 접근합니다.","type":"string"},"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-08-05T02:24:50Z","type":"string"},"fanouts":{"description":"AI가 답변 생성 시 수행한 검색 쿼리(query fan-out) 목록. 페이지네이션 없이 전체 제공","example":["AI 검색 노출 최적화 방법"],"items":{"type":"string"},"type":"array","uniqueItems":false},"id":{"description":"답변 ID. 답변 단건 조회(GET /v1/platform/answers/{answerID})의 answerID 로 사용합니다","example":"pv9LpgpbQyXpCAv8l0Lf0w","type":"string"},"markdownURL":{"description":"답변 원본 마크다운(스크래핑 원문)의 파일 URL.","example":"https://cdn.trychainshift.ai/78af3dd2-0b10-4dc5-8c53-83fc875a625e.md","type":"string"},"model":{"description":"이 답변을 수집한 모델","example":"NAVER_AI_BRIEFING","type":"string"},"promptID":{"description":"답변 대상 프롬프트 ID. 프롬프트 조회(GET /v1/platform/prompts/{promptID})에 사용합니다","example":"KNUETdAfRhDY9lQTgu9wuw","type":"string"},"query":{"description":"모델에 실제로 던진 질의 텍스트","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","type":"string"},"region":{"description":"이 답변을 수집한 지역 코드","example":"KR","type":"string"},"runID":{"description":"이 답변을 생성한 프롬프트 실행 ID (실행 요청 시 발급). 연관된 프롬프트 실행이 없으면 생략","example":"S8cqDSjSot67bCK6YtmvHw","type":"string"},"sources":{"description":"답변에 인용된 출처 목록. 페이지네이션 없이 전체 제공","items":{"$ref":"#/components/schemas/domain.AnswerSourceDTO"},"type":"array","uniqueItems":false},"status":{"description":"답변의 수집·분류 상태. PENDING: 아직 답변이 준비되지 않음(수집 또는 분류 진행 중, content 는 빈 문자열),\nSUCCESS: 답변 분류까지 끝나 content 조회 가능, FAILED: 실패했거나 건너뜀(예: 모델이 AI 답변을 내지 않은 경우).\nPENDING 에서 SUCCESS 또는 FAILED 로 한 번만 전이하며, 종료된 뒤에는 바뀌지 않습니다","enum":["PENDING","SUCCESS","FAILED"],"example":"SUCCESS","type":"string"}},"required":["id","model","promptID","region","status"],"type":"object"},"domain.AnswerNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"ANSWER_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"답변을 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.AnswerSourceDTO":{"properties":{"domain":{"description":"출처 도메인 (루트 도메인 기준). 출처 통계 API의 domain 필터에 그대로 넣을 수 있습니다. 판별하지 못한 경우 생략됩니다","example":"wikipedia.org","type":"string"},"title":{"description":"출처 콘텐츠 제목 (분류 전이면 빈 문자열)","example":"Search engine optimization","type":"string"},"url":{"description":"출처 URL","example":"https://en.wikipedia.org/wiki/Search_engine_optimization","type":"string"}},"type":"object"},"domain.BindingError":{"properties":{"code":{"description":"오류 코드","example":"COMMON_BINDING","type":"string"},"details":{"description":"해석에 실패한 원인 (사유 1건이어도 길이 1 배열)","example":["PLATFORM_INVALID_ID: 유효하지 않은 ID 형식입니다."],"items":{"type":"string"},"type":"array","uniqueItems":false},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"요청 데이터를 처리할 수 없습니다","type":"string"}},"type":"object"},"domain.BrandDTO":{"properties":{"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-07-28T02:39:00Z","type":"string"},"description":{"description":"브랜드 설명","example":"AI 검색(AEO·GEO)에서 브랜드 노출을 측정하고 개선하는 서비스입니다.","type":"string"},"id":{"description":"브랜드 ID. 브랜드 조회·수정·삭제 경로의 brandID 로 사용합니다","example":"FL8xhW9MKzRXuMo9w6ON2A","type":"string"},"name":{"description":"브랜드명","example":"Chainshift","type":"string"},"synonyms":{"description":"브랜드 동의어 목록","example":["체인시프트"],"items":{"type":"string"},"type":"array","uniqueItems":false},"websites":{"description":"브랜드 웹사이트 URL 목록","example":["https://trychainshift.ai"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["id","name"],"type":"object"},"domain.BrandNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"USER_BRAND_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"사용자 브랜드를 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.BulkCreatePromptItem":{"properties":{"content":{"description":"프롬프트 내용 (최대 1000자)","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","maxLength":1000,"type":"string"},"promptSetID":{"description":"소속 프롬프트 세트 ID (필수)","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"}},"required":["content","promptSetID"],"type":"object"},"domain.BulkCreatePromptRequest":{"properties":{"prompts":{"description":"생성할 프롬프트 목록 (1~100개)","items":{"$ref":"#/components/schemas/domain.BulkCreatePromptItem"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":false}},"required":["prompts"],"type":"object"},"domain.BulkCreatePromptResponse":{"properties":{"ids":{"description":"생성된 프롬프트 ID 목록 (요청 순서와 동일)","example":["cM0RPoxbNbJy0mS-MhsHOg"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["ids"],"type":"object"},"domain.CountAnswersResponse":{"properties":{"count":{"description":"검색어 중 하나라도 매칭된 답변 개수","example":48,"type":"integer"}},"type":"object"},"domain.CreateBrandRequest":{"properties":{"description":{"description":"브랜드 설명 (최대 1000자)","example":"AI 검색(AEO·GEO)에서 브랜드 노출을 측정하고 개선하는 서비스입니다.","maxLength":1000,"type":"string"},"name":{"description":"브랜드명 (최대 100자)","example":"Chainshift","maxLength":100,"type":"string"},"synonyms":{"description":"브랜드 동의어 목록 (최대 50개, 각 100자 이내)","example":["체인시프트"],"items":{"type":"string"},"maxItems":50,"type":"array","uniqueItems":false},"websites":{"description":"브랜드 웹사이트 URL 목록 (최대 20개, 각 항목 URL 형식·scheme 포함·2048자 이내)","example":["https://trychainshift.ai"],"items":{"type":"string"},"maxItems":20,"type":"array","uniqueItems":false}},"required":["name","synonyms"],"type":"object"},"domain.CreateBrandResponse":{"properties":{"id":{"description":"생성된 브랜드의 ID. 브랜드 조회·수정·삭제 경로의 brandID 로 사용합니다","example":"FL8xhW9MKzRXuMo9w6ON2A","type":"string"}},"required":["id"],"type":"object"},"domain.CreatePromptRequest":{"properties":{"content":{"description":"프롬프트 내용 (최대 1000자)","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","maxLength":1000,"type":"string"},"promptSetID":{"description":"소속 프롬프트 세트 ID (필수)","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"}},"required":["content","promptSetID"],"type":"object"},"domain.CreatePromptResponse":{"properties":{"id":{"description":"생성된 프롬프트의 ID. 프롬프트 조회·수정·삭제 경로의 promptID, 프롬프트 실행 요청의 promptIDs 값으로 사용합니다","example":"cM0RPoxbNbJy0mS-MhsHOg","type":"string"}},"required":["id"],"type":"object"},"domain.CreatePromptSetRequest":{"properties":{"description":{"description":"설명 (최대 1000자)","example":"자사 서비스가 AI 답변에 어떻게 노출되는지 추적하는 프롬프트 모음","maxLength":1000,"type":"string"},"name":{"description":"이름 (최대 100자)","example":"AI 검색 노출 모니터링","maxLength":100,"type":"string"}},"required":["name"],"type":"object"},"domain.CreatePromptSetResponse":{"properties":{"id":{"description":"생성된 프롬프트 세트의 ID. 세트 조회·수정·삭제 경로의 promptSetID, 프롬프트 실행 요청의 promptSetID 값으로 사용합니다","example":"T66Yb0Ylf-xJX-Mbx-yhcg","type":"string"}},"required":["id"],"type":"object"},"domain.ExtractProperNounsRequest":{"properties":{"lang":{"description":"auto/ko/en (기본 auto)","enum":["auto","ko","en"],"example":"ko","type":"string"},"text":{"description":"분석 대상 텍스트","example":"체인시프트는 ChatGPT 와 Perplexity 답변에서 브랜드 노출을 추적한다.","maxLength":100000,"type":"string"}},"required":["text"],"type":"object"},"domain.ExtractProperNounsResponse":{"properties":{"properNouns":{"description":"미등록 고유명사 목록","items":{"$ref":"#/components/schemas/domain.ProperNounDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.FanoutStatisticDTO":{"properties":{"fanoutCount":{"description":"이 쿼리의 fan-out 발생 수 (인용 통계의 citationCount 와 동형 명명, FND-1495)","example":9,"type":"integer"},"latestCreatedAt":{"description":"이 쿼리가 가장 최근 등장한 시각 (RFC3339)","example":"2026-08-03T11:39:44Z","type":"string"},"models":{"description":"이 쿼리를 던진 모델 목록 (include=models 일 때만, 중복 제거)","example":["PERPLEXITY"],"items":{"type":"string"},"type":"array","uniqueItems":false},"query":{"description":"AI가 던진 검색 쿼리 문자열","example":"AI 검색 노출 최적화 방법","type":"string"},"regions":{"description":"이 쿼리가 나온 지역 목록 (include=regions 일 때만, 중복 제거)","example":["KR"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"domain.GetAnswerResponse":{"properties":{"content":{"description":"분류된 답변 본문 (status 가 SUCCESS 가 아니면 빈 문자열)","example":"AI 검색 노출을 늘리려면 먼저 어떤 질문에서 브랜드가 인용되는지 측정하고, 인용이 많은 출처 유형에 맞춰 콘텐츠를 보강하는 순서로 접근합니다.","type":"string"},"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-08-05T02:24:50Z","type":"string"},"fanouts":{"description":"AI가 답변 생성 시 수행한 검색 쿼리(query fan-out) 목록. 페이지네이션 없이 전체 제공","example":["AI 검색 노출 최적화 방법"],"items":{"type":"string"},"type":"array","uniqueItems":false},"id":{"description":"답변 ID. 답변 단건 조회(GET /v1/platform/answers/{answerID})의 answerID 로 사용합니다","example":"pv9LpgpbQyXpCAv8l0Lf0w","type":"string"},"markdownURL":{"description":"답변 원본 마크다운(스크래핑 원문)의 파일 URL.","example":"https://cdn.trychainshift.ai/78af3dd2-0b10-4dc5-8c53-83fc875a625e.md","type":"string"},"model":{"description":"이 답변을 수집한 모델","example":"NAVER_AI_BRIEFING","type":"string"},"promptID":{"description":"답변 대상 프롬프트 ID. 프롬프트 조회(GET /v1/platform/prompts/{promptID})에 사용합니다","example":"KNUETdAfRhDY9lQTgu9wuw","type":"string"},"query":{"description":"모델에 실제로 던진 질의 텍스트","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","type":"string"},"region":{"description":"이 답변을 수집한 지역 코드","example":"KR","type":"string"},"runID":{"description":"이 답변을 생성한 프롬프트 실행 ID (실행 요청 시 발급). 연관된 프롬프트 실행이 없으면 생략","example":"S8cqDSjSot67bCK6YtmvHw","type":"string"},"sources":{"description":"답변에 인용된 출처 목록. 페이지네이션 없이 전체 제공","items":{"$ref":"#/components/schemas/domain.AnswerSourceDTO"},"type":"array","uniqueItems":false},"status":{"description":"답변의 수집·분류 상태. PENDING: 아직 답변이 준비되지 않음(수집 또는 분류 진행 중, content 는 빈 문자열),\nSUCCESS: 답변 분류까지 끝나 content 조회 가능, FAILED: 실패했거나 건너뜀(예: 모델이 AI 답변을 내지 않은 경우).\nPENDING 에서 SUCCESS 또는 FAILED 로 한 번만 전이하며, 종료된 뒤에는 바뀌지 않습니다","enum":["PENDING","SUCCESS","FAILED"],"example":"SUCCESS","type":"string"}},"required":["id","model","promptID","region","status"],"type":"object"},"domain.GetBrandResponse":{"properties":{"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-07-28T02:39:00Z","type":"string"},"description":{"description":"브랜드 설명","example":"AI 검색(AEO·GEO)에서 브랜드 노출을 측정하고 개선하는 서비스입니다.","type":"string"},"id":{"description":"브랜드 ID. 브랜드 조회·수정·삭제 경로의 brandID 로 사용합니다","example":"FL8xhW9MKzRXuMo9w6ON2A","type":"string"},"name":{"description":"브랜드명","example":"Chainshift","type":"string"},"synonyms":{"description":"브랜드 동의어 목록","example":["체인시프트"],"items":{"type":"string"},"type":"array","uniqueItems":false},"websites":{"description":"브랜드 웹사이트 URL 목록","example":["https://trychainshift.ai"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["id","name"],"type":"object"},"domain.GetGoogleKeywordMetricsRequest":{"properties":{"countryCode":{"description":"국가 코드 (ISO 3166-1 alpha-2, 기본 \"KR\")","example":"US","type":"string"},"keywords":{"description":"조회할 키워드 목록 (1~100개, 중복 불가(대소문자·공백 표기 무시), 각 80자 이내)","example":["protein powder"],"items":{"type":"string"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":true},"languageCode":{"description":"언어 코드 (ISO 639-1, 기본 \"ko\")","example":"en","type":"string"}},"required":["keywords"],"type":"object"},"domain.GetGoogleKeywordMetricsResponse":{"properties":{"countryCode":{"description":"적용된 국가 코드 (기본값 반영)","example":"US","type":"string"},"items":{"description":"키워드별 지표 (요청 keywords 순서 유지)","items":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsItemDTO"},"type":"array","uniqueItems":false},"languageCode":{"description":"적용된 언어 코드 (기본값 반영)","example":"en","type":"string"}},"required":["countryCode","items","languageCode"],"type":"object"},"domain.GetMyCreditBalanceResponse":{"properties":{"balance":{"description":"현재 크레딧 잔액 (유료+플랜 합계, 소수점 포함 가능)","example":99162205,"type":"number"}},"type":"object"},"domain.GetMyOrganizationResponse":{"properties":{"createdAt":{"description":"조직 생성일","example":"2025-06-23T02:17:53Z","type":"string"},"id":{"description":"요청에 사용한 API 키가 속한 조직의 ID. 문의·지원 요청 시 조직을 특정하는 값으로, 요청 경로에 넣을 일은 없습니다","example":"09aro2Db6PaXr5pSvCvVGA","type":"string"},"name":{"description":"조직명","example":"Chainshift","type":"string"},"region":{"description":"조직 리전 (ISO 3166-1 alpha-2 국가 코드)","example":"KR","type":"string"},"websites":{"description":"조직 웹사이트 리스트 (없으면 필드 생략)","example":["https://trychainshift.ai"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"required":["createdAt","id","name","region"],"type":"object"},"domain.GetNaverKeywordMetricsRequest":{"properties":{"keywords":{"description":"조회할 키워드 목록 (1~15개, 중복 불가(대소문자·공백 무시), 각 80자 이내)","example":["단백질보충제"],"items":{"type":"string"},"maxItems":15,"minItems":1,"type":"array","uniqueItems":true}},"required":["keywords"],"type":"object"},"domain.GetNaverKeywordMetricsResponse":{"properties":{"items":{"description":"키워드별 지표 (요청 keywords 순서 유지)","items":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsItemDTO"},"type":"array","uniqueItems":false}},"required":["items"],"type":"object"},"domain.GetNaverKeywordTrendRequest":{"properties":{"keywords":{"description":"조회할 키워드 목록 (1~15개, 중복 불가(대소문자·공백 무시), 각 80자 이내)","example":["단백질보충제"],"items":{"type":"string"},"maxItems":15,"minItems":1,"type":"array","uniqueItems":true}},"required":["keywords"],"type":"object"},"domain.GetNaverKeywordTrendResponse":{"properties":{"items":{"description":"키워드별 트렌드 (요청 keywords 순서 유지)","items":{"$ref":"#/components/schemas/domain.NaverKeywordTrendItemDTO"},"type":"array","uniqueItems":false}},"required":["items"],"type":"object"},"domain.GetPromptResponse":{"properties":{"answerCount":{"description":"프롬프트로 수집된 답변 수","example":3,"type":"integer"},"content":{"description":"프롬프트 내용","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","type":"string"},"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-08-03T07:13:26Z","type":"string"},"id":{"description":"프롬프트 ID. 프롬프트 조회·수정·삭제 경로의 promptID, 프롬프트 실행 요청의 promptIDs 값으로 사용합니다","example":"cM0RPoxbNbJy0mS-MhsHOg","type":"string"},"promptSetID":{"description":"이 프롬프트가 속한 프롬프트 세트 ID","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"}},"required":["content","id","promptSetID"],"type":"object"},"domain.GetPromptSetResponse":{"properties":{"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-06-23T01:15:09Z","type":"string"},"description":{"description":"설명 (없으면 null)","example":"자사 서비스가 AI 답변에 어떻게 노출되는지 추적하는 프롬프트 모음","type":"string"},"id":{"description":"프롬프트 세트 ID. 세트 조회·수정·삭제 경로의 promptSetID, 프롬프트 실행 요청의 promptSetID 값으로 사용합니다","example":"T66Yb0Ylf-xJX-Mbx-yhcg","type":"string"},"name":{"description":"이름","example":"AI 검색 노출 모니터링","type":"string"},"promptCount":{"description":"세트에 소속된 프롬프트 수","example":4,"type":"integer"}},"required":["id","name"],"type":"object"},"domain.GetRunStatusResponse":{"properties":{"answers":{"description":"항목별 세부 진행 상태 (프롬프트 × 모델 × 반복 1회당 1건)","items":{"$ref":"#/components/schemas/domain.RunAnswerStatus"},"type":"array","uniqueItems":false},"failedCount":{"description":"실패했거나 건너뛴 항목 수","example":12,"type":"integer"},"finishedCount":{"description":"종료된 항목 수 (성공 + 실패)","example":5000,"type":"integer"},"id":{"description":"조회한 프롬프트 실행 ID. 제출 응답의 id 이자 요청 경로의 runID 와 같은 값입니다","example":"S8cqDSjSot67bCK6YtmvHw","type":"string"},"runningCount":{"description":"아직 종료되지 않은 항목 수","example":0,"type":"integer"},"status":{"description":"프롬프트 실행 전체의 진행 상태. RUNNING: 아직 종료되지 않은 항목이 남음(runningCount \u003e 0), FINISHED: 모든 항목이 종료됨(finishedCount == totalCount).\nRUNNING 에서 FINISHED 로 한 번만 전이하며 되돌아가지 않습니다. 제출 직후 실행 항목이 아직 준비되지 않아 totalCount 가 0 인 동안에도 RUNNING 입니다.\n실패한 항목이 있어도 전부 종료되면 FINISHED 이므로, 성공 여부는 successCount·failedCount 로 판단합니다","enum":["RUNNING","FINISHED"],"example":"FINISHED","type":"string"},"successCount":{"description":"답변 분류까지 완료된 항목 수","example":4988,"type":"integer"},"totalCount":{"description":"전체 실행 항목 수 (프롬프트 수 × 모델 수 × 반복 횟수)","example":5000,"type":"integer"}},"type":"object"},"domain.GetSiteKeywordAnalysisStatusResponse":{"properties":{"error":{"description":"example 을 붙이지 않는다 — status=COMPLETED 예시에 실패 사유가 섞여 보인다.","type":"string"},"id":{"description":"조회한 분석 작업 ID. 제출 응답의 id 이자 요청 경로의 taskID 와 같은 값입니다","example":"Ck1hRr4mQ2yVX8pTd0LsJw","type":"string"},"keywords":{"description":"COMPLETED일 때만 채워짐","items":{"$ref":"#/components/schemas/domain.SiteKeywordDTO"},"type":"array","uniqueItems":false},"maxPages":{"description":"제출 시 요청한 최대 분석 페이지 수","example":30,"type":"integer"},"processedPages":{"description":"지금까지 시도(성공+실패) 완료한 페이지 수","example":8,"type":"integer"},"status":{"description":"분석 작업의 진행 상태. PENDING: 접수됐고 아직 시작 전, IN_PROGRESS: 페이지를 수집·분석하는 중(totalPages·processedPages 로 진척 확인),\nCOMPLETED: 분석이 끝나 keywords 가 채워짐, FAILED: 분석이 실패해 결과가 없음(error 에 사유).\nPENDING → IN_PROGRESS → COMPLETED 또는 FAILED 순으로 전이하며, 종료(COMPLETED·FAILED) 후에는 바뀌지 않습니다. 시작 전 실패하면 PENDING 에서 바로 FAILED 가 될 수 있습니다","enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED"],"example":"COMPLETED","type":"string"},"totalPages":{"description":"처리 대상 페이지 수 (IN_PROGRESS 진입 후 확정)","example":8,"type":"integer"}},"type":"object"},"domain.GoogleKeywordMetricsDTO":{"description":"검색 지표 (null = 데이터 없음)","properties":{"cpc":{"description":"평균 클릭당 비용 (USD)","example":1.66,"type":"number"},"keywordDifficulty":{"description":"SEO 난이도 (0~100)","example":32,"type":"integer"},"monthlySearches":{"description":"최근 12개월 월별 검색량","items":{"$ref":"#/components/schemas/domain.GoogleMonthlySearchDTO"},"type":"array","uniqueItems":false},"searchIntent":{"description":"검색 의도 (informational | navigational | commercial | transactional)","example":"transactional","type":"string"},"searchVolume":{"description":"월평균 검색량. null = Google Ads 제한 카테고리(의료·금융 등)로 검색량 비공개","example":301000,"type":"integer"},"searchVolumeTrend":{"$ref":"#/components/schemas/domain.GoogleSearchVolumeTrendDTO"}},"type":"object"},"domain.GoogleKeywordMetricsItemDTO":{"properties":{"keyword":{"description":"키워드 (요청 원문 그대로)","example":"protein powder","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsDTO"}},"required":["keyword"],"type":"object"},"domain.GoogleMonthlySearchDTO":{"properties":{"month":{"description":"월 (1~12)","example":6,"type":"integer"},"searchVolume":{"description":"해당 월 검색량","example":450000,"type":"integer"},"year":{"description":"연도","example":2026,"type":"integer"}},"required":["month","year"],"type":"object"},"domain.GoogleSearchVolumeTrendDTO":{"description":"기간별 검색량 증감률 (%)","properties":{"monthly":{"description":"전월 대비 (%)","example":-33,"type":"number"},"quarterly":{"description":"전분기 대비 (%)","example":50,"type":"number"},"yearly":{"description":"전년 대비 (%)","example":50,"type":"number"}},"type":"object"},"domain.InsufficientCreditsError":{"properties":{"code":{"description":"오류 코드","example":"INSUFFICIENT_CREDITS","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"크레딧이 부족합니다.","type":"string"}},"type":"object"},"domain.InternalServerError":{"properties":{"message":{"description":"오류 메시지 (지역화하지 않습니다)","example":"Internal Server Error","type":"string"},"requestID":{"description":"문의 시 참조할 요청 식별자 (응답의 X-Request-Id 헤더와 같은 값)","example":"bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk","type":"string"}},"type":"object"},"domain.KeywordMetricsNotConfiguredError":{"properties":{"code":{"description":"오류 코드","example":"KEYWORD_METRICS_NOT_CONFIGURED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"키워드 지표 기능이 아직 활성화되지 않았습니다","type":"string"}},"type":"object"},"domain.KeywordProviderUnavailableError":{"properties":{"code":{"description":"오류 코드","example":"KEYWORD_METRICS_PROVIDER_UNAVAILABLE","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"키워드 지표 조회에 실패했습니다. 잠시 후 다시 시도해주세요","type":"string"}},"type":"object"},"domain.ListAnswersResponse":{"properties":{"answers":{"description":"답변 목록","items":{"$ref":"#/components/schemas/domain.AnswerDTO"},"type":"array","uniqueItems":false},"nextCursor":{"description":"다음 페이지 cursor (더 이상 없으면 null)","example":"eyJpZCI6NzIzMDF9","type":"string"}},"type":"object"},"domain.ListBrandsResponse":{"properties":{"brands":{"description":"브랜드 목록","items":{"$ref":"#/components/schemas/domain.BrandDTO"},"type":"array","uniqueItems":false},"nextCursor":{"description":"다음 페이지 cursor (더 이상 없으면 null)","example":"eyJpZCI6MTI0NX0","type":"string"}},"type":"object"},"domain.ListFanoutStatisticsResponse":{"properties":{"fanouts":{"description":"등장 횟수 내림차순 검색 쿼리 랭킹 (상위 limit개)","items":{"$ref":"#/components/schemas/domain.FanoutStatisticDTO"},"type":"array","uniqueItems":false},"totalFanouts":{"description":"스코프 내 총 fan-out 발생 수 (같은 쿼리가 여러 번 나오면 각각 1건). 랭킹 항목 fanoutCount 의 분모","example":128,"type":"integer"}},"type":"object"},"domain.ListGoogleKeywordSuggestionsResponse":{"properties":{"countryCode":{"description":"적용된 국가 코드 (기본값 반영)","example":"US","type":"string"},"keyword":{"description":"조회 기준 키워드 (에코)","example":"protein powder","type":"string"},"languageCode":{"description":"적용된 언어 코드 (기본값 반영)","example":"en","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsDTO"},"suggestedKeywords":{"description":"제안 키워드 (검색량 내림차순, 기준 키워드 제외)","items":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsItemDTO"},"type":"array","uniqueItems":false}},"required":["countryCode","keyword","languageCode","suggestedKeywords"],"type":"object"},"domain.ListGoogleRelatedKeywordsResponse":{"properties":{"countryCode":{"description":"적용된 국가 코드 (기본값 반영)","example":"US","type":"string"},"keyword":{"description":"조회 기준 키워드 (에코)","example":"protein powder","type":"string"},"languageCode":{"description":"적용된 언어 코드 (기본값 반영)","example":"en","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsDTO"},"relatedKeywords":{"description":"연관 키워드 (검색량 내림차순, 기준 키워드 제외)","items":{"$ref":"#/components/schemas/domain.GoogleKeywordMetricsItemDTO"},"type":"array","uniqueItems":false}},"required":["countryCode","keyword","languageCode","relatedKeywords"],"type":"object"},"domain.ListModelsResponse":{"properties":{"models":{"description":"지원 모델 목록","items":{"$ref":"#/components/schemas/domain.ModelItem"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListNaverKeywordSuggestionsResponse":{"properties":{"keyword":{"description":"조회 기준 키워드 (에코)","example":"단백질보충제","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsDTO"},"suggestedKeywords":{"description":"제안 키워드 (검색량 내림차순, 기준 키워드 제외)","items":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsItemDTO"},"type":"array","uniqueItems":false}},"required":["keyword","suggestedKeywords"],"type":"object"},"domain.ListNaverRelatedKeywordsResponse":{"properties":{"keyword":{"description":"조회 기준 키워드 (에코)","example":"단백질보충제","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsDTO"},"relatedKeywords":{"description":"연관 키워드 (검색량 내림차순, 기준 키워드 제외)","items":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsItemDTO"},"type":"array","uniqueItems":false}},"required":["keyword","relatedKeywords"],"type":"object"},"domain.ListPromptSetsResponse":{"properties":{"nextCursor":{"description":"다음 페이지 cursor (없으면 null)","example":"eyJpZCI6MTI0NX0","type":"string"},"promptSets":{"description":"프롬프트 세트 목록","items":{"$ref":"#/components/schemas/domain.PromptSetDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListPromptsResponse":{"properties":{"nextCursor":{"description":"다음 페이지 cursor (더 이상 없으면 null)","example":"eyJpZCI6NzIzMDF9","type":"string"},"prompts":{"description":"프롬프트 목록","items":{"$ref":"#/components/schemas/domain.PromptDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListRunItem":{"properties":{"failedCount":{"description":"실패했거나 건너뛴 항목 수","example":12,"type":"integer"},"finishedCount":{"description":"종료된 항목 수 (성공 + 실패)","example":5000,"type":"integer"},"id":{"description":"프롬프트 실행 ID. 제출 응답의 id 와 같은 값이며, 상태 조회 경로의 runID 로 사용합니다","example":"S8cqDSjSot67bCK6YtmvHw","type":"string"},"runningCount":{"description":"아직 종료되지 않은 항목 수","example":0,"type":"integer"},"status":{"description":"프롬프트 실행 전체의 진행 상태. RUNNING: 아직 종료되지 않은 항목이 남음(runningCount \u003e 0), FINISHED: 모든 항목이 종료됨(finishedCount == totalCount).\nRUNNING 에서 FINISHED 로 한 번만 전이하며 되돌아가지 않습니다. 제출 직후 실행 항목이 아직 준비되지 않아 totalCount 가 0 인 동안에도 RUNNING 입니다.\n실패한 항목이 있어도 전부 종료되면 FINISHED 이므로, 성공 여부는 successCount·failedCount 로 판단합니다","enum":["RUNNING","FINISHED"],"example":"FINISHED","type":"string"},"successCount":{"description":"답변 분류까지 완료된 항목 수","example":4988,"type":"integer"},"totalCount":{"description":"전체 실행 항목 수 (프롬프트 수 × 모델 수 × 반복 횟수)","example":5000,"type":"integer"}},"type":"object"},"domain.ListRunsResponse":{"properties":{"nextCursor":{"description":"다음 페이지 cursor (없으면 null)","example":"eyJpZCI6MzcxfQ","type":"string"},"runs":{"description":"프롬프트 실행 목록","items":{"$ref":"#/components/schemas/domain.ListRunItem"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListSourceStatisticsDomainsResponse":{"properties":{"domains":{"description":"인용 수 내림차순 도메인 랭킹 (상위 limit개)","items":{"$ref":"#/components/schemas/domain.SourceDomainStatisticDTO"},"type":"array","uniqueItems":false},"totalCitations":{"description":"스코프 내 총 인용 수 (동일 URL이 여러 답변에 인용되면 각각 1건)","example":1571,"type":"integer"},"totalDomains":{"description":"스코프 내 고유 도메인 수 (통계 단위 기준, 도메인 미확인 인용 제외). 도메인 종류가 매우 많아 정확히 셀 수 없는 경우 null","example":354,"type":"integer"}},"type":"object"},"domain.ListSourceStatisticsURLsResponse":{"properties":{"totalCitations":{"description":"스코프 내 총 인용 수","example":1571,"type":"integer"},"urls":{"description":"인용 수 내림차순 URL 랭킹 (상위 limit개)","items":{"$ref":"#/components/schemas/domain.SourceURLStatisticDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListTokenNeighborsResponse":{"properties":{"neighbors":{"description":"기준 단어(들) 앞뒤에 함께 나온 토큰 랭킹 (상위 limit개)","items":{"$ref":"#/components/schemas/domain.NeighborTokenDTO"},"type":"array","uniqueItems":false},"words":{"description":"요청한 기준 단어 목록(원문 그대로)","example":["AEO"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ListTokenStatisticsResponse":{"properties":{"tokens":{"description":"등장 답변 수 내림차순 토큰 랭킹 (상위 limit개)","items":{"$ref":"#/components/schemas/domain.TokenStatisticDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.ModelItem":{"properties":{"code":{"description":"모델 코드","example":"CHATGPT","type":"string"},"name":{"description":"모델 표시명","example":"ChatGPT","type":"string"}},"type":"object"},"domain.ModelNotGrantedError":{"properties":{"code":{"description":"오류 코드","example":"MODEL_NOT_GRANTED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"조직에 부여되지 않은 모델입니다. 사용하려면 계약이 필요합니다","type":"string"}},"type":"object"},"domain.ModelNotSupportedError":{"properties":{"code":{"description":"오류 코드","example":"MODEL_NOT_SUPPORTED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"플랫폼 API에서 지원하지 않는 모델입니다","type":"string"}},"type":"object"},"domain.NaverKeywordMetricsDTO":{"description":"검색 지표 (null = 데이터 없음)","properties":{"adDepth":{"description":"월평균 노출 광고 개수","example":8,"type":"integer"},"avgCTRMobile":{"description":"모바일 월평균 클릭률 (%)","example":2.74,"type":"number"},"avgCTRPC":{"description":"PC 월평균 클릭률 (%)","example":0.75,"type":"number"},"avgClickMobile":{"description":"모바일 월평균 클릭수","example":696.9,"type":"number"},"avgClickPC":{"description":"PC 월평균 클릭수","example":45,"type":"number"},"competition":{"description":"경쟁 정도 (낮음 | 중간 | 높음)","example":"중간","type":"string"},"mobileBelowThreshold":{"description":"true 면 모바일 검색량이 10 미만(정확한 값 불명)","example":false,"type":"boolean"},"pcBelowThreshold":{"description":"true 면 PC 검색량이 10 미만(정확한 값 불명)","example":false,"type":"boolean"},"searchVolumeMobile":{"description":"모바일 월간 검색량","example":27200,"type":"integer"},"searchVolumePC":{"description":"PC 월간 검색량","example":6370,"type":"integer"},"searchVolumeTotal":{"description":"월간 검색량 합계 (PC+모바일)","example":33570,"type":"integer"}},"type":"object"},"domain.NaverKeywordMetricsItemDTO":{"properties":{"keyword":{"description":"키워드 (요청 원문 그대로)","example":"단백질보충제","type":"string"},"metrics":{"$ref":"#/components/schemas/domain.NaverKeywordMetricsDTO"}},"required":["keyword"],"type":"object"},"domain.NaverKeywordTrendDTO":{"description":"검색 트렌드 (null = 데이터 없음)","properties":{"anchor":{"$ref":"#/components/schemas/domain.NaverTrendAnchorDTO"},"points":{"description":"최근 12개월(완결 월) 상대 검색 비율 시계열 (오름차순)","items":{"$ref":"#/components/schemas/domain.NaverTrendPointDTO"},"type":"array","uniqueItems":false}},"required":["points"],"type":"object"},"domain.NaverKeywordTrendItemDTO":{"properties":{"keyword":{"description":"키워드 (요청 원문 그대로)","example":"단백질보충제","type":"string"},"trend":{"$ref":"#/components/schemas/domain.NaverKeywordTrendDTO"}},"required":["keyword"],"type":"object"},"domain.NaverTrendAnchorDTO":{"description":"절대 환산 앵커. null = 검색광고 절대 검색수 조회 불가","properties":{"month":{"description":"앵커 월 (1~12)","example":7,"type":"integer"},"searchVolumeTotal":{"description":"검색광고 기준 해당 월 절대 검색수 (PC+모바일)","example":33570,"type":"integer"},"year":{"description":"앵커 월의 연도 (points 의 마지막 완결 월)","example":2026,"type":"integer"}},"type":"object"},"domain.NaverTrendPointDTO":{"properties":{"month":{"description":"월 (1~12)","example":8,"type":"integer"},"ratio":{"description":"조회 기간 내 최댓값=100 기준 정규화된 상대 비율 (0~100)","example":100,"type":"number"},"year":{"description":"연도","example":2025,"type":"integer"}},"required":["month","year"],"type":"object"},"domain.NeighborTokenDTO":{"properties":{"answerCount":{"description":"이 이웃 토큰이 기준 단어(들) 중 하나의 window 이내에 함께 나온 답변 수","example":571,"type":"integer"},"token":{"description":"이웃 토큰","example":"브랜드","type":"string"},"totalAnswerCount":{"description":"기준 단어 근접 여부와 무관하게 이 토큰이 스코프 전체에서 등장한 답변 수\n(include=totalAnswerCount 지정 시에만 포함, 미지정 시 생략). answerCount와의 비율로 보면\n\"이 토큰이 등장할 때 얼마나 자주 기준 단어 근처에 나오는지\"가 드러나,\n원래 흔한 단어와 실제 연관어를 구분할 수 있습니다.","example":3276,"type":"integer"}},"type":"object"},"domain.OrganizationNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"ORGANIZATION_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"조직을 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.PromptDTO":{"properties":{"content":{"description":"프롬프트 내용","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","type":"string"},"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-08-03T07:13:26Z","type":"string"},"id":{"description":"프롬프트 ID. 프롬프트 조회·수정·삭제 경로의 promptID, 프롬프트 실행 요청의 promptIDs 값으로 사용합니다","example":"cM0RPoxbNbJy0mS-MhsHOg","type":"string"},"promptSetID":{"description":"이 프롬프트가 속한 프롬프트 세트 ID","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"}},"required":["content","id","promptSetID"],"type":"object"},"domain.PromptNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"PROMPT_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"프롬프트를 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.PromptSetDTO":{"properties":{"createdAt":{"description":"생성 일시 (RFC3339)","example":"2026-06-23T01:15:09Z","type":"string"},"description":{"description":"설명 (없으면 null)","example":"자사 서비스가 AI 답변에 어떻게 노출되는지 추적하는 프롬프트 모음","type":"string"},"id":{"description":"프롬프트 세트 ID. 세트 조회·수정·삭제 경로의 promptSetID, 프롬프트 실행 요청의 promptSetID 값으로 사용합니다","example":"T66Yb0Ylf-xJX-Mbx-yhcg","type":"string"},"name":{"description":"이름","example":"AI 검색 노출 모니터링","type":"string"}},"required":["id","name"],"type":"object"},"domain.PromptSetNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"PROMPT_SET_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"프롬프트 세트를 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.PromptSetPromptLimitExceededError":{"properties":{"code":{"description":"오류 코드","example":"PROMPT_SET_PROMPT_LIMIT_EXCEEDED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"프롬프트 세트당 프롬프트 최대 개수(1,000개)를 초과했습니다","type":"string"}},"type":"object"},"domain.ProperNounDTO":{"properties":{"frequency":{"description":"텍스트 내 등장 빈도","example":1,"type":"integer"},"lang":{"description":"언어 (ko/en)","example":"ko","type":"string"},"tag":{"description":"품사 태그 (NNP/NNG)","example":"NNP","type":"string"},"word":{"description":"단어(복합명사는 통째)","example":"체인시프트","type":"string"}},"type":"object"},"domain.QuestionNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"QUESTION_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"질문을 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.RateLimitExceededError":{"properties":{"code":{"description":"오류 코드","example":"PLATFORM_RATE_LIMIT_EXCEEDED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"요청이 너무 많습니다. 잠시 후 다시 시도해주세요.","type":"string"}},"type":"object"},"domain.RegionItem":{"properties":{"code":{"description":"리전 코드 (ISO 3166-1 alpha-2)","example":"KR","type":"string"},"name":{"description":"리전 표시명 (영문)","example":"South Korea","type":"string"}},"type":"object"},"domain.RunAnswerStatus":{"properties":{"model":{"description":"이 항목을 실행한 모델. 제출 시 지정한 models 값 중 하나입니다","example":"PERPLEXITY","type":"string"},"promptID":{"description":"이 항목이 실행한 프롬프트 ID. 제출 시 지정한 promptIDs 값(promptSetID 로 제출했다면 세트에 속한 프롬프트)입니다","example":"fTZ200JfbMwpQDXPnS8isw","type":"string"},"query":{"description":"모델에 실제로 던진 질의 텍스트","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","type":"string"},"region":{"description":"이 항목을 실행한 지역 코드. 제출 시 지정한 region(생략 시 KR)입니다","example":"KR","type":"string"},"status":{"description":"항목 1건의 실행 상태. PENDING: 아직 답변이 준비되지 않음(수집 또는 분류 진행 중), SUCCESS: 답변 분류까지 끝나 답변 조회가 가능,\nFAILED: 실패했거나 건너뜀(예: 모델이 AI 답변을 내지 않은 경우). PENDING 에서 SUCCESS 또는 FAILED 로 한 번만 전이하며, 종료된 뒤에는 바뀌지 않습니다","enum":["PENDING","SUCCESS","FAILED"],"example":"SUCCESS","type":"string"}},"type":"object"},"domain.RunModel":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string","x-enum-varnames":["RunModelChatGPT","RunModelGoogleOverview","RunModelGoogleAI","RunModelPerplexity","RunModelGemini","RunModelNaverAIBriefing","RunModelNaverAITab","RunModelClaude"]},"domain.RunNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"TASK_GENERATION_RUN_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"태스크 생성 실행 기록을 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.SiteKeywordAnalysisNotFoundError":{"properties":{"code":{"description":"오류 코드","example":"PLATFORM_SITE_KEYWORD_ANALYSIS_NOT_FOUND","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"사이트 키워드 분석 작업을 찾을 수 없습니다","type":"string"}},"type":"object"},"domain.SiteKeywordDTO":{"properties":{"keyword":{"description":"추출된 키워드","example":"AEO","type":"string"},"sourceURLCount":{"description":"이 키워드가 발견된 페이지 수 (항상 포함)","example":1,"type":"integer"},"sources":{"description":"발견된 페이지별 url/context (발견 순서). includeSourceURLs/includeContext 중 하나라도 true일 때만 포함","items":{"$ref":"#/components/schemas/domain.SiteKeywordSourceDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.SiteKeywordSourceDTO":{"properties":{"contexts":{"description":"이 페이지에서 키워드가 등장한 원문 문장·구절 인용 목록. 같은 키워드가 여러 문장에서\n언급되면 모두 포함됩니다. 인용문이 확인되지 않은 페이지는 비어 있을 수(생략될 수) 있습니다.","example":["AI 검색 노출을 측정하는 AEO 지표"],"items":{"type":"string"},"type":"array","uniqueItems":false},"url":{"description":"키워드가 발견된 페이지 URL","example":"https://trychainshift.ai/","type":"string"}},"type":"object"},"domain.SourceDomainStatisticDTO":{"properties":{"citationCount":{"description":"이 도메인의 총 인용 수","example":78,"type":"integer"},"domain":{"description":"통계 단위 (기본 eTLD+1, groupBy=subdomain 이면 서브도메인까지 포함)","example":"reddit.com","type":"string"},"models":{"description":"모델별 인용 수 분해 (include=models 일 때만, 인용 수 내림차순)","items":{"$ref":"#/components/schemas/domain.SourceModelStatisticDTO"},"type":"array","uniqueItems":false}},"type":"object"},"domain.SourceModelStatisticDTO":{"properties":{"citationCount":{"description":"해당 모델에서의 인용 수","example":69,"type":"integer"},"model":{"description":"모델","example":"CHATGPT","type":"string"}},"type":"object"},"domain.SourceURLStatisticDTO":{"properties":{"citationCount":{"description":"이 URL의 총 인용 수","example":14,"type":"integer"},"domain":{"description":"해당 URL의 도메인 (groupBy 축 표기 — 기본 eTLD+1, subdomain 이면 서브도메인 포함. 미확인 시 빈 문자열)","example":"wikipedia.org","type":"string"},"models":{"description":"모델별 인용 수 분해 (include=models 일 때만, 인용 수 내림차순)","items":{"$ref":"#/components/schemas/domain.SourceModelStatisticDTO"},"type":"array","uniqueItems":false},"quotes":{"description":"AI가 이 URL을 인용한 텍스트 조각 (include=quotes 일 때만, 중복 제거, URL당 최대 20개)","example":["AEO 는 AI 답변에 브랜드가 인용되도록 콘텐츠를 최적화하는 활동이다"],"items":{"type":"string"},"type":"array","uniqueItems":false},"url":{"description":"인용된 URL","example":"https://en.wikipedia.org/wiki/Search_engine_optimization","type":"string"},"urlVariants":{"description":"이 URL로 병합된 원본 URL 목록 (include=urlVariants 지정 시에만 포함). 항상 자기 자신을\n포함하며, 모바일 주소(m.)나 표시용 쿼리 파라미터처럼 표기만 다른 같은 문서의 URL이\n하나로 합쳐졌을 때 어떤 URL들이 합쳐졌는지 확인하는 용도입니다.","example":["https://en.wikipedia.org/wiki/Search_engine_optimization"],"items":{"type":"string"},"type":"array","uniqueItems":false}},"type":"object"},"domain.SubmitRunRequest":{"properties":{"models":{"description":"실행할 모델 목록.","example":["CHATGPT","PERPLEXITY"],"items":{"$ref":"#/components/schemas/domain.RunModel"},"maxItems":8,"minItems":1,"type":"array","uniqueItems":false},"promptIDs":{"description":"실행할 프롬프트 ID 목록 (1~500개, 중복은 1회로 처리). promptSetID 와 정확히 하나만 지정합니다","example":["cM0RPoxbNbJy0mS-MhsHOg"],"items":{"type":"string"},"maxItems":500,"minItems":1,"type":"array","uniqueItems":false},"promptSetID":{"description":"실행할 프롬프트 세트 ID — 세트 소속 프롬프트 전체를 실행합니다. promptIDs 와 정확히 하나만 지정합니다. 세트 프롬프트 수에 500개 제한은 없으며 총 실행 수 상한(10,000)만 적용","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"},"region":{"description":"실행 지역(ISO 3166-1 alpha-2). 생략 시 KR. 지원하지 않는 코드는 400. 모델마다 지원 지역이 다를 수 있습니다.(GET /regions?model= 로 확인)","example":"KR","type":"string"},"repeatCount":{"description":"각 프롬프트(question)별 반복 실행 횟수 (기본 1, 최대 100).","example":1,"maximum":100,"minimum":1,"type":"integer"}},"required":["models"],"type":"object"},"domain.SubmitRunResponse":{"properties":{"id":{"description":"생성된 프롬프트 실행의 ID. 이 값을 프롬프트 실행 상태 조회(GET /v1/platform/runs/{runID})의 runID 로 그대로 넣습니다","example":"S8cqDSjSot67bCK6YtmvHw","type":"string"}},"type":"object"},"domain.SubmitSiteKeywordAnalysisRequest":{"properties":{"maxPages":{"description":"입력 URL을 포함해 분석할 최대 페이지 수 (1~50). 1이면 입력 URL만 분석하고,\n2 이상이면 사이트 내 다른 페이지까지 탐색합니다.","example":30,"maximum":50,"minimum":1,"type":"integer"},"url":{"description":"분석 대상 URL (scheme 포함, 최대 2048자)","example":"https://trychainshift.ai/","maxLength":2048,"type":"string"}},"required":["maxPages","url"],"type":"object"},"domain.SubmitSiteKeywordAnalysisResponse":{"properties":{"id":{"description":"생성된 분석 작업의 ID. 이 값을 분석 상태 조회(GET /v1beta/platform/siteKeywordAnalyses/{taskID})의 taskID 로 그대로 넣습니다","example":"Ck1hRr4mQ2yVX8pTd0LsJw","type":"string"}},"type":"object"},"domain.TokenStatisticDTO":{"properties":{"answerCount":{"description":"이 토큰이 등장한 답변 수 (한 답변에 여러 번 나와도 1)","example":4377,"type":"integer"},"avgPosition":{"description":"답변 내 평균 첫 등장 위치 (0=맨앞, 1=맨뒤). 원문 글자 위치가 아니라 추출된 명사 나열 기준의 상대 위치. 명사가 1개뿐인 답변은 위치가 정의되지 않아 평균에서 제외되며, 그런 답변에만 등장한 토큰은 0으로 표기됨","example":0.2355,"type":"number"},"token":{"description":"토큰 (답변에서 추출한 명사, 소문자 통일)","example":"노출","type":"string"}},"type":"object"},"domain.UnauthorizedError":{"properties":{"code":{"description":"오류 코드","example":"COMMON_UNAUTHORIZED","type":"string"},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"인증되지 않은 사용자입니다","type":"string"}},"type":"object"},"domain.UpdateBrandRequest":{"properties":{"description":{"description":"브랜드 설명 (최대 1000자)","example":"AI 검색(AEO·GEO)에서 브랜드 노출을 측정하고 개선하는 서비스입니다.","maxLength":1000,"type":"string"},"name":{"description":"브랜드명 (최대 100자)","example":"Chainshift","maxLength":100,"type":"string"},"synonyms":{"description":"브랜드 동의어 목록 (최대 50개, 각 100자 이내)","example":["체인시프트"],"items":{"type":"string"},"maxItems":50,"type":"array","uniqueItems":false},"websites":{"description":"브랜드 웹사이트 URL 목록 (최대 20개, 각 항목 URL 형식·scheme 포함·2048자 이내)","example":["https://trychainshift.ai"],"items":{"type":"string"},"maxItems":20,"type":"array","uniqueItems":false}},"required":["synonyms"],"type":"object"},"domain.UpdatePromptRequest":{"properties":{"content":{"description":"프롬프트 내용 (최대 1000자)","example":"우리 서비스가 AI 검색에 노출되게 하려면 어떻게 해야 하나요?","maxLength":1000,"type":"string"},"promptSetID":{"description":"이동할 프롬프트 세트 ID (미제공 시 세트 유지)","example":"IkVMHhjFWcBXcJ41-h9yBQ","type":"string"}},"type":"object"},"domain.UpdatePromptSetRequest":{"properties":{"description":{"description":"설명 (최대 1000자)","example":"자사 서비스가 AI 답변에 어떻게 노출되는지 추적하는 프롬프트 모음","maxLength":1000,"type":"string"},"name":{"description":"이름 (최대 100자)","example":"AI 검색 노출 모니터링","maxLength":100,"type":"string"}},"type":"object"},"domain.ValidationError":{"properties":{"code":{"description":"오류 코드","example":"COMMON_VALIDATION","type":"string"},"details":{"description":"위반한 필드별 사유 목록 (\"필드: 사유\" 한 줄씩)","example":["limit: 100 이하여야 합니다"],"items":{"type":"string"},"type":"array","uniqueItems":false},"message":{"description":"오류 메시지 (기본 한국어, Accept-Language: en 지정 시 영어)","example":"데이터 검증에 실패했습니다","type":"string"}},"type":"object"},"github_com_chainshiftlabs_console-api-go_internal_platform_domain.ListRegionsResponse":{"properties":{"regions":{"description":"지원 리전 목록","items":{"$ref":"#/components/schemas/domain.RegionItem"},"type":"array","uniqueItems":false}},"type":"object"}},"securitySchemes":{"OrgAPIKeyAuth":{"description":"\"조직 API 키를 입력하세요. 예: 'cs_live_xxxx'\"","in":"header","name":"API-Key","type":"apiKey"}}},"externalDocs":{"description":"","url":""},"info":{"description":"외부 파트너용 플랫폼 API. 조직 API 키 기반 인증을 사용합니다.\n### 공통 요청 제한\n- 요청 body 크기는 최대 2MiB이며, 초과 시 413과 함께 `COMMON_REQUEST_BODY_TOO_LARGE` 코드를 반환합니다.\n- 배열 파라미터와 문자열 필드에는 엔드포인트별 개수·길이 상한이 있습니다. 상한은 각 필드/파라미터 설명에 명시되어 있으며, 위반 시 400과 함께 `COMMON_VALIDATION` 코드를 반환합니다.\n### 오류 응답\n오류 응답 본문은 상태 코드와 상관없이 항상 같은 세 필드입니다.\n| 필드 | 형태 | 의미 |\n| --- | --- | --- |\n| `code` | 문자열 | 오류 종류를 가리키는 고정 식별자입니다. 클라이언트가 분기할 대상은 이 값 하나입니다. 엔드포인트가 반환하는 코드 목록은 각 API 의 \"오류\" 표에 있습니다. |\n| `message` | 문자열 | 오류 전체를 한 줄로 요약한, 사람이 읽는 문장입니다. 언제나 한 개입니다. |\n| `details` | 문자열 배열 | `message` 한 줄로는 부족한 개별 사유입니다. 사유가 한 건이어도 길이 1 배열로 내려가며, 담을 사유가 없으면 필드 자체가 빠집니다. |\n- `details` 는 어떤 오류에서도 배열입니다. 문자열이나 객체로 내려오는 경우는 없으므로 형태별 분기가 필요 없습니다.\n- `details` 의 문구 자체는 고정 계약이 아닙니다. 화면 표시와 디버깅에만 쓰고, 문자열을 파싱해 분기하지 마십시오. 분기는 `code` 로 하십시오.\n- 여러 건의 사유를 담는 필드는 `details` 하나뿐입니다. `messages` 라는 필드는 응답에 존재하지 않습니다.\n- 검증 실패(`COMMON_VALIDATION`) 시 `details` 에는 위반 필드마다 `\"필드: 사유\"` 한 줄씩 담깁니다. 예: `{\"code\":\"COMMON_VALIDATION\",\"message\":\"데이터 검증에 실패했습니다\",\"details\":[\"keywords: 최대 100개까지 입력할 수 있습니다\"]}`\n- `message` 는 기본이 한국어이고, `Accept-Language: en` 을 보내면 영어로 제공됩니다. `details` 도 검증 실패처럼 필드별 사유를 담는 경우에는 같은 규칙을 따르지만, 진단 목적으로 원문을 그대로 싣는 오류에서는 요청 언어와 다른 문구가 담길 수 있습니다.\n- 500 만 형태가 다릅니다. `code` 없이 `message` 와, 문의 시 참조할 `requestID` 를 반환합니다.","title":"Platform API","version":"1.0"},"openapi":"3.1.0","paths":{"/v1/platform/answers":{"get":{"description":"프롬프트를 실행해서 얻은 답변 목록을 조회합니다. 각 답변은 본문과 함께 인용(sources)·팬아웃(fanouts)·원본 마크다운(markdownURL)을 포함하며, PENDING/FAILED 실행도 상태와 함께 반환됩니다.\n\n`markdownURL` 은 `status` 가 `SUCCESS` 인 답변에 항상 포함됩니다. 수집 전(`PENDING`)·수집 실패(`FAILED`) 답변에만 원본이 없어 생략되므로, `SUCCESS` 답변을 다룰 때 값이 없는 경우를 대비할 필요는 없습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • limit 범위 위반(1~100) • 지원하지 않는 status 값 |\n| 400 | `COMMON_INVALID_CURSOR` | cursor 형식 오류 |\n| 400 | `COMMON_BINDING` | runID·promptSetID·promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listAnswers","parameters":[{"description":"특정 프롬프트 실행으로 범위를 좁히는 필터 (실행 요청 시 발급된 ID)","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runID","schema":{"type":"string"}},{"description":"특정 프롬프트 세트로 범위를 좁히는 필터 (세트 목록·생성 응답의 id)","example":"IkVMHhjFWcBXcJ41-h9yBQ","in":"query","name":"promptSetID","schema":{"type":"string"}},{"description":"특정 프롬프트로 범위를 좁히는 필터 (프롬프트 목록·생성 응답의 id)","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptID","schema":{"type":"string"}},{"description":"특정 모델로 범위를 좁히는 필터","example":"CHATGPT","in":"query","name":"model","schema":{"type":"string"}},{"description":"특정 지역으로 범위를 좁히는 필터","example":"KR","in":"query","name":"region","schema":{"type":"string"}},{"description":"수집·분류 상태 필터. PENDING(아직 답변 미준비), SUCCESS(답변 분류 완료), FAILED(실패 또는 건너뜀) 중 하나","example":"SUCCESS","in":"query","name":"status","schema":{"type":"string"}},{"description":"인용 출처 도메인 필터. 응답 sources[].domain 값이나 출처 통계의 domain 값을 그대로 넣습니다 (eTLD+1·서브도메인 축 모두 매칭, 최대 253자)","example":"reddit.com","in":"query","name":"sourceDomain","schema":{"type":"string"}},{"description":"인용 출처 URL 필터. 응답 sources[].url 값이나 URL 통계의 url 값을 그대로 넣습니다 (통계와 동일한 정규화 축 매칭, 최대 2048자)","example":"https://en.wikipedia.org/wiki/Search_engine_optimization","in":"query","name":"sourceURL","schema":{"type":"string"}},{"description":"생성일 시작 (RFC3339)","example":"2026-08-01T00:00:00Z","in":"query","name":"from","schema":{"type":"string"}},{"description":"생성일 종료 (RFC3339)","example":"2026-08-31T23:59:59Z","in":"query","name":"to","schema":{"type":"string"}},{"description":"이전 응답의 nextCursor (첫 요청은 생략)","example":"eyJpZCI6NzIzMDF9","in":"query","name":"cursor","schema":{"type":"string"}},{"description":"페이지 크기 (기본 20, 최대 100)","example":20,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListAnswersResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"limit 범위 위반(1~100), 지원하지 않는 status 값 (cursor·ID 형식 오류는 위 오류 표 참고)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"답변 목록 조회","tags":["Answer"]}},"/v1/platform/answers/{answerID}":{"get":{"description":"답변 단건을 조회합니다. 응답 구조는 목록 항목과 동일하게 인용(sources)·검색 쿼리(fanouts)·원본 마크다운(markdownURL)을 포함합니다.\n\n`markdownURL` 은 `status` 가 `SUCCESS` 인 답변에 항상 포함됩니다. 수집 전(`PENDING`)·수집 실패(`FAILED`) 답변에만 원본이 없어 생략됩니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | answerID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `ANSWER_NOT_FOUND` | 답변이 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getAnswer","parameters":[{"description":"조회할 답변 ID — 답변 목록 응답 항목의 id 를 그대로 넣습니다","example":"pv9LpgpbQyXpCAv8l0Lf0w","in":"path","name":"answerID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetAnswerResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"answerID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.AnswerNotFoundError"}}},"description":"답변이 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"답변 단건 조회","tags":["Answer"]}},"/v1/platform/brands":{"get":{"description":"조직의 브랜드 목록을 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • limit 범위 위반(1~100) • nameContains 100자 초과 |\n| 400 | `COMMON_INVALID_CURSOR` | cursor 형식 오류 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listBrands","parameters":[{"description":"이전 응답의 nextCursor (첫 요청은 생략)","example":"eyJpZCI6MTI0NX0","in":"query","name":"cursor","schema":{"type":"string"}},{"description":"페이지 크기 (기본 20, 최대 100)","example":20,"in":"query","name":"limit","schema":{"type":"integer"}},{"description":"브랜드명 부분 일치 검색 (검색 조건 변경 시 cursor 비우고 재조회)","example":"Chainshift","in":"query","name":"nameContains","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListBrandsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"limit 범위 위반(1~100) (cursor 형식 오류는 COMMON_INVALID_CURSOR)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"브랜드 목록 조회","tags":["Brand"]},"post":{"description":"조직에 브랜드를 생성합니다. 브랜드는 답변에서 자사 언급을 추적할 때 기준이 되는 브랜드명·동의어(synonyms)·웹사이트(websites)를 관리하는 리소스입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | • 브랜드명 누락·100자 초과 • 설명 1000자 초과 • 웹사이트 20개 초과·URL 형식 오류·각 2048자 초과 • 동의어 50개 초과·각 100자 초과 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"createBrand","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreateBrandRequest","description":"브랜드 생성 요청","summary":"request"}}},"description":"브랜드 생성 요청","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreateBrandResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"브랜드명 누락·길이 초과, 웹사이트 URL 형식 오류"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"브랜드 생성","tags":["Brand"]}},"/v1/platform/brands/{brandID}":{"delete":{"description":"브랜드를 삭제합니다.\n\n삭제에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | brandID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `USER_BRAND_NOT_FOUND` | 브랜드가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"deleteBrand","parameters":[{"description":"대상 브랜드 ID — 브랜드 생성 응답 또는 브랜드 목록 항목의 id 를 그대로 넣습니다","example":"FL8xhW9MKzRXuMo9w6ON2A","in":"path","name":"brandID","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"삭제 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"brandID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BrandNotFoundError"}}},"description":"브랜드가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"브랜드 삭제","tags":["Brand"]},"get":{"description":"브랜드 단건을 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | brandID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `USER_BRAND_NOT_FOUND` | 브랜드가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getBrand","parameters":[{"description":"대상 브랜드 ID — 브랜드 생성 응답 또는 브랜드 목록 항목의 id 를 그대로 넣습니다","example":"FL8xhW9MKzRXuMo9w6ON2A","in":"path","name":"brandID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetBrandResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"brandID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BrandNotFoundError"}}},"description":"브랜드가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"브랜드 단건 조회","tags":["Brand"]},"patch":{"description":"브랜드를 부분 수정합니다. 제공한 필드만 변경되고 나머지는 유지됩니다.\n\n수정에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있으므로, 수정된 내용이 필요하면 브랜드 조회를 호출하세요.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | • 요청 본문 JSON 파싱 실패 • brandID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 400 | `COMMON_VALIDATION` | • 브랜드명 100자 초과 • 설명 1000자 초과 • 웹사이트 20개 초과·URL 형식 오류·각 2048자 초과 • 동의어 50개 초과·각 100자 초과 |\n| 400 | `USER_BRAND_NAME_REQUIRED` | name 을 빈 문자열로 보냄 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `USER_BRAND_NOT_FOUND` | 브랜드가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"updateBrand","parameters":[{"description":"대상 브랜드 ID — 브랜드 생성 응답 또는 브랜드 목록 항목의 id 를 그대로 넣습니다","example":"FL8xhW9MKzRXuMo9w6ON2A","in":"path","name":"brandID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UpdateBrandRequest","description":"브랜드 수정 요청 (부분 수정)","summary":"request"}}},"description":"브랜드 수정 요청 (부분 수정)","required":true},"responses":{"204":{"description":"수정 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"브랜드명 길이 초과, 웹사이트 URL 형식 오류 (name 을 빈 문자열로 보내면 USER_BRAND_NAME_REQUIRED)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BrandNotFoundError"}}},"description":"브랜드가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"브랜드 수정","tags":["Brand"]}},"/v1/platform/credits/me":{"get":{"description":"조직의 현재 크레딧 잔액(유료+플랜 합계)을 조회합니다. 사용 이력이 없는 조직은 잔액 0으로 응답합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getMyCreditBalance","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetMyCreditBalanceResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"내 조직 크레딧 잔액 조회","tags":["Credit"]}},"/v1/platform/models":{"get":{"description":"프롬프트 실행에 사용할 수 있는 지원 모델 목록을 조회합니다. 반환되는 모델 코드는 프롬프트 실행 요청(submitRun)의 models 값과 통계 API의 model 필터 값으로 사용합니다.\n\n일부 모델은 별도 계약으로 사용 권한을 받은 조직에만 제공되며, 권한이 없으면 이 목록에 나타나지 않고 Run 제출 시 403 `MODEL_NOT_GRANTED` 로 거부됩니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listModels","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListModelsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"모델 목록 조회","tags":["Model"]}},"/v1/platform/organizations/me":{"get":{"description":"API 키가 속한 조직의 기본 정보를 조회합니다. 발급받은 API 키가 어느 조직에 연결되어 있는지 확인할 때 사용합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `ORGANIZATION_NOT_FOUND` | 조직을 찾을 수 없음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getMyOrganization","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetMyOrganizationResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.OrganizationNotFoundError"}}},"description":"조직을 찾을 수 없습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"내 조직 정보 조회","tags":["Organization"]}},"/v1/platform/prompt-sets":{"get":{"description":"조직의 프롬프트 세트 목록을 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • limit 범위 위반(1~100) • nameStartsWith 100자 초과 • 지원하지 않는 order 값 |\n| 400 | `COMMON_INVALID_CURSOR` | cursor 형식 오류 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listPromptSets","parameters":[{"description":"이전 응답의 nextCursor (첫 요청은 생략)","example":"eyJpZCI6MTI0NX0","in":"query","name":"cursor","schema":{"type":"string"}},{"description":"페이지 크기 (기본 20, 최대 100)","example":20,"in":"query","name":"limit","schema":{"type":"integer"}},{"description":"정렬 방향 (기본 desc = 최신순)","example":"desc","in":"query","name":"order","schema":{"enum":["asc","desc"],"type":"string"}},{"description":"이름 prefix 검색","example":"AI","in":"query","name":"nameStartsWith","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListPromptSetsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"limit·order 검증 실패 (cursor 형식 오류는 COMMON_INVALID_CURSOR)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 세트 목록 조회","tags":["PromptSet"]},"post":{"description":"조직에 프롬프트 세트를 생성합니다. 프롬프트 세트는 프롬프트를 묶어 관리하는 단위로, 프롬프트 실행 요청 시 promptSetID로 세트 전체를 한 번에 실행할 수 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | • 이름 누락·100자 초과 • 설명 1000자 초과 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"createPromptSet","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreatePromptSetRequest","description":"프롬프트 세트 생성 요청","summary":"request"}}},"description":"프롬프트 세트 생성 요청","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreatePromptSetResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"이름 누락·길이 초과"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 세트 생성","tags":["PromptSet"]}},"/v1/platform/prompt-sets/{promptSetID}":{"delete":{"description":"프롬프트 세트를 삭제합니다.\n\n삭제에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"deletePromptSet","parameters":[{"description":"대상 프롬프트 세트 ID — 세트 생성 응답 또는 세트 목록 항목의 id 를 그대로 넣습니다","example":"IkVMHhjFWcBXcJ41-h9yBQ","in":"path","name":"promptSetID","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"삭제 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"promptSetID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"프롬프트 세트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 세트 삭제","tags":["PromptSet"]},"get":{"description":"프롬프트 세트 단건을 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getPromptSet","parameters":[{"description":"대상 프롬프트 세트 ID — 세트 생성 응답 또는 세트 목록 항목의 id 를 그대로 넣습니다","example":"IkVMHhjFWcBXcJ41-h9yBQ","in":"path","name":"promptSetID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetPromptSetResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"promptSetID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"프롬프트 세트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 세트 단건 조회","tags":["PromptSet"]},"patch":{"description":"프롬프트 세트를 부분 수정합니다. 제공한 필드만 변경되고 나머지는 유지됩니다.\n\n수정에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있으므로, 수정된 내용이 필요하면 프롬프트 세트 조회를 호출하세요.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | • 요청 본문 JSON 파싱 실패 • promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 400 | `COMMON_VALIDATION` | • 이름 100자 초과 • 설명 1000자 초과 |\n| 400 | `PROMPT_SET_NAME_REQUIRED` | name 을 빈 문자열로 보냄 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"updatePromptSet","parameters":[{"description":"대상 프롬프트 세트 ID — 세트 생성 응답 또는 세트 목록 항목의 id 를 그대로 넣습니다","example":"IkVMHhjFWcBXcJ41-h9yBQ","in":"path","name":"promptSetID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UpdatePromptSetRequest","description":"프롬프트 세트 수정 요청 (부분 수정)","summary":"request"}}},"description":"프롬프트 세트 수정 요청 (부분 수정)","required":true},"responses":{"204":{"description":"수정 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"이름 길이 초과 (name 을 빈 문자열로 보내면 PROMPT_SET_NAME_REQUIRED)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"프롬프트 세트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 세트 수정","tags":["PromptSet"]}},"/v1/platform/prompts":{"get":{"description":"조직의 프롬프트 목록을 조회합니다. promptSetID 지정 시 해당 세트만, 미지정 시 전체를 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • limit 범위 위반(1~100) • contentContains 1000자 초과 |\n| 400 | `COMMON_INVALID_CURSOR` | cursor 형식 오류 |\n| 400 | `COMMON_BINDING` | promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | promptSetID 로 지정한 세트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listPrompts","parameters":[{"description":"특정 프롬프트 세트로 범위를 좁히는 필터 (미지정 시 조직의 모든 프롬프트 세트 조회)","example":"IkVMHhjFWcBXcJ41-h9yBQ","in":"query","name":"promptSetID","schema":{"type":"string"}},{"description":"이전 응답의 nextCursor (첫 요청은 생략)","example":"eyJpZCI6NzIzMDF9","in":"query","name":"cursor","schema":{"type":"string"}},{"description":"페이지 크기 (기본 20, 최대 100)","example":20,"in":"query","name":"limit","schema":{"type":"integer"}},{"description":"프롬프트 내용 부분 일치 검색 (검색 조건 변경 시 cursor 비우고 재조회)","example":"AI 검색","in":"query","name":"contentContains","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListPromptsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"limit 범위 위반(1~100) (cursor·ID 형식 오류는 위 오류 표 참고)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"promptSetID 로 지정한 세트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 목록 조회","tags":["Prompt"]},"post":{"description":"프롬프트 세트에 프롬프트를 생성합니다. promptSetID는 필수입니다. 세트당 프롬프트는 최대 1,000개까지 생성할 수 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | • 내용 누락·1000자 초과 • promptSetID 누락 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 409 | `PROMPT_SET_PROMPT_LIMIT_EXCEEDED` | 세트당 프롬프트 최대 개수(1,000개) 초과 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"createPrompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreatePromptRequest","description":"프롬프트 생성 요청","summary":"request"}}},"description":"프롬프트 생성 요청","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CreatePromptResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"내용 누락·길이 초과, promptSetID 누락"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"세트가 없거나 다른 조직 소유입니다"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetPromptLimitExceededError"}}},"description":"세트당 프롬프트 최대 개수(1,000개)를 넘었습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 생성","tags":["Prompt"]}},"/v1/platform/prompts/bulk":{"post":{"description":"프롬프트를 한 번에 최대 100개까지 생성합니다. 하나라도 검증에 실패하면 전체가 생성되지 않습니다(all-or-nothing). 세트당 프롬프트는 최대 1,000개까지이며, 한 세트라도 한도를 넘기면 전체가 생성되지 않습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | • 목록 비었음·100개 초과 • 내용 누락·1000자 초과 • promptSetID 누락 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 409 | `PROMPT_SET_PROMPT_LIMIT_EXCEEDED` | 세트당 프롬프트 최대 개수(1,000개) 초과 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"bulkCreatePrompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BulkCreatePromptRequest","description":"프롬프트 벌크 생성 요청","summary":"request"}}},"description":"프롬프트 벌크 생성 요청","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BulkCreatePromptResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"목록 비었음·100개 초과, 내용 누락·길이 초과, promptSetID 누락"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetNotFoundError"}}},"description":"세트가 없거나 다른 조직 소유입니다"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetPromptLimitExceededError"}}},"description":"세트당 프롬프트 최대 개수(1,000개)를 넘었습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 벌크 생성","tags":["Prompt"]}},"/v1/platform/prompts/{promptID}":{"delete":{"description":"프롬프트를 삭제합니다.\n\n삭제에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `QUESTION_NOT_FOUND` | 프롬프트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"deletePrompt","parameters":[{"description":"대상 프롬프트 ID — 프롬프트 생성 응답 또는 프롬프트 목록 항목의 id 를 그대로 넣습니다","example":"KNUETdAfRhDY9lQTgu9wuw","in":"path","name":"promptID","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"삭제 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"promptID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.QuestionNotFoundError"}}},"description":"프롬프트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 삭제","tags":["Prompt"]},"get":{"description":"프롬프트 단건을 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `QUESTION_NOT_FOUND` | 프롬프트가 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getPrompt","parameters":[{"description":"대상 프롬프트 ID — 프롬프트 생성 응답 또는 프롬프트 목록 항목의 id 를 그대로 넣습니다","example":"KNUETdAfRhDY9lQTgu9wuw","in":"path","name":"promptID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetPromptResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"promptID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.QuestionNotFoundError"}}},"description":"프롬프트가 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 단건 조회","tags":["Prompt"]},"patch":{"description":"프롬프트를 부분 수정합니다. 제공한 필드만 변경되고 나머지는 유지됩니다. promptSetID 제공 시 해당 세트로 이동합니다. 이동 대상 세트가 한도(1,000개)에 도달했으면 이동할 수 없습니다.\n\n수정에 성공하면 `204 No Content` 를 반환합니다. 응답 본문은 비어 있으므로, 수정된 내용이 필요하면 프롬프트 조회를 호출하세요.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | • 요청 본문 JSON 파싱 실패 • promptID·promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 400 | `COMMON_VALIDATION` | 내용 1000자 초과 |\n| 400 | `QUESTION_CONTENT_REQUIRED` | content 를 빈 문자열로 보냄 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `QUESTION_NOT_FOUND` | 프롬프트가 없거나 타 조직 소유 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 이동 대상 세트가 없거나 타 조직 소유 |\n| 409 | `PROMPT_SET_PROMPT_LIMIT_EXCEEDED` | 이동 대상 세트의 프롬프트 최대 개수(1,000개) 초과 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"updatePrompt","parameters":[{"description":"대상 프롬프트 ID — 프롬프트 생성 응답 또는 프롬프트 목록 항목의 id 를 그대로 넣습니다","example":"KNUETdAfRhDY9lQTgu9wuw","in":"path","name":"promptID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UpdatePromptRequest","description":"프롬프트 수정 요청 (부분 수정)","summary":"request"}}},"description":"프롬프트 수정 요청 (부분 수정)","required":true},"responses":{"204":{"description":"수정 완료. 응답 본문 없음"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"내용 길이 초과 (content 를 빈 문자열로 보내면 QUESTION_CONTENT_REQUIRED)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.QuestionNotFoundError"}}},"description":"프롬프트(QUESTION_NOT_FOUND) 또는 이동 대상 세트(PROMPT_SET_NOT_FOUND)를 찾을 수 없습니다"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptSetPromptLimitExceededError"}}},"description":"이동 대상 세트의 프롬프트 최대 개수(1,000개)를 넘었습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 수정","tags":["Prompt"]}},"/v1/platform/regions":{"get":{"description":"프롬프트 실행 요청(submitRun)의 region 값으로 사용할 수 있는 지원 리전 목록을 조회합니다. model 을 지정하면 해당 모델이 지원하는 리전만, 생략하면 전체 리전을 반환합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `MODEL_NOT_SUPPORTED` | 플랫폼 API 가 지원하지 않는 model 값 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listRegions","parameters":[{"description":"모델 코드. 지정 시 해당 모델이 지원하는 리전만 반환합니다. GET /models 로 조회 가능한 값이어야 하며, 미지원 모델이면 400","example":"CHATGPT","in":"query","name":"model","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/github_com_chainshiftlabs_console-api-go_internal_platform_domain.ListRegionsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ModelNotSupportedError"}}},"description":"플랫폼 API 가 지원하지 않는 model 값입니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"리전 목록 조회","tags":["Region"]}},"/v1/platform/runs":{"get":{"description":"조직이 요청한 프롬프트 실행 목록을 상태·건수와 함께 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | limit 범위 위반(1~100) |\n| 400 | `COMMON_INVALID_CURSOR` | cursor 형식 오류 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listPlatformRuns","parameters":[{"description":"이전 응답의 nextCursor (첫 요청은 생략)","example":"eyJpZCI6MzcxfQ","in":"query","name":"cursor","schema":{"type":"string"}},{"description":"페이지 크기 (기본 20, 최대 100)","example":20,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListRunsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"limit 범위 위반(1~100) (cursor 형식 오류는 COMMON_INVALID_CURSOR)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 실행 목록 조회","tags":["Run"]},"post":{"description":"조직의 프롬프트를 지정한 모델로 실행합니다. 정기 모니터링이 아니라 요청한 시점에 한 번 수행됩니다. 요청이 성공하면 프롬프트 실행(Run)이 생성됩니다. 실행 대상은 promptIDs(개별 프롬프트) 또는 promptSetID(프롬프트 세트 전체) 중 하나만 지정할 수 있으며, 둘을 동시에 사용할 수 없습니다. 진행 상태는 응답으로 받은 id를 사용해 프롬프트 실행 상태 조회에서 확인합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | • 요청 본문 JSON 파싱 실패 • promptIDs·promptSetID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 400 | `COMMON_VALIDATION` | • models 누락·8개 초과 • promptIDs 500개 초과 • repeatCount 범위 위반(1~100) |\n| 400 | `RUN_PROMPT_TARGET_REQUIRED` | promptIDs·promptSetID 중 정확히 하나를 지정하지 않음 |\n| 400 | `PROMPT_SET_EMPTY` | 지정한 세트에 실행할 프롬프트가 없음 |\n| 400 | `MODEL_NOT_SUPPORTED` | 플랫폼 API 가 지원하지 않는 model 값 |\n| 400 | `NO_AVAILABLE_PLATFORM` | 요청한 모델이 현재 모두 수집 불가 |\n| 400 | `REGION_NOT_SUPPORTED` | 지원하지 않는 지역 코드 |\n| 400 | `REGION_NOT_SUPPORTED_FOR_MODEL` | 모델이 지원하지 않는 지역 |\n| 400 | `QUESTION_NOT_MARKETING_PLATFORM` | 플랫폼 API 소속이 아닌 프롬프트 |\n| 400 | `RUN_TOO_MANY_TASKS` | 총 실행 수(프롬프트 × 모델 × 반복)가 10,000 초과 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 403 | `MODEL_NOT_GRANTED` | 별도 계약이 필요한 모델을 권한 없이 요청함 (`GET /models` 에도 나타나지 않음) |\n| 404 | `PROMPT_NOT_FOUND` | 프롬프트가 없거나 타 조직 소유 |\n| 404 | `PROMPT_SET_NOT_FOUND` | 세트가 없거나 타 조직 소유 |\n| 404 | `CAMPAIGN_NOT_FOUND` | 프롬프트가 속한 캠페인을 찾을 수 없음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"submitPlatformRun","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.SubmitRunRequest","description":"프롬프트 실행 요청","summary":"request"}}},"description":"프롬프트 실행 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.SubmitRunResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"models 누락·8개 초과, promptIDs 500개 초과, repeatCount 범위 위반(1~100). 실행 대상·모델·지역 관련 400 코드는 위 오류 표 참고"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"실행 규모(모델×프롬프트×반복)에 필요한 크레딧이 잔액보다 큽니다"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ModelNotGrantedError"}}},"description":"별도 계약이 필요한 모델입니다. 조직에 부여되지 않았습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.PromptNotFoundError"}}},"description":"프롬프트(PROMPT_NOT_FOUND) 또는 프롬프트 세트(PROMPT_SET_NOT_FOUND)를 찾을 수 없습니다 (다른 조직 소유 포함)"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 실행 요청","tags":["Run"]}},"/v1/platform/runs/{runID}":{"get":{"description":"요청한 프롬프트 실행(runID)의 진행 상태와 전체/완료/성공/실패/진행중 건수, 항목별 세부 상태를 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | runID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `TASK_GENERATION_RUN_NOT_FOUND` | 프롬프트 실행이 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getPlatformRunStatus","parameters":[{"description":"조회할 프롬프트 실행 ID — 프롬프트 실행 요청 응답의 id 를 그대로 넣습니다","example":"S8cqDSjSot67bCK6YtmvHw","in":"path","name":"runID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetRunStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"runID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RunNotFoundError"}}},"description":"프롬프트 실행이 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"프롬프트 실행 상태 조회","tags":["Run"]}},"/v1beta/platform/answers/count":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n조직의 답변 본문을 전문검색해, 검색어 중 하나라도 매칭되는 답변의 개수를 셉니다. 한 검색어 안의 여러 단어는 순서대로 인접한 구문(phrase)으로 매칭하고, 검색어 사이는 OR로 처리합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | word 누락·20개 초과·각 200자 초과 |\n| 400 | `COMMON_BINDING` | promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"countAnswers","parameters":[{"description":"검색어 목록 (반복 전달, 1~20개, 각 200자 이내). 한 검색어 안의 여러 단어는 구문(phrase, 인접) 매칭","example":"AEO","in":"query","name":"words","required":true,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"특정 프롬프트로 범위를 좁히는 필터 (프롬프트 목록·생성 응답의 id)","example":"cM0RPoxbNbJy0mS-MhsHOg","in":"query","name":"promptID","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.CountAnswersResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"word 가 비었거나 개수(1~20개)·길이(각 200자) 제한을 넘었습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"답변 전문검색 카운트 (Beta)","tags":["Answer"]}},"/v1beta/platform/answers/statistics/neighbors":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n기준 단어 앞뒤(±`window` 토큰)에 함께 등장한 토큰을 집계합니다.\n\n- `word` 를 여러 개 주면 하나의 기준 집합으로 묶어 셉니다. 브랜드명과 유사어를 함께 넣는 용도입니다.\n- 한국어 답변만 집계합니다.\n- `include=totalAnswerCount` 를 주면 각 토큰의 전체 등장 답변 수(비교 기준값)를 함께 반환합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • word 누락·20개 초과·각 200자 초과 • runID·promptID 둘 다 누락 • window·limit 범위 위반 • 지원하지 않는 model·include 값 |\n| 400 | `COMMON_BINDING` | runID·promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listAnswerStatisticsNeighbors","parameters":[{"description":"기준 단어 (1~20개, 각 200자 이내). 형태소 단위로 매칭하며, 여러 개를 주면 하나의 기준 집합으로 합쳐 셉니다","example":"AEO","in":"query","name":"word","required":true,"schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"특정 프롬프트 실행 필터 (실행 요청 시 발급된 ID). runID·promptID 중 최소 하나 필수","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runID","schema":{"type":"string"}},{"description":"특정 프롬프트 필터 (프롬프트 목록·생성 응답의 id). runID·promptID 중 최소 하나 필수","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptID","schema":{"type":"string"}},{"description":"모델 필터. GET /models 로 조회 가능한 모델만 허용","example":"CHATGPT","in":"query","name":"model","schema":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string"}},{"description":"기준 단어 앞뒤 몇 개의 명사 토큰까지 이웃으로 볼지 (기본 5, 최대 20)","example":5,"in":"query","name":"window","schema":{"type":"integer"}},{"description":"상위 몇 개 이웃 토큰까지 반환할지 (기본 50, 최대 200)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}},{"description":"추가로 포함할 필드 (선택, 현재 totalAnswerCount 지원)","example":"totalAnswerCount","in":"query","name":"include","schema":{"items":{"enum":["totalAnswerCount"],"type":"string"},"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListTokenNeighborsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"word 누락·20개 초과·각 200자 초과, runID·promptID 둘 다 누락, window·limit 범위 위반, 지원하지 않는 model·include 값"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"특정 단어의 근접 토큰 통계 조회","tags":["AnswerStatistics (Beta)"]}},"/v1beta/platform/answers/statistics/tokens":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n답변 본문에 자주 등장한 명사 토큰을 집계합니다.\n\n- 등장 답변 수 내림차순 상위 `limit` 개만 담는 랭킹입니다. 페이지네이션이 아닙니다.\n- 등장 답변 수는 한 답변에 여러 번 나와도 1 로 셉니다.\n- 한국어 형태소 분석 기반이라 한국어가 아닌 답변은 집계에서 빠집니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • runID·promptID 둘 다 누락 • limit 범위 위반(1~200) • 지원하지 않는 model 값 |\n| 400 | `COMMON_BINDING` | runID·promptID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listAnswerStatisticsTokens","parameters":[{"description":"특정 프롬프트 실행 필터 (실행 요청 시 발급된 ID). runID·promptID 중 최소 하나 필수","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runID","schema":{"type":"string"}},{"description":"특정 프롬프트 필터 (프롬프트 목록·생성 응답의 id). runID·promptID 중 최소 하나 필수","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptID","schema":{"type":"string"}},{"description":"모델 필터. GET /models 로 조회 가능한 모델만 허용","example":"CHATGPT","in":"query","name":"model","schema":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string"}},{"description":"상위 몇 개 토큰까지 반환할지 (기본 50, 최대 200)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListTokenStatisticsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"runID·promptID 둘 다 누락, limit 범위 위반(1~200), 지원하지 않는 model 값"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"답변 토큰 통계 조회","tags":["AnswerStatistics (Beta)"]}},"/v1beta/platform/common/proper-nouns/extract":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n텍스트에서 일반명사·고유명사를 추출합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | text 누락 또는 길이 초과 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"extractProperNouns","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ExtractProperNounsRequest","description":"고유명사 추출 요청","summary":"request"}}},"description":"고유명사 추출 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ExtractProperNounsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"text 가 비었거나 길이 제한(100,000자)을 넘었습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"미등록 고유명사 추출","tags":["ProperNoun (Beta)","devonly"]}},"/v1beta/platform/common/proper-nouns/extract-strict":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n텍스트에서 명사를 추출하되 고유명사 오탐을 제거합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | text 누락 또는 길이 초과 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"extractProperNounsStrict","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/domain.ExtractProperNounsRequest","description":"고유명사 추출 요청","summary":"request"}]}}},"description":"고유명사 추출 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ExtractProperNounsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"text 가 비었거나 길이 제한(100,000자)을 넘었습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"미등록 고유명사 추출 (엄격)","tags":["ProperNoun (Beta)","devonly"]}},"/v1beta/platform/fanouts/statistics":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\nAI 가 답변을 만들면서 실제로 던진 검색 쿼리(fan-out)를 집계합니다.\n\n- `fanouts` 는 fan-out 발생 수(`fanoutCount`) 내림차순 상위 `limit` 개만 담는 랭킹입니다. 페이지네이션이 아닙니다.\n- 조회 범위 전체의 총 fan-out 발생 수(`totalFanouts`)를 함께 반환합니다.\n- 쿼리별 모델·지역 distinct 목록은 `include=models`·`include=regions` 로 요청할 때만 포함됩니다.\n- fan-out 은 CHATGPT · PERPLEXITY · CLAUDE 답변에서만 수집됩니다. 그 외 모델은 항상 빈 결과입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • runIDs·promptIDs 둘 다 누락 • runIDs 개수(5개)·promptIDs 개수(10개) 초과 • limit 범위 위반(1~200) • 지원하지 않는 model·include 값 |\n| 400 | `COMMON_BINDING` | runIDs·promptIDs 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listFanoutStatistics","parameters":[{"description":"프롬프트 실행 필터 (실행 요청 시 발급된 ID, 반복 전달, 최대 5개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"프롬프트 필터 (프롬프트 목록·생성 응답의 id, 반복 전달, 최대 10개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"모델 필터. GET /models 로 조회 가능한 모델만 허용","example":"CHATGPT","in":"query","name":"model","schema":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string"}},{"description":"추가로 포함할 필드. models=쿼리별 모델 distinct 목록, regions=쿼리별 지역 distinct 목록","example":"models","in":"query","name":"include","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"상위 몇 개 쿼리까지 반환할지 (기본 50, 최대 200)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListFanoutStatisticsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"runIDs·promptIDs 둘 다 누락, runIDs 개수(5개)·promptIDs 개수(10개) 초과, limit 범위 위반(1~200), 지원하지 않는 model·include 값"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"팬아웃(검색 쿼리) 통계 조회","tags":["FanoutStatistics (Beta)"]}},"/v1beta/platform/keywords/google/metrics":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n키워드 목록(최대 100개)의 구글 검색 지표(월평균 검색량·SEO 난이도·CPC·검색 의도·검색량 추이)를 조회합니다. 데이터가 없는 키워드는 metrics가 null이며, metrics는 있으나 searchVolume이 null이면 검색량이 비공개된 키워드입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | 키워드 1~100개·중복 불가·각 80자 이내 위반 |\n| 400 | `KEYWORD_COUNTRY_NOT_SUPPORTED` | 지원하지 않는 국가 코드 |\n| 400 | `KEYWORD_METRICS_PROVIDER_REJECTED` | 공급자가 요청을 거부 (언어·국가 조합, 키워드 형식) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"getGoogleKeywordMetrics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetGoogleKeywordMetricsRequest","description":"키워드 지표 조회 요청","summary":"request"}}},"description":"키워드 지표 조회 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetGoogleKeywordMetricsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"키워드 1~100개·중복 불가·각 80자 이내 위반. 국가 코드·공급자 거부는 위 오류 표 참고"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"구글 키워드 지표 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/google/related":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n기준 키워드와 연관된 구글 키워드를 검색량 내림차순으로 조회합니다. 기준 키워드는 목록에서 제외되며, 그 지표는 응답의 metrics 필드로 제공됩니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • keyword 누락·80자 초과 • limit 범위 위반(1~100) |\n| 400 | `KEYWORD_COUNTRY_NOT_SUPPORTED` | 지원하지 않는 국가 코드 |\n| 400 | `KEYWORD_METRICS_PROVIDER_REJECTED` | 공급자가 요청을 거부 (언어·국가 조합, 키워드 형식) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"listGoogleRelatedKeywords","parameters":[{"description":"연관 키워드를 조회할 기준 키워드 (80자 이내)","example":"protein powder","in":"query","name":"keyword","required":true,"schema":{"type":"string"}},{"description":"언어 코드 (ISO 639-1, 기본 ko)","example":"en","in":"query","name":"languageCode","schema":{"type":"string"}},{"description":"국가 코드 (ISO 3166-1 alpha-2, 기본 KR)","example":"US","in":"query","name":"countryCode","schema":{"type":"string"}},{"description":"최대 반환 개수 (기본 30, 최대 100)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListGoogleRelatedKeywordsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"keyword 누락·길이 초과, limit 범위 위반. 국가 코드·공급자 거부는 위 오류 표 참고"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"구글 연관 키워드 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/google/suggestions":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n기준 키워드를 포함하는 세부(롱테일) 구글 키워드를 검색량 내림차순으로 조회합니다. 기준 키워드는 목록에서 제외되며, 그 지표는 응답의 metrics 필드로 제공됩니다. 기준 키워드에 검색 데이터가 없으면 metrics가 null입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • keyword 누락·80자 초과 • limit 범위 위반(1~100) |\n| 400 | `KEYWORD_COUNTRY_NOT_SUPPORTED` | 지원하지 않는 국가 코드 |\n| 400 | `KEYWORD_METRICS_PROVIDER_REJECTED` | 공급자가 요청을 거부 (언어·국가 조합, 키워드 형식) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"listGoogleKeywordSuggestions","parameters":[{"description":"세부 키워드를 조회할 기준 키워드 (80자 이내)","example":"protein powder","in":"query","name":"keyword","required":true,"schema":{"type":"string"}},{"description":"언어 코드 (ISO 639-1, 기본 ko)","example":"en","in":"query","name":"languageCode","schema":{"type":"string"}},{"description":"국가 코드 (ISO 3166-1 alpha-2, 기본 KR)","example":"US","in":"query","name":"countryCode","schema":{"type":"string"}},{"description":"최대 반환 개수 (기본 30, 최대 100)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListGoogleKeywordSuggestionsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"keyword 누락·길이 초과, limit 범위 위반. 국가 코드·공급자 거부는 위 오류 표 참고"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"구글 키워드 제안(자동완성) 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/naver/metrics":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n키워드 목록(최대 15개)의 네이버 검색 지표(PC·모바일 검색량·클릭수·클릭률·경쟁 정도·평균 노출 광고 수)를 조회합니다. 한국 시장 전용이라 언어·국가 코드 파라미터가 없습니다. 데이터가 없거나 검색 수요가 거의 없는 키워드는 metrics가 null입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | 키워드 1~15개·중복 불가·각 80자 이내 위반 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"getNaverKeywordMetrics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetNaverKeywordMetricsRequest","description":"키워드 지표 조회 요청","summary":"request"}}},"description":"키워드 지표 조회 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetNaverKeywordMetricsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"키워드 1~15개·중복 불가·각 80자 이내 위반"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"네이버 키워드 지표 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/naver/related":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n기준 키워드와 연관된 네이버 키워드를 검색량 내림차순으로 조회합니다. 기준 키워드는 목록에서 제외되며, 그 지표는 응답의 metrics 필드로 제공됩니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • keyword 누락·80자 초과 • limit 범위 위반(1~100) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"listNaverRelatedKeywords","parameters":[{"description":"연관 키워드를 조회할 기준 키워드 (80자 이내)","example":"단백질보충제","in":"query","name":"keyword","required":true,"schema":{"type":"string"}},{"description":"최대 반환 개수 (기본 30, 최대 100)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListNaverRelatedKeywordsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"keyword 누락·길이 초과, limit 범위 위반"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"네이버 연관 키워드 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/naver/suggestions":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n기준 키워드를 포함하는 세부(롱테일) 네이버 키워드를 검색량 내림차순으로 조회합니다. 기준 키워드는 목록에서 제외되며, 그 지표는 응답의 metrics 필드로 제공됩니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • keyword 누락·80자 초과 • limit 범위 위반(1~100) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"listNaverKeywordSuggestions","parameters":[{"description":"세부 키워드를 조회할 기준 키워드 (80자 이내)","example":"단백질보충제","in":"query","name":"keyword","required":true,"schema":{"type":"string"}},{"description":"최대 반환 개수 (기본 30, 최대 100)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListNaverKeywordSuggestionsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"keyword 누락·길이 초과, limit 범위 위반"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"네이버 키워드 제안(자동완성) 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/keywords/naver/trend":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n키워드 목록(최대 15개)의 네이버 최근 12개월 검색 트렌드를 조회합니다. 값은 절대 검색량이 아니라 기간 내 최댓값을 100으로 한 상대 비율(0~100)이며, 절대 환산이 필요하면 응답의 anchor 값으로 스케일링할 수 있습니다. 데이터가 없는 키워드는 trend가 null입니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | 키워드 1~15개·중복 불가·각 80자 이내 위반 |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |\n| 502 | `KEYWORD_METRICS_PROVIDER_UNAVAILABLE` | 지표 공급자 호출 실패. 잠시 후 재시도 |\n| 503 | `KEYWORD_METRICS_NOT_CONFIGURED` | 키워드 지표 기능이 활성화되지 않음 |","operationId":"getNaverKeywordTrend","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetNaverKeywordTrendRequest","description":"키워드 트렌드 조회 요청","summary":"request"}}},"description":"키워드 트렌드 조회 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetNaverKeywordTrendResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"키워드 1~15개·중복 불가·각 80자 이내 위반"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordProviderUnavailableError"}}},"description":"지표 공급자 호출에 실패했습니다. 잠시 후 재시도하세요"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.KeywordMetricsNotConfiguredError"}}},"description":"키워드 지표 기능이 활성화되어 있지 않습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"네이버 키워드 12개월 검색 트렌드 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/siteKeywordAnalyses":{"post":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\nURL을 크롤링해 키워드 후보를 추출하는 분석을 제출합니다. 비동기로 처리되며 응답의 id 로 상태를 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | 요청 본문 JSON 파싱 실패 |\n| 400 | `COMMON_VALIDATION` | • url 형식 오류·2048자 초과 • maxPages 범위 위반(1~50) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"submitPlatformSiteKeywordAnalysis","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.SubmitSiteKeywordAnalysisRequest","description":"분석 제출 요청","summary":"request"}}},"description":"분석 제출 요청","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.SubmitSiteKeywordAnalysisResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"url 형식 오류·2048자 초과, maxPages 범위 위반(1~50)"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"},"x-mint":{"metadata":{"tag":"Beta"}}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"사이트 키워드 분석 제출","tags":["Keyword (Beta)"]}},"/v1beta/platform/siteKeywordAnalyses/{taskID}":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n제출된 분석 작업(taskID)의 진행 상태와, 완료됐다면 추출된 키워드 결과를 조회합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_BINDING` | taskID 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 404 | `PLATFORM_SITE_KEYWORD_ANALYSIS_NOT_FOUND` | 분석 작업이 없거나 타 조직 소유 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"getPlatformSiteKeywordAnalysisStatus","parameters":[{"description":"조회할 분석 작업 ID — 분석 제출 응답의 id 를 그대로 넣습니다","example":"Ck1hRr4mQ2yVX8pTd0LsJw","in":"path","name":"taskID","required":true,"schema":{"type":"string"}},{"description":"true면 키워드별 sources 항목에 url을 포함합니다 (기본 false). sourceURLCount는 항상 포함됩니다","example":true,"in":"query","name":"includeSourceURLs","schema":{"type":"boolean"}},{"description":"true면 키워드별 sources 항목에 contexts(키워드가 등장한 원문 인용 목록)를 포함합니다 (기본 false). includeSourceURLs와 독립적으로 지정할 수 있으며, 인용문이 확인되지 않은 페이지는 contexts가 비어 있을 수 있습니다","example":true,"in":"query","name":"includeContext","schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.GetSiteKeywordAnalysisStatusResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.BindingError"}}},"description":"taskID 형식이 올바르지 않습니다"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.SiteKeywordAnalysisNotFoundError"}}},"description":"분석 작업이 없거나 다른 조직 소유입니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"사이트 키워드 분석 상태 조회","tags":["Keyword (Beta)"]}},"/v1beta/platform/sources/statistics/domains":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n답변에 인용된 출처를 도메인 단위로 집계합니다.\n\n- `domains` 는 인용 수가 많은 순으로 상위 `limit` 개를 담은 랭킹이며, 페이지네이션을 지원하지 않습니다.\n- 기본 집계 단위는 루트 도메인입니다. 예를 들어 `blog.naver.com` 과 `cafe.naver.com` 은 `naver.com` 으로 합산됩니다. `groupBy=subdomain` 을 지정하면 서브도메인 단위로 집계합니다.\n- 조회 범위 전체의 총 인용 수(`totalCitations`)와 고유 도메인 수(`totalDomains`)를 함께 반환합니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • runIDs·promptIDs 둘 다 누락 • runIDs 개수(5개)·promptIDs 개수(10개) 초과 • limit 범위 위반(1~200) • domains 필터 개수(50개)·길이(253자) 초과 • 지원하지 않는 groupBy·model·include 값 |\n| 400 | `COMMON_BINDING` | runIDs·promptIDs 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listSourceStatisticsDomains","parameters":[{"description":"프롬프트 실행 필터 (실행 요청 시 발급된 ID, 반복 전달, 최대 5개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"프롬프트 필터 (프롬프트 목록·생성 응답의 id, 반복 전달, 최대 10개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"모델 필터. GET /models 로 조회 가능한 모델만 허용","example":"CHATGPT","in":"query","name":"model","schema":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string"}},{"description":"도메인 필터 (반복 전달, 최대 50개, 각 253자 이내). 매칭 기준은 groupBy 를 따릅니다. 상위 limit 밖 도메인도 지정하면 지표를 볼 수 있습니다","example":"reddit.com","in":"query","name":"domains","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"집계 단위 (기본 domain=루트 도메인 합산, subdomain=서브도메인별 구분). www. 는 항상 제거해 상위 도메인과 합칩니다","example":"domain","in":"query","name":"groupBy","schema":{"enum":["domain","subdomain"],"type":"string"}},{"description":"추가로 포함할 필드. models 를 주면 도메인별 모델 분해를 함께 반환합니다","example":"models","in":"query","name":"include","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"상위 몇 개 도메인까지 반환할지 (기본 50, 최대 200)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListSourceStatisticsDomainsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"runIDs·promptIDs 둘 다 누락, runIDs 개수(5개)·promptIDs 개수(10개) 초과, limit 범위 위반(1~200), domains 필터 개수(50개)·길이(253자) 초과, 지원하지 않는 groupBy·model·include 값"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"도메인별 인용 통계 조회","tags":["SourceStatistics (Beta)"]}},"/v1beta/platform/sources/statistics/urls":{"get":{"description":"\u003e **[BETA]** 베타 API 입니다. 응답 스펙이 예고 없이 변경될 수 있습니다.\n\n답변에 인용된 출처를 URL 단위로 집계합니다.\n\n- `urls` 는 인용 수 내림차순 상위 `limit` 개만 담는 랭킹입니다. 페이지네이션이 아닙니다.\n- 조회 범위 전체의 총 인용 수(`totalCitations`)를 함께 반환합니다.\n- `domains` 를 지정하면 그 도메인 아래 URL 만 봅니다. 자사 페이지가 상위 `limit` 밖이어도 인용 여부를 확인할 수 있습니다.\n- `domains` 의 매칭 기준과 항목 `domain` 필드 표기는 `groupBy` 를 따릅니다 — 도메인 통계(`groupBy=subdomain`)에서 본 값을 그대로 넣어 드릴다운할 수 있습니다.\n\n### 오류\n\n| HTTP | 코드 | 설명 |\n| --- | --- | --- |\n| 400 | `COMMON_VALIDATION` | • runIDs·promptIDs 둘 다 누락 • runIDs 개수(5개)·promptIDs 개수(10개) 초과 • limit 범위 위반(1~200) • domains 필터 개수(50개)·길이(253자) 초과 • 지원하지 않는 groupBy·model·include 값 |\n| 400 | `COMMON_BINDING` | runIDs·promptIDs 형식 오류 (details 에 `PLATFORM_INVALID_ID`) |\n| 401 | `COMMON_UNAUTHORIZED` | API 키 또는 액세스 토큰이 없거나 유효하지 않음 |\n| 402 | `INSUFFICIENT_CREDITS` | 조직 크레딧 잔액이 이 요청의 단가보다 적음 |\n| 429 | `PLATFORM_RATE_LIMIT_EXCEEDED` | 요청 한도 초과. `Retry-After` 헤더의 초만큼 기다린 뒤 재시도 |\n| 500 | — | 서버 내부 오류. `code` 없이 `message` 와 `requestID` 를 반환 |","operationId":"listSourceStatisticsURLs","parameters":[{"description":"프롬프트 실행 필터 (실행 요청 시 발급된 ID, 반복 전달, 최대 5개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"S8cqDSjSot67bCK6YtmvHw","in":"query","name":"runIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"프롬프트 필터 (프롬프트 목록·생성 응답의 id, 반복 전달, 최대 10개 — 여러 개면 합집합). runIDs·promptIDs 중 최소 하나 필수","example":"KNUETdAfRhDY9lQTgu9wuw","in":"query","name":"promptIDs","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"모델 필터. GET /models 로 조회 가능한 모델만 허용","example":"CHATGPT","in":"query","name":"model","schema":{"enum":["CHATGPT","GOOGLE_OVERVIEW","GOOGLE_AI","PERPLEXITY","GEMINI","NAVER_AI_BRIEFING","NAVER_AI_TAB","CLAUDE"],"type":"string"}},{"description":"도메인 필터 (반복 전달, 최대 50개, 각 253자 이내). 매칭 기준은 groupBy 를 따릅니다","example":"reddit.com","in":"query","name":"domains","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"domains 필터의 매칭 축과 항목 domain 필드 표기 (기본 domain=eTLD+1, subdomain=서브도메인 포함 호스트)","example":"domain","in":"query","name":"groupBy","schema":{"enum":["domain","subdomain"],"type":"string"}},{"description":"추가로 포함할 필드. models=URL별 모델 분해, quotes=AI 가 인용한 텍스트 조각(URL당 최대 20개, 중복 제거), urlVariants=이 URL 로 병합된 원본 URL 목록","example":"quotes","in":"query","name":"include","schema":{"items":{"type":"string"},"type":"array"},"style":"form"},{"description":"상위 몇 개 URL까지 반환할지 (기본 50, 최대 200)","example":50,"in":"query","name":"limit","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ListSourceStatisticsURLsResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.ValidationError"}}},"description":"runIDs·promptIDs 둘 다 누락, runIDs 개수(5개)·promptIDs 개수(10개) 초과, limit 범위 위반(1~200), domains 필터 개수(50개)·길이(253자) 초과, 지원하지 않는 model·include 값"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.UnauthorizedError"}}},"description":"API 키 또는 액세스 토큰이 없거나 유효하지 않습니다"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InsufficientCreditsError"}}},"description":"조직 크레딧 잔액이 이 요청의 단가보다 적습니다"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.RateLimitExceededError"}}},"description":"요청 한도를 초과했습니다. Retry-After 헤더의 초만큼 기다린 뒤 재시도하세요"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/domain.InternalServerError"}}},"description":"서버 내부 오류. requestID 를 함께 알려주시면 추적할 수 있습니다"}},"security":[{"OrgAPIKeyAuth":[]}],"summary":"URL별 인용 통계 조회","tags":["SourceStatistics (Beta)"]}}},"servers":[{"url":"https://platform-api.trychainshift.ai/api"}],"tags":[{"description":"API 키가 귀속되는 최상위 계정 단위입니다. 조직의 기본 정보를 조회합니다.","name":"Organization"},{"description":"AI 서비스에서 노출을 모니터링하는 대상 브랜드입니다. 브랜드 등록·조회·수정·삭제를 제공합니다.","name":"Brand"},{"description":"브랜드와 시장을 분석하기 위한 키워드 인텔리전스입니다. 구글·네이버 검색 지표, 연관·자동완성 키워드 조회와 사이트 URL 기반 키워드 분석을 제공합니다.","name":"Keyword (Beta)"},{"description":"프롬프트를 목적별로 묶는 그룹입니다. 프롬프트 세트 생성·조회·수정·삭제를 제공합니다.","name":"PromptSet"},{"description":"AI 서비스에 질의하는 문장 단위입니다. 프롬프트 생성·조회·수정·삭제와 대량 생성을 제공합니다.","name":"Prompt"},{"description":"프롬프트 실행에 사용하는 AI 서비스 모델입니다. 지원 모델 목록을 조회합니다.","name":"Model"},{"description":"프롬프트 실행에 사용하는 실행 지역입니다. 지원 리전 목록을 조회합니다.","name":"Region"},{"description":"프롬프트를 AI 서비스에 실제로 실행하는 작업 단위입니다. 프롬프트 실행 요청과 진행 상태·목록 조회를 제공합니다.","name":"Run"},{"description":"실행으로 수집된 AI 서비스의 응답입니다. 인용 출처·검색 쿼리를 포함한 답변을 조회합니다.","name":"Answer"},{"description":"답변에 인용된 출처의 도메인·URL 단위 통계 지표입니다. 인용 요약, 도메인별·URL별 인용 통계를 조회합니다.","name":"SourceStatistics (Beta)"},{"description":"답변 본문의 토큰(Kiwi 명사) 통계 지표입니다. 많이 나온 토큰 랭킹과 특정 단어의 근접 토큰을 조회합니다.","name":"AnswerStatistics (Beta)"},{"description":"AI가 답변 생성 시 실제로 던진 검색 쿼리(팬아웃) 통계 지표입니다. 검색 쿼리별 등장 횟수 랭킹을 조회합니다.","name":"FanoutStatistics (Beta)"},{"description":"텍스트에서 고유명사를 식별하는 부가 기능입니다. 고유명사 추출을 제공합니다.","name":"ProperNoun (Beta)"},{"description":"조직 크레딧 잔액 및 플랫폼 API 과금 정보입니다. 현재 크레딧 잔액을 조회합니다.","name":"Credit"}]}