# KOBIS 영화진흥위원회 OpenAPI 정리

영화진흥위원회(KOBIS) 통합전산망 오픈API 요약 문서입니다.
crawler 프로젝트에서 사용하는 영화 관련 API 9종을 한 곳에 정리했습니다.

> 원본: `docs/*.txt` (KOBIS 공식 API 명세)

---

## 공통 사항

- **호출 방식**: REST / SOAP 선택 가능 (본 문서는 REST 기준)
- **응답 형식**: URI 확장자로 구분 — `.xml` 또는 `.json`
- **HTTP 메서드**: `GET`
- **REST 베이스 URL**: `http://www.kobis.or.kr/kobisopenapi/webservice/rest`
- **SOAP 베이스 URL**: `http://www.kobis.or.kr/kobisopenapi/webservice/soap`
- **인증**: 모든 요청에 발급키 `key` 파라미터 필수
- 예시 URL의 `key=82ca741a2844c5c180a208137bb92bd7` 는 KOBIS 공식 문서의 **샘플 키**입니다. 실제 호출 시 발급받은 키로 교체하세요.

### 엔드포인트 한눈에 보기

| 구분 | API | Operation | REST 경로 (`.json` / `.xml`) |
|------|-----|-----------|------------------------------|
| 박스오피스 | 일별 박스오피스 | `searchDailyBoxOfficeList` | `/boxoffice/searchDailyBoxOfficeList` |
| 박스오피스 | 주간/주말 박스오피스 | `searchWeeklyBoxOfficeList` | `/boxoffice/searchWeeklyBoxOfficeList` |
| 영화 | 영화 목록 | `searchMovieList` | `/movie/searchMovieList` |
| 영화 | 영화 상세 | `searchMovieInfo` | `/movie/searchMovieInfo` |
| 영화사 | 영화사 목록 | `searchCompanyList` | `/company/searchCompanyList` |
| 영화사 | 영화사 상세 | `searchCompanyInfo` | `/company/searchCompanyInfo` |
| 영화인 | 영화인 목록 | `searchPeopleList` | `/people/searchPeopleList` |
| 영화인 | 영화인 상세 | `searchPeopleInfo` | `/people/searchPeopleInfo` |
| 공통 | 공통코드 조회 | `searchCodeList` | `/code/searchCodeList` |

### 자주 쓰는 상위코드 (`comCode`, 공통코드 조회 API로 조회)

| comCode | 용도 | 사용하는 API |
|---------|------|--------------|
| `2201` | 영화유형코드 | 영화 목록 (`movieTypeCd`) |
| `2204` | 국적코드 | 영화 목록 (`repNationCd`) |
| `2601` | 영화사 분류코드 | 영화사 목록 (`companyPartCd`) |
| `0105000000` | 상영지역코드 | 박스오피스 (`wideAreaCd`) |

---

## 1. 일별 박스오피스 — `searchDailyBoxOfficeList`

특정 일자 상영작들의 박스오피스 정보를 영화구분(다양성/상업), 한국/외국, 상영지역 등으로 조회.

