Scraper Hub API

flex 동료 휴가 일정

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

채널 코드 flex_time_off · 수집 환경 windows

flex 홈의 "동료 일정 → 일정 보기" 와 같은 데이터 — 동료(전 구성원 캘린더)의 휴가를 기간으로 수집합니다. 하루 종일/시간 단위(반차 등), 승인 대기(미확정) 여부, 부서가 함께 옵니다. 휴가 종류(연차/반차/병가 등)는 flex 가 동료에게 보여주지 않아 "휴가" 로만 옵니다. 여러 날 휴가는 하루씩 나뉘어 오고 같은 휴가는 extra.task_key 로 묶입니다. 선택으로 생일·입사 기념일도 함께 받습니다. 수집 서버의 flex 수집기 앱이 전용 Chrome 프로필로 flex 에 로그인해 두고(세션 7일, 쓸 때마다 연장), 풀리면 앱에 저장된 아이디/비밀번호로 자동 로그인합니다 — 아이디/비밀번호는 API 로 보내지 않습니다. server 를 비우면 허브가 지금 가능한 flex 서버(온라인 · 로그인됨 · 대기 작업 적은 순)를 골라 배정하고, 가능한 서버가 없으면 409 no_flex_server 입니다. 지정한 서버가 오프라인이거나 flex 자동 로그인까지 실패한 상태면 409, flex 수집기가 없는 서버는 422 not_flex_server 입니다.

요청 파라미터

아래 값들을 POST /api/v1/collect 의 params 객체에 담아 보냅니다.

키타입필수기본설명
server text — — 비우면 허브가 지금 flex 수집이 가능한 서버(온라인 · flex 로그인됨 · 대기 작업 적은 순) 중 하나를 골라 배정하고, 응답의 server 로 알려줌. 특정 서버로 보내려면 그 서버 ID(예: win-flex-01, GET /flex-servers 로 조회)
from_date date (YYYY-MM-DD) — — 포함. 비우면 오늘
to_date date (YYYY-MM-DD) — — 포함. 비우면 시작일+30일. 기간은 최대 366일
include_tentative bool — true 승인 전 휴가(화면의 "미확정", extra.status=TENTATIVE)도 포함
include_anniversaries bool — false extra.kind=birthday / company_join_day 항목을 함께

요청 예시

curl -X POST https://scraper.conbus.co.kr/api/v1/collect \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "channel": "flex_time_off", "params": { "from_date": "2026-10-01", "to_date": "2026-10-31", "include_tentative": true, "include_anniversaries": false } }'

응답 (202 Accepted)

요청은 즉시 큐에 적재되고 request_id 를 돌려줍니다. 실제 수집은 워커가 비동기로 처리합니다.

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

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

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

진행 중 (pending / running)

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

{ "success": true, "data": { "request_id": 42, "channel": "flex_time_off", "status": "running", "external_ref": null, "result_count": null, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": null, "duration_ms": null, "duration_sec": null, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:01:30+09:00", "progress": { "count": 12, "phase": "list" }, "elapsed_ms": 85000 } }

완료 (done)

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

{ "success": true, "data": { "request_id": 42, "channel": "flex_time_off", "status": "done", "external_ref": null, "result_count": 1, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": "2026-06-16T09:02:00+09:00", "duration_ms": 115000, "duration_sec": 115, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:02:00+09:00", "items": [ { "post_id": "01m368fe8kmdfhge0pw2kxg1dh", "url": null, "title": "길동 · 휴가 (09:00~14:00) [미확정]", "author": "길동", "posted_at": "2026-10-02T09:00:00+09:00", "views": null, "comment_count": null, "recommends": null, "body": null, "source": "마케팅팀", "extra": { "kind": "time_off", "event_id": "01m368fe8kmdfhge0pw2kxg1dh", "calendar_id": "01h5pg4nd35vskng3sf4b9jj6v", "user_id": "aB3dE5fG7h", "name": "길동", "department": "마케팅팀", "date": "2026-10-02", "start_at": "2026-10-02T09:00:00+09:00", "end_at": "2026-10-02T14:00:00+09:00", "all_day": false, "time_range": "09:00~14:00", "minutes": 300, "status": "TENTATIVE", "tentative": true, "summary": "휴가", "title_raw": "🌴 [길동] 휴가 - 9:00 AM ~ 2:00 PM", "task_key": "01m368fcy2ba17616rat433pcd", "leave_dates": [ "2026-10-02" ], "leave_first": "2026-10-02", "leave_last": "2026-10-02", "leave_days_in_range": 1, "source_kind": "flex_time_off" } } ] } }

