Scraper Hub API

커뮤니티 통합 검색

플레이그라운드에서 수집 →

채널 코드 community_search · 수집 환경 linux

키워드 하나로 국내 커뮤니티 19곳(디시인사이드·뽐뿌·클리앙·루리웹·더쿠·인벤·보배드림·82쿡·오늘의유머·오르비·와이고수·배틀페이지·HYGALL·긱뉴스·알지롱·엠엘비파크·네이트판·다모앙·인스티즈)의 글을 기간 단위로 한 번에 모읍니다. 카카오(Daum) 웹문서 검색으로 사이트마다 기간 안의 글을 끝까지 받아(기본수집) 제목·요약·작성시각(대부분 초 단위 — 사이트에 따라 분·날짜 단위)·주소·사이트·게시판을 돌려줍니다 — 사이트에 직접 접속하지 않아 빠르고(보통 수 초~수십 초) 차단 걱정이 없습니다. 동의어·영문·별칭을 '함께 검색'(aliases)에 넣으면 검색어마다 받아 같은 글은 한 번만 담고 글마다 걸린 검색어를 표시합니다. 본문·댓글이 필요하면 collect_body·collect_comments 를 켜세요(상세수집) — 목록을 다 모은 뒤 최신 글부터 최대 3,000건을 사이트마다 직접 열어 받으므로 수 분~수 시간 걸립니다(아래 '기본수집과 상세수집').

요청 파라미터

아래 값들을 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로 가립니다(아래 상세 결과 확인). 사이트별 특이 사항은 아래 표의 상세수집 참고.

상세수집 요청 예시

{ "channel": "community_search", "params": { "keyword": "맥심", "start_date": "2026-10-01", "end_date": "2026-10-07", "sites": "dcinside, theqoo", "collect_body": true, "collect_comments": true, "detail_limit": 500 } }

진행 중에는 목록 단계(progress.phase = "list")를 지나 상세 단계("detail")가 되고, progress.detail에 대상·끝난 수가 나옵니다(count = detail.done — 상세가 끝난 글 수. 각 값의 뜻은 아래 진행 중 절). 이 예시는 목록에서 405건을 모아(detail_limit 500보다 적어 전부가 상세 대상) 디시인사이드 두 묶음(100건)을 처리하는 중입니다:

{ "progress": { "count": 260, "phase": "detail", "walks": { "total": 2, "done": 2 }, "kakao_calls": 12, "found": 405, "detail": { "targets": 405, "done": 260, "waiting": 45, "in_progress": 100, "unavailable": 0 } } }

상세를 받은 글 예시 (items[] 한 건)

{ "post_id": "dcinside:krstock/3600628", "url": "https://gall.dcinside.com/mgallery/board/view/?id=krstock&no=3600628", "title": "맥심 모카골드 대용량 어디가 제일 싸요", "author": "ㅇㅇ", "posted_at": "2026-10-06T14:58:20+09:00", "posted_at_raw": "2026-10-06 14:58:20", "views": 1532, "comment_count": 2, "recommends": 3, "body": "맥심 모카골드 대용량 사려는데\n쿠팡이 싼가요 마트가 싼가요", "source": "디시인사이드 / 국내주식 마이너 갤러리", "extra": { "site": "dcinside", "site_label": "디시인사이드", "board": "krstock", "gallery_type": "M", "snippet": "맥심 모카골드 대용량 사려는데 쿠팡이 싼가요 마트가 싼가요 ...", "keywords": [ "맥심" ], "source_kind": "community_search", "comments": [ { "comment_id": "1290345", "author": "ㅇㅇ", "text": "창고형 마트가 제일 쌈", "date": "2026-10-06 15:01:12", "is_reply": false, "date_raw": "10.06 15:01:12" }, { "comment_id": "1290351", "author": "주갤러", "text": "쿠팡 와우면 비슷함", "date": "2026-10-06 15:04:40", "is_reply": true, "date_raw": "10.06 15:04:40", "parent_id": "1290345" } ], "detail": { "status": "ok", "collected": true, "posted_at": "2026-10-06 14:58:20", "kakao_posted_at": "2026-10-06 14:58:20", "full_body": true, "comments_truncated": false, "board_name": "국내주식 마이너 갤러리", "gallery_type": "M" } } }