- **REST**: `GET /boxoffice/searchDailyBoxOfficeList.json` (또는 `.xml`)
- **SOAP**: `.../soap/boxoffice` · Operation `searchDailyBoxOfficeList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `targetDt` | ✅ | 조회 날짜 `yyyymmdd` |
| `itemPerPage` | | 결과 ROW 개수 (default `10`, 최대 `10`) |
| `multiMovieYn` | | `Y`: 다양성 영화 / `N`: 상업영화 (default 전체) |
| `repNationCd` | | `K`: 한국영화 / `F`: 외국영화 (default 전체) |
| `wideAreaCd` | | 상영지역코드(공통코드 `0105000000`) (default 전체) |

### 응답 필드

| 필드 | 설명 |
|------|------|
| `boxofficeType` | 박스오피스 종류 |
| `showRange` | 박스오피스 조회 일자 |
| `rnum` | 순번 |
| `rank` | 해당일자 박스오피스 순위 |
| `rankInten` | 전일 대비 순위 증감분 |
| `rankOldAndNew` | 신규 진입 여부 (`OLD` 기존 / `NEW` 신규) |
| `movieCd` | 영화 대표코드 |
| `movieNm` | 영화명(국문) |
| `openDt` | 개봉일 |
| `salesAmt` | 해당일 매출액 |
| `salesShare` | 해당일 상영작 매출총액 대비 매출 비율 |
| `salesInten` | 전일 대비 매출액 증감분 |
| `salesChange` | 전일 대비 매출액 증감 비율 |
| `salesAcc` | 누적 매출액 |
| `audiCnt` | 해당일 관객수 |
| `audiInten` | 전일 대비 관객수 증감분 |
| `audiChange` | 전일 대비 관객수 증감 비율 |
| `audiAcc` | 누적 관객수 |
| `scrnCnt` | 해당일자 상영 스크린수 |
| `showCnt` | 해당일자 상영 횟수 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={KEY}&targetDt=20120101
```

---

## 2. 주간/주말 박스오피스 — `searchWeeklyBoxOfficeList`

특정 일자가 속한 주차의 주간/주말/주중 상영작 박스오피스 정보를 조회.

- **REST**: `GET /boxoffice/searchWeeklyBoxOfficeList.json` (또는 `.xml`)
- **SOAP**: `.../soap/boxoffice` · Operation `searchWeeklyBoxOfficeList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `targetDt` | ✅ | 조회 날짜 `yyyymmdd` |
| `weekGb` | | `0`: 주간(월~일) / `1`: 주말(금~일, **default**) / `2`: 주중(월~목) |
| `itemPerPage` | | 결과 ROW 개수 (default `10`, 최대 `10`) |
| `multiMovieYn` | | `Y`: 다양성 영화 / `N`: 상업영화 (default 전체) |
| `repNationCd` | | `K`: 한국영화 / `F`: 외국영화 (default 전체) |
| `wideAreaCd` | | 상영지역코드(공통코드 `0105000000`) (default 전체) |

### 응답 필드

일별 박스오피스와 동일하며, 아래 필드가 추가됩니다.

| 필드 | 설명 |
|------|------|
| `boxofficeType` | 박스오피스 종류 |
| `showRange` | 대상 상영기간 |
| `yearWeekTime` | 조회일자에 해당하는 연도·주차 (`YYYYIW`) |
| `rnum` | 순번 |
| `rank` | 박스오피스 순위 |
| `rankInten` | 전일 대비 순위 증감분 |
| `rankOldAndNew` | 신규 진입 여부 (`OLD` / `NEW`) |
| `movieCd` | 영화 대표코드 |
| `movieNm` | 영화명(국문) |
| `openDt` | 개봉일 |
| `salesAmt` / `salesShare` / `salesInten` / `salesChange` / `salesAcc` | 매출액 / 점유율 / 증감분 / 증감율 / 누적 |
| `audiCnt` / `audiInten` / `audiChange` / `audiAcc` | 관객수 / 증감분 / 증감율 / 누적 |
| `scrnCnt` / `showCnt` | 상영 스크린수 / 상영 횟수 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchWeeklyBoxOfficeList.json?key={KEY}&targetDt=20120101
```

---

## 3. 영화 목록 — `searchMovieList`

영화명, 감독명 등의 조건으로 영화 목록을 조회.

