채용 소스 조사 브리프 (2026-07-22)

PRD·설계 입력용 사전 조사 결과. 실제 HTTP 호출로 검증한 사실만 기록합니다. 추측은 “미검증”으로 표기합니다.

요약

  • 어댑터는 회사별이 아니라 채용 플랫폼별입니다. 은행·공기업 다수가 인크루트/잡코리아 채용대행을 공유하므로, 파서 1개가 회사 여러 곳을 커버합니다.
  • 회사 등록은 회사 → (플랫폼 타입, slug) 매핑으로 환원됩니다.
  • SPA라도 내부 JSON API가 있으면 헤드리스 브라우저가 불필요합니다 (배민 사례).

검증된 소스 (실제 호출 확인)

1. 당근 — Greenhouse 공개 API

GET https://boards-api.greenhouse.io/v1/boards/daangn/jobs
→ 200, JSON, 총 38건, 인증 불필요
필드용도
id안정 식별 키
title직무 키워드 매칭
updated_at변경 감지
first_published신규 판정
absolute_url공고 링크
metadata[]고용형태(정규직/계약직/인턴)·경력·키워드 — 근무형태 추출 1순위 근거
  • 마감일 필드가 없습니다 → 상시채용 취급, 7일 반복 리마인드 대상.
  • {slug} 부분만 회사별로 다릅니다 (daangn). 국내 IT 다수가 동일 패턴.

2. 배민(우아한형제들) — 내부 JSON API

공식 API는 없고 career.woowahan.com은 SPA(Vue)입니다. JS 번들(chunk-common.*.js)에서 엔드포인트를 발견했습니다.

GET https://career.woowahan.com/w1/recruits?page=1&size=5
→ 200, JSON, 총 61건, 인증 불필요
필드값 예시용도
recruitSeq25496안정 식별 키
recruitNumberR2504040보조 식별자
recruitVersion36변경 감지 — 해시 불필요, 버전 증가 = 수정
recruitOpenDate2025-04-28 18:30:00오픈 판정
recruitEndDate9999-12-31 00:00:00상시채용을 이 값으로 표현
recruitCloseDate2999-12-31 00:00:00마감 판정 보조
careerRestrictionMinYears / MaxYears5 / 15경력 조건
recruitNameB2B영업직무 키워드 매칭
  • 페이지네이션: page=1 요청에 pageNumber: 2 응답 — 0-based/1-based 확인 필요(미검증). 구현 시 전량 수집으로 검증할 것.
  • 비공식 API 리스크: 사전 통보 없이 스키마가 바뀝니다. 소스 고장 감지(N일 연속 0건 → 알림)가 필수입니다.
  • /w1/applicant-favorites/available-recruits 등 다른 엔드포인트도 번들에 존재하나 인증이 필요할 것으로 보입니다 (미검증).

3. 수협은행 — 인크루트 채용대행 (HTML)

https://recruit.incruit.com/suhyup-bank/
→ 200, HTML 서버 렌더링 (SPA 아님)
  • 목록에 제목·링크·마감일이 함께 노출됩니다. 확인된 형식: 2026.07.16 00:00 ~ 2026.07.30 17:00
  • 인코딩이 EUC-KR 계열입니다 — UTF-8로 읽으면 깨집니다. charset 처리 필수.
  • 패턴: recruit.incruit.com/{slug}/ — slug만 바꾸면 다른 회사에 재사용됩니다.

4. 우리은행 — 인크루트 + 잡코리아 (혼합)

  • 신입: https://recruit.incruit.com/wooribank/ (수협과 동일 어댑터)
  • 경력: https://jrs.jobkorea.co.kr/wooribank (잡코리아 채용대행 — 별도 어댑터 필요)
  • 로그인 필요 공고 실존 확인: recruit.incruit.com/wooribank/job/2507310011 이 “비공개 공고 로그인 페이지”로 동작합니다 → 수동 등록 대상 판별 로직이 필요합니다.
  • 한 회사가 복수 소스를 가질 수 있음이 확인됩니다 → Company : JobSource = 1:N.