상세를 받은 글은 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). 상세수집 요청이면 모든 글에 붙습니다
reasonunavailable일 때만 — 그 사이트의 상세를 받을 수 없는 이유(예: "인스티즈가 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_bodycollect_body를 켜고 상세를 받은 글만 true — body가 글 페이지의 전체 본문이라는 표시(짧은 글은 카카오 요약과 글자까지 같을 수 있음)
kakao_posted_at결과 posted_at을 글 페이지 시각으로 쓴 글만 — 원래 카카오 검색 시각(YYYY-MM-DD HH:MM:SS, 같은 값일 수도 있음). 기간 판정은 이 시각 기준입니다
board_name게시판·갤러리 이름(글 페이지에 있을 때) — 뽐뿌·오늘의유머·HYGALL·인스티즈·오르비·긱뉴스는 없고, 엠엘비파크는 게시판 코드(bullpen) 그대로
comments_truncatedtrue면 댓글을 다 담지 못함 — 글당 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)로 미리 알려 줍니다. 그 사이트 글은 기다리지 않고 목록(카카오) 정보만 담깁니다.
상세 불가 사이트(인스티즈)의 글 예시와 사이트별 집계 예시:
{ "items": [ { "post_id": "instiz:name/67711168", "title": "에어팟 프로 3 써본 사람", "body": "에어팟 프로 3 노캔 어때? 지금 2세대 쓰는데 ...", "source": "인스티즈 / name", "extra": { "site": "instiz", "snippet": "에어팟 프로 3 노캔 어때? 지금 2세대 쓰는데 ...", "keywords": [ "에어팟" ], "detail": { "status": "unavailable", "collected": false, "reason": "인스티즈가 Cloudflare 봇 확인(HTTP 403 \"Just a moment...\")으로 글 페이지 접근을 막아 상세(본문·댓글)를 받을 수 없음(2026-10-12 확인) — 목록(카카오 검색) 정보만 제공" } } } ], "channel_info": { "sites": [ { "site": "clien", "label": "클리앙", "found": 2, "detail": { "collected": 2, "not_collected": 0, "available": true } }, { "site": "instiz", "label": "인스티즈", "found": 8, "detail": { "collected": 0, "not_collected": 8, "available": false, "reason": "인스티즈가 Cloudflare 봇 확인(HTTP 403 \"Just a moment...\")으로 글 페이지 접근을 막아 상세(본문·댓글)를 받을 수 없음(2026-10-12 확인) — 목록(카카오 검색) 정보만 제공" } } ], "detail": { "collected": 2, "not_collected": 8, "ok": 2, "unavailable": 8 } }, "warnings": { "detail_unavailable": [ { "site": "instiz", "label": "인스티즈", "reason": "인스티즈가 Cloudflare 봇 확인(HTTP 403 \"Just a moment...\")으로 글 페이지 접근을 막아 상세(본문·댓글)를 받을 수 없음(2026-10-12 확인) — 목록(카카오 검색) 정보만 제공", "count": 8 } ] } }
(예시는 필요한 칸만 보였습니다 — 실제 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 — 카카오 응답 오류가 이어졌습니다.
카카오가 사용량이 적은데도 '한도 초과'로 잠깐 거절하면 그 키를 5·15·30·60분 쉬었다가 이어 받습니다 — 요청은 실패하지 않고 늦어질 뿐이며, 목록 단계가 3시간을 넘으면 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와 같은 층)에 붙습니다. 모양 예시(실제로는 해당하는 키만 옴):
{ "warnings": { "partial": [ { "site": "dcinside", "keyword": "맥심", "reason": "call_budget", "missing": [ [ "2026-10-01", "2026-10-03" ] ] } ], "items_capped": { "max_items": 50000, "dropped": 1234 }, "detail_incomplete": [ { "site": "dcinside", "reason": "blocked", "count": 120 } ], "detail_capped": { "detail_limit": 500, "without_detail": 740 }, "detail_unavailable": [ { "site": "instiz", "label": "인스티즈", "reason": "인스티즈가 Cloudflare 봇 확인(HTTP 403 \"Just a moment...\")으로 글 페이지 접근을 막아 상세(본문·댓글)를 받을 수 없음(2026-10-12 확인) — 목록(카카오 검색) 정보만 제공", "count": 8 } ] } }
글을 하나도 받지 못한 채 quota·nokey·ip·auth로 멈추면 0건 완료가 아니라 failed입니다(아래 실패).

