방송 이력
개요
oe.history.*는 방송 이력을 읽기 전용으로 제공합니다. 목록 조회와 단건 조회만 지원합니다.
시작하기 전에
방송 이력을 조회하기 전에 아래를 준비하세요.
- 파트너 앱에
HISTORYcapability grant 가 있어야 합니다. 없으면CapabilityDenied에러가 발생합니다.
참고: capability 는 부여 등급(READ·MANAGE)에 따라 사용할 수 있는 API 가 다릅니다. 메서드별 등급은 컨트롤 플레인 개요의 Capability 요약에서 확인하세요.
HistoryView 필드
목록·상세 조회 모두 아래 필드 구성을 공유합니다.
| 이름 | 타입 | 설명 |
|---|---|---|
sessionId | string | 방송 세션 ID |
type | "MIC" | "TTS" | 방송 유형. 서버 내부 wire 값을 SDK가 정규화하므로 항상 이 두 값 중 하나입니다. 알 수 없는 wire 값을 서버가 내려주면 SDK는 ProtocolError를 던집니다 |
status | string | 방송 결과 |
totalDevices | number | 전체 대상 디바이스 수 |
successDevices | number | 성공 디바이스 수 |
failDevices | number | 실패 디바이스 수 |
createdAt | string | 방송 시작 시각(ISO 8601) |
triggeredBy | string | 방송 요청자 ID |
contentTitle | string | null | undefined | 방송한 컨텐츠 제목 |
contentHandle | string | null | undefined | 이 앱이 접근 가능한 컨텐츠면 그 handle(재방송 조합용), 아니면 null |
deviceHandles | string[] | null | undefined | 당시 대상 디바이스 handle 목록. 목록 조회에서는 채워지지 않고 상세 조회에서만 채워집니다 |
참고:
type은 SDK가 정규화한 공개 계약값입니다. 서버 wire 값을 직접 비교하지 말고'TTS'/'MIC'로 비교하세요.
방송 이력 목록 조회 — oe.history.list()
정렬은 서버가 최신순으로 고정합니다.
기본 정보
| 메서드 | 앱 capability | 참조 handle 조건 | 반환 타입 |
|---|---|---|---|
oe.history.list(opts?) | HISTORY | 없음 — capability 만으로 게이트되고, 이후 이 앱이 소유한 세션만 반환됩니다 | Promise<Page<HistoryView>> |
요청 — 필터 파라미터
| 이름 | 타입 | 설명 | 기본값 | 필수 |
|---|---|---|---|---|
page | number | 페이지 번호(0-base) | - | X |
size | number | 페이지 크기 | - | X |
type | "MIC" | "TTS" | 방송 유형 필터 | - | X |
search | string | 컨텐츠 제목 부분일치 필터(대소문자 무시) | - | X |
응답
| 이름 | 타입 | 설명 |
|---|---|---|
content | HistoryView[] | 이 페이지의 항목 목록 |
page | number | 현재 페이지 번호 |
size | number | 페이지 크기 |
totalElements | number | 전체 항목 수 |
예제
const page = await oe.history.list({ page: 0, size: 10 });
console.log(page.content.length, page.totalElements);
// 유형 필터 — TTS 방송만
const tts = await oe.history.list({ page: 0, size: 10, type: "TTS" });
// 제목 검색 — 부분일치·대소문자 무시
const found = await oe.history.list({ page: 0, size: 10, search: "환영" });
참고: 필터나 검색어를 바꿀 때는
page를 0 으로 되돌리세요.
전체 페이지를 순회하려면 다음과 같이 반복 조회합니다.
async function fetchAllHistory() {
type Item = Awaited<ReturnType<typeof oe.history.list>>["content"][number];
const all: Item[] = [];
let page = 0;
const size = 20;
while (true) {
const result = await oe.history.list({ page, size });
all.push(...result.content);
if ((page + 1) * size >= result.totalElements) break;
page++;
}
return all;
}
대표 에러
| 에러 | HTTP 상태 | 원인 | 해결 방법 |
|---|---|---|---|
CapabilityDenied | 403 | 앱에 HISTORY capability grant 가 없음 | Open Echo 지원 채널로 grant 를 요청하세요 |
방송 이력 단건 조회 — oe.history.get()
목록과 달리 deviceHandles(당시 대상)가 채워집니다. 지난 방송 당시 대상 그대로 재방송하는 흐름에서 주로 사용합니다.
기본 정보
| 메서드 | 앱 capability | 참조 handle 조건 | 반환 타입 |
|---|---|---|---|
oe.history.get(sessionId) | HISTORY | 없음 — sessionId 가 이 앱이 소유한 세션이 아니면 조회되지 않습니다(존재 은닉) | Promise<HistoryView> |
요청
| 이름 | 타입 | 설명 | 기본값 | 필수 |
|---|---|---|---|---|
sessionId | string | 조회할 방송 세션 ID | - | O |
응답
HistoryView — 필드는 위 "HistoryView 필드" 절을 참조하세요. 상세 조회에서는 deviceHandles 가 채워집니다.
예제
const item = await oe.history.get(sessionId);
console.log(item.status, item.deviceHandles);
참고: 이 앱이 소유하지 않은 세션은 존재 여부가 노출되지 않습니다.
대표 에러
| 에러 | HTTP 상태 | 원인 | 해결 방법 |
|---|---|---|---|
CapabilityDenied | 403 | 앱에 HISTORY capability grant 가 없음 | Open Echo 지원 채널로 grant 를 요청하세요 |
지난 방송으로 재방송
oe.history.get()으로 받은 contentHandle과 deviceHandles를 그대로 oe.broadcast.tts.fromContent()에 전달하면 지난 방송 당시 대상 그대로 다시 방송할 수 있습니다.
const past = await oe.history.get(sessionId);
if (past.contentHandle && (past.deviceHandles?.length ?? 0) > 0) {
await oe.broadcast.tts.fromContent({
contentHandle: past.contentHandle,
deviceHandles: past.deviceHandles!,
idempotencyKey: crypto.randomUUID(),
});
}
- 재방송 후보는
type !== 'MIC'이고contentHandle이 있는 항목만 고릅니다. deviceHandles가 비어 있으면 당시 대상이 더 이상 이 앱에 노출되지 않는 것입니다 — 재방송할 수 없습니다.
방송 실행 상세는 TTS 방송을 참조하세요.
참고 코드
레퍼런스 앱의 방송 이력 화면 구현은 partner-app/src/features/history/History.tsx에서 확인할 수 있습니다. history.get() 기반 재방송 플로우는 partner-app/src/features/tts/TtsBroadcast.tsx에 있습니다.