애그리게이터 소스 조사 (2026-07-22 추가)

회사 지정 소스와 성격이 다릅니다 — 회사에 종속되지 않는 전역 소스이며, “검색 조건”으로 수집합니다.

원티드 — 공개 JSON API 2종 동작 확인

GET https://www.wanted.co.kr/api/v4/jobs?country=kr&job_sort=job.latest_order&locations=all&years=-1&limit=5
→ 200, JSON, 인증 불필요. 커서 페이지네이션(`links.next`에 offset 포함)
GET https://www.wanted.co.kr/api/chaos/navigation/v1/results?job_group_id=518&country=kr&job_sort=job.latest_order&limit=5
→ 200, JSON, 직무 그룹(`job_group_id`) 필터 지원
  • 응답에 company.id·company.name·title·address·reward_total·status(active) 포함. 회사 ID가 있어 회사 단위 그루핑이 가능합니다.
  • robots.txt가 CloudFront WAF에 의해 403입니다 — robots 기준 판단이 불가하고, API는 현재 열려 있으나 WAF 정책 변경 시 예고 없이 차단될 수 있습니다. 소스 고장 감지(FR-19)가 여기서 특히 중요합니다.

전체 플랫폼 조사 결과 (11종 실측)

기술적 가능 여부와 규약상 허용 여부가 서로 다릅니다. “200이 온다”와 “수집해도 된다”를 분리해 판정했습니다.

채택 가능 — 규약 청정

플랫폼엔드포인트안정 ID마감일 / 상시채용변경 감지볼륨(백엔드)robots
사람인saramin.co.kr/zf_user/jobs/list/job-category?cat_kewd=84&page=N&page_count=100 (HTML, UTF-8)rec_idx~MM/DD 연도 없음 / 채용시·상시채용 문자열수정일 YY/MM/DD 존재2,594건해당 경로 미차단. Crawl-delay 없음
점핏jumpit-api.saramin.co.kr/api/positions?page=1&size=200&jobCategory=1 (JSON, 무인증)idclosedAt ISO / alwaysOpen 불리언없음 → 필드 해시 필요118건 (전체 627)/positions 미차단. GPTBot만 차단
원티드wanted.co.kr/api/v4/jobs, /api/chaos/navigation/v1/results (JSON, 무인증)id미검증미검증미검증robots.txt 자체가 WAF 403 → 판단 불가
  • 사람인은 무료 공개 API도 존재합니다 (oapi.saramin.co.kr/job-search, access-key 신청·승인제). 발급받으면 HTML 파싱에서 JSON으로 전환하는 게 안전합니다.
  • 사람인 curl 기본 UA는 307로 막힙니다 — UA 헤더만 넣으면 통과합니다 (WAF·캡차 없음).
  • 점핏은 alwaysOpen=true일 때 closedAt을 마감 판정에 쓰면 안 됩니다.

규약 회색지대 — 채택 시 사용자 판단 필요

플랫폼기술 평가규약 문제
리멤버 커리어조사한 것 중 가장 깔끔POST career-api.rememberapp.co.kr/job_postings/search 무인증 JSON, min_updated_at 증분 필터 지원(1일 1회 델타 수집에 최적), ends_at+explicit_due로 상시채용 명시, per 상한 50, 백엔드 258건이용약관 제13조 1항 24호가 “스크래퍼”를 이름으로 지목해 금지. 검색엔진 인덱싱만 예외
잡코리아상세에 JSON-LD JobPostingidentifier·hiringOrganization·validThrough(ISO)를 정규화 없이 사용. 봇 차단 없음. 백엔드 1,958건robots.txtClaudeBot·anthropic-ai 등 AI 크롤러를 Disallow: /로 명시 차단. 키워드 검색 경로는 일반 크롤러에게도 차단. 허용 경로는 목록 1페이지 수준