요청 예시

curl -X POST https://scraper.conbus.co.kr/api/v1/collect \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "channel": "community_search", "params": { "keyword": "맥심", "aliases": "maxim", "start_date": "2026-10-01", "end_date": "2026-10-07", "sites": "dcinside, theqoo, ruliweb", "exclude_keywords": "구인" } }'

응답 (202 Accepted)

요청을 받으면 request_id 를 돌려주고 허브가 곧바로 목록 수집을 시작합니다(큐·워커 대기 없음). 202 응답의 status 는 pending 이지만 조회하면 처음부터 running 입니다. 상세수집(본문·댓글)만 수집 서버가 사이트별로 나눠 처리합니다. 상세수집 요청의 sites에 상세 불가 사이트(지금: 인스티즈)가 있으면 202 응답에 detail_unavailable[](site·label·reason)가 붙습니다 — 그 사이트 글은 목록 정보만 옵니다.

{ "success": true, "data": { "request_id": 42, "channel": "community_search", "status": "pending", "status_url": "https://scraper.conbus.co.kr/api/v1/requests/42" } }

결과 조회 — GET /requests/{id}

같은 API 키로 request_id 를 조회합니다. 상태에 따라 응답이 달라집니다. 결과(items)는 요청별로 보관되므로 같은 글이 다른 요청(다른 키워드·재수집)에 겹쳐도 이 요청의 결과는 그대로입니다 — 여러 요청에 걸친 중복 정리는 post_id로 호출 쪽에서 하세요. 보존 기간은 완료 후 90일입니다. 보존 기간이 지나면 items 는 빈 배열이고 items_expired: true, items_keep_days 가 함께 옵니다(status 는 그대로 done).

진행 중 (pending / running)

아직 끝나지 않았으면 progress 로 진행 상황만 옵니다(items 없음).

{ "success": true, "data": { "request_id": 42, "channel": "community_search", "status": "running", "external_ref": null, "result_count": null, "started_at": "2026-10-08T09:00:00+09:00", "finished_at": null, "duration_ms": null, "duration_sec": null, "created_at": "2026-10-08T09:00:00+09:00", "updated_at": "2026-10-08T09:00:01+09:00", "progress": { "count": 230, "phase": "list", "walks": { "total": 6, "done": 4 }, "kakao_calls": 9 }, "elapsed_ms": 1300 } }

이 채널은 요청을 받자마자 허브가 시작하므로 조회하면 처음부터 running입니다(pending은 보이지 않음). progress 값:

필드설명
count목록 단계: 지금까지 모은 글 수(제목·요약 제외어는 뺀 뒤, limit·안전 상한 적용 전이라 최종 result_count보다 클 수 있음) · 상세 단계: detail.done과 같음(0부터 다시 셈)
phaselist(목록) → detail(상세수집을 켰을 때만)
walkstotal = 사이트 수 × 검색어 수(대표 키워드 + 함께 검색) · done = 끝난 수(덜 받고 멈춘 것 포함)
kakao_calls지금까지 쓴 카카오 호출 수
found상세 단계만 — 목록에서 모은 글 수
detail상세 단계만 — targets = 상세 대상(최신 글부터 detail_limit건, limit을 줬으면 결과에 남을 글 안에서) · done = 끝난 글(받음·삭제·회원 전용·실패·제외·차단 등 상태가 정해진 글) · waiting = 아직 묶음에 안 들어간 글 · in_progress = 묶음(50건)에 담겨 수집 서버를 기다리거나 처리 중인 글 · unavailable = 상세 불가 사이트라 바로 끝낸 글(done에 포함)

