채팅 이벤트

채팅 이벤트를 구독하면 채널에서 발생하는 채팅 메시지를 실시간으로 수신합니다.

구독 엔드포인트: POST /api/openapi/open/v1/sessions/events/subscribe/chat

필요 Scope: READ:LIVE_CHAT

이 구독으로는 CHAT 외에 DROPS·GOODS_PURCHASE 이벤트도 함께 전달됩니다. event 필드로 분기하고, 모르는 값은 무시하도록 구현하세요.

이벤트 데이터

{
  "event": "CHAT",
  "data": {
    "channelId": "12345",
    "senderChannelId": "67890",
    "profile": {
      "nickname": "닉네임",
      "badges": [
        { "id": "subscribe_tier1", "name": "티어1 구독자", "imageUrl": "https://..." }
      ]
    },
    "content": "안녕하세요 :AaBbCc-heart:",
    "messageTime": "2024-01-15T10:30:00.000Z",
    "emojis": {
      ":AaBbCc-heart:": "https://example.com/emojis/heart.webp"
    }
  }
}
필드 타입 설명
channelId string 채팅이 발생한 채널의 ID
senderChannelId string 메시지 작성자의 채널 ID
profile.nickname string 작성자 닉네임
profile.badges array 작성자의 뱃지 목록 (없으면 빈 배열). 각 항목은 id, name, imageUrl 포함
content string 채팅 메시지. 이모티콘 토큰이 포함될 수 있음
messageTime string 메시지 전송 시간 (ISO 8601)
emojis object 이모티콘 토큰과 이미지 URL 매핑

드롭스 추첨 완료 (DROPS)

랜덤 쿠폰 보상의 추첨이 끝나면 해당 캠페인이 연결된 방송으로 DROPS 이벤트가 전달됩니다. 별도 구독이 필요 없으며, 채팅 이벤트 구독으로 함께 수신합니다.

수신 조건은 두 가지입니다.

  • 캠페인이 연결된 방송이 송출 중일 것 (방송이 꺼져 있으면 전달되지 않습니다)
  • 해당 회차에 실제로 당첨자가 나왔을 것
{
  "event": "DROPS",
  "data": {
    "channelId": "12345",
    "campaignId": "778",
    "rewardId": "1024",
    "rewardTitle": "게임 아이템 쿠폰",
    "rewardDescription": "인게임에서 사용 가능한 아이템 쿠폰입니다.",
    "rewardImageUrl": "https://example.com/rewards/item-coupon.png",
    "count": 30,
    "drawnAt": "2024-01-15T10:30:00.000Z"
  }
}
필드 타입 설명
channelId string 추첨 결과가 전달된 채널의 ID
campaignId string 드롭스 캠페인 ID
rewardId string 드롭스 보상 ID
rewardTitle string 보상명
rewardDescription string 보상 설명
rewardImageUrl string 보상 이미지 URL
count number 이번 회차 당첨자 수
drawnAt string 추첨 시각 (ISO 8601)

추첨은 한 캠페인에서 여러 번 일어날 수 있습니다. 운영자가 쿠폰을 나눠 배분하거나, 캠페인 종료 후 쿠폰을 추가 등록해 잔여 대상자에게 재추첨하는 경우입니다. 그때마다 이벤트가 발생하며 count그 회차의 당첨자 수입니다. 누적값이 아니므로 총 당첨자를 알아야 하면 직접 합산하세요.


굿즈 구매 인증 메시지 (GOODS_PURCHASE)

시청자가 마플샵에서 산 굿즈를 방송 중에 인증하면 전달됩니다. 채팅창에 카드 형태로 노출되는 메시지이며, 별도 구독 없이 채팅 이벤트 구독으로 함께 수신합니다.

일반 채팅과 달리 구매 정보(상점·상품·금액) 가 함께 옵니다.

{
  "event": "GOODS_PURCHASE",
  "data": {
    "channelId": "12345",
    "senderChannelId": "67890",
    "profile": {
      "nickname": "닉네임",
      "badges": [
        { "id": "subscribe_tier1", "name": "티어1 구독자", "imageUrl": "https://..." }
      ]
    },
    "content": "굿즈 잘 받았어요!",
    "messageTime": "2024-01-15T10:30:00.000Z",
    "emojis": {},
    "shopName": "테스트샵",
    "representativeItemName": "교복 리본 아크릴",
    "itemCount": 2,
    "totalAmount": 150000,
    "currency": "KRW"
  }
}
필드 타입 설명
channelId string 인증 메시지가 전달된 채널의 ID
senderChannelId string | null 구매자의 채널 ID. 익명 전송 시 null
profile object | null 구매자 프로필(nickname, badges). 익명 전송 시 null
content string 인증 메시지. 이모티콘 토큰이 포함될 수 있음
messageTime string 메시지 전송 시간 (ISO 8601)
emojis object 이모티콘 토큰과 이미지 URL 매핑
shopName string 굿즈를 구매한 마플샵 상점명
representativeItemName string 대표 상품명. 결제액이 가장 큰 품목
itemCount number 상품 종류 수. itemCount - 1 이 "외 N건"
totalAmount number 해당 상점 결제 총액
currency string 결제 통화. KRW / USD / JPY
  • totalAmount는 후원의 payAmount와 단위가 다릅니다. 후원은 빔이지만 여기는 실제 결제 금액이라 currency를 함께 봐야 합니다. 후원 집계에 합산하지 마세요.
  • 인증은 결제 1건 × 상점 1곳당 한 번만 가능합니다. 같은 구매로 이벤트가 여러 번 오지 않습니다.
  • 익명 전송이면 profile이 모두 null입니다.

이모티콘 토큰

채팅 메시지에는 구독자 이모티콘이 토큰 형태로 포함될 수 있습니다.

토큰 형식: :{channelIdentifier}-{emojiName}:

{
  "content": "안녕하세요 :AaBbCc-heart:",
  "emojis": {
    ":AaBbCc-heart:": "https://example.com/emojis/heart.webp"
  }
}

메시지 본문에서 토큰을 emojis 매핑의 이미지 URL로 치환하여 렌더링합니다.

"안녕하세요 :AaBbCc-heart: 반갑습니다"
→ "안녕하세요 <img src="...heart.webp"> 반갑습니다"