불가

플랫폼사유
잡플래닛Cloudflare WAF가 robots.txt전 경로 403 하드 블록. UA·전체 브라우저 헤더·다른 네트워크 모두 동일. cf-mitigated: challenge 없음 = JS 챌린지가 아니라 즉시 거부 → 헤드리스로도 통과 보장 없음. 응답 본문 미수신으로 나머지 전부 미검증
링크드인robots.txt User-agent: * → Disallow: / (화이트리스트 신청제) + 약관 §8.2 스크래핑 명문 금지. 게스트 API는 200이 오지만 허용성에서 탈락
로켓펀치내부 API가 익명 호출에 401(A0004). 상세·sitemap은 AWS WAF JS 챌린지(202). 조사 중 반복 요청으로 목록까지 챌린지 전환 → IP 레이트 챌린지 존재. 로그인 세션 + 헤드리스가 필요해 1인용 도구에 부적합
프로그래머스 커리어서비스 종료career.programmers.co.kr DNS NXDOMAIN, /job 404, sitemap에 career 부재 (2025-04-28 종료)

추가 실측 3종 (2026-07-22, 사용자 선정)

플랫폼엔드포인트안정 ID마감일 / 상시채용변경 감지인코딩판정
워크넷/고용24 공식 오픈 APIopenapi.work.go.kr/opi/opi/opia/wantedApi.do?authKey=&callTp=L&returnType=XML (data.go.kr 3038225)wantedAuthNocloseDt / “채용시까지·상시채용” 문자열 센티널regDt(등록일)만, 수정일·버전 없음XML만(JSON 미지원), UTF-8조건부 — 인증키 발급 시 즉시
서핏POST api.surfit.io/v1/jobs/all body {"page":N} (JSON, 무인증)idis_closed 불리언 + close 문자열(“상시채용”) + ads_end_at없음 → 필드 해시UTF-8조건부 — 약관 회색지대
잡알리오GET job.alio.go.kr/getCSVRecruitList.do (CSV 전량 export) + recruit.do(HTML 목록) + recruitview.do?idx=(상세)idx (CSV엔 없고 HTML 목록에만)마감일 항상 실제 날짜(상시채용 센티널 없음)등록일CSV는 MS949(EUC-KR), HTML은 UTF-8수집 가능
  • 워크넷: 키 없는 호출이 messageCd 002(인증키 오류)에서만 막히고 나머지는 200 통과 → 유효 키만 있으면 즉시 동작. callTp=L(목록)/D(상세), 직종·지역·경력·기간·페이지 필터 존재. 회사 식별자는 busiNo(사업자등록번호). XML 파서 필수, 지역·직종은 공통코드 API(15037287)로 매핑 선행. 갱신 실시간. 일일 트래픽 한도·키 승인 소요는 발급 후 확인(미검증). 사용자가 data.go.kr에서 직접 인증키를 신청해야 합니다.
  • 서핏: SPA(webpack)였지만 번들 grep으로 api.surfit.io/v1 baseURL + POST /jobs/all 발견. 전체 약 971건(개발 직군 최대 비중). WAF·캡차 없음, Origin/Referer 필요. robots.txt/jobs 미차단. 다만 기업 서비스 약관에 크롤링·미러링 금지 취지 문구 존재(정확한 국문 원문은 페이지 리다이렉트로 미검증). speciality 필터 값 포맷 미확정(slug_path는 500). 리멤버·잡코리아와 같은 회색지대.
  • 잡알리오: 가장 수집이 쉬움getCSVRecruitList.do가 진행 공고 전량(약 959건)을 CSV로 한 번에 반환. 서버 렌더링이라 SPA 문제 없음. robots.txt 부재, WAF 없음. 정부 사이트라 리스크 낮음. 주의 2건: ① CSV는 MS949 디코딩 필수(인크루트와 같은 함정) ② CSV에 idx가 없어 안정 ID는 HTML 목록에서 취득해야 함. 공공기관 전용이라 개발 직무 비중은 낮음.

