Sign in Start streaming
← Knowledgebase
SteamDEVELOPERS

Steam RTMP streaming: a developer guide

27 Sep 2026 · 7 min read

A Steam store broadcast is an RTMP ingest. Anything that can speak RTMP can feed it: OBS, ffmpeg, a hardware encoder or a hosted service. This page is the whole picture for developers: who is allowed to broadcast, where the upload URL and token come from, the exact encode Steam wants, working ffmpeg commands, and the handful of things that make a correct stream stay invisible.

Who can broadcast

Valve checks the account, not the software. The Steam account that sends the stream must:

▪be non-limited, which means it has spent at least $5 USD on the Steam store at some point
▪own the game it is broadcasting
▪hold the Broadcast Live permission in Steamworks, or belong to the Store Broadcast Beta group

Games marked Adult-Only cannot be broadcast at all. A fresh account created just for streaming fails the first check, and it is the most common reason a setup that looks right never appears.

Getting the RTMP URL and token

1.Signed in as the broadcasting account, open steamcommunity.com/broadcast/upload and choose Create RTMP Token. Steam picks an upload server near you and shows its RTMP URL.
2.Copy the RTMP URL (the server) and the token (the stream key). Treat the token like a password: anyone holding it can broadcast as you. Finding your Steam stream key has more on keeping it safe.
3.Enter your game’s App ID on the same page. Use the base game’s App ID, never a DLC or demo App ID. It is in the URL of your store page. Broadcasting your demo explains why a demo ID hides the stream.
4.Set the broadcast to Public. It defaults to Friends Only, which means only you and your Steam friends can see it, and the store page shows nothing.

In any RTMP client the URL goes in the server field and the token in the stream key field. Tools that take one address want the two joined with a slash: rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN.

The encode Steam requires

These are Valve’s published requirements, not suggestions. The right-hand column is what Loopcast sends, which sits safely inside every limit.

Field
Steam requires
Safe setting
Video codec
H.264, High profile, level 4.1
H.264 High@4.1
Frame rate
30 or 60 fps
30 fps
Aspect ratio
16:9
1920×1080
Keyframe interval
2 seconds
2 s (60 frames at 30 fps)
Video bitrate
Constant (CBR), 7,000 kbps max
6,000 kbps CBR
Audio
AAC-LC, 128 kbps max
AAC-LC 128 kbps, 44.1 kHz stereo

Two of these cause most rejected or stuttering streams: a keyframe interval left on the encoder’s automatic setting, and variable bitrate. 60 fps is allowed, but at a 7,000 kbps ceiling 30 fps gives each frame twice the bits, which is the better trade for a looped trailer. More detail is in Steam broadcast video specs.

Streaming a file with ffmpeg

This takes any video, scales and pads it to 1080p at 30 fps, encodes it to the spec above and loops it forever:

ffmpeg -re -stream_loop -1 -i input.mp4 \
  -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
  -c:v libx264 -preset veryfast -profile:v high -level:v 4.1 -pix_fmt yuv420p \
  -g 60 -keyint_min 60 -sc_threshold 0 \
  -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 12000k -x264-params nal-hrd=cbr \
  -c:a aac -b:a 128k -ar 44100 -ac 2 \
  -f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"

-re sends at real-time speed instead of as fast as the disk allows. -g 60, -keyint_min 60 and -sc_threshold 0 pin a keyframe to every 2 seconds, including across scene cuts. The three rate flags plus nal-hrd=cbr make the bitrate actually constant rather than capped.

Encoding 1080p live costs a few CPU cores for as long as the broadcast runs. For a loop, it is cheaper to encode the file to the spec once (with HandBrake or ffmpeg) and then send it without re-encoding:

ffmpeg -re -stream_loop -1 -i steam-ready.mp4 -c copy \
  -f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"

Before you rely on a pre-encoded file, check what is actually in it:

ffprobe -v error -select_streams v:0 \
  -show_entries stream=codec_name,profile,level,width,height,r_frame_rate,bit_rate \
  steam-ready.mp4

You want h264, High, level 41, 1920 by 1080 and 30/1. ffprobe does not report the keyframe interval directly, so if in doubt, re-encode with the flags above.

Keeping it on air

An RTMP connection drops sooner or later: a network blip, an ingest restart on Valve’s side, a router reboot. ffmpeg exits when that happens and does not come back on its own. The minimum for an unattended broadcast is a loop that restarts it:

until false; do
  ffmpeg -re -stream_loop -1 -i steam-ready.mp4 -c copy \
    -f flv "rtmp://YOUR-UPLOAD-URL/YOUR-TOKEN"
  sleep 5
done

That covers the connection. It does not cover the machine. Whatever runs this has to stay powered, awake and online for as long as you want the page live, which is the real cost of doing it yourself. A small VPS works better than a desktop, since it never sleeps or installs updates overnight, but you are still the one who finds out when it stops.

When the stream is up but the store page shows nothing

▪Wait five minutes. Valve says a new stream can take up to 5 minutes to be picked up by the store page, and the page may need a refresh.
▪Visibility is still Friends Only. Switch it to Public on the upload page.
▪Wrong App ID. A DLC or demo App ID sends the broadcast somewhere nobody is looking.
▪The account is limited or lacks permission. See the three checks at the top of this page.
▪Stutter or a black player. Check the keyframe interval and constant bitrate first.

The rest of the usual causes are in the troubleshooting guide.

Would rather not run the encoder at all? Loopcast holds the RTMP connection for you from a datacenter: upload any video, paste the URL and token, and we encode to this spec, restart on drops and can run it on a schedule. Start a stream.

Put your game live in 5 minutes

Upload a video, paste your stream key, hit start. From $0.72/day.

Start streaming · $0.72/day
Stuck on something? Ask in our Discord →
Status