실패 (failed)

status 가 failed 면 error 에 사유가 옵니다(items 없음). 일시적 실패는 자동 재시도되며, 위 응답은 마지막 시도 기준입니다.

{ "success": true, "data": { "request_id": 42, "channel": "flex_time_off", "status": "failed", "external_ref": null, "result_count": 0, "started_at": "2026-06-16T09:00:05+09:00", "finished_at": "2026-06-16T09:00:16+09:00", "duration_ms": 11000, "duration_sec": 11, "created_at": "2026-06-16T09:00:00+09:00", "updated_at": "2026-06-16T09:00:16+09:00", "error": "flex 로그인 필요 — 자동 로그인 실패 — 아이디 또는 비밀번호가 틀렸습니다 (수집 PC 의 flex 수집기 계정 메뉴에서 확인 후 다시 요청)" } }

최상위 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로 중단할 수 있습니다.

결과 필드 (items[])

필드설명
post_id일정 ID — 휴가는 하루 단위 이벤트 ID(여러 날 휴가는 날짜마다 다른 ID, 같은 휴가는 extra.task_key 로 묶임). 생일·입사 기념일은 이벤트ID@날짜
urlnull — 일정별 주소가 없습니다
title / bodytitle=표시 이름 · 구분(시간 단위면 (09:00~14:00), 승인 대기면 [미확정] 을 붙임) / body=null
author구성원 표시 이름(flex 의 닉네임)
posted_at작성 시각 (ISO8601, KST) — 휴가 시작 시각. 하루 종일이면 그날 00:00
views / comment_countnull / null
recommendsnull
source구성원의 부서명
extra.kindtime_off · birthday · company_join_day
extra.name / department / user_id구성원 표시 이름 · 부서 · 사용자 ID(구성원 채널 post_id 와 같은 값)
extra.date일정 날짜(KST, YYYY-MM-DD)
extra.start_at / end_at시작 · 끝(끝은 미포함, KST)
extra.all_day하루 종일 여부
extra.time_range / minutes시간 단위 휴가의 시간대와 길이(분) — 반차 여부 판단에 사용
extra.status / tentativeCONFIRMED(확정) · TENTATIVE(승인 대기, 화면의 "미확정")
extra.summary / title_raw구분(항상 휴가) · flex 원래 제목
extra.task_key / leave_dates / leave_first / leave_last / leave_days_in_range같은 휴가 묶음 ID와 요청 기간 안의 그 휴가 날짜들 — 여러 날 휴가를 한 건으로 합칠 때
extra.join_date / years입사일 · 근속 연수(company_join_day만)
extra.source_kindflex_time_off
채널 참고
  • 수집 서버 자동 선택 — server 는 선택입니다. 비우면 허브가 지금 flex 수집이 가능한 서버(온라인 · flex 로그인됨 · 대기 작업 적은 순) 중 하나를 골라 배정하고 202 응답의 server 로 알려줍니다. 가능한 서버가 없으면 409 no_flex_server(이유 포함). 특정 서버로 보내려면 GET /flex-servers 의 서버 이름을 넣으세요 — 그 서버가 오프라인이면 409 server_offline, flex 로그인이 풀리고 자동 로그인까지 실패한 상태면 409 account_login_required(추가 인증 화면이면 account_blocked), flex 수집기가 없는 서버면 422 not_flex_server. 배정은 요청 시점에 고정되므로 고른 서버가 그 뒤 꺼지면 그 요청은 실패로 끝납니다(다시 요청하면 살아 있는 서버로 갑니다).
  • 휴가 종류(연차·반차·병가 등)는 오지 않습니다 — flex 가 동료에게는 "휴가" 로만 보여 주기 때문입니다(홈 "동료 일정" 과 같은 범위). 반차 여부는 all_day=false 와 minutes 로 판단하세요.
  • 기간은 from_date~to_date(둘 다 포함, 최대 366일). 비우면 오늘부터 30일. 기간 안에 걸친 날짜만 오므로, 여러 날 휴가가 기간 경계에 걸리면 leave_dates 도 기간 안의 날짜만 담깁니다.
  • 수집 계정 본인의 일정은 포함하지 않습니다(동료 캘린더 전체 = 수집 계정을 뺀 전 구성원). 다른 동료의 미팅 등 비공개 일정은 받지 않습니다.

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