커뮤니티 통합 검색
플레이그라운드에서 수집 →채널 코드 community_search · 수집 환경 linux
요청 파라미터
아래 값들을 POST /api/v1/collect 의 params 객체에 담아 보냅니다.
| 키 | 타입 | 필수 | 기본 | 설명 |
|---|---|---|---|---|
| keyword | text | 예 | — | 대표 키워드(60자 이내, 예: 맥심). 사이트마다 "site:도메인 키워드"로 검색합니다 — site: 는 넣지 마세요 |
| aliases | text | — | — | 동의어·영문·별칭을 쉼표로 최대 4개(예: "maxim, 맥심커피") — 한 개 30자 이내, site: 는 넣지 마세요(넘거나 넣으면 422). 대표 키워드와 같은 말·중복(대소문자 무시)은 오류 없이 빼고 4개를 셉니다. exclude_keywords 에 있는 말은 넣을 수 없습니다(422). 카카오는 OR 검색이 안 돼 검색어마다 따로 받고 같은 글은 한 번만 담습니다(글마다 extra.keywords 에 걸린 검색어). 대표 키워드를 품은 말(맥심커피)은 결과가 거의 늘지 않고 호출만 늘어납니다 |
| start_date | date (YYYY-MM-DD) | — | — | 이 날짜부터(당일 포함, KST). 비우면 종료일 기준 최근 7일. 기간은 최대 1년 |
| end_date | date (YYYY-MM-DD) | — | — | 이 날짜까지(당일 포함). 비우면 오늘. 오늘보다 뒤면 오늘까지로 |
| sites | text | — | — | 사이트 코드를 쉼표로(예: "dcinside, theqoo, ruliweb"). 비우면 19곳 전부 — 코드는 아래 수집 사이트 표 참고 |
| exclude_keywords | text | — | — | 이 단어가 제목·요약에 들어간 글은 뺍니다(쉼표로 최대 50개 — 넘으면 422, 대소문자 무시·부분 일치). aliases 와 같은 말은 넣을 수 없습니다(422). 상세수집을 켜면(댓글만 켜도) 상세 대상 글은 글 페이지의 제목·본문으로 한 번 더 걸러 뺍니다(개수는 channel_info.detail.excluded) |
| limit | number | — | — | 정수(JSON 숫자). 비우거나 0 이하면 기간 안의 글 전부(안전 상한 50,000건). 숫자를 넣으면 최신 글부터 그 수만큼만 돌려줍니다(수집은 기간 전체). 50,000보다 크면 50,000으로 맞춥니다 |
| collect_body | bool | — | — | 켜면 글 페이지를 직접 열어 본문 전체·작성자·조회·추천·댓글 수·글 페이지의 작성시각을 받습니다(상세수집 — 최신 글부터 detail_limit 건). 끄면(기본) 카카오 요약만 |
| collect_comments | bool | — | — | 켜면 글마다 댓글을 최대 1,000개까지 받습니다(답글 포함, extra.comments). 본문 수집과 따로 켤 수 있고, 댓글만 켜도 작성자·조회·추천·댓글 수·작성시각은 글 페이지 값으로 채웁니다(본문은 카카오 요약 그대로) |
| detail_limit | number | — | — | 정수(JSON 숫자). 본문·댓글을 받을 글 수(최신 글부터). 비우거나 0 이하면 3,000(최대값 — 수 시간 걸릴 수 있음), 3,000보다 크면 3,000으로 맞춥니다. 그보다 오래된 글은 목록 정보만(extra.detail.status = over_limit) |
| refresh | enum | — | incremental | incremental(기본): 상세수집(본문·댓글)에서 허브가 이미 받은 상세가 규칙에 맞으면 사이트에 다시 접속하지 않고 다시 씁니다(게시 7일 미만 글은 항상 새로 — 다시 쓴 글은 extra.detail_cached_at 에 원래 받은 시각). full: 이번 요청은 전부 새로 수집합니다. 결과 형식은 같습니다 |
기본수집과 상세수집
이 채널은 두 단계로 수집합니다. 아무 옵션 없이 요청하면 기본수집(목록)만 하고, collect_body·collect_comments를 켜면 목록이 끝난 뒤 상세수집(본문·댓글)까지 해서 한 번에 돌려줍니다.
| 구분 | 기본수집 (기본값) | 상세수집 (옵션) |
|---|---|---|
| 켜는 법 | 따로 켤 것 없음 | collect_body: true(본문) · collect_comments: true(댓글) — 하나만 켜도 됩니다. 건수는 detail_limit(기본·최대 3,000) |
| 방식 | 카카오(Daum) 웹문서 검색으로 사이트마다 site:도메인 키워드를 기간 단위로 끝까지 받습니다. 커뮤니티 사이트에는 접속하지 않습니다. | 기본수집으로 찾은 글 중 최신 글부터 detail_limit건을 사이트에서 직접 열어 본문·댓글을 읽습니다. 사이트별로 50건씩 나눠 여러 수집 서버가 동시에 처리합니다(사이트마다 동시에 2묶음까지 — 사이트에 부담을 주지 않도록). |
| 받는 값 | 제목 · 요약(본문 일부) · 작성시각(대부분 초 단위) · 주소 · 사이트 · 게시판 · 걸린 검색어 | 기본수집 값 + 전체 본문 · 작성자 · 조회/추천/댓글 수 · 게시판 이름 · 글 페이지의 작성시각(posted_at이 이 값으로 바뀜) · 댓글·답글(글당 최대 1,000개) · 글 상태(extra.detail.status) |
| 건수 | 기간 안에 카카오가 찾은 글 전부(안전 상한 50,000건, limit로 줄일 수 있음) | 최신 글부터 최대 3,000건 — 나머지 글은 기본수집 값만(extra.detail.status = over_limit) |
| 시간 | 보통 수 초~수십 초(예: 디시 글이 수천 건인 30일 요청은 1분 안팎) | 글당 약 2~5초(댓글이 많으면 더)를 사이트별로 나눠 병렬 처리 — 한 사이트에 몰린 요청일수록 오래 걸립니다(예: 디시 3,000건 본문+댓글 1~3시간). 최대 6시간, 넘으면 받은 데까지 완료 |
| 한계 | 카카오 색인에 있는 글만 — 보통 결과 수(ref_total)의 80~90%. 사이트마다 색인이 늦게 들어오는 곳이 있습니다(아래 표). | 삭제된 글·회원 전용 글은 본문이 없습니다(deleted·member_only). 사이트가 수집을 막으면 그 사이트에는 더 요청하지 않고 받은 데까지만(warnings.detail_incomplete — 2026-10-12부터 쉬었다 다시 하지 않음). 상세 불가 사이트(지금: 인스티즈 — 아래 수집 사이트 표의 상세 칸)는 상세를 시도하지 않고 기본수집 값만 담아 바로 넘어갑니다(extra.detail.status = unavailable · warnings.detail_unavailable). 받은 글·못 받은 글은 extra.detail.collected로 가립니다(아래 상세 결과 확인). 사이트별 특이 사항은 아래 표의 상세수집 참고. |
상세수집 요청 예시
진행 중에는 목록 단계(progress.phase = "list")를 지나 상세 단계("detail")가 되고, progress.detail에 대상·끝난 수가 나옵니다(count = detail.done — 상세가 끝난 글 수. 각 값의 뜻은 아래 진행 중 절). 이 예시는 목록에서 405건을 모아(detail_limit 500보다 적어 전부가 상세 대상) 디시인사이드 두 묶음(100건)을 처리하는 중입니다:
상세를 받은 글 예시 (items[] 한 건)
상세를 받은 글은 posted_at이 글 페이지 시각이고 posted_at_raw는 그 표기 원문입니다. 디시인사이드는 카카오 시각과 글 페이지 시각이 보통 같아 kakao_posted_at도 같은 값입니다.
상세 상태 (extra.detail)
| 필드 | 설명 |
|---|---|
| status |
ok 받음 · deleted 삭제·없는 글 · member_only 회원 전용(본문 없음) · error 읽기 실패(사유·다시 시도 규칙은 아래 error) ·
blocked 사이트가 수집을 막아 못 받음 · timeout 상세 기한(6시간) 안에 못 받음 · cancelled 관리자가 그 묶음을 취소 ·
over_limit detail_limit보다 오래된 글이라 받지 않음 · unavailable 상세 불가 사이트(사이트가 수집을 막는 등 — 지금: 인스티즈)라 상세를 시도하지 않음(이유는 reason. 단 허브가 전에 받아 둔 상세가 있는 글은 그 상세로 담겨 ok — extra.detail_cached_at).
글 페이지의 제목·본문에 exclude_keywords가 있는 글은 결과에서 뺍니다(댓글만 켜도 같음 — channel_info.detail.excluded로 개수만).
상세를 받지 못한 글도 결과에 남고 body는 카카오 요약입니다. |
| collected | 상세를 받았나 — true = 글 페이지에서 본문·댓글을 받음(status = ok), false = 못 받음(그 밖의 모든 상태 — 이유는 status·reason·error). 상세수집 요청이면 모든 글에 붙습니다 |
| reason | unavailable일 때만 — 그 사이트의 상세를 받을 수 없는 이유(예: "인스티즈가 Cloudflare 봇 확인(HTTP 403 "Just a moment...")으로 글 페이지 접근을 막아 상세(...") |
| error | 사유 — 보통 status가 error일 때. 글 페이지 모양이 다르거나 읽지 못한 글은 다시 시도하지 않고 바로 error입니다(접속 오류는 요청마다 3번까지 시도한 뒤).
묶음(50건)이 실패하거나 시간 초과로 결과 없이 끝나면 그 글들을 다시 넣어 글마다 3번까지 시도하고, 그래도 안 되면 error(사유 "상세 3회 시도 실패 — …")입니다 — 사이트 차단으로 멈춘 묶음은 횟수에 세지 않습니다.
다모앙은 글 데이터를 일부만 읽은 ok 글에도 붙습니다("인라인 데이터 해석 실패 — JSON-LD·본문만" — 조회·추천·댓글 수가 없고, 댓글을 요청했으면 comments는 빈 배열에 comments_truncated = true) |
| posted_at | 글 페이지에 적힌 작성시각(YYYY-MM-DD HH:MM:SS — 사이트 표기가 분 단위면 초 :00). 결과 posted_at은 보통 이 값입니다(아래 결과 필드 표의 posted_at) |
| full_body | collect_body를 켜고 상세를 받은 글만 true — body가 글 페이지의 전체 본문이라는 표시(짧은 글은 카카오 요약과 글자까지 같을 수 있음) |
| kakao_posted_at | 결과 posted_at을 글 페이지 시각으로 쓴 글만 — 원래 카카오 검색 시각(YYYY-MM-DD HH:MM:SS, 같은 값일 수도 있음). 기간 판정은 이 시각 기준입니다 |
| board_name | 게시판·갤러리 이름(글 페이지에 있을 때) — 뽐뿌·오늘의유머·HYGALL·인스티즈·오르비·긱뉴스는 없고, 엠엘비파크는 게시판 코드(bullpen) 그대로 |
| comments_truncated | true면 댓글을 다 담지 못함 — 글당 1,000개 상한, 사이트가 일부만 보여 줌(다모앙 50개), 또는 다모앙 글 데이터를 일부만 읽음(위 error) |
| comments_masked | 사이트가 비회원에게 가린 댓글 수(더쿠·인스티즈 — 쓴 지 1시간 안 된 댓글). 있을 때만 |
| (사이트별) | gallery_type(디시) · category(말머리·분류) · tags(오르비) · original_id(오늘의유머 베오베·베스트 사본의 원글) · original_url(더쿠 — 글 머리의 원글 링크가 이 글 주소와 다를 때만) · news_source(뽐뿌 뉴스 게시판 news_*의 언론사 이름) · dislikes(비추천) · source·source_url(긱뉴스 원문 출처) — 그 사이트에 있을 때만 |
댓글 필드 (extra.comments[])
| 필드 | 설명 |
|---|---|
| comment_id | 댓글 번호(글 안에서 고유) |
| author | 작성자 닉네임 — 익명 사이트는 null(더쿠·해연갤·알지롱) 또는 글마다 매기는 익명 이름(인스티즈 '익인N') |
| text | 내용(줄바꿈 유지) — 이미지·스티커만 있는 댓글은 [내용없음] |
| date | 작성시각(KST, YYYY-MM-DD HH:MM:SS). 연도 없는 표기는 수집 연도로, '5시간 전' 같은 상대 표기(와이고수·오르비 하루 안)는 수집 시각에서 어림 — 원문은 date_raw |
| is_reply / parent_id | 답글이면 true와 부모 댓글 번호(사이트가 알려 줄 때). 답글은 부모 댓글 바로 뒤에 옵니다(오늘의유머·디시인사이드 포함) — 부모 댓글이 삭제돼 빠진 답글과, 1,000개 상한으로 부모 댓글이 잘린 답글은 예외 |
| likes | 댓글 추천 수(사이트에 있을 때만) |
| deleted | 삭제 표시가 붙었지만 내용이 남아 있는 댓글(82쿡)만 true — 내용이 지워진 삭제 댓글은 담지 않습니다 |
댓글은 오래된 댓글부터입니다(답글은 부모 뒤).
글당 1,000개 상한에 걸리면(comments_truncated = true) 대부분 오래된 댓글 1,000개가 남고, 디시인사이드·네이트판은 최신 댓글 1,000개가 남습니다(순서는 오래된 순). 완료 응답의 channel_info.detail에 상세 결과 요약이 옵니다 — requested(본문·댓글 옵션) · detail_limit · collected·not_collected(결과 글 중 상세를 받은 글·못 받은 글) · 상태별 글 수(ok·deleted·member_only·error·blocked·timeout·cancelled·unavailable·over_limit) · excluded(본문 제외어로 뺀 글) · comments(받은 댓글 수 합계).
상세수집 요청의 결과에는 상세를 못 받은 글도 빠지지 않고 기본수집(카카오 검색) 값으로 담기고(본문 제외어에 걸린 글만 빠짐), 상세를 받았는지는 아래 네 곳에서 확인합니다.
- 글마다 —
extra.detail.collected:true본문·댓글을 받음 /false못 받음. 못 받은 이유는extra.detail.status(unavailable·blocked·deleted·member_only·error·timeout·over_limit…)와reason·error. - 사이트마다 —
channel_info.sites[].detail:collected(받은 글 수) ·not_collected(못 받은 글 수) ·available(그 사이트가 상세를 받을 수 있는 곳인지) ·reason(available = false일 때 이유).available = false여도 허브가 전에 받아 둔 상세가 있는 글은collected에 셉니다. - 요청 전체 —
channel_info.detail.collected·not_collected와 상태별 수. 상세 불가 사이트의 글이 있으면warnings.detail_unavailable[](site·label·reason·count)가 붙습니다. - 요청할 때 — 상세수집 요청의
sites에 상세 불가 사이트가 들어 있으면 202 응답data.detail_unavailable[](site·label·reason)로 미리 알려 줍니다. 그 사이트 글은 기다리지 않고 목록(카카오) 정보만 담깁니다.
channel_info.detail에는 위 상태별 수가 모두 옵니다.)
수집 사이트 (19곳)
sites에 아래 코드를 쉼표로 넣으면 그 사이트만, 비우면 전부 수집합니다. 결과의 post_id와 extra.site도 이 코드로 시작합니다.
| 코드 | 사이트 | 도메인 | 어떤 곳 | 참고 | 상세 | 상세수집 참고 |
|---|---|---|---|---|---|---|
| dcinside | 디시인사이드 | dcinside.com | 국내 최대 갤러리형 커뮤니티(정식·마이너·미니 갤러리) — 물량이 가장 많음 | 가능 | 댓글이 많으면 100개마다 요청이 하나씩 늘어 느려짐 · 댓글이 1,000개를 넘으면 최신 1,000개가 남음(순서는 오래된 순) | |
| ppomppu | 뽐뿌 | ppomppu.co.kr | 핫딜·쇼핑 정보와 생활 포럼 | 가능 | 게시판 이름을 읽지 않아 source 는 게시판 코드(예: 뽐뿌 / freeboard) · 뉴스 게시판(news_*, 기사 전재)은 작성자·조회 없음(언론사는 extra.detail.news_source) · '인기글로 선정되어 뽐쿠폰이 발급되었습니다' 같은 시스템 댓글이 섞임 | |
| clien | 클리앙 | clien.net | IT·생활 커뮤니티(모두의공원·소모임·사용기) | 삭제가 빠른 편 | 가능 | |
| ruliweb | 루리웹 | ruliweb.com | 게임·서브컬처·취미 커뮤니티와 게임 뉴스 | 가능 | 뉴스 기사(news/read)는 작성자·추천 없음 · 마이피 글은 작성자·조회·추천 없음 | |
| theqoo | 더쿠 | theqoo.net | 연예·아이돌 팬덤·뷰티·생활(익명) | 가능 | 작성자 없음(익명) · 추천 수 없음 · 비회원에게 1시간 안 된 댓글은 가려짐(comments_masked) | |
| inven | 인벤 | inven.co.kr | 게임별 게시판(로스트아크·메이플스토리 등) | 가능 | ||
| bobaedream | 보배드림 | bobaedream.co.kr | 자동차·중고차 커뮤니티(자유·유머·정치 게시판 포함) | 가능 | 삭제된 댓글은 뺌 | |
| 82cook | 82쿡 | 82cook.com | 살림·요리 중심 커뮤니티(자유게시판 활발) | 가능 | ||
| todayhumor | 오늘의유머 | todayhumor.co.kr | 유머·시사 종합 커뮤니티 | 베오베·베스트는 원글의 사본이라 같은 글이 두 번 잡힐 수 있음 | 가능 | 베오베·베스트 사본은 extra.detail.original_id 에 원글 키 |
| orbi | 오르비 | orbi.kr | 수험생·입시 커뮤니티 | 가능 | 게시판 대신 태그(extra.detail.tags) · 하루 안 댓글 시각은 상대 표기를 어림 | |
| ygosu | 와이고수 | ygosu.com | 남성 중심 종합 커뮤니티(야구·이슈·엽기 등) | 가능 | 댓글 시각이 상대 표기("5시간 전")뿐이라 수집 시각에서 어림(date_raw 에 원문) | |
| battlepage | 배틀페이지 | battlepage.com | 격투게임 커뮤니티 출신 — 지금은 잡담(프리보드) 중심 | 가능 | 오늘 댓글은 시각만 표기 — 수집일 날짜를 붙임 | |
| hygall | HYGALL | hygall.com | 해외연예 익명 갤러리(해연갤) | 가능 | 작성자 없음(익명) · 회원 전용 글은 본문 없음(member_only) | |
| geeknews | 긱뉴스 | news.hada.io | 개발·기술 뉴스 큐레이션 | 물량 적음 | 가능 | 조회수 없음 · 'GN⁺'(봇)이 단 해외 반응 요약 댓글이 섞임 |
| te31 | 알지롱 | te31.com | 오래된 소규모 종합 커뮤니티 | 물량 매우 적음 | 가능 | 작성자 비공개(비로그인) |
| mlbpark | 엠엘비파크 | mlbpark.donga.com | 야구 커뮤니티 — 불펜(시사·연예 잡담) 활발 | 사이트 정책상 자동 수집 제한(사내 연구용) | 가능 | 삭제된 댓글은 뺌 |
| pann | 네이트판 | pann.nate.com | 사연·고민·연예 토크 | 카카오 색인이 며칠(약 4일) 늦게 들어옴 · 사이트 정책상 자동 수집 제한(사내 연구용) | 가능 | 답글은 댓글마다 따로 받아 인기글은 느림 · 댓글이 1,000개를 넘으면 최신 1,000개가 남음(순서는 오래된 순) |
| damoang | 다모앙 | damoang.net | 시사·생활 종합 커뮤니티 | 사이트 정책상 자동 수집 제한(사내 연구용) | 가능 | 댓글은 글 페이지에 실린 50개까지(사이트가 댓글 목록 API 수집 거부를 명시) |
| instiz | 인스티즈 | instiz.net | 연예·일상 익명 커뮤니티 | 카카오 색인이 약 8일 늦어 최근 일주일 글은 거의 잡히지 않음 · 사이트 정책상 자동 수집 제한(사내 연구용) | 불가 | ⚠️ 지금 상세 불가(2026-10-12 — 사이트가 Cloudflare 봇 확인으로 막음, extra.detail.status = unavailable) · 글 작성자 없음(익명 — 익명 이름 익인N 은 댓글 작성자에만) · 회원 전용 글 있음(member_only) · 비회원에게 1시간 안 된 댓글은 가려짐(comments_masked) |
에펨코리아·OKKY(상세수집에 크롬 필요), 딜바다·풀빵·이지데이·씨보드·퀘이사존(서버 과부하·자동 게시글 위주·카카오 날짜 부정확)은 아직 넣지 않았습니다 — 필요하면 추가 검토합니다.
- 기간(
start_date~end_date, KST·양끝 포함): 비우면 최근 7일, 최대 1년. 기간 결과가 많으면 하루 단위로 나눠 받고, 하루 안에서도 많으면 이어 받아 기간 안의 글을 끝까지 모읍니다. - 함께 검색(
aliases, 최대 4개 — 한 개 30자 이내,site:불가, 대표 키워드와 같은 말·중복은 빼고 셈): 카카오는 OR 검색이 안 돼 검색어마다 따로 받습니다. 같은 글은 한 번만 담고extra.keywords에 걸린 검색어를 모두 적습니다. 대표 키워드를 품은 말(예: 맥심 → 맥심커피)은 대표 키워드 결과에 이미 들어 있어 늘지 않고 호출만 늘어납니다. - 제외 키워드(
exclude_keywords, 최대 50개): 제목·요약에 들어간 글을 뺍니다(쉼표 구분·대소문자 무시·부분 일치, 함께 검색어와 같은 말은 넣을 수 없음). 상세수집을 켜면(댓글만 켜도) 상세 대상 글은 글 페이지의 제목·본문으로 한 번 더 걸러 뺍니다(개수는channel_info.detail.excluded). - 색인 지연: 카카오에 글이 들어오는 속도가 사이트마다 다릅니다 — 디시인사이드는 몇 분, 네이트판은 약 4일, 인스티즈는 약 8일 늦습니다. 최근 며칠 요청은 그 사이트 글이 적게 나올 수 있습니다.
- 결과 수(
channel_info.sites[].ref_total)는 카카오가 알려 준 참고값입니다. 실제로 받은 글(found)은 보통 그 80~90%입니다.
warnings수집을 끝까지 못 한 사이트·검색어가 있어도 글을 하나라도 받았으면 요청은 실패하지 않고 받은 글까지 담아
done으로 끝나며, 빠진 부분을 warnings.partial[](site·keyword·reason·missing)로 알려 줍니다. missing은 못 받은 날짜 구간 ["시작일", "종료일"] 쌍의 배열입니다. reason:
quota— 오늘 카카오 검색에 쓸 수 있는 양을 다 썼습니다: 키마다 하루 안전선(웹문서 27,000회와, 다음 카페 검색 사용분까지 합친 45,000회 중 먼저 닿는 쪽) 또는 카카오 하루 한도. 자정(KST) 이후 다시 요청하세요.call_budget— 요청 하나의 카카오 호출 예산(5,000회)을 다 썼습니다. 기간·사이트·함께 검색어를 줄여 나눠 요청하세요.nokey— 쓸 수 있는 카카오 키가 없습니다(만료·비활성·미등록). /ip— 카카오 키의 호출 허용 IP 에 허브 서버가 없습니다. /auth— 카카오 키 인증 실패(다른 쓸 키 없음). 셋 다 관리자 확인이 필요합니다.timeout— 목록 수집이 3시간을 넘었습니다. /walk_cap— 한 사이트·검색어의 호출 상한에 닿았습니다. /error— 카카오 응답 오류가 이어졌습니다.
timeout으로 받은 데까지 완료합니다.
warnings.items_capped(max_items·dropped) — 결과가 응답 안전 상한(50,000건)을 넘어 오래된 글이 빠졌습니다(limit을 50,000 이상 줘도 상한에 걸리면 붙음).warnings.detail_incomplete[](site·reason·count) — 상세수집에서 본문·댓글을 못 받은 글:blocked(사이트가 수집을 막음 — 그 사이트에는 더 요청하지 않고 남은 글은 포기, 2026-10-12부터 10·30분 뒤 다시 하지 않음) ·timeout(6시간 기한) ·cancelled. 그 글들도 결과에는 기본수집 값으로 남습니다.warnings.detail_capped(detail_limit·without_detail) — 결과가detail_limit보다 많아 오래된 글은 상세 없이 담았습니다.warnings.detail_unavailable[](site·label·reason·count) — 상세 불가 사이트(지금: 인스티즈)의 글이라 상세를 시도하지 않고 목록(카카오) 정보만 담았습니다. 기다림 없이 바로 넘어갑니다.
warnings는 해당할 때만 응답 data 최상위(channel_info와 같은 층)에 붙습니다. 모양 예시(실제로는 해당하는 키만 옴):
quota·nokey·ip·auth로 멈추면 0건 완료가 아니라 failed입니다(아래 실패).
요청 예시
응답 (202 Accepted)
요청을 받으면 request_id 를 돌려주고 허브가 곧바로 목록 수집을 시작합니다(큐·워커 대기 없음). 202 응답의 status 는 pending 이지만 조회하면 처음부터 running 입니다. 상세수집(본문·댓글)만 수집 서버가 사이트별로 나눠 처리합니다. 상세수집 요청의 sites에 상세 불가 사이트(지금: 인스티즈)가 있으면 202 응답에 detail_unavailable[](site·label·reason)가 붙습니다 — 그 사이트 글은 목록 정보만 옵니다.
결과 조회 — GET /requests/{id}
같은 API 키로 request_id 를 조회합니다. 상태에 따라 응답이 달라집니다.
결과(items)는 요청별로 보관되므로 같은 글이 다른 요청(다른 키워드·재수집)에 겹쳐도 이 요청의 결과는 그대로입니다 —
여러 요청에 걸친 중복 정리는 post_id로 호출 쪽에서 하세요.
보존 기간은 완료 후 90일입니다. 보존 기간이 지나면 items 는 빈 배열이고 items_expired: true, items_keep_days 가 함께 옵니다(status 는 그대로 done).
진행 중 (pending / running)
아직 끝나지 않았으면 progress 로 진행 상황만 옵니다(items 없음).
이 채널은 요청을 받자마자 허브가 시작하므로 조회하면 처음부터 running입니다(pending은 보이지 않음). progress 값:
| 필드 | 설명 |
|---|---|
| count | 목록 단계: 지금까지 모은 글 수(제목·요약 제외어는 뺀 뒤, limit·안전 상한 적용 전이라 최종 result_count보다 클 수 있음) · 상세 단계: detail.done과 같음(0부터 다시 셈) |
| phase | list(목록) → detail(상세수집을 켰을 때만) |
| walks | total = 사이트 수 × 검색어 수(대표 키워드 + 함께 검색) · done = 끝난 수(덜 받고 멈춘 것 포함) |
| kakao_calls | 지금까지 쓴 카카오 호출 수 |
| found | 상세 단계만 — 목록에서 모은 글 수 |
| detail | 상세 단계만 — targets = 상세 대상(최신 글부터 detail_limit건, limit을 줬으면 결과에 남을 글 안에서) · done = 끝난 글(받음·삭제·회원 전용·실패·제외·차단 등 상태가 정해진 글) · waiting = 아직 묶음에 안 들어간 글 · in_progress = 묶음(50건)에 담겨 수집 서버를 기다리거나 처리 중인 글 · unavailable = 상세 불가 사이트라 바로 끝낸 글(done에 포함) |
완료 (done)
status 가 done 이면 data.items[] 에 결과가 담깁니다.
실패 시엔 status: "failed" 와 error 가 옵니다.
예시는 items를 한 건만 보였습니다(result_count 421). 이 채널의 done에는 사이트·검색어별 집계 channel_info가 항상 붙고, 받은 데까지 완료면 warnings도 붙습니다(위 받은 데까지 완료):
| 필드 | 설명 |
|---|---|
| keywords | 검색한 말 — 대표 키워드 + 함께 검색(정리한 뒤의 값) |
| period | 실제로 수집한 기간(start_date·end_date — 비웠으면 채운 값) |
| sites[] | 요청한 사이트 전부(0건이어도) — 요청 순서가 아니라 위 수집 사이트 표 순서 |
| sites[].found | 그 사이트에서 목록 단계에 모은 글 수 — 제목·요약 제외어는 뺀 뒤, limit·안전 상한(50,000건)·본문 제외어 적용 전이라 실제로 돌려준 건수(result_count)와 다를 수 있음. limit으로 일찍 멈췄으면(list_stopped_before) 조회한 날짜까지의 수 |
| sites[].ref_total | {검색어: 카카오가 알려 준 결과 수} 참고값(실제로 받는 글은 보통 그 80~90%) — 그 검색어를 한 번도 조회하기 전에 멈췄으면 null |
| sites[].complete | 그 사이트의 모든 검색어를 끝까지 받았나 — false면 warnings.partial에 그 사이트 항목이 있음 |
| sites[].detail | 상세수집을 켠 요청만 — collected(상세를 받은 글 수) · not_collected(못 받은 글 수 — 상세 불가·삭제·회원 전용·실패·detail_limit 밖 등) · available(그 사이트가 상세를 받을 수 있는 곳인지) · reason(available = false일 때 이유) |
| keyword_hits | {검색어: 걸린 글 수} — found와 같은 기준(limit·본문 제외어 적용 전). 1건 이상 걸린 검색어만 키가 있고 0건 검색어는 키가 없습니다. 한 글이 여러 검색어에 걸리면 검색어마다 셈 |
| kakao_calls | 이 요청이 쓴 카카오 호출 수 |
| list_stopped_before | limit을 채워 일찍 멈췄을 때만 — 그 날짜(YYYY-MM-DD)부터 끝 날짜까지는 다 조회했고 더 옛 날짜는 조회하지 않음(돌려준 글은 같음) |
| list_cache | 목록 캐시로 답한 날짜가 있을 때만 — days 원장으로 답한 날짜 수(사이트·검색어별로 셈) · posts 결과 중 원장으로만 채운 글 수(extra.ledger_at) · over_limit limit보다 더 돌려준 수 |
| detail | 상세수집을 켠 요청만 — collected·not_collected(상세를 받은·못 받은 글 수)와 상태별 글 수 등(위 댓글 필드 표 아래 설명 · 상세 결과 확인) |
실패 (failed)
status 가 failed 면 error 에 사유가 옵니다(items 없음).
이 채널은 요청 단위 자동 재시도가 없습니다(한 번 실행). 카카오 일시 오류는 수집 안에서 다시 시도하고, 끝내 못 받은 부분은 실패가 아니라 받은 데까지 done + warnings.partial로 끝납니다. failed는 아래 사유로 글을 하나도 받지 못했을 때뿐이며 result_count는 null입니다(글을 일부라도 받았으면 같은 사유여도 done + warnings.partial).
카카오 검색 하루 사용량이 한도에 닿아 검색하지 못했습니다(자정 이후 다시 요청하세요)— 하루 안전선·카카오 한도를 다 씀(quota, 자정은 KST 기준)사용할 수 있는 카카오 키가 없어 검색할 수 없습니다(관리자 확인 필요)— 키 만료·비활성·미등록(nokey)카카오 키의 호출 허용 IP 에 허브 서버가 없어 검색할 수 없습니다(관리자 확인 필요)— 키 설정의 호출 허용 IP 불일치(ip)카카오 키 인증 실패로 검색할 수 없습니다(관리자 확인 필요)— 키 인증 실패, 다른 쓸 키 없음(auth)
관리자 확인이 필요한 세 가지(nokey·ip·auth)는 고치기 전에는 다시 요청해도 결과가 같습니다.
최상위 data에는 항상 request_id·channel·status·external_ref·result_count·started_at·finished_at·duration_ms·duration_sec·created_at·updated_at이 포함되고, 상태에 따라 items(done)·progress+elapsed_ms(진행 중)·error(failed/cancelled)가 추가됩니다. duration_*는 허브가 잰 수집 소요 시간(시작~종료) — 자세히는 비동기 & 콜백. 요청을 잘못 시작했다면 취소 API로 중단할 수 있습니다. 이 채널은 done이면 channel_info가 항상, 받은 데까지 완료면 warnings가 같은 층에 붙습니다. 요청 즉시 시작하므로 대기 시간이 없고(started_at = created_at), duration_*에는 카카오 키가 잠시 쉬는 시간과 상세 묶음이 수집 서버를 기다린 시간·사이트 차단 뒤 쉬는 시간도 들어갑니다.
결과 필드 (items[])
| 필드 | 설명 |
|---|---|
| post_id | 글 고유 ID — 사이트:원래ID(예: dcinside:갤러리/글번호, theqoo:글번호, ppomppu:게시판/글번호). 같은 글이 다른 주소(PC·모바일·베스트 경로)로 잡혀도 하나로 묶입니다. 여러 요청에 걸친 중복 정리 키 |
| url | 정규화한 글 주소 — 목록·검색 꼬리표(page= 등)를 뗀 PC 주소 |
| title / body | title=글 제목(검색어 강조 태그와 사이트가 붙이는 이름 꼬리 — 예 : 클리앙 — 를 뗌, 상세를 받은 글은 글 페이지의 제목) / body=카카오 검색 요약(본문 일부, 기본수집). collect_body를 켜고 상세를 받은 글(extra.detail.status = ok)은 전체 본문 |
| author | 기본수집에서는 null(카카오 검색이 주지 않음) — 상세를 받은 글은 작성자. 익명·비공개 사이트(더쿠·HYGALL·인스티즈·알지롱)와 뽐뿌 뉴스 게시판(news_*)·루리웹 뉴스 기사(news/read)·루리웹 마이피 글은 상세를 받아도 null |
| posted_at | 작성 시각 (ISO8601, KST) — 상세를 받은 글(extra.detail.status = ok)은 글 페이지에 적힌 작성시각, 그 밖의 글은 카카오 검색이 준 시각입니다.· 글 페이지 시각이 미래(10분 넘게)이거나 카카오 시각과 31일 넘게 차이 나면 카카오 시각을 씁니다. 같은 분인데 글 페이지 표기만 분 단위(초 :00)이고 카카오는 초까지 주는 경우도 카카오 시각입니다. 글 페이지 시각을 쓴 글은 extra.detail.kakao_posted_at에 카카오 시각을 남깁니다.· posted_at_raw는 쓴 쪽의 원문 — 글 페이지 시각이면 글 페이지 표기(사이트마다 모양이 다름), 카카오 시각이면 카카오 원문(ISO 8601).· 카카오 시각은 대부분 초 단위지만, 분 단위로 주는 곳(더쿠·엠엘비파크·네이트판·인벤·오르비·루리웹 마이피)은 초가 :00, 보배드림·뽐뿌 일반 게시판(뉴스 게시판 news_* 제외)은 날짜만(00:00:00)입니다. 다모앙은 초가 맞지 않고, 루리웹 마이피 오후 글은 12시간 이르게, 뽐뿌 일부 글은 날짜가 며칠 이르게 들어옵니다 — 상세 없이 받은 글은 이 값 그대로입니다.· 기간( start_date~end_date) 판정과 limit로 글을 고르는 순서는 카카오 시각 기준이고, 결과 순서는 최종 posted_at 최신순입니다. 그래서 카카오 날짜가 틀리는 글은 posted_at이 요청 기간을 조금 벗어날 수 있습니다(드묾). |
| views / comment_count | 기본수집에서는 null — 상세를 받은 글은 조회수·댓글 수(사이트에 표시된 값). 조회수가 없는 곳(긱뉴스·뽐뿌 뉴스 게시판 news_*·루리웹 마이피)은 상세를 받아도 views가 null |
| recommends | 기본수집에서는 null — 상세를 받은 글은 추천(공감·좋아요) 수(사이트가 보여 주는 경우 — 더쿠·인스티즈와 루리웹 뉴스 기사·마이피 글은 null) |
| source | 사이트 이름 / 게시판 — 상세를 받은 글은 글 페이지의 게시판 이름, 아니면 주소에서 읽은 게시판 코드(없으면 사이트 이름만). 상세를 받아도 뽐뿌·오늘의유머·HYGALL·인스티즈는 게시판 이름을 읽지 않아 주소의 코드 그대로(예: 뽐뿌 / news_economy), 엠엘비파크는 게시판 이름 자리에 코드(엠엘비파크 / bullpen), 오르비·긱뉴스는 사이트 이름만 |
| extra.site | 사이트 코드(위 수집 사이트 표) |
| extra.site_label | 사이트 이름 |
| extra.board | 게시판 코드(주소에서 — 없으면 null) |
| extra.board_name | 게시판 이름 — 제목에서 알 수 있을 때만(보배드림) |
| extra.gallery_type | 디시 갤러리 종류 — G(정식)·M(마이너)·MI(미니)·PR(인물). 모바일 주소(m.dcinside.com)로 잡힌 정식·마이너 글은 이 키가 없음(상세를 받으면 extra.detail.gallery_type에 있음) |
| extra.comeidx | 인벤 게시판 번호 |
| extra.snippet | 카카오 검색 요약(기본수집에서는 body와 같음) |
| extra.keywords | 이 글이 걸린 검색어 배열(대표 키워드·함께 검색) — 여러 검색어에 걸려도 글은 한 번만 |
| extra.source_kind | community_search |
| extra.detail | 상세수집 결과 상태와 부가 값 — collect_body·collect_comments를 켰을 때만(위 상세 상태 표) |
| extra.detail_cached_at | 상세 캐시로 채운 글만 — 그 상세를 원래 받은 시각(YYYY-MM-DD HH:MM:SS). 본문·댓글·수치는 그때 값입니다(refresh=full이면 붙지 않음) |
| extra.ledger_at | 목록 캐시로 채운 글만 — 카카오에 다시 묻지 않고 허브 원장으로 답한 글. 그 날짜를 끝까지 받은 시각(YYYY-MM-DD HH:MM:SS). 제목·요약은 그때 카카오 값이고, 요약은 같은 글을 다른 검색어로 받은 요약일 수 있습니다(refresh=full이면 붙지 않음) |
| extra.comments | 댓글 배열 — collect_comments를 켜고 상세를 받은 글만(위 댓글 필드 표) |
- 사이트 운영 정책 — 엠엘비파크·네이트판·다모앙·인스티즈는 사이트 robots.txt 가 자동 수집을 제한하거나 수집 거부 의사를 밝힌 곳입니다. 목록은 카카오 검색 결과라 사이트에 접속하지 않지만,
collect_body·collect_comments를 켜면 이 4곳도 글 페이지와 댓글을 직접 받습니다(다모앙은 robots 가 막은 댓글 목록 API 는 쓰지 않음). 사내 연구 용도로만 쓰세요. - 결과는 요청별로 보관되고
posted_at최신순으로 정렬됩니다. 응답 하나가 너무 커지지 않게 50,000건이 안전 상한이며(limit을 더 크게 줘도 같음), 넘으면 오래된 글(카카오 시각 기준)부터 빠지고warnings.items_capped가 붙습니다 — 기간·사이트를 나눠 요청하세요. posted_at은 상세를 받은 글이면 글 페이지에 적힌 작성시각, 아니면 카카오 검색 시각입니다(규칙은 위posted_at설명). 카카오 시각은 사이트에 따라 분·날짜 단위이거나 어긋나는 글이 있으니, 정확한 작성시각이 필요하면 상세수집을 켜세요. 기간 판정과limit로 글을 고르는 순서는 카카오 시각 기준이라, 카카오 날짜가 틀리는 사이트(뽐뿌 일부 게시판 등)에서는posted_at이 요청 기간을 조금 벗어난 글이 드물게 있습니다.- 캐시·
refresh— 상세수집(본문·댓글)은 허브가 이미 받은 상세가 규칙에 맞으면 사이트에 다시 접속하지 않고 다시 씁니다(refresh=incremental, 기본 — 게시 7일 미만 글은 항상 새로, 7~30일 글은 받은 지 7일 이내 상세만, 그보다 오래된 글은 다시 씀). 다시 쓴 글은extra.detail_cached_at에 원래 받은 시각이 붙고 결과 형식은 같습니다. 항상 새로 받으려면refresh=full. - 목록 캐시 — 결과가 많아 날짜별로 나눠 조회하는 사이트·검색어에서, 허브가 이미 끝까지 받은 날짜(게시 7일 이상 · 받은 지 7일 이내, 게시 30일 넘은 날은 30일 이내 · 같은 제외어)는 카카오에 다시 묻지 않고 허브 원장으로 답합니다(
extra.ledger_at). 사이트별로 실측(늦게 색인되는 글·사라지는 글)을 확인한 뒤 차례로 켭니다 — 지금 켜진 사이트: 없음. 원장으로 답한 날이 있으면limit보다 조금 많이 돌려줄 수 있습니다 — 그 사이 사이트에서 지워진 글이limit자리를 차지해 최신 글이 빠지지 않게 하려는 것이고, 넘은 수는channel_info.list_cache.over_limit입니다. 항상 카카오에 새로 조회하려면refresh=full. limit을 주면 일찍 멈춥니다 — 결과가 많아 날짜별로 나눠 조회하는 사이트는 최신 날짜부터 조회하다가, 그날까지 모은 글이limit이상이면 더 옛 날짜는 조회하지 않습니다(돌려주는 글은 끝까지 조회한 것과 같고 카카오 호출이 크게 줄어듦). 이때channel_info.list_stopped_before에 그 날짜가 붙고,found·keyword_hits는 기간 전체가 아니라 조회한 날짜까지의 수입니다. 상세수집 +exclude_keywords요청은 본문 제외로 글이 빠질 수 있어 끝까지 조회합니다.
결과 수신(폴링·콜백) 방식은 비동기 & 콜백을 참고하세요.