# 브랜드 메시지 전송

## 1. SendBMSText - 텍스트 전송

| HTTP Method | 테스트(Sandbox)                                  | 운영(Production)                           |
| ----------- | --------------------------------------------- | ---------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Text> | <https://popbill.linkhub.co.kr/BMS/Text> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 텍스트형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- content `type: string` `length: 1,300` `required: 조건부` `description: 브랜드 메시지 내용`
  - 줄바꿈 최대 99개
  - 동보 전송인 경우 필수
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- btns `type: array` `length: 5` `required: N` `description: 버튼 목록`
  - 최대 5개 (쿠폰을 포함하는 경우 최대 4개)
  - 동보 전송인 경우 입력
  - n `type: string` `length: 14` `required: Y` `description: 버튼명`
  - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
    - `WL`: 웹링크
    - `AL`: 앱링크
    - `MD`: 메시지전달
    - `BK`: 봇키워드
    - `AC`: 채널추가
    - 채널 추가 버튼은 첫번째 위치에만 가능
  - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 iOS 앱링크 적용
    - {t} = "WL" 경우 Mobile 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
  - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 Android 앱링크 적용
    - {t} = "WL" 경우 PC 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
- coupon `type: object` `length: -` `required: N` `description: 쿠폰`
  - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
  - 외부 쿠폰 사용 시 linkMobile 필수
  - 동보 전송인 경우 입력
  - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
    - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
    - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
    - `배송비 할인 쿠폰`
    - `#{7자 이내} 무료 쿠폰`
    - `#{7자 이내} UP 쿠폰`
  - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
    - 줄바꿈 사용 불가
  - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - content `type: string` `length: 1,300` `required: 조건부` `description: 브랜드 메시지 내용`
    - 줄바꿈 최대 99개
    - 대량 전송인 경우 필수
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - btns `type: array` `length: 5` `required: N` `description: 버튼 목록`
    - 최대 5개 (쿠폰을 포함하는 경우 최대 4개)
    - 대량 전송인 경우 입력
    - n `type: string` `length: 14` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 채널 추가 버튼은 첫번째 위치에만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
    - 외부 쿠폰 사용 시 linkMobile 필수
    - 대량 전송인 경우 입력
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Text' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Text' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Text' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "content": "브랜드 메시지 내용",
    "btns": [
        {
            "n": "버튼명",
            "t": "MD"
        }
    ],
    "coupon": {
        "title": "1000원 할인 쿠폰",
        "description": "쿠폰 설명",
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 2-1. SendBMSImage - 이미지 전송

| HTTP Method | 테스트(Sandbox)                                   | 운영(Production)                            |
| ----------- | ---------------------------------------------- | ----------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Image> | <https://popbill.linkhub.co.kr/BMS/Image> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 이미지형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 브랜드 메시지 전송 전에 [\[UploadImage - 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadImage) API로 이미지 업로드가 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
  - [\[UploadImage - 이미지 업로드\]](#UploadImage) API로 응답받은 URL
  - 동보 전송인 경우 필수
- imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
  - 이미지를 클릭하면 연결되는 URL
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- content `type: string` `length: 1,300` `required: 조건부` `description: 브랜드 메시지 내용`
  - 줄바꿈 최대 99개
  - 동보 전송인 경우 필수
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- btns `type: array` `length: 5` `required: N` `description: 버튼 목록`
  - 최대 5개 (쿠폰을 포함하는 경우 최대 4개)
  - 동보 전송인 경우 입력
  - n `type: string` `length: 14` `required: Y` `description: 버튼명`
  - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
    - `WL`: 웹링크
    - `AL`: 앱링크
    - `MD`: 메시지전달
    - `BK`: 봇키워드
    - `AC`: 채널추가
    - 채널 추가 버튼은 첫번째 위치에만 가능
  - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 iOS 앱링크 적용
    - {t} = "WL" 경우 Mobile 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
  - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 Android 앱링크 적용
    - {t} = "WL" 경우 PC 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
- coupon `type: object` `length: -` `required: N` `description: 쿠폰`
  - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
  - 외부 쿠폰 사용 시 linkMobile 필수
  - 동보 전송인 경우 입력
  - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
    - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
    - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
    - `배송비 할인 쿠폰`
    - `#{7자 이내} 무료 쿠폰`
    - `#{7자 이내} UP 쿠폰`
  - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
    - 줄바꿈 사용 불가
  - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
    - [\[UploadImage - 이미지 업로드\]](#UploadImage) API로 응답받은 URL
    - 대량 전송인 경우 필수
  - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
    - 이미지를 클릭하면 연결되는 URL
    - 대량 전송인 경우 입력
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - content `type: string` `length: 1,300` `required: 조건부` `description: 브랜드 메시지 내용`
    - 줄바꿈 최대 99개
    - 대량 전송인 경우 필수
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - btns `type: array` `length: 5` `required: N` `description: 버튼 목록`
    - 최대 5개 (쿠폰을 포함하는 경우 최대 4개)
    - 대량 전송인 경우 입력
    - n `type: string` `length: 14` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 채널 추가 버튼은 첫번째 위치에만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
    - 외부 쿠폰 사용 시 linkMobile 필수
    - 대량 전송인 경우 입력
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Image' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28dr6QSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Image' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28dr6QSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28zwSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Image' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28drzwSsn4K/img_l.jpg",
    "imageLink": "https://www.popbill.com",
    "content": "브랜드 메시지 내용",
    "btns": [
        {
            "n": "버튼명",
            "t": "MD"
        }
    ],
    "coupon": {
        "title": "1000원 할인 쿠폰",
        "description": "쿠폰 설명",
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 2-2. UploadImage - 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                  | 운영(Production)                                           |
| ----------- | ------------------------------------------------------------- | -------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/Default> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/Default> |

- 브랜드 메시지 전송에 사용할 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- image `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 2:1이상 3:4이하
  - 권장 사이즈 - 800\*400px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/Default' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'image=@"/path/image.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- imageUrl `type: string` `length: 500` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": "1",
    "message": "성공",
    "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
}
```

## 3-1. SendBMSWideImage - 와이드 이미지 전송

| HTTP Method | 테스트(Sandbox)                                       | 운영(Production)                                |
| ----------- | -------------------------------------------------- | --------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/WideImage> | <https://popbill.linkhub.co.kr/BMS/WideImage> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 와이드 이미지형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 브랜드 메시지 전송 전에 [\[UploadWideImage - 와이드 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadWideImage) API로 이미지 업로드가 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
  - [\[UploadWideImage -와이드 이미지 업로드\]](#UploadWideImage) API로 응답받은 URL
  - 동보 전송인 경우 필수
- imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
  - 이미지를 클릭하면 연결되는 URL
  - 동보 전송인 경우 입력
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- content `type: string` `length: 76` `required: 조건부` `description: 브랜드 메시지 내용`
  - 줄바꿈 최대 5개
  - 동보 전송인 경우 필수
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
  - 최대 2개
  - 동보 전송인 경우 입력
  - n `type: string` `length: 8` `required: Y` `description: 버튼명`
  - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
    - `WL`: 웹링크
    - `AL`: 앱링크
    - `MD`: 메시지전달
    - `BK`: 봇키워드
    - `AC`: 채널추가
    - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
    - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
  - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 iOS 앱링크 적용
    - {t} = "WL" 경우 Mobile 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
  - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 Android 앱링크 적용
    - {t} = "WL" 경우 PC 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
- coupon `type: object` `length: -` `required: N` `description: 쿠폰`
  - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
  - 외부 쿠폰 사용 시 linkMobile 필수
  - 동보 전송인 경우 입력
  - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
    - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
    - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
    - `배송비 할인 쿠폰`
    - `#{7자 이내} 무료 쿠폰`
    - `#{7자 이내} UP 쿠폰`
  - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
    - 줄바꿈 사용 불가
  - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
    - [\[UploadWideImage - 와이드 이미지 업로드\]](#UploadWideImage) API로 응답받은 URL
    - 대량 전송인 경우 필수
  - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
    - 이미지를 클릭하면 연결되는 URL
    - 대량 전송인 경우 입력
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - content `type: string` `length: 76` `required: 조건부` `description: 브랜드 메시지 내용`
    - 줄바꿈 최대 5개
    - 대량 전송인 경우 필수
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
    - 최대 2개
    - 대량 전송인 경우 입력
    - n `type: string` `length: 8` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
      - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
    - 외부 쿠폰 사용 시 linkMobile 필수
    - 대량 전송인 경우 입력
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideImage' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28dr6QSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideImage' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28dr6QSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28zwSsn4K/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideImage' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "imageUrl": "https://mud-kage.kakao.com/dn/Pr575/dJMcabwMHsv/QJuvrxpS28drzwSsn4K/img_l.jpg",
    "imageLink": "https://www.popbill.com",
    "content": "브랜드 메시지 내용",
    "btns": [
        {
            "n": "버튼명",
            "t": "MD"
        }
    ],
    "coupon": {
        "title": "1000원 할인 쿠폰",
        "description": "쿠폰 설명",
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 3-2. UploadWideImage - 와이드 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                    | 운영(Production)                                             |
| ----------- | --------------------------------------------------------------- | ---------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/WideImage> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/WideImage> |

- 브랜드 메시지 와이드 전송에 사용할 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- image `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 2:1이상 1:1이하
  - 권장 사이즈 - 800\*600px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/WideImage' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'image=@"/path/image.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- imageUrl `type: string` `length: 500` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": "1",
    "message": "성공",
    "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
}
```

## 4-1. SendBMSWideList - 리스트 전송

| HTTP Method | 테스트(Sandbox)                                      | 운영(Production)                               |
| ----------- | ------------------------------------------------- | -------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/WideList> | <https://popbill.linkhub.co.kr/BMS/WideList> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 와이드 리스트형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- header `type: string` `length: 20` `required: 조건부` `description: 제목`
  - 동보 전송인 경우 필수
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- item `type: array` `length: 5` `required: 조건부` `description: 아이템 목록`
  - 최소 3개, 최대 5개
  - 동보 전송인 경우 필수
  - title `type: string` `length: 30` `required: Y` `description: 타이틀`
  - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
    - 메인 아이템인 경우 [\[UploadWideListMainImage - 리스트 메인 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadWideListMainImage) API로 응답받은 URL
    - 서브 아이템인 경우 [\[UploadWideListImage - 리스트 서브 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadWideListImage) API로 응답받은 URL
  - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
- btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
  - 최대 2개
  - 동보 전송인 경우 입력
  - n `type: string` `length: 8` `required: Y` `description: 버튼명`
  - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
    - `WL`: 웹링크
    - `AL`: 앱링크
    - `MD`: 메시지전달
    - `BK`: 봇키워드
    - `AC`: 채널추가
    - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
    - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
  - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 iOS 앱링크 적용
    - {t} = "WL" 경우 Mobile 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
  - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 Android 앱링크 적용
    - {t} = "WL" 경우 PC 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
- coupon `type: object` `length: -` `required: N` `description: 쿠폰`
  - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
  - 외부 쿠폰 사용 시 linkMobile 필수
  - 동보 전송인 경우 입력
  - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
    - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
    - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
    - `배송비 할인 쿠폰`
    - `#{7자 이내} 무료 쿠폰`
    - `#{7자 이내} UP 쿠폰`
  - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
    - 줄바꿈 사용 불가
  - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - header `type: string` `length: 20` `required: 조건부` `description: 제목`
    - 대량 전송인 경우 필수
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - item `type: array` `length: 5` `required: 조건부` `description: 아이템 목록`
    - 최소 3개, 최대 5개
    - 대량 전송인 경우 필수
    - title `type: string` `length: 30` `required: Y` `description: 타이틀`
    - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
      - 메인 아이템인 경우 [\[UploadWideListMainImage - 리스트 메인 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadWideListMainImage) API로 응답받은 URL
      - 서브 아이템인 경우 [\[UploadWideListImage - 리스트 서브 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadWideListImage) API로 응답받은 URL
    - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
  - btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
    - 최대 2개
    - 대량 전송인 경우 입력
    - n `type: string` `length: 8` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
      - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
    - 외부 쿠폰 사용 시 linkMobile 필수
    - 대량 전송인 경우 입력
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideList' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "header": "헤더",
            "item": [
                {
                    "title": "아이템 제목1",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목2",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목3",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideList' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "header": "헤더",
            "item": [
                {
                    "title": "아이템 제목1",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목2",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목3",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "header": "헤더",
            "item": [
                {
                    "title": "아이템 제목1",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목2",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                },
                {
                    "title": "아이템 제목3",
                    "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
                    "linkMobile": "https://www.popbill.com"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/WideList' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "header": "헤더",
    "item": [
        {
            "title": "아이템 제목1",
            "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
            "linkMobile": "https://www.popbill.com"
        },
        {
            "title": "아이템 제목2",
            "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
            "linkMobile": "https://www.popbill.com"
        },
        {
            "title": "아이템 제목3",
            "imageUrl": "https://mud-kage.kakao.com/dn/bbpkmf/dJMcaadjEnb/zJ0XkMqa2vVl1p0dWeK/img_l.jpg",
            "linkMobile": "https://www.popbill.com"
        }
    ],
    "coupon": {
        "title": "1000원 할인 쿠폰",
        "description": "쿠폰 설명",
        "linkMobile": "https://www.popbill.com"
    },
    "btns": [
        {
            "n": "버튼명",
            "t": "MD"
        }
    ],
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 4-2. UploadWideListMainImage - 리스트 메인 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                        | 운영(Production)                                                 |
| ----------- | ------------------------------------------------------------------- | -------------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/WideList/Main> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/WideList/Main> |

- 브랜드 메시지 리스트 전송에 사용할 메인 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- image `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 고정비율 2:1
  - 권장 사이즈 800\*400px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/WideList/Main' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'image=@"/path/image.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- imageUrl `type: string` `length: 500` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": "1",
    "message": "성공",
    "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
}
```

## 4-3. UploadWideListImage - 리스트 서브 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                   | 운영(Production)                                            |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/WideList> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/WideList> |

- 브랜드 메시지 리스트 전송에 사용할 서브 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- images `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 1:1 고정비율
  - 권장 사이즈 - 800\*800px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB
  - 업로드 요청 최대 파일수 - 3개

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/WideList' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'images=@"/path/image1.jpg"' \
  --form 'images=@"/path/image2.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- result `type: array` `length: -` `description: 이미지 업로드 결과`
  - formField `type: string` `length: -` `description: 이미지 인덱스`
    - 이미지 구분을 위한 식별값
  - imageUrl `type: string` `length: -` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": 1,
    "message": "성공",
    "result": [
        {
            "formField": "image_1",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        },
        {
            "formField": "image_2",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        }
    ]
}
```

## 5-1. SendBMSCarouselFeed - 캐러셀 전송

| HTTP Method | 테스트(Sandbox)                                          | 운영(Production)                                   |
| ----------- | ----------------------------------------------------- | ------------------------------------------------ |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/CarouselFeed> | <https://popbill.linkhub.co.kr/BMS/CarouselFeed> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 캐러셀 피드형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- carousel `type: array` `length: 6` `required: 조건부` `description: 캐러셀 목록`
  - 동보 전송인 경우 필수
  - header `type: string` `length: 20` `required: Y` `description: 제목`
  - content `type: string` `length: 180` `required: Y` `description: 내용`
  - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
  - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
  - btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
    - 최소 1개, 최대 2개
    - n `type: string` `length: 8` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
      - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- tail `type: object` `length: -` `required: N` `description: 캐러셀 더보기`
  - 동보 전송인 경우 입력
  - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - carousel `type: array` `length: 6` `required: 조건부` `description: 캐러셀 목록`
    - 최소 2개, 최대 6개
    - 대량 전송인 경우 필수
    - header `type: string` `length: 20` `required: Y` `description: 제목`
    - content `type: string` `length: 180` `required: Y` `description: 내용`
    - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
    - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
    - btns `type: array` `length: 2` `required: N` `description: 버튼 목록`
      - 최소 1개, 최대 2개
      - n `type: string` `length: 8` `required: Y` `description: 버튼명`
      - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
        - `WL`: 웹링크
        - `AL`: 앱링크
        - `MD`: 메시지전달
        - `BK`: 봇키워드
        - `AC`: 채널추가
        - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
        - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
      - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
        - {t} = "AL" 경우 iOS 앱링크 적용
        - {t} = "WL" 경우 Mobile 웹링크 적용
        - {t} = "WL" or "AL" 경우 필수
      - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
        - {t} = "AL" 경우 Android 앱링크 적용
        - {t} = "WL" 경우 PC 웹링크 적용
        - {t} = "WL" or "AL" 경우 필수
    - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
      - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
        - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
        - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
        - `배송비 할인 쿠폰`
        - `#{7자 이내} 무료 쿠폰`
        - `#{7자 이내} UP 쿠폰`
      - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
        - 줄바꿈 사용 불가
      - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
      - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
      - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
      - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
  - tail `type: object` `length: -` `required: N` `description: 캐러셀 더보기`
    - 대량 전송인 경우 입력
    - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselFeed' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/c8JBPF/dJMcafy2vaR/9cyuCLSkzBmM3opIFbPiz1/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/YSLKV/dJMcaf6QD9q/payZOdvsbnOWWUWAnKY101/img_l.jpg",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselFeed' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/c8JBPF/dJMcafy2vaR/9cyuCLSkzBmM3opIFbPiz1/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/YSLKV/dJMcaf6QD9q/payZOdvsbnOWWUWAnKY101/img_l.jpg",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/c8JBPF/dJMcafy2vaR/9cyuCLSkzBmM3opIFbPiz1/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/YSLKV/dJMcaf6QD9q/payZOdvsbnOWWUWAnKY101/img_l.jpg",
                    "header": "헤더",
                    "content": "브랜드 메시지 내용",
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ],
                    "coupon": {
                        "title": "1000원 할인 쿠폰",
                        "description": "쿠폰 설명",
                        "linkMobile": "https://www.popbill.com"
                    }
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselFeed' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "carousel": [
        {
            "imageUrl": "https://mud-kage.kakao.com/dn/c8JBPF/dJMcafy2vaR/9cyuCLSkzBmM3opIFbPiz1/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "header": "헤더",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "imageUrl": "https://mud-kage.kakao.com/dn/YSLKV/dJMcaf6QD9q/payZOdvsbnOWWUWAnKY101/img_l.jpg",
            "header": "헤더",
            "content": "브랜드 메시지 내용",
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ],
    "tail": {
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 5-2. UploadCarouselFeedImage - 캐러셀 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                       | 운영(Production)                                                |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/CarouselFeed> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/CarouselFeed> |

- 브랜드 메시지 캐러셀 전송에 사용할 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- images `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 2:1이상 3:4이하
  - 권장 사이즈 - 800\*600px 또는 800\*400px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB
  - 업로드 요청 최대 파일수 - 10개

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/CarouselFeed' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'images=@"/path/image1.jpg"' \
  --form 'images=@"/path/image2.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- result `type: array` `length: -` `description: 이미지 업로드 결과`
  - formField `type: string` `length: -` `description: 이미지 인덱스`
    - 이미지 구분을 위한 식별값
  - imageUrl `type: string` `length: -` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": 1,
    "message": "성공",
    "result": [
        {
            "formField": "image_1",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        },
        {
            "formField": "image_2",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        }
    ]
}
```

## 6-1. SendBMSCommerce - 커머스 전송

| HTTP Method | 테스트(Sandbox)                                      | 운영(Production)                               |
| ----------- | ------------------------------------------------- | -------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Commerce> | <https://popbill.linkhub.co.kr/BMS/Commerce> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 커머스형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
  - [\[UploadCommerceImage - 커머스 이미지 업로드\]](#UploadCommerceImage) API로 응답받은 URL
  - 동보 전송인 경우 필수
- imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
  - 이미지를 클릭하면 연결되는 URL
  - 동보 전송인 경우 입력
- addContent `type: string` `length: 34` `required: N` `description: 부가메시지`
  - 줄바꿈 최대 1개
  - 동보 전송인 경우 입력
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- commerce `type: object` `length: -` `required: 조건부` `description: 커머스 정보`
  - 동보 전송인 경우 필수
  - title `type: string` `length: 30` `required: Y` `description: 상품명`
  - regularPrice `type: number` `length: -` `required: Y` `description: 정상가격`
    - 0 \~ 99,999,999
  - discountType `type: string` `length: 1` `required: N` `description: 할인유형`
    - `R`: 할인율
    - `F`: 할인금액
  - discount `type: number` `length: -` `required: 조건부` `description: 할인율/할인금액`
    - {discountType}="R" 경우 1 \~ 100\
      {discountType}="F" 경우 0 \~ 999,999
  - discountPrice `type: number` `length: -` `required: 조건부` `description: 할인가격`
    - 0 \~ 99,999,999
    - 할인 적용 후 최종 가격
    - {discountType} 입력 시 필수
- btns `type: array` `length: 2` `required: 조건부` `description: 버튼 목록`
  - 최소 1개, 최대 2개
  - 동보 전송인 경우 필수
  - n `type: string` `length: 8` `required: Y` `description: 버튼명`
  - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
    - `WL`: 웹링크
    - `AL`: 앱링크
    - `MD`: 메시지전달
    - `BK`: 봇키워드
    - `AC`: 채널추가
    - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
    - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
  - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 iOS 앱링크 적용
    - {t} = "WL" 경우 Mobile 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
  - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
    - {t} = "AL" 경우 Android 앱링크 적용
    - {t} = "WL" 경우 PC 웹링크 적용
    - {t} = "WL" or "AL" 경우 필수
- coupon `type: object` `length: -` `required: N` `description: 쿠폰`
  - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
  - 외부 쿠폰 사용 시 linkMobile 필수
  - 동보 전송인 경우 입력
  - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
    - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
    - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
    - `배송비 할인 쿠폰`
    - `#{7자 이내} 무료 쿠폰`
    - `#{7자 이내} UP 쿠폰`
  - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
    - 줄바꿈 사용 불가
  - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - imageUrl `type: string` `length: 500` `required: 조건부` `description: 이미지 URL`
    - [\[UploadCommerceImage - 커머스 이미지 업로드\]](#UploadCommerceImage) API로 응답받은 URL
    - 대량 전송인 경우 필수
  - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
    - 이미지를 클릭하면 연결되는 URL
    - 대량 전송인 경우 입력
  - addContent `type: string` `length: 34` `required: N` `description: 부가메시지`
    - 줄바꿈 최대 1개
    - 대량 전송인 경우 입력
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - commerce `type: object` `length: -` `required: 조건부` `description: 커머스 정보`
    - 대량 전송인 경우 필수
    - title `type: string` `length: 30` `required: Y` `description: 상품명`
    - regularPrice `type: number` `length: -` `required: Y` `description: 정상가격`
      - 0 \~ 99,999,999
    - discountType `type: string` `length: 1` `required: N` `description: 할인유형`
      - `R`: 할인율
      - `F`: 할인금액
    - discount `type: number` `length: -` `required: 조건부` `description: 할인율/할인금액`
      - {discountType}="R" 경우 1 \~ 100\
        {discountType}="F" 경우 0 \~ 999,999
    - discountPrice `type: number` `length: -` `required: 조건부` `description: 할인가격`
      - 0 \~ 99,999,999
      - 할인 적용 후 최종 가격
      - {discountType} 입력 시 필수
  - btns `type: array` `length: 2` `required: 조건부` `description: 버튼 목록`
    - 최소 1개, 최대 2개
    - 대량 전송인 경우 필수
    - n `type: string` `length: 8` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
      - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - 채널 쿠폰 사용 시 linkAndroid, linkIos 중 1개 필수
    - 외부 쿠폰 사용 시 linkMobile 필수
    - 대량 전송인 경우 입력
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Commerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "imageUrl": "https://mud-kage.kakao.com/dn/jCE2v/dJMcaioIsCz/acNc4qeZvAX6Sa8hevQPK1/img_l.jpg",
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000,
                "discountPrice": 9000,
                "discountType": "R",
                "discount": 10
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Commerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "imageUrl": "https://mud-kage.kakao.com/dn/jCE2v/dJMcaioIsCz/acNc4qeZvAX6Sa8hevQPK1/img_l.jpg",
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000,
                "discountPrice": 9000,
                "discountType": "R",
                "discount": 10
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "imageUrl": "https://mud-kage.kakao.com/dn/jCE2v/dJMcaioIsCz/acNc4qeZvAX6Sa8hevQPK1/img_l.jpg",
            "adultYN": false,
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000,
                "discountPrice": 9000,
                "discountType": "F",
                "discount": 1000
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ],
            "coupon": {
                "title": "1000원 할인 쿠폰",
                "description": "쿠폰 설명",
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Commerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "imageUrl": "https://mud-kage.kakao.com/dn/jCE2v/dJMcaioIsCz/acNc4qeZvAX6Sa8hevQPK1/img_l.jpg",
    "commerce": {
        "title": "상품명",
        "regularPrice": 10000,
        "discountPrice": 9000,
        "discountType": "R",
        "discount": 10
    },
    "btns": [
        {
            "n": "버튼명",
            "t": "MD"
        }
    ],
    "coupon": {
        "title": "1000원 할인 쿠폰",
        "description": "쿠폰 설명",
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 6-2. UploadCommerceImage - 커머스 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                   | 운영(Production)                                            |
| ----------- | -------------------------------------------------------------- | --------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/Commerce> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/Commerce> |

- 브랜드 메시지 커머스 전송에 사용할 이미지를 업로드합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- image `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 2:1이상 3:4이하
  - 권장 사이즈 - 800\*400px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/Commerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'image=@"/path/image.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- imageUrl `type: string` `length: 500` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": "1",
    "message": "성공",
    "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
}
```

## 7-1. SendBMSCarouselCommerce - 캐러셀 커머스 전송

| HTTP Method | 테스트(Sandbox)                                              | 운영(Production)                                       |
| ----------- | --------------------------------------------------------- | ---------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/CarouselCommerce> | <https://popbill.linkhub.co.kr/BMS/CarouselCommerce> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 캐러셀 커머스형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- plusFriendID `type: string` `length: 30` `required: Y` `description: 검색용 아이디`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
  - 기본값 : false
  - 동보 전송인 경우 입력
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- head `type: object` `length: -` `required: N` `description: 캐러셀 인트로`
  - 동보 전송인 경우 입력
  - header `type: string` `length: 20` `required: Y` `description: 제목`
  - content `type: string` `length: 50` `required: Y` `description: 내용`
  - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
    - [\[UploadCarouselCommerceImage - 캐러셀 커머스 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadCarouselCommerceImage) API로 응답받은 URL
  - linkMobile `type: string` `length: 1,000` `required: N` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
- carousel `type: array` `length: 6` `required: 조건부` `description: 캐러셀 목록`
  - 동보 전송인 경우 필수
  - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
    - [\[UploadCarouselCommerceImage - 캐러셀 커머스 이미지 업로드\]](#UploadCarouselCommerceImage) API로 응답받은 URL
  - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
  - addContent `type: string` `length: 34` `required: N` `description: 부가메시지`
  - commerce `type: object` `length: -` `required: Y` `description: 커머스 정보`
    - title `type: string` `length: 30` `required: Y` `description: 상품명`
    - regularPrice `type: number` `length: -` `required: Y` `description: 정상가격`
      - 0 \~ 99,999,999
    - discountType `type: string` `length: 1` `required: N` `description: 할인유형`
      - `R`: 할인율
      - `F`: 할인금액
    - discount `type: number` `length: -` `required: 조건부` `description: 할인율/할인금액`
      - {discountType}="R" 경우 1 \~ 100\
        {discountType}="F" 경우 0 \~ 999,999
    - discountPrice `type: number` `length: -` `required: 조건부` `description: 할인가격`
      - 0 \~ 99,999,999
      - 할인 적용 후 최종 가격
      - {discountType} 입력 시 필수
  - btns `type: array` `length: 2` `required: Y` `description: 버튼 목록`
    - n `type: string` `length: 8` `required: Y` `description: 버튼명`
    - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
      - `WL`: 웹링크
      - `AL`: 앱링크
      - `MD`: 메시지전달
      - `BK`: 봇키워드
      - `AC`: 채널추가
      - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
      - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
    - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 iOS 앱링크 적용
      - {t} = "WL" 경우 Mobile 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
    - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
      - {t} = "AL" 경우 Android 앱링크 적용
      - {t} = "WL" 경우 PC 웹링크 적용
      - {t} = "WL" or "AL" 경우 필수
  - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
    - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
      - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
      - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
      - `배송비 할인 쿠폰`
      - `#{7자 이내} 무료 쿠폰`
      - `#{7자 이내} UP 쿠폰`
    - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
      - 줄바꿈 사용 불가
    - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
- tail `type: object` `length: -` `required: N` `description: 캐러셀 더보기`
  - 동보 전송인 경우 입력
  - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
  - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
  - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
  - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - adultYN `type: boolean` `length: -` `required: N` `description: 성인용 메시지 여부`
    - 기본값 : false
    - 대량 전송인 경우 입력
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - head `type: object` `length: -` `required: N` `description: 캐러셀 인트로`
    - 대량 전송인 경우 입력
    - header `type: string` `length: 20` `required: Y` `description: 제목`
    - content `type: string` `length: 50` `required: Y` `description: 내용`
    - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
      - [\[UploadCarouselCommerceImage - 캐러셀 커머스 이미지 업로드\]](https://developers.popbill.com/api-reference/kakaotalk/api/send-bms#UploadCarouselCommerceImage) API로 응답받은 URL
    - linkMobile `type: string` `length: 1,000` `required: N` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`
  - carousel `type: array` `length: 6` `required: 조건부` `description: 캐러셀 목록`
    - imageUrl `type: string` `length: 500` `required: Y` `description: 이미지 URL`
      - [\[UploadCarouselCommerceImage - 캐러셀 커머스 이미지 업로드\]](#UploadCarouselCommerceImage) API로 응답받은 URL
    - imageLink `type: string` `length: 500` `required: N` `description: 이미지 링크 URL`
    - addContent `type: string` `length: 34` `required: N` `description: 부가메시지`
    - commerce `type: object` `length: -` `required: Y` `description: 커머스 정보`
      - title `type: string` `length: 30` `required: Y` `description: 상품명`
      - regularPrice `type: number` `length: -` `required: Y` `description: 정상가격`
        - 0 \~ 99,999,999
      - discountType `type: string` `length: 1` `required: N` `description: 할인유형`
        - `R`: 할인율
        - `F`: 할인금액
      - discount `type: number` `length: -` `required: 조건부` `description: 할인율/할인금액`
        - {discountType}="R" 경우 1 \~ 100\
          {discountType}="F" 경우 0 \~ 999,999
      - discountPrice `type: number` `length: -` `required: 조건부` `description: 할인가격`
        - 0 \~ 99,999,999
        - 할인 적용 후 최종 가격
        - {discountType} 입력 시 필수
    - btns `type: array` `length: 2` `required: Y` `description: 버튼 목록`
      - n `type: string` `length: 8` `required: Y` `description: 버튼명`
      - t `type: string` `length: 2` `required: Y` `description: 버튼유형`
        - `WL`: 웹링크
        - `AL`: 앱링크
        - `MD`: 메시지전달
        - `BK`: 봇키워드
        - `AC`: 채널추가
        - 버튼 1개인 경우 채널추가 버튼은 첫번째 위치만 가능
        - 버튼 2개인 경우 채널추가 버튼은 두번째 위치만 가능
      - u1 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
        - {t} = "AL" 경우 iOS 앱링크 적용
        - {t} = "WL" 경우 Mobile 웹링크 적용
        - {t} = "WL" or "AL" 경우 필수
      - u2 `type: string` `length: 1,000` `required: 조건부` `description: 버튼링크`
        - {t} = "AL" 경우 Android 앱링크 적용
        - {t} = "WL" 경우 PC 웹링크 적용
        - {t} = "WL" or "AL" 경우 필수
    - coupon `type: object` `length: -` `required: N` `description: 쿠폰`
      - title `type: string` `length: 15` `required: Y` `description: 쿠폰 제목`
        - `#{숫자}원 할인 쿠폰`: (숫자 : 1\~99,999,999)
        - `#{숫자}% 할인 쿠폰`: (숫자 : 1\~100)
        - `배송비 할인 쿠폰`
        - `#{7자 이내} 무료 쿠폰`
        - `#{7자 이내} UP 쿠폰`
      - description `type: string` `length: 12` `required: Y` `description: 쿠폰 설명`
        - 줄바꿈 사용 불가
      - linkMobile `type: string` `length: 1,000` `required: 조건부` `description: Mobile 웹링크`
      - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
      - linkAndroid `type: string` `length: 1,000` `required: 조건부` `description: Android 앱링크`
      - linkIos `type: string` `length: 1,000` `required: 조건부` `description: iOS 앱링크`
  - tail `type: object` `length: -` `required: N` `description: 캐러셀 더보기`
    - 대량 전송인 경우 입력
    - linkMobile `type: string` `length: 1,000` `required: Y` `description: Mobile 웹링크`
    - linkPc `type: string` `length: 1,000` `required: N` `description: PC 웹링크`
    - linkAndroid `type: string` `length: 1,000` `required: N` `description: Android 앱링크`
    - linkIos `type: string` `length: 1,000` `required: N` `description: iOS 앱링크`

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselCommerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "head": {
                "header": "캐러셀 인트로 제목",
                "content": "캐러셀 인트로 내용",
                "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg"
            },
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "R",
                        "discount": 10
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "F",
                        "discount": 1000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselCommerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "head": {
                "header": "캐러셀 인트로 제목",
                "content": "캐러셀 인트로 내용",
                "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg"
            },
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "R",
                        "discount": 10
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "F",
                        "discount": 1000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "head": {
                "header": "캐러셀 인트로 제목",
                "content": "캐러셀 인트로 내용",
                "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg"
            },
            "carousel": [
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "R",
                        "discount": 10
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                },
                {
                    "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
                    "imageLink": "https://www.popbill.com",
                    "commerce": {
                        "title": "상품명",
                        "regularPrice": 10000,
                        "discountPrice": 9000,
                        "discountType": "F",
                        "discount": 1000
                    },
                    "btns": [
                        {
                            "n": "버튼명",
                            "t": "MD"
                        }
                    ]
                }
            ],
            "tail": {
                "linkMobile": "https://www.popbill.com"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/CarouselCommerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "plusFriendID": "@팝빌",
    "targeting": "I",
    "head": {
        "header": "캐러셀 인트로 제목",
        "content": "캐러셀 인트로 내용",
        "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg"
    },
    "carousel": [
        {
            "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        },
        {
            "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000,
                "discountPrice": 9000,
                "discountType": "R",
                "discount": 10


            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        },
        {
            "imageUrl": "https://mud-kage.kakao.com/dn/bpQO3e/dJMcafL82dm/vFoK4fIWdelJ4w8igTXjsK/img_l.jpg",
            "imageLink": "https://www.popbill.com",
            "commerce": {
                "title": "상품명",
                "regularPrice": 10000,
                "discountPrice": 9000,
                "discountType": "F",
                "discount": 1000
            },
            "btns": [
                {
                    "n": "버튼명",
                    "t": "MD"
                }
            ]
        }
    ],
    "tail": {
        "linkMobile": "https://www.popbill.com"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 7-2. UploadCarouselCommerceImage - 캐러셀 커머스 이미지 업로드

| HTTP Method | 테스트(Sandbox)                                                           | 운영(Production)                                                    |
| ----------- | ---------------------------------------------------------------------- | ----------------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Upload/Image/CarouselCommerce> | <https://popbill.linkhub.co.kr/BMS/Upload/Image/CarouselCommerce> |

- 브랜드 메시지 캐러셀 커머스 전송에 사용할 이미지를 업로드합니다.

> 캐러셀 커머스 이미지는 모든 업로드 이미지의 비율이 동일해야 합니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `multipart/form-data`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- images `type: file` `length: -` `required: Y` `description: 이미지 파일`
  - 가로:세로 비율제한 - 2:1이상 3:4이하
  - 권장 사이즈 - 800\*600px 또는 800\*400px(가로 500px 이상)
  - 파일형식 및 크기 - jpg, png / 최대 5MB
  - 업로드 요청 최대 파일수 - 11개

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Upload/Image/CarouselCommerce' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'images=@"/path/image1.jpg"' \
  --form 'images=@"/path/image2.jpg"'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`
- result `type: array` `length: -` `description: 이미지 업로드 결과`
  - formField `type: string` `length: -` `description: 이미지 인덱스`
    - 이미지 구분을 위한 식별값
  - imageUrl `type: string` `length: -` `description: 이미지 URL`

**응답 예시**

```json
{
    "code": 1,
    "message": "성공",
    "result": [
        {
            "formField": "image_1",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        },
        {
            "formField": "image_2",
            "imageUrl": "https://mud-kage.kakao.com/dn/bMQ3ze/dJMcahpDs55/FnZPcowCMtxkeZkvSyopu1/img_l.jpg"
        }
    ]
}
```

## 8. SendBMSVariable - 템플릿형 전송

| HTTP Method | 테스트(Sandbox)                                      | 운영(Production)                               |
| ----------- | ------------------------------------------------- | -------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/BMS/Variable> | <https://popbill.linkhub.co.kr/BMS/Variable> |

- 카카오톡 채널을 추가한 사용자 또는 마케팅 정보 수신에 동의한 사용자에게 템플릿형 광고성 메시지를 전송합니다. (최대 1,000건)
- 비채널 친구에게 브랜드 메시지를 전송하기 위해서는 등록된 비즈니스 채널에 대해 브랜드 메시지 채널 신청이 필요합니다.
- 전송실패시 대체문자를 전송할 수 있고, 이 경우 문자(SMS/LMS) 요금이 과금됩니다.

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**요청 본문**

- templateCode `type: string` `length: 12` `required: Y` `description: 템플릿 코드`
- targeting `type: string` `length: 1` `required: Y` `description: 전송대상`
  - `I`: 채널친구
  - `N`: 비채널 친구
  - `M`: 전체
- unsubscribeNo `type: string` `length: 13` `required: 조건부` `description: 080 수신거부 번호`
  - {targeting}="N" or "M" 인 경우 필수
- altYN `type: boolean` `length: -` `required: N` `description: 대체문자 전송 여부`
  - 기본값 : false
- sendNum `type: string` `length: 20` `required: 조건부` `description: 발신번호`
  - 대체문자 전송시 필수
  - 팝빌에 등록되지 않은 발신번호를 입력하는 경우 오류 반환
- altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
  - 대체문자 내용이 90byte 초과한 경우에만 적용
  - 단위 : byte
  - 동보 전송인 경우 입력
- altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
  - 대체문자 전송 시 필수
  - 단위 : byte
  - 동보 전송인 경우 입력
- altUnsubscribeNo `type: string` `length: 20` `required: 조건부` `description: 대체문자 080 수신거부 번호`
  - 대체문자 전송 시 필수
- reserveDT `type: string` `length: 14` `required: N` `description: 전송 예약일시`
  - 형식 : yyyyMMddHHmmss
  - 예약 가능 시간 08:00\~20:50
  - 기본값 : 즉시전송
- requestNum `type: string` `length: 36` `required: N` `description: 요청번호`
  - 파트너가 접수 단위를 식별하기 위해 할당하는 관리번호
  - 영문 대소문자, 숫자, 특수문자('-', '\_')만 이용 가능
- contentVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 내용 변수`
  - 내용, 헤더, 아이템 제목, 아이템 이미지 링크, 부가메시지에 변수 사용한 경우 필수
  - 동보 전송인 경우 필수
- buttonVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 버튼 변수`
  - 버튼 링크에 변수 사용한 경우 필수
  - 동보 전송인 경우 필수
- couponVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 쿠폰 변수`
  - 쿠폰 설명, 링크에 변수 사용한 경우 필수
  - 동보 전송인 경우 필수
- commerceVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 커머스 변수`
  - 상품명, 정상가격, 할인가격, 할인율, 할인금액에 변수 사용한 경우 필수
  - 동보 전송인 경우 필수
- carouselVariable `type: array` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 변수`
  - 캐러셀에 변수 사용한 경우 필수
  - 동보 전송인 경우 필수
  - contentVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 내용 변수`
    - 캐러셀 제목, 캐러셀 내용, 캐러셀 이미지 링크, 캐러셀 부가메시지에 변수 사용한 경우 필수
  - buttonVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 버튼 변수`
    - 버튼 링크에 변수 사용한 경우 필수
  - couponVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 쿠폰 변수`
    - 쿠폰 설명, 링크에 변수 사용한 경우 필수
  - commerceVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 커머스 변수`
    - 상품명, 정상가격, 할인가격, 할인율, 할인금액에 변수 사용한 경우 필수
- msgs `type: array` `length: 1,000` `required: Y` `description: 수신자 목록`
  - receiveNum `type: string` `length: 20` `required: Y` `description: 수신번호`
  - receiveName `type: string` `length: 70` `required: N` `description: 수신자명`
  - altSubject `type: string` `length: 64` `required: N` `description: 대체문자 제목`
    - 대체문자 내용이 90byte 초과한 경우에만 적용
    - 단위 : byte
    - 대량 전송인 경우 입력
  - altContent `type: string` `length: 2,000` `required: 조건부` `description: 대체문자 내용`
    - 대체문자 전송 시 필수
    - 단위 : byte
    - 대량 전송인 경우 입력
  - interOPRefKey `type: string` `length: 20` `required: N` `description: 파트너 지정키`
    - 브랜드 메시지 대량 전송 시 파트너가 개별건마다 입력할 수 있는 값
  - contentVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 내용 변수`
    - 내용, 헤더, 아이템 제목, 아이템 이미지 링크, 부가메시지에 변수 사용한 경우 필수
    - 대량 전송인 경우 필수
  - buttonVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 버튼 변수`
    - 버튼 링크에 변수 사용한 경우 필수
    - 대량 전송인 경우 필수
  - couponVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 쿠폰 변수`
    - 쿠폰 설명, 링크에 변수 사용한 경우 필수
    - 대량 전송인 경우 필수
  - commerceVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 커머스 변수`
    - 상품명, 정상가격, 할인가격, 할인율, 할인금액에 변수 사용한 경우 필수
    - 대량 전송인 경우 필수
  - carouselVariable `type: array` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 변수`
    - 캐러셀에 변수 사용한 경우 필수
    - 대량 전송인 경우 필수
    - contentVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 내용 변수`
      - 캐러셀 제목, 캐러셀 내용, 캐러셀 이미지 링크, 캐러셀 부가메시지에 변수 사용한 경우 필수
    - buttonVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 버튼 변수`
      - 버튼 링크에 변수 사용한 경우 필수
    - couponVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 쿠폰 변수`
      - 쿠폰 설명, 링크에 변수 사용한 경우 필수
    - commerceVariable `type: object` `length: -` `required: 조건부` `description: 브랜드 메시지 캐러셀 커머스 변수`
      - 상품명, 정상가격, 할인가격, 할인율, 할인금액에 변수 사용한 경우 필수

**요청 예시 (단건)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Variable' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "targeting": "I",
    "templateCode": "026030000095",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동",
            "contentVariable": {
                "이름": "팝빌"
            }
        }
    ]
}'
```

**요청 예시 (대량)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Variable' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "targeting": "I",
    "templateCode": "026030000095",
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1",
            "contentVariable": {
                "이름": "팝빌"
            }
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2",
            "contentVariable": {
                "이름": "팝빌"
            }
        }
    ]
}'
```

**요청 예시 (동보)**

```bash
curl --request POST \
  --url 'https://{domain}/BMS/Variable' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "targeting": "I",
    "templateCode": "026030000095",
    "contentVariable": {
        "이름": "팝빌"
    },
    "msgs": [
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동1"
        },
        {
            "receiveNum": "01012345678",
            "receiveName": "홍길동2"
        }
    ]
}'
```

### Response

**응답 본문**

- receiptNum `type: string` `length: 18` `description: 접수번호`

**응답 예시**

```json
{
    "receiptNum": "026012710214000001"
}
```

## 9. CancelReserve - 예약전송 전체 취소 (접수번호)

| HTTP Method | 테스트(Sandbox)                                                       | 운영(Production)                                                |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------------------------- |
| GET         | <https://popbill-test.linkhub.co.kr/KakaoTalk/{receiptNum}/Cancel> | <https://popbill.linkhub.co.kr/KakaoTalk/{receiptNum}/Cancel> |

- 팝빌에서 반환받은 접수번호로 예약된 카카오톡을 전송 취소합니다. (예약시간 10분 전까지 가능)

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Accept-Language `required: N` `description: 응답 언어 설정`
  - `ko-KR`: 기본값
  - `en-US`
- Accept-Encoding `required: N` `description: 응답 압축 방식`
  - `gzip`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**Query 파라미터**

- receiptNum `type: string` `length: 18` `required: Y` `description: 팝빌에서 할당한 접수번호`
  - 카카오톡 예약전송 요청의 반환값

**요청 예시**

```bash
curl --request GET \
  --url 'https://{domain}/KakaoTalk/{receiptNum}/Cancel' \
  --header 'Authorization: Bearer {token}'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`

**응답 예시**

```json
{
    "code": 1,
    "message": "취소 완료"
}
```

## 10. CancelReservebyRCV - 예약전송 부분 취소 (접수번호)

| HTTP Method | 테스트(Sandbox)                                                       | 운영(Production)                                                |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/KakaoTalk/{receiptNum}/Cancel> | <https://popbill.linkhub.co.kr/KakaoTalk/{receiptNum}/Cancel> |

- 팝빌에서 반환받은 접수번호로 접수 건을 식별하여 수신번호에 예약된 카카오톡을 전송 취소합니다. (예약시간 10분 전까지 가능)

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- Accept-Language `required: N` `description: 응답 언어 설정`
  - `ko-KR`: 기본값
  - `en-US`
- Accept-Encoding `required: N` `description: 응답 압축 방식`
  - `gzip`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**Query 파라미터**

- receiptNum `type: string` `length: 18` `required: Y` `description: 팝빌에서 할당한 접수번호`
  - 카카오톡 예약전송 요청의 반환값

**요청 본문**

- receiveNum `type: string` `length: 20` `required: Y` `description: 예약전송 수신번호`

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/KakaoTalk/{receiptNum}/Cancel' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "receiveNum": "01012345678"
  }'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`

**응답 예시**

```json
{
    "code": 1,
    "message": "취소 완료"
}
```

## 11. CancelReserveRN - 예약전송 전체 취소 (요청번호)

| HTTP Method | 테스트(Sandbox)                                                       | 운영(Production)                                                |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------------------------- |
| GET         | <https://popbill-test.linkhub.co.kr/KakaoTalk/Cancel/{requestNum}> | <https://popbill.linkhub.co.kr/KakaoTalk/Cancel/{requestNum}> |

- 파트너가 할당한 요청번호로 예약된 카카오톡을 전송 취소합니다. (예약시간 10분 전까지 가능)

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Accept-Language `required: N` `description: 응답 언어 설정`
  - `ko-KR`: 기본값
  - `en-US`
- Accept-Encoding `required: N` `description: 응답 압축 방식`
  - `gzip`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**Query 파라미터**

- requestNum `type: string` `length: 36` `required: Y` `description: 파트너가 할당한 요청번호`

**요청 예시**

```bash
curl --request GET \
  --url 'https://{domain}/KakaoTalk/Cancel/{requestNum}' \
  --header 'Authorization: Bearer {token}'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`

**응답 예시**

```json
{
    "code": 1,
    "message": "취소 완료"
}
```

## 12. CancelReserveRNbyRCV - 예약전송 부분 취소 (요청번호)

| HTTP Method | 테스트(Sandbox)                                                       | 운영(Production)                                                |
| ----------- | ------------------------------------------------------------------ | ------------------------------------------------------------- |
| POST        | <https://popbill-test.linkhub.co.kr/KakaoTalk/Cancel/{requestNum}> | <https://popbill.linkhub.co.kr/KakaoTalk/Cancel/{requestNum}> |

- 파트너가 할당한 요청번호로 접수 건을 식별하여 수신번호에 예약된 카카오톡을 전송 취소합니다. (예약시간 10분 전까지 가능)

### Request

**요청 헤더**

- Authorization `required: Y` `description: 인증 토큰`
  - [\[참고\] 인증 및 헤더 설정](https://developers.popbill.com/api-reference/kakaotalk/getting-started/authorization)
- Content-Type `required: Y` `description: 요청 본문 형식`
  - `application/json`
- Accept-Language `required: N` `description: 응답 언어 설정`
  - `ko-KR`: 기본값
  - `en-US`
- Accept-Encoding `required: N` `description: 응답 압축 방식`
  - `gzip`
- X-PB-UserID `required: N` `description: 팝빌회원 아이디`

**Query 파라미터**

- requestNum `type: string` `length: 36` `required: Y` `description: 파트너가 할당한 요청번호`

**요청 본문**

- receiveNum `type: string` `length: 20` `required: Y` `description: 예약전송 수신번호`

**요청 예시**

```bash
curl --request POST \
  --url 'https://{domain}/KakaoTalk/Cancel/{requestNum}' \
  --header 'Authorization: Bearer {token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "receiveNum": "01012345678"
  }'
```

### Response

**응답 본문**

- code `type: number` `length: -` `description: API 처리에 대한 응답코드`
  - `1`: 성공
- message `type: string` `length: -` `description: API 처리에 대한 응답메시지`

**응답 예시**

```json
{
    "code": 1,
    "message": "취소 완료"
}
```