- **REST**: `GET /movie/searchMovieList.json` (또는 `.xml`)
- **SOAP**: `.../soap/movie` · Operation `searchMovieList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `curPage` | | 현재 페이지 (default `1`) |
| `itemPerPage` | | 결과 ROW 개수 (default `10`) |
| `movieNm` | | 영화명으로 조회 (UTF-8) |
| `directorNm` | | 감독명으로 조회 (UTF-8) |
| `openStartDt` | | 조회 시작 개봉연도 `YYYY` |
| `openEndDt` | | 조회 종료 개봉연도 `YYYY` |
| `prdtStartYear` | | 조회 시작 제작연도 `YYYY` |
| `prdtEndYear` | | 조회 종료 제작연도 `YYYY` |
| `repNationCd` | | 국적코드(공통코드 `2204`), N개 가능 (default 전체) |
| `movieTypeCd` | | 영화유형코드(공통코드 `2201`), N개 가능 (default 전체) |

### 응답 필드

| 필드 | 설명 |
|------|------|
| `movieCd` | 영화코드 |
| `movieNm` | 영화명(국문) |
| `movieNmEn` | 영화명(영문) |
| `prdtYear` | 제작연도 |
| `openDt` | 개봉일 |
| `typeNm` | 영화유형 |
| `prdtStatNm` | 제작상태 |
| `nationAlt` | 제작국가(전체) |
| `genreAlt` | 영화장르(전체) |
| `repNationNm` | 대표 제작국가명 |
| `repGenreNm` | 대표 장르명 |
| `directors` › `peopleNm` | 영화감독(배열) › 감독명 |
| `companys` › `companyCd`, `companyNm` | 제작사(배열) › 제작사 코드, 제작사명 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key={KEY}
```

---

## 4. 영화 상세 — `searchMovieInfo`

영화코드로 영화 상세정보를 조회.

- **REST**: `GET /movie/searchMovieInfo.json` (또는 `.xml`)
- **SOAP**: `.../soap/movie` · Operation `searchMovieInfo`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `movieCd` | ✅ | 영화코드 |

### 응답 필드

**기본 정보**

| 필드 | 설명 |
|------|------|
| `movieCd` | 영화코드 |
| `movieNm` / `movieNmEn` / `movieNmOg` | 영화명 국문 / 영문 / 원문 |
| `prdtYear` | 제작연도 |
| `showTm` | 상영시간 |
| `openDt` | 개봉연도 |
| `prdtStatNm` | 제작상태명 |
| `typeNm` | 영화유형명 |

**중첩 구조 (배열)**

| 그룹 | 하위 필드 | 설명 |
|------|-----------|------|
| `nations` | `nationNm` | 제작국가명 |
| (genre) | `genreNm` | 장르명 |
| `directors` | `peopleNm`, `peopleNmEn` | 감독명 / 감독명(영문) |
| `actors` | `peopleNm`, `peopleNmEn`, `cast`, `castEn` | 배우명 / 배우명(영문) / 배역명 / 배역명(영문) |
| `showTypes` | `showTypeGroupNm`, `showTypeNm` | 상영형태 구분 / 상영형태명 |
| `audits` | `auditNo`, `watchGradeNm` | 심의번호 / 관람등급 명칭 |
| `companys` | `companyCd`, `companyNm`, `companyNmEn`, `companyPartNm` | 영화사 코드 / 명 / 명(영문) / 참여 분야명 |
| `staffs` | `peopleNm`, `peopleNmEn`, `staffRoleNm` | 스텝명 / 스텝명(영문) / 스텝역할명 |

### 예시

```
http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieInfo.json?key={KEY}&movieCd=20124079
```

---

## 5. 영화사 목록 — `searchCompanyList`

영화사명, 대표자명 등의 조건으로 영화사 목록을 조회.

- **REST**: `GET /company/searchCompanyList.json` (또는 `.xml`)
- **SOAP**: `.../soap/company` · Operation `searchCompanyList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `curPage` | | 현재 페이지 (default `1`) |
| `itemPerPage` | | 결과 ROW 개수 (default `10`) |
| `companyNm` | | 영화사명으로 조회 |
| `ceoNm` | | 대표자명으로 조회 |
| `companyPartCd` | | 분류코드(공통코드 `2601`), N개 가능 (default 전체) |

### 응답 필드

| 필드 | 설명 |
|------|------|
| `companyCd` | 영화사 코드 |
| `companyNm` / `companyNmEn` | 영화사명 / 영화사명(영문) |
| `companyPartNames` | 영화사 분류 |
| `ceoNm` | 대표자명 |
| `filmoNames` | 필모리스트 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/company/searchCompanyList.json?key={KEY}
```

