빠른 시작

승인된 파트너 상태에서 첫 스트림 재생과 이벤트 추적까지 10단계로 진행합니다. 여기의 모든 작업은 Sandbox(https://signal-partners.newunivers.ai/v1)에서 실행됩니다. 샌드박스 가이드를 참고하세요.

먼저 기본 URL을 설정하세요. 조직 ID와 키는 승인 클레임 및 부트스트랩 응답에서 얻습니다:

export NSP_BASE="https://signal-partners.newunivers.ai/v1"

1. 조직 승인 받기

개인정보 처리방침에 동의하고 파트너 신청서를 제출합니다:

curl -X POST "$NSP_BASE/partner-applications" \
  -H "Content-Type: application/json" \
  -d '{
    "company_name": "Acme Streaming",
    "service_type": "OTT",
    "contact_name": "Jin Park",
    "contact_email": "dev@acme.example",
    "privacy_consent": true,
    "target_territories": ["KR", "JP"],
    "expected_use_case": "Catalog licensing + VOD playback"
  }'

응답의 application_referencestatus_token을 즉시 안전한 시크릿 저장소에 보관하세요. 상태 토큰은 한 번만 표시되며 URL이나 로그에 넣지 마세요. 같은 이메일로 24시간 내 다시 제출하면 새 신청 대신 기존 application_id를 반환합니다. NU가 조직을 검토하는 동안 상태 호출을 폴링하세요.

상태가 approved이고 claim_available이 true가 된 뒤 클레임을 정확히 한 번 실행하세요.

export NSP_APPLICATION_REFERENCE="nsp_app_..."
export NSP_STATUS_TOKEN="nsp_ast_..."

curl -X POST "$NSP_BASE/partner-applications/status"   -H "Content-Type: application/json"   -d "{"application_reference":"$NSP_APPLICATION_REFERENCE","status_token":"$NSP_STATUS_TOKEN"}"

curl -X POST "$NSP_BASE/partner-applications/claim"   -H "Content-Type: application/json"   -d "{"application_reference":"$NSP_APPLICATION_REFERENCE","status_token":"$NSP_STATUS_TOKEN"}"

export NSP_APPROVAL_TOKEN="nsp_appr_..."

2. 첫 Sandbox 키 발급

승인 후 /partner-applications/claim에서 한 번 받은 승인 토큰을 nsp_test_ 접두사의 Sandbox 키로 교환하세요. 시크릿은 한 번만 표시되므로 시크릿 매니저에 저장하세요. 읽기 전용 파트너 포털에서 같은 키로 상태를 볼 수 있지만 키 생성, 회전 및 폐기는 API에서만 수행합니다.

curl -X POST "$NSP_BASE/api-keys/bootstrap" \
  -H "Content-Type: application/json" \
  -d "{ \"approval_token\": \"$NSP_APPROVAL_TOKEN\" }"

export NSP_ADMIN_KEY="nsp_test_xxxxxxxxxxxxxxxx"

3. 최소 권한으로 스코프 지정

부트스트랩 키로 이 가이드에 필요한 catalog:read, playback:token, events:write만 가진 좁은 연동 키를 생성하세요. api_keys:write를 가진 서버 측 관리 키는 별도로 보관하고 선택적으로 각 키에 허용 오리진과 IP를 고정하세요. API 키를 참고하세요.

curl --fail-with-body -X POST "$NSP_BASE/api-keys" \
  -H "Authorization: Bearer $NSP_ADMIN_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "environment": "sandbox",
    "scopes": ["catalog:read", "playback:token", "events:write"]
  }'

export NSP_KEY="nsp_test_xxxxxxxxxxxxxxxx"

4. Postman 컬렉션 다운로드

Postman 컬렉션Sandbox 환경 파일을 다운로드하여 Postman에 가져온 뒤 base_urlapi_key를 위 값으로 설정하세요.

5. 카탈로그 타이틀 목록 조회

