A surprising number of IPTV providers gate their streams by User-Agent. The TV sends Mozilla/5.0 (Web0S; Linux …), the provider returns 403, the channel doesn’t play.
The fix is to spoof a UA the provider expects.
Quickest fix — global override
If most of your channels fail with 403:
Settings → Playlist → User-Agent → Override (all sources)
Set to one of:
VLC/3.0.20 LibVLC/3.0.20
Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36
IPTVSmartersPro
The first works for ~80% of providers. The third works specifically for providers that whitelist the IPTV Smarters family of apps (a common pattern).
Per-source override
If you have multiple playlists and only one needs a custom UA:
Settings → Playlist → <source name> → User-Agent
This overrides the global setting for streams from that source only.
Per-channel override (M3U directives)
If only specific channels in a single source need a custom UA, use M3U #EXTVLCOPT directives in your playlist:
#EXTINF:-1 tvg-id="ch1" tvg-name="Channel 1",Channel 1
#EXTVLCOPT:http-user-agent=VLC/3.0.20 LibVLC/3.0.20
http://provider.example/stream/ch1
Lumen·TV reads #EXTVLCOPT and applies the UA per-channel. This is the recommended approach if you maintain your own playlist (or your provider lets you customize it).
How to figure out which UA to send
If the recipes above don’t work, you have to figure out what UA the provider whitelists. Three approaches:
1. Ask the provider
Often they have docs or a support email. “Which user-agent does your service expect?” gets a useful answer maybe 1 time in 3.
2. Test in VLC
VLC sends VLC/<version> LibVLC/<version> by default. If the stream works in VLC on your computer, that’s the UA you need.
vlc <stream-url>
3. Sniff a working app
If the stream works on another IPTV app on your phone, intercept its traffic:
- Install Charles Proxy or mitmproxy on a computer.
- Configure your phone’s Wi-Fi to use the computer as HTTP proxy.
- Trust the proxy’s certificate on the phone.
- Open the IPTV app on the phone, play a channel.
- In Charles, look at the request to the stream URL — the
User-Agentheader is what you need to copy.
What about cookies and headers?
Some providers gate by cookies (session tokens) or custom headers (Authorization: Bearer xxx). These are harder.
For Bearer-token providers, Lumen·TV supports the M3U directive:
#EXTINF:-1 ...,Channel
#EXTVLCOPT:http-header-Authorization=Bearer eyJhbGciOi...
http://provider.example/stream
For cookie-based auth, there is no good answer — the cookie usually rotates and a player can’t refresh it. These providers are not friendly to standalone IPTV apps; consider switching.
Why does this matter?
User-agent gating is the #1 cause of “channel loads but doesn’t play” reports we get. Most users assume their playlist is broken. It’s almost always the UA.
If you maintain a community playlist, always include the right #EXTVLCOPT:http-user-agent= directive. It saves your users a 30-minute debugging session.
Reference: common UAs that work
| Pattern | UA |
|---|---|
| Most legitimate providers | VLC/3.0.20 LibVLC/3.0.20 |
| Mobile apps allowed | Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36 |
| IPTV Smarters whitelisted | IPTVSmartersPro |
| Kodi via PVR plugin | Kodi/20.0 (Linux; Android 13) |
| Generic browser | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 |