---

## 6. 영화사 상세 — `searchCompanyInfo`

영화사코드로 영화사 상세정보를 조회.

- **REST**: `GET /company/searchCompanyInfo.json` (또는 `.xml`)
- **SOAP**: `.../soap/company` · Operation `searchCompanyInfo`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `companyCd` | | 영화사코드 |

### 응답 필드

| 그룹 | 필드 | 설명 |
|------|------|------|
| 기본 | `companyCd` | 영화사 코드 |
| 기본 | `companyNm` / `companyNmEn` | 영화사명 / 영화사명(영문) |
| 기본 | `ceoNm` | 대표자명 |
| `parts` | `companyPartNm` | 영화사 분류명 |
| `filmos` | `movieCd`, `movieNm`, `companyPartNm` | 참여 영화코드 / 참여 영화명 / 참여 분류명 |

### 예시

```
http://www.kobis.or.kr/kobisopenapi/webservice/rest/company/searchCompanyInfo.json?key={KEY}&companyCd=20122497
```

---

## 7. 영화인 목록 — `searchPeopleList`

영화인명, 필모그래피 조건으로 영화인 목록을 조회.

- **REST**: `GET /people/searchPeopleList.json` (또는 `.xml`)
- **SOAP**: `.../soap/people` · Operation `searchPeopleList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `curPage` | | 현재 페이지 (default `1`) |
| `itemPerPage` | | 결과 ROW 개수 (default `10`) |
| `peopleNm` | | 영화인명으로 조회 |
| `filmoNames` | | 필모리스트로 조회 |

### 응답 필드

| 필드 | 설명 |
|------|------|
| `peopleCd` | 영화인 코드 |
| `peopleNm` / `peopleNmEn` | 영화인명 / 영화인명(영문) |
| `repRoleNm` | 분야 |
| `filmoNames` | 필모리스트 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/people/searchPeopleList.json?key={KEY}
```

---

## 8. 영화인 상세 — `searchPeopleInfo`

영화인코드로 영화인 상세정보를 조회.

- **REST**: `GET /people/searchPeopleInfo.json` (또는 `.xml`)
- **SOAP**: `.../soap/people` · Operation `searchPeopleInfo`
  > ⚠️ SOAP Operation 표기가 원문에서 `searchpeopleInfo`(소문자 p)로 되어 있음 — SOAP 사용 시 주의.

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `peopleCd` | | 영화인코드 |

### 응답 필드

