Streaming CDN

Go live from OBS to the browser in under a second with WHIP

Updated 2026-10-07

WHIP (WebRTC-HTTP Ingestion Protocol) lets an encoder publish over WebRTC with a single HTTP request. OBS Studio supports it natively, so a stream can go from OBS to viewers' browsers over WebRTC end to end, in the low hundreds of milliseconds, instead of the several seconds that segment-based delivery such as HLS adds.

1. The publish URL

OBS publishes to your ingest domain, a publish point and a stream name:

https://<ingest-hostname>/<publish-point>/<stream-name>

# example
https://push.example.com/live/camera-01

2. Before you publish

  1. The ingest domain has active DNS and TLS.
  2. If source IP allowlisting is on, add the publisher's public egress IP (a private LAN address is not enough).
  3. If Stream Key authentication is on, create a key for this exact ingest domain. The secret is shown once.
  4. Use a current OBS Studio release that includes WHIP.

3. OBS settings

Open Settings → Stream and enter:

OBS fieldValue
ServiceWHIP
ServerThe full WHIP URL, including publish point and stream name
Bearer TokenThe ingest domain's Stream Key (empty only when Stream Key authentication is off)

OBS sends the Bearer Token as Authorization: Bearer <stream-key>. Treat Stream Keys as passwords: never put them in public URLs, screenshots, repositories or shared OBS profiles.

4. Recommended output for low latency

SettingValueWhy
Video encoderH.264 (hardware or software)Broad browser support
Rate controlCBRPredictable bandwidth
720p bitrate1.5–2.5 MbpsAdjust for motion and source quality
1080p bitrate3–6 MbpsAdjust for motion and source quality
Keyframe interval1 secondFaster first frame and recovery
H.264 profileMain or BaselineAvoids unsupported decoder features
B-frames0Lower latency
AudioEnabled, not mutedWHIP negotiates the audio track

5. Check that it works

  1. OBS changes from Connecting to Live.
  2. The console's Live streams list shows the stream name with active tracks.
  3. Open https://<playback-hostname>/<publish-point>/<stream-name> and check video and audio.

6. When it does not work

SymptomLikely causeWhat to do
401 invalid_stream_keyMissing, expired, revoked or wrong-domain keyCreate a key for the active ingest domain and paste it into Bearer Token
403 publisher_ip_deniedThe publisher's public IP is not allowedAdd the real public egress IP, or turn the allowlist off while testing
429 Too Many RequestsA duplicate publisher, or a concurrency limitStop the old publisher or use a different stream name
OBS stays on ConnectingFirewall, outbound UDP/DTLS, DNS or TLSCheck DNS/TLS, allow outbound UDP, read the OBS log
Live with no pictureHidden or muted source, incompatible outputCheck the OBS preview and mixer; use H.264 and a one-second keyframe interval

Publishing from a web page instead

A browser page can publish too: WHIP with fetch() and a send-only RTCPeerConnection. Because that request is cross-origin, list the page's origin under the ingest domain's browser publishing origins (CORS) in the console. Encoders such as OBS never ask for CORS and are unaffected.

Interactive live streaming

Zero-latency WebRTC live streaming for streamers, live commerce and events: real-time chat and votes over data channels, picture-in-picture, adaptive quality, recording and playback protection.

Learn more · Contact us