아직 미검증 — 향후 확장 후보

플랫폼판단
OKKY Jobs (jobs.okky.kr)개발자 전용, Next.js(__NEXT_DATA__)라 접근 방법론 동일. 중복 적음. P1 이후

제외 권고 8종 — 캐치·슈퍼루키·커리어리·그리팅·잡다·나라일터·클린아이·인디드류 메타서치. 사유는 개발 공고 부재, 다른 플랫폼과 중복 과다, 또는 애그리게이터가 아님(그리팅은 ATS 호스팅이라 통합 검색 없음).

금융권 전용 애그리게이터는 존재하지 않습니다 — 은행 채용은 ①잡알리오(금융공기업) ②각 은행 자체 페이지 ③인크루트·잡코리아 채용대행으로 흩어지며, 이미 조사된 소스로 커버됩니다.

애그리게이터가 기존 설계에 주는 영향 (P1 설계 시 필수 고려)

영향내용
소스 모델 변경현재 Company : JobSource = 1:N으로 소스가 회사에 종속됩니다. 애그리게이터는 회사에 속하지 않는 전역 소스이고 수집 파라미터가 “회사 slug”가 아니라 “검색 조건(직무 그룹·지역·경력)“입니다. 소스 유형을 회사 종속형·애그리게이터형 2종으로 분리해야 합니다
크로스 소스 중복같은 공고가 당근 Greenhouse와 원티드에 동시 존재합니다. 현재 식별 키 (job_source_id, source_job_id)로는 별개 공고로 저장돼 알림이 2번 갑니다. 회사·제목·마감일 기반 크로스 소스 중복 판정과 대표 공고 선정 규칙이 필요합니다
볼륨 폭증회사 지정 소스는 회사당 수십 건인데, 원티드에서 직무 그룹 하나만 걸어도 수백~수천 건입니다. “매칭 실패 공고도 저장”(FR-25) 원칙이 여기서 폭발하므로, 애그리게이터는 수집 단계 필터링이 필요합니다
회사 자동 생성애그리게이터 공고의 회사가 등록되지 않은 회사일 수 있습니다. 자동 생성할지, 등록된 회사의 공고만 취할지 정책이 필요합니다

어댑터 개발 표준 절차

새 회사 등록 시 아래 순서로 판정합니다. 위 단계에서 해결되면 아래로 내려가지 않습니다.

단계방법비용해당 사례
① 공식 공개 APIGreenhouse/Lever/Ashby 등 표준 ATS매우 낮음당근
② 내부 API 탐색JS 번들에서 엔드포인트 추출 후 직접 호출낮음배민
③ HTML 파싱서버 렌더링 목록 페이지중간인크루트(수협·우리)
④ 헤드리스 브라우저최후 수단 — Docker 비용 큼높음현재 해당 없음
⑤ 수동 등록로그인 필수·자소서 필요 공고우리은행 비공개 공고

소스별 마감 판정 근거 차이

어댑터가 자신이 지원하는 판정 근거를 선언해야 합니다.

소스마감일 제공마감 판정 근거
Greenhouse (당근)없음목록에서 연속 미발견
배민있음 (recruitEndDate, 상시는 9999-12-31)마감일 경과 + 연속 미발견
인크루트있음 (목록에 노출)마감일 경과 + 연속 미발견

구현 시 확인 필요 (미검증)

  • 배민 API 페이지네이션 인덱스 base
  • 배민 API의 상세 조회 엔드포인트 존재 여부 (JD 본문 확보용 — 근무형태 추출에 필요)
  • 잡코리아 채용대행(jrs.jobkorea.co.kr/{slug}) 페이지 구조
  • 각 소스의 robots.txt 및 이용약관

출처