| 그룹 | 필드 | 설명 |
|------|------|------|
| 기본 | `peopleCd` | 영화인 코드 |
| 기본 | `peopleNm` / `peopleNmEn` | 영화인명 / 영화인명(영문) |
| 기본 | `sex` | 성별 |
| 기본 | `repRoleNm` | 영화인 분류명 |
| `filmos` | `movieCd`, `movieNm`, `moviePartNm` | 참여 영화코드 / 참여 영화명 / 참여분야 |
| 기본 | `homepages` | 관련 URL |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/people/searchPeopleInfo.json?key={KEY}&peopleCd=20164556
```

---

## 9. 공통코드 조회 — `searchCodeList`

특정 상위 코드값을 조건으로 하위 코드정보를 조회. (국적/유형/분류/지역 코드 등)

- **REST**: `GET /code/searchCodeList.json` (또는 `.xml`)
- **SOAP**: `.../soap/code` · Operation `searchCodeList`

### 요청 파라미터

| 변수 | 필수 | 설명 |
|------|:----:|------|
| `key` | ✅ | 발급받은 키 값 |
| `comCode` | ✅ | 조회하고자 하는 상위 코드 (예: `2204`, `2201`, `2601`, `0105000000`) |

### 응답 필드

| 필드 | 설명 |
|------|------|
| `fullCd` | 상위코드 |
| `korNm` | 코드 국문명 |
| `engNm` | 코드 영문명 |

### 예시

```
http://kobis.or.kr/kobisopenapi/webservice/rest/code/searchCodeList.json?key={KEY}&comCode=0105000000
```

---

## 구현 현황 (crawler ↔ movie 사이트) — 2026-07-22 기준

| KOBIS API | crawler 구현 | crawler 엔드포인트 | movie 사이트 사용처 |
|---|:---:|---|---|
| 일별 박스오피스 | ✅ | `GET /movie/searchDailyBoxOfficeList` | /movie/rank (평일) |
| 주간/주말 박스오피스 | ✅ | `GET /movie/searchWeeklyBoxOfficeList` | /movie/rank (주말) |
| 영화 목록 | ✅ | `GET /movie/searchMovieList` + `/cron/list` | (수집 전용 — 검색 페이지는 tb_movie 직조회) |
| 영화 상세 | ✅ | `GET /movie/searchMovieInfo` + `/cron/info` | /movie/rank/{id}, /movie/search/{id} |
| 영화사 목록 | ✅ | `GET /company/searchCompanyList` | /movie/company |
| 영화사 상세 | ✅ | `GET /company/searchCompanyInfo` | /movie/company/{cd} |
| 영화인 목록/상세 | ❌ 미구현 | - | - |
| 공통코드 조회 | ❌ 미구현 | - | - |

- 영화사 API는 **DB 캐싱 없이 KOBIS 프록시**로 동작한다 (tb_company 테이블 없음).
- KOBIS는 오류도 HTTP 200 + `faultInfo`로 반환하므로 crawler `model/kobis.go`의 `checkFault()`가 error로 승격한다 (→ HTTP 400).

### 키 운영 정책

- 키는 crawler `config/movie.json`(cron 수집용)과 movie `config/constants.php` `KOBIS_API_1~3`(사이트 → crawler 전달용) **양쪽에 동일하게 유지**해야 한다.
- `apiKey_3` 자리의 `82ca741a...`는 KOBIS 공식 문서 샘플 키로 **무효**(320010) — 실제 사용 시 KOBIS 계정에서 발급한 키로 교체할 것. 사이트는 `KOBIS_API_1`만 실제 사용한다.
- 키당 일 호출 한도가 있으므로 cron 수집 시 `?key=1|2` 파라미터로 분산한다.

### 운영 절차 (수집)

1. 박스오피스(일별/주간): 사이트 조회 시 **on-demand 수집** — 별도 스케줄 불필요. 키만 유효하면 날짜별 첫 조회 때 tb_movie_daily/weekly에 적재된다.
2. 영화 목록/기본정보/상세: `GET /cron/list?key=1` → `GET /cron/info?key=2` → `GET /cron/detail` 순서로 주기 실행 (마지막 수집 페이지는 `log/kobis/page.txt`에 저장, 목록은 최신순 정렬이라 전량 스윕은 page.txt를 `1`로 리셋 후 실행).
   - `/cron/info`는 단건 실패 시 해당 영화만 건너뛰고(`failedCodes`로 리포트) **연속 오류 10회면 중단**한다(무효 키·쿼터 초과 보호). 실패 원인은 `log/kobis/error.txt`에서 확인.
   - 2026-07-22 기준 백로그: tb_movie 101,810 vs KOBIS 120,000(목록 ~18k편 부족), 기본정보 미수집 ~31k건 — info 수집은 키당 일 3,000회 제한으로 수일 분산 필요.
3. 누적 매출/관객(`tb_movie_detail.sale_acc/audi_acc`) 수집기(c2)는 주석 처리 상태 — 재활성화 시 `searchMovieDtl.do sType=stat` 셀렉터 재검증 필요.