curl "$NSP_BASE/catalog/titles?territory=KR&limit=5" \
  -H "Authorization: Bearer $NSP_KEY"

조직은 API 키에서 안전하게 도출되므로 X-NU-Partner-Id를 별도로 보낼 필요가 없습니다.

data[]에서 title_id를 고르고 GET /catalog/titles/{title_id}/episodes로 에피소드를 조회한 뒤 episode_id를 복사하세요. 카탈로그 API를 참고하세요.

6. 재생 인가

viewer_id_hash는 시청자 ID와 솔트로 직접 계산한 SHA-256입니다. Production은 64자의 소문자 16진수를 요구하며 원시 PII여서는 안 됩니다. 선택적으로 비PII preferences를 보내 호스팅 웹뷰를 개인화하세요.

샘플 값을 재사용하지 마세요. 파트너가 비밀로 보관하는 솔트로 서버에서 해시를 계산하세요.

export NSP_VIEWER_HASH="$(printf '%s' 'stable-viewer-id:replace-with-secret-salt' | sha256sum | cut -d' ' -f1)"
curl -X POST "$NSP_BASE/playback/tokens" \
  -H "Authorization: Bearer $NSP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title_id": "ttl_abc",
    "episode_id": "ep_001",
    "viewer_id_hash": "'"$NSP_VIEWER_HASH"'",
    "country": "KR",
    "device": "web",
    "origin": "https://app.acme.example",
    "preferences": { "subtitle_language": "ko", "autoplay_next": true },
    "expires_in": 1800
  }'

Sandbox 재생에는 라이선스 계약이 필요 없지만 권리 게이트는 적용됩니다. 타이틀에는 노출되고 만료되지 않은 권리 패키지가 필요하며 country를 보내면 허용 지역이어야 하고 그렇지 않으면 territory_not_allowed로 차단됩니다. 응답은 playback_session_id, expires_at, 호스팅된 webview_url, 서명된 hls/dash URL을 담은 manifest, event_endpointrequired_events를 담은 tracking을 포함합니다. 재생 API를 참고하세요.

7. 재생

동일한 세션에 대한 두 가지 동등한 방법 중 하나를 선택하세요:

  • 호스팅 웹뷰(권장): webview_url을 WebView(WKWebView/android.webkit.WebView) 또는 <iframe>에서 여세요. 플레이어 연동이 필요 없고 preferences가 자동 적용됩니다. URL은 서명 토큰을 포함하므로 시크릿으로 취급하세요.
  • 자체 플레이어: HLS 플레이어(hls.js, AVPlayer, ExoPlayer)를 manifest.hls로 지정하세요. CDN은 세그먼트 제공 전 서명과 TTL을 검증하며 마스터 파일은 노출되지 않습니다.

8. 이벤트 전송

curl -X POST "$NSP_BASE/events" \
  -H "Authorization: Bearer $NSP_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "event_id": "evt_acme_0001",
    "event_type": "EPISODE_STARTED",
    "title_id": "ttl_abc",
    "episode_id": "ep_001",
    "playback_session_id": "pbs_123",
    "occurred_at": "2026-06-24T00:00:00Z"
  }'

200{ data: { event_id, status: "validated", received_at } }를 반환합니다. event_id는 조직별로 고유하고 멱등이며 다시 보내면 409 duplicate_event_id를 반환합니다. 이벤트 API를 참고하세요.

9. 수집 결과 확인

상태가 validated인지 확인하세요. 오류 응답의 request_id를 로그에 저장하고 안정적인 event_id를 사용하여 재시도 시 중복 집계 대신 duplicate_event_id가 반환되게 하세요.

10. Production 키 요청

연동을 마치면 프로덕션 체크리스트를 따르세요. Production 계약을 체결하여 statusactive이고 production_api_enabledtrue가 되게 한 뒤(라이선스 API) nsp_live_ 키를 요청하고 allowed_origins/allowed_ips를 설정한 다음 NSP_BASEhttps://signal-partners.newunivers.ai/v1로 전환하세요.