---
title: "도브러너 서비스 API 가이드"
description: "이 문서는 도브러너의 각종 서비스 API를 이용해 고객사 시스템에 연동하는 방법을 설명합니다."
---
> For the complete documentation index, see [llms.txt](/llms.txt).

도브러너 서비스 고객은 [도브러너 웹 콘솔](https://console.doverunner.com)에서 콘텐츠 패키징, 라이선스 발급 등 다양한 데이터를 확인할 수 있습니다. API 기반의 데이터 접근이 필요한 경우, 고객은 `도브러너 서비스 API`를 이용해 도브러너 서버 측 데이터를 자사 시스템과 통합할 수 있습니다.

이 문서는 2021년 12월에 출시된 `PallCon 서비스 API V2`를 기준으로 작성되었습니다.

## API 기본 정보

`도브러너 서비스 API`는 정보의 안전한 전송을 위해 [JSON Web Token(JWT)](https://jwt.io/introduction/)을 사용합니다.

> [온라인 JWT 도구](https://jwt.io/#libraries) 또는 서버 측 프로그래밍 언어를 사용하여 JWT 토큰을 생성하고 테스트할 수 있습니다.

![Service API JWT Specification](/img/content-security/service-api-jwt-spec.jpeg)

토큰은 HMAC SHA256(HS256) 알고리듬과 함께 계정별 비밀 키를 사용하여 서명해야 합니다. 토큰 페이로드에 사용되는 서비스 API 키와 계정 seq 값은 [헬프데스크](https://support.doverunner.com/) 티켓을 통해 요청할 수 있습니다.

### JWT 구조

위 캡쳐 이미지에서 확인할 수 있듯이, 인코딩된 JWT 토큰의 형식은 다음과 같습니다.

```shell
base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + HS256 signature value
```

### 페이로드 규격

토큰은 아래 예시와 같은 JSON 페이로드 데이터를 사용합니다.

```json
{
    "sub" : "DoveRunnerAPI",
    "aud" : "DoveRunner",
    "iss" : "DoveRunner",
    "doverunnerId" : "Your DoveRunner account ID",
    "pallyconId": "Your ContentSecurity account SEQ",
    "iat": 1724053758,
    "exp": 1724055558
}
```

| 키 | 필수 여부 | 값 |
|:----|:---------|:------|
| sub | Y | `DoveRunnerAPI` (고정 값) |
| aud | Y | `DoveRunner` (고정 값) |
| iss | Y | `DoveRunner` (고정 값) |
| doverunnerId | Y | 도브러너 서비스 계정 ID (헬프데스크 티켓을 통해 요청 가능)|
| pallyconId | Y | 컨텐츠시큐리티 서비스 계정의 `SEQ` (헬프데스크 티켓을 통해 요청 가능) |
| iat | N | JWT 발급 시간|
| exp | N | JWT 만료 일자 (형식: date number)|

> `SEQ`는 도브러너 서비스 API에서 주요 데이터를 인덱싱하는데 사용되는 키값입니다.

### 기본 응답 규격

도브러너 서비스 API를 호출하면 아래와 같은 HTTP 상태 코드 중 하나를 받게 됩니다.

| HTTP 상태 코드 | 설명 |
| :-----| :--------|
| 401 | JWT 토큰 사양이 잘못되었거나 사용자 정보를 찾을 수 없음 |
| 403 | 호출된 API에 대한 권한이 없음 |
| 200 | HTTP 통신 성공 |

HTTP 상태 코드가 `200`(HTTP 통신 성공)인 경우 JSON 형식으로 아래 응답 데이터를 받게 됩니다.

| 키 | 유형 | 값 |
| :---|:-----|:------|
| error_code | String | 0000: 성공 / 기타 숫자: 실패 |
| error_message | String | 실패한 요청에 대한 오류 메시지 표시 |
| data | JSON | API 요청 결과 (성공 시) |

## 계정 관리 API

도브러너 서비스 계정 및 사이트 관리를 위한 API입니다.

:::note 

도브러너 서비스에서 `사이트`는 도브러너 솔루션이 적용된 당사 고객의 서비스 사이트를 의미합니다. 도브러너 계정에는 기본적으로 하나의 사이트가 있으며, 필요한 경우 계정에 사이트를 추가할 수 있습니다. (예: 여러 고객이 있는 리셀러 계정)
각 사이트는 4개의 영숫자로 된 고유 ID(사이트 ID)가 있습니다.

:::

### 사이트 목록 조회

이 API는 도브러너 계정의 사이트 목록을 검색합니다.

- URL: https://service.doverunner.com/api/v2/account/siteId
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UC011004100` |

#### Response.data

| 키 | 유형 | 설명 |
| :---| :--- | :------ |
| site_id | String | 사이트 ID (네자리 영숫자, 도브러너 콘솔에서 조회 가능) |
| service_name | String | 서비스 사이트 이름 |
| product_list              | Array      | 제품 리스트                                 |
| product_list.[].service_code | String      | 제품 코드 ( PD001 : DRM, PD002 : FWM )     |
| product_list.[].status_code  | String      | 서비스 상태 (SE000 : 서비스중, SE001 : 서비스 중지 ) |

### 서비스 사이트 추가 요청

이 API는 도브러너 계정에 대한 추가 서비스 사이트를 요청합니다. (한 계정에서 여러 개의 서비스 사이트를 운영하는 경우)

- URL: https://service.doverunner.com/api/v2/account/siteId/approve
- Method: POST

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010310200` |
| service_name | String | Y | 추가될 서비스 사이트 명 |

#### Response.data

| 키 | 유형 | 설명 |
| :---| :--- | :------ |
| seq | Int | 해당 요청에 대한 SEQ (시퀀스 번호) |

### 사이트 추가 상태 조회

이 API는 서비스 사이트 추가 요청에 대한 상태를 반환합니다.

- URL: https://service.doverunner.com/api/v2/account/siteId/approve
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010310100` |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| req_status | String | N | 사이트 추가 진행 상태 |
| search_type | String | N | 검색 유형 (account_id, site_id) |
| search_keyword | String | N | 검색 키워드 (검색 유형이 설정된 경우) |
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

#### Response.data

| 키 | 유형 | 설명 |
| :---| :--- | :------ |
| seq | Int | 사이트 추가 요청에 대한 SEQ 번호 |
| account_id | String | 도브러너 서비스 계정 ID |
| site_id | String | 사이트 ID (네자리 영숫자) |
| service_name | String | 서비스 사이트 명 |
| status | String | 사이트 추가 진행 상태 |
| update_time | String | 상태 업데이트 시간 |
| reg_time | String | 요청 등록 시간 |

### 하위 사용자 목록 조회

이 API는 계정의 하위 구성원 목록을 조회합니다.

- URL: https://service.doverunner.com/api/v2/account/member
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010700200` |
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

#### Response.data

| 키 | 유형 | 설명 |
| :---| :--- | :------ |
| group_name | String | 하위 사용자가 소속된 권한 그룹 명 |
| group_seq | Int | 권한 그룹의 SEQ 번호 (아래 테이블 참조) |
| member_seq | Int | 해당 하위 사용자의 SEQ 번호 |
| member_email | String | 하위 사용자의 이메일 주소 |
| status_code | String | 하위 사용자 상태 코드 (MT001: 활성, MT002: 비활성) |
| reg_date | String | 하위 사용자 등록 날짜 (YYYY-MM-DD) |

- 그룹 SEQ 목록
| SEQ 번호 | 설명 |
| :----- | :------- |
| 1000 | BIZ 그룹. 서비스 사용 이력 및 연동 정보와 결제 관련 정보에 접근 가능 |
| 1001 | TS 그룹. 서비스 사용 이력 및 연동 정보와 SDK 다운로드 페이지 접근 가능 |
| 1014 | Clients 그룹. 서비스 사용 이력 페이지만 접근 가능 |

### 하위 사용자 생성

이 API는 계정에 하위 구성원을 만듭니다.

- URL: https://service.doverunner.com/api/v2/account/member
- Method: POST

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010700200` |
| member_email | String | Y | 하위 사용자 이메일 주소 |
| group_seq | Int | N | 해당 하위 사용자가 소속될 권한 그룹의 SEQ |

#### Response.data

| 키 | 유형 | 설명 |
| :---| :--- | :------ |
| member_seq | Int | 생성된 하위 사용자의 SEQ 번호 |

### 하위 사용자 암호 재설정

이 API는 하위 사용자의 비밀번호를 재설정합니다.

- URL: https://service.doverunner.com/api/v2/account/member/repw
- Method: PUT

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010700200` |
| member_seq | Int | Y | 하위 사용자의 SEQ 번호 |

#### Response

이 API는 기본 응답 데이터를 응답합니다.

### 하위 사용자 정보 수정

이 API는 그룹 및 상태와 같은 하위 사용자의 정보를 업데이트합니다.

- URL: https://service.doverunner.com/api/v2/account/member
- Method: PUT

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String | Y | API 코드 `UA010700200` |
| member_seq | Int | Y | 하위 사용자의 SEQ 번호 |
| member_status | String | N | 적용할 사용자 상태 코드 (MT001: 활성, MT002: 비활성)
| group_seq | Int | N | 적용할 권한 그룹의 SEQ |

#### Response

이 API는 기본 응답 데이터를 응답합니다.

## 도브러너 서비스 공통 API

도브러너의 여러 제품에서 공통으로 사용되는 서비스 API를 설명합니다.

### 서비스 상태 변경 요청 현황 조회

이 API는 도브러너 제품 별로 서비스 상태 변경 요청에 대한 현황을 조회합니다.

- URL: `https://service.doverunner.com/api/v2/plan/request/status/{site_id}`
- Method: GET

#### Request

| 파라미터      | 유형 | 필수 여부 | 설명                                                     |
|:---------------| :-----|:---------|:----------------------------------------------------------------|
| Authorization  | Header | Y        | 회원 정보가 있는 암호화된 jwt                                              |
| api_code       | String | Y        | api 코드 (UA010301100)                                            |
| site_id        | PathVariable | Y        | SITE ID                                                         |
| service_code   | String | Y        | 제품코드 (PD001:DRM, PD002:FWM)                                     |

#### Response

| 키            | 유형     | 설명                                           |
|:-------------|:-------|:---------------------------------------------|
| site_id      | String | 사이트 ID                                       |
| req_group_id | String | 요청 ID (PK)                                   |
| reg_type     | String | 요청타입 코드                                      |
| reg_message  | String | 요청 내용                                        |
| reg_status   | String | 요청 상태 (ST001: 신청, ST002: 반려 또는 취소, ST003:승인) |
| reg_id       | String | 요청 ID                                        |
| reg_dt       | String | 저장일 (UTC +00:00 기준)                          |
| update_dt    | String | 요청 내역 수정일 (UTC +00:00 기준)                    |

### 서비스 상태 변경 요청

이 API는 도브러너 제품 별로 서비스 상태를 변경하기 위한 요청을 등록합니다.

- URL: `https://service.doverunner.com/api/v2/plan/request/status/{site_id}`
- Method: POST

#### Request

| 파라미터      | 유형 | 필수 여부 | 설명                                                     |
|:---------------| :-----|:---------|:----------------------------------------------------------------|
| Authorization  | Header | Y        | 회원 정보가 있는 암호화된 jwt                                              |
| api_code       | String | Y        | api 코드 (UA010301200)                                            |
| site_id        | PathVariable | Y        | SITE ID                                                         |
| service_code   | String | Y        | 제품코드 (PD001:DRM, PD002:FWM)                                     |
| request_type   | String | Y        | 요청타입 코드 (SM001:서비스 재개 요청, SM002:서비스 중지 요청, SM003:트라이얼 기간 연장 요청) |
| request_message    | String | N        | 요청 내용                                                           |

#### Response.data

| 키            | 유형     | 설명                  |
|:-------------|:------ |:--------------------|
| site_id      | String | 사이트 ID              |
| req_group_id | String | 요청 ID (PK)          |
| reg_type     | String | 요청타입 코드             |
| reg_message  | String | 요청 내용               |
| reg_id       | String | 요청 ID               |
| reg_dt       | String | 저장일 (UTC +00:00 기준) |

### 서비스 상태 변경 요청 취소

이 API는 도브러너 제품 별 서비스 상태 변경 요청을 취소합니다.

- URL: `https://service.doverunner.com/api/v2/plan/request/status/{site_id}`
- Method: PUT

#### Request

| 파라미터      | 유형 | 필수 여부 | 설명                                                    |
|:---------------| :-----|:---------|:------------------------------------------------------|
| Authorization  | Header | Y        | 회원 정보가 있는 암호화된 jwt                                    |
| api_code       | String | Y        | api 코드 (UA010301200)                                  |
| site_id        | PathVariable | Y        | SITE ID                                               |
| service_code   | String | Y        | 제품코드 (PD001:DRM, PD002:FWM)                           |
| request_type   | String | Y        | 요청타입 코드 (SM004:서비스 변경 요청 취소)                          |
| request_group_id   | String | Y        | 요청 ID (PK)                                            |

#### Response.data

| 키            | 유형     | 설명                                           |
|:-------------|:------ |:---------------------------------------------|
| site_id      | String | 사이트 ID                                       |
| req_group_id | String | 요청 ID (PK)                                   |
| reg_type     | String | 기존 요청타입 코드                                   |
| reg_status   | String | 요청 상태 (ST001: 신청, ST002: 반려 또는 취소, ST003:승인) |
| reg_message  | String | 요청 내용                                        |
| reg_id       | String | 요청 ID                                        |
| reg_dt       | String | 저장일 (UTC +00:00 기준)                          |
| update_dt    | String | 요청 내역 수정일 (UTC +00:00 기준)                    |

## DRM 서비스 API

도브러너 멀티 DRM 서비스와 관련된 API를 설명합니다.

### DRM 라이선스 발급 조회

이 API는 특정 기간에 발급된 DRM 라이선스의 목록을 검색합니다.

- URL: https://service.doverunner.com/api/v2/drm/license
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String| Y | API 코드 (UA003001100) |
| site_id | String | Y | 사이트 ID (네자리 영숫자) |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| search_status | String | N | 라이선스 발급 상태로 검색 (success or fail) |
| search_condition | String | N | 키워드 검색 카테고리 (cid, drm_type, user_id, device_id, device_model) |
| search_keyword | String | N | 카테고리 검색에 사용될 키워드 (search_condition 설정 시)|
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

- 요청 예제

```
curl -H 'authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJQYWxseUNvbkFQSSIsImF1ZCI6IklOS0EiLCJpc3MiOiJQYWxseUNvbiIsImFkbWluIjp0cnVlLCJ1c2VySWQiOiJ0ZXN0dXNlciJ9.p7VJmRryoaSVU2qn9PDuoDRIFxphw0N2786bR6zhELQ' 'https://service.doverunner.com/api/v2/drm/license?api_code=UA003001100&site_id=DEMO&from=2020-03-01&to=2020-03-02&search_status=success&search_condition=cid&search_keyword=test'
```

#### Response.data (Array)

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| cid | String | 콘텐츠의 고유 ID |
| status | String | 라이선스 발급 상태 (success, fail) |
| error_code | String | 에러 코드 (성공: 0000, 실패 시 해당 에러 코드) |
| drm_type | String | DRM 유형 (PlayReady, Widevine, FairPlay, NCG) |
| user_id | String | 최종 사용자의 고유 ID |
| device_id | String | 클라이언트 기기의 고유 ID |
| device_model | String | 클라이언트 기기 모델명 |
| license_type | String | DRM 라이선스 연동 방식 (token, gateway) |
| platform_name | String | 클라이언트 플랫폼 정보 |
| reg_time | String | 라이선스 요청 등록 시간 |

- 응답 예제

```json
{
    "_links":{
        "self":{
            "href":"https://service.doverunner.com/api/v2/drm/license"
        }
    },
    "error_code":"0000",
    "data":[{
        "cid":"configtest",
        "status":"success",
        "error_code":"0000",
        "drm_type":"FairPlay",
        "user_id":"uuu",
        "device_id":"13406080a61bef63aaa1d99a32f51e31c804e659",
        "device_model":"iOS-device",
        "license_type":"gateway",
        "platform_name":"iOS",
        "reg_time":"20200302235959"
    },
    {
        "cid":"configtest",
        "status":"success",
        "error_code":"0000",
        "drm_type":"FairPlay",
        "user_id":"uuu",
        "device_id":"13406080a61bef63aaa1d99a32f51e31c804e659",
        "device_model":"iOS-device",
        "license_type":"gateway",
        "platform_name":"iOS",
        "reg_time":"20200302235956"
    }],
    "count":2
    }
}
```

### DRM 사용자 조회

이 API는 특정 기간에 라이선스를 획득한 최종 사용자 ID의 목록을 검색합니다.

- URL: https://service.doverunner.com/api/v2/drm/user
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String| Y | API 코드 값 (UA003001100) |
| site_id | String | Y | 사이트 ID (네자리 영숫자) |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| search_keyword | String | N | 검색할 사용자 ID |
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

- 요청 예제

```
curl -H 'authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJQYWxseUNvbkFQSSIsImF1ZCI6IklOS0EiLCJpc3MiOiJQYWxseUNvbiIsImFkbWluIjp0cnVlLCJ1c2VySWQiOiJ0ZXN0dXNlciJ9.p7VJmRryoaSVU2qn9PDuoDRIFxphw0N2786bR6zhELQ' 'https://service.doverunner.com/api/v2/drm/user?api_code=UA003001100&site_id=DEMO&from=2020-03-01&to=2020-03-02
```

#### Response.data (Array)

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| user_id | String | 최종 사용자의 고유 ID |
| license_cnt | Int | 해당 사용자가 요청한 DRM 라이선스 수 |
| device_cnt | Int | 해당 사용자가 이용한 클라이언트 기기 수 |
| success | Int | 성공한 라이선스 요청 수 |
| fail | Int | 실패한 라이선스 요청 수 |

- 응답 예제

```json
{
    "_links":{
       "self":{
            "href":"https://service.doverunner.com/api/v2/drm/user"
        }
    },
    "error_code":"0000",
    "data":[{
        "user_id":"ta5uwrsw",
        "license_cnt":1,
        "device_cnt":1,
        "success":1,
        "fail":0
    },
    {
        "user_id":"uuu",
        "license_cnt":1729,
        "device_cnt":1,
        "success":1729,
        "fail":0
    },
    {
        "user_id":"5xhsdd36",
        "license_cnt":1,
        "device_cnt":1,
        "success":1,
        "fail":0
    }],
    "count":3
    }
}
```

### DRM 클라이언트 기기 조회

이 API는 특정 기간에 DRM 라이선스를 획득한 클라이언트 기기 목록을 검색합니다.

- URL: https://service.doverunner.com/api/v2/drm/device
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String| Y | API 코드 값 (UA003001100) |
| site_id | String | Y | 사이트 ID (네자리 영숫자) |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| search_keyword | String | N | 검색할 클라이언트 기기 ID |
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

- 요청 예제

```
curl -H 'authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJQYWxseUNvbkFQSSIsImF1ZCI6IklOS0EiLCJpc3MiOiJQYWxseUNvbiIsImFkbWluIjp0cnVlLCJ1c2VySWQiOiJ0ZXN0dXNlciJ9.p7VJmRryoaSVU2qn9PDuoDRIFxphw0N2786bR6zhELQ' 'https://service.doverunner.com/api/v2/drm/device?api_code=UA003001100&site_id=DEMO&from=2020-03-01&to=2020-03-02
```

#### Response.data (Array)

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| device_id | String | 클라이언트 기기의 고유 ID |
| device_model | String | 클라이언트 기기 모델명 |
| license_cnt | Int | 해당 기기에서 요청된 DRM 라이선스 수 |
| success | Int | 성공한 라이선스 요청 수 |
| fail | Int | 실패한 라이선스 요청 수 |

- 응답 예제

```json
{
    "_links":{
        "self":{
            "href":"https://service.doverunner.com/api/v2/drm/device"
        }
    },
    "error_code":"0000",
    "data":[{
        "device_id":"ea2e698d95b28441422f4997d6ffd5450a",
        "device_model":"ChromeCDM-Windows-2",
        "license_cnt":1732,
        "success":1732,
        "fail":0
    },
    {
        "device_id":"13406080a61bef63aaa1d99a32f51e31c804e659",
        "device_model":"iOS-device",
        "license_cnt":1729,
        "success":1729,
        "fail":0
    },
    {
        "device_id":"ab3dd736cd46607abbd81ec942e07a620a",
        "device_model":"ChromeCDM-Mac-2",
        "license_cnt":1,
        "success":1,
        "fail":0
    },
    {
        "device_id":"d838f619-69e0-4e3a-9b48-5a1b52ce287a",
        "device_model":"playready-device",
        "license_cnt":1728,
        "success":1728,
        "fail":0
    }],
    "count":4
}
```

### CID 별 DRM 라이선스 조회

이 API는 특정 기간 동안 각 CID(콘텐츠 ID)에 대해 발급된 라이선스 수를 검색합니다.

- URL: https://service.doverunner.com/api/v2/drm/cid-License
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String| Y | API 코드 값 (UA003001100) |
| site_id | String | Y | 사이트 ID (네자리 영숫자) |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| search_status | String | N | 라이선스 발급 상태로 조회 (success or fail) |
| page_unit | Int | N | 검색 결과 수 지정 (기본 값:25, 최대: 1000)|
| page_index | Int | N | 검색 결과 페이지 번호 (결과 수가 page_unit 보다 클 경우) |

- 요청 예제

```
curl -H 'authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJQYWxseUNvbkFQSSIsImF1ZCI6IklOS0EiLCJpc3MiOiJQYWxseUNvbiIsImFkbWluIjp0cnVlLCJ1c2VySWQiOiJ0ZXN0dXNlciJ9.p7VJmRryoaSVU2qn9PDuoDRIFxphw0N2786bR6zhELQ' 'https://service.doverunner.com/api/v2/drm/cid-drmLicense?api_code=UA003001100&site_id=DEMO&from=2020-03-01&to=2020-03-02
```

#### Response.data (Array)

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| cid | String | 콘텐츠의 고유 ID |
| license_cnt | Int | 해당 콘텐츠에 발급된 DRM 라이선스 수 |

- 응답 예제

```json
{
    "_links":{
        "self":{
            "href":"https://service.doverunner.com/api/v2/drm/cid-drmLicense"
        }
    },
    "error_code":"0000",
    "data":[
    {
    "cid":"bigbuckbunny",
    "license_cnt":1733
    },
    {
    "cid":"configtest",
    "license_cnt":1729
    }],
    "count":2
}
```

### DRM 패키징 이력 조회

이 API는 특정 기간의 DRM 패키징 이력을 검색합니다.

- URL: https://service.doverunner.com/api/v2/drm/pack
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| api_code | String| Y | API 코드 값 (UA003001100) |
| site_id | String | Y | 사이트 ID (네자리 영숫자) |
| from | String | N | 검색 기간 시작일 (YYYY-MM-DD)|
| to | String | N | 검색 기간 종료일 (YYYY-MM-DD)|
| search_condition | String | N | 검색 카테고리 (cid, drm_type, user_id, device_id, device_model) |
| search_keyword | String | N | 카테고리 별 검색 키워드 (valid when search_condition is set)|
| last_created_time_cid | String | N | 조회 리스트 중 마지막 CID 값 (페이지 처리 용) |
| last_update_time | String | N | 조회 리스트 중 마지막 update_time (페이지 처리 용) |

> `last_created_time_cid` 및 `last_update_time`이 설정되면 응답에는 설정된 값 이후의 데이터만 포함됩니다.

#### Response.data (Array)

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| site_id | String | 사이트 ID (네자리 영숫자) |
| cid | String | 콘텐츠의 고유 ID |
| track | String | 콘텐츠 트랙 정보 (기본값: HD) |
| created_time | String | 최초 패키징 시간 (YYYYMMDDhhmmss) |
| update_time | String | 마지막 재패키징 시간 (YYYYMMDDhhmmss) |

### DRM 연동 정보 조회

이 API는 DRM 연동과 관련된 정보를 조회합니다.

- URL: `https://service.doverunner.com/api/v2/drm/setting/{site_id}`
- Method: GET

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| site_id | Path Variable | Y | 사이트 ID (네자리 영숫자) |
| api_code | String| Y | API 코드 값 (UA003004100) |

#### Response.data 

| 키 | 유형 | 설명 |
| :-- | :--- | :---------- |
| site_id | String | 사이트 ID (네자리 영숫자) |
| site_key | String | 서비스 사이트 연동에 필요한 암호화 키 (Base64 인코딩된 32바이트 문자열) |
| access_key | String | 추가적인 연동에 사용되는 암호화 키 |
| license_callback_url | String | 콜백 방식 라이선스 연동에 사용되는 웹 페이지 URL (지원 중단) |
| package_callback_url | String | 콜백 방식 패키저 연동에 사용되는 웹 페이지 URL (지원 중단) |
| kms_token | String | CPIX, SPEKE API 등 KMS 연동에 사용되는 토큰 |
| token_duration | Int | 라이선스 토큰 유효 기간 (초 단위) |
| iv | String | 사이트 별로 지정되는 고유 IV(Initial Vector) 값. DRM 패키징에 사용 |

### DRM 연동 정보 변경

이 API는 DRM과 관련한 정보를 업데이트합니다.

- URL: `https://service.doverunner.com/api/v2/drm/setting/{site_id}`
- Method: PUT

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| site_id | Path Variable | Y | 사이트 ID (네자리 영숫자) |
| api_code | String| Y | API 코드 값 (UA003004100) |
| license_callback_url | String | N | 콜백 방식 라이선스 연동에 사용되는 웹 페이지 URL (지원 중단됨) |
| package_callback_url | String | N | 콜백 방식 패키저 연동에 사용되는 웹 페이지 URL (지원 중단됨) |
| token_duration | Int | N | 라이선스 토큰 유효 기간 (초 단위) |

#### Response

이 API는 기본 응답 데이터를 응답합니다.

### FairPlay 인증서 등록

이 API는 애플로부터 발급받은 FPS 인증서를 도브러너 서비스에 등록합니다.

- URL: `https://service.doverunner.com/api/v2/drm/setting/fpscert/{site_id}`
- Method: POST

#### Request

| 파라미터 | 유형 | 필수 여부 | 설명 |
|:------- | :----|:------|:-----|
| Authorization | Header | Y | 인코딩된 JWT 데이터 |
| site_id | Path Variable | Y | 사이트 ID (네자리 영숫자) |
| api_code | String| Y | API 코드 값 (UA003004200) |
| ask | String | Y | Application secret key (ASK) 문자열 |
| key_pw | String | Y | 개인 키 암호 (최대 32 바이트) |
| fps_cert | blob | Y | FPS 인증서 파일 (.der 또는 .cer) |
| private_key | blob | Y | 개인 키 파일 (.pem) |

#### Response

이 API는 기본 응답 데이터를 응답합니다.

### MAL, MAU, MAD 수치 조회 

이 API는 특정 날짜에 발생한 MAL(월간 라이선스 발급 수), MAU(월간 활성 사용자 수) 및 MAD(월간 활성 기기 대수) 수치를 조회합니다.

- URL: https://service.doverunner.com/api/v2/drm/statistics/targetDate
- Method: GET

:::note 

MAD의 경우, 데스크탑 크롬 브라우저의 PC 별 고유 ID를 생성하려면 플레이어에서 `persistentStateRequired`를 설정해야 합니다. ([HTML Player 샘플 소스](https://github.com/doverunner/html5-player-drm-samples) 참조)

해당 설정을 하지 않으면 모든 PC의 크롬 브라우저에 동일한 ID가 적용되어 1개의 기기로 MAD에 반영됩니다.

:::

#### Request

| 파라미터      | 유형 | 필수 여부 | 설명            |
|:--------------|----|----------| ----- |
| Authorization | Header | Y        | 회원 정보가 있는 암호화된 jwt |
| api_code      | String | Y        | api 코드 : UA003003100  |
| site_id       | String | Y        | 사이트 아이디 |
| target_date   | String | Y        | 조회 대상 날짜 (YYYY-MM-DD)  |

#### Response.data (Object)

| 키            | 유형     | 설명          |
|:----|:--------|:------------|
| license_cnt     | Integer     | MAL (Monthly Active Licenses)        |
| user_acc_cnt    | Integer     | MAU (Monthly Active Users)        |
| device_acc_cnt  | Integer     | MAD (Monthly Active Devices)        |
| target_date     | Integer     | 조회 대상 날짜  |