완료 (done)

status 가 done 이면 data.items[] 에 결과가 담깁니다. 실패 시엔 status: "failed" 와 error 가 옵니다.

{ "success": true, "data": { "request_id": 42, "channel": "community_search", "status": "done", "external_ref": null, "result_count": 421, "started_at": "2026-10-08T09:00:00+09:00", "finished_at": "2026-10-08T09:00:03+09:00", "duration_ms": 3120, "duration_sec": 3.1, "created_at": "2026-10-08T09:00:00+09:00", "updated_at": "2026-10-08T09:00:03+09:00", "channel_info": { "keywords": [ "맥심", "maxim" ], "period": { "start_date": "2026-10-01", "end_date": "2026-10-07" }, "sites": [ { "site": "dcinside", "label": "디시인사이드", "found": 412, "ref_total": { "맥심": 455, "maxim": 21 }, "complete": true }, { "site": "ruliweb", "label": "루리웹", "found": 0, "ref_total": { "맥심": 0, "maxim": 0 }, "complete": true }, { "site": "theqoo", "label": "더쿠", "found": 9, "ref_total": { "맥심": 9, "maxim": 0 }, "complete": true } ], "keyword_hits": { "맥심": 405, "maxim": 18 }, "kakao_calls": 16 }, "items": [ { "post_id": "dcinside:krstock/3600628", "url": "https://gall.dcinside.com/mgallery/board/view/?id=krstock&no=3600628", "title": "맥심 모카골드 대용량 어디가 제일 싸요", "author": null, "posted_at": "2026-10-06T14:58:20+09:00", "posted_at_raw": "2026-10-06T14:58:20.000+09:00", "views": null, "comment_count": null, "recommends": null, "body": "맥심 모카골드 대용량 사려는데 쿠팡이 싼가요 마트가 싼가요 ...", "source": "디시인사이드 / krstock", "extra": { "site": "dcinside", "site_label": "디시인사이드", "board": "krstock", "gallery_type": "M", "snippet": "맥심 모카골드 대용량 사려는데 쿠팡이 싼가요 마트가 싼가요 ...", "keywords": [ "맥심", "maxim" ], "source_kind": "community_search" } } ] } }

예시는 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_beforelimit을 채워 일찍 멈췄을 때만 — 그 날짜(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).

관리자 확인이 필요한 세 가지(nokey·ip·auth)는 고치기 전에는 다시 요청해도 결과가 같습니다.

{ "success": true, "data": { "request_id": 42, "channel": "community_search", "status": "failed", "external_ref": null, "result_count": null, "started_at": "2026-10-08T09:00:00+09:00", "finished_at": "2026-10-08T09:00:00+09:00", "duration_ms": 310, "duration_sec": 0.3, "created_at": "2026-10-08T09:00:00+09:00", "updated_at": "2026-10-08T09:00:00+09:00", "error": "카카오 검색 하루 사용량이 한도에 닿아 검색하지 못했습니다(자정 이후 다시 요청하세요)" } }

최상위 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 / bodytitle=글 제목(검색어 강조 태그와 사이트가 붙이는 이름 꼬리 — 예 : 클리앙 — 를 뗌, 상세를 받은 글은 글 페이지의 제목) / 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_kindcommunity_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 요청은 본문 제외로 글이 빠질 수 있어 끝까지 조회합니다.

결과 수신(폴링·콜백) 방식은 비동기 & 콜백을 참고하세요.