Skip to main content
Xtream Codes is the most common IPTV provider protocol. This guide walks you through connecting a provider, defining a target and granting client access.

Prerequisites

You need the following from your provider:
  • Base URL (e.g. http://fantastic.provider.xyz:8080)
  • Username
  • Password

Step 1: Define the input

1

Open source.yml

Add an entry under inputs with type: xtream.
source.yml
inputs:
  - type: xtream
    name: my_provider
    url: http://fantastic.provider.xyz:8080
    username: tvjunkie
    password: junkie.secret
The name is a local identifier you reference later in sources.
2

Create a source and target

Add a sources block that wires the input to a named target with an xtream output.
source.yml
templates:
  - name: ALL_CHAN
    value: 'Group ~ ".*"'
inputs:
  - type: xtream
    name: my_provider
    url: http://fantastic.provider.xyz:8080
    username: tvjunkie
    password: junkie.secret
sources:
  - inputs:
      - my_provider
    targets:
      - name: all_channels
        output:
          - type: xtream
        filter: "!ALL_CHAN!"
3

Configure api-proxy.yml

Tell tuliprox which public URL to advertise and create a client credential.
api-proxy.yml
server:
  - name: default
    protocol: http
    host: 192.168.1.41
    port: 8901
    timezone: Europe/Berlin
    message: Welcome to tuliprox
user:
  - target: all_channels
    credentials:
      - username: xt
        password: xt.secret
        proxy: redirect
        server: default
Set proxy: reverse if you want tuliprox to proxy stream traffic instead of redirecting clients directly to the provider.
4

Set core config

A minimal config.yml for server mode:
config.yml
api:
  host: 0.0.0.0
  port: 8901
  web_root: ./web
storage_dir: ./data
update_on_boot: true

Xtream input options

Pass these under options on the input:
OptionDescription
xtream_skip_liveDo not fetch live channels from this provider
xtream_skip_vodDo not fetch VOD entries
xtream_skip_seriesDo not fetch series
xtream_live_stream_without_extensionStrip file extension from live stream URLs
xtream_live_stream_use_prefixUse the stream-URL prefix format instead of numeric IDs
resolve_tmdbEnrich VOD/series metadata via TMDB
probe_streamProbe streams to detect codec and quality information
resolve_seriesFetch detailed series metadata
resolve_vodFetch detailed VOD metadata
Example with options:
source.yml
inputs:
  - type: xtream
    name: my_provider
    url: http://fantastic.provider.xyz:8080
    username: tvjunkie
    password: junkie.secret
    options:
      xtream_skip_series: true
      xtream_live_stream_without_extension: true
      resolve_tmdb: true

Xtream output options

Pass these under the output entry with type: xtream:
FieldDefaultDescription
skip_live_direct_sourcetrueHide provider direct-source URL for live
skip_video_direct_sourcetrueHide provider direct-source URL for VOD
skip_series_direct_sourcetrueHide provider direct-source URL for series
filterExtra per-output filter expression

Testing the connection

After starting tuliprox, verify the Xtream endpoint responds:
curl "http://localhost:8901/player_api.php?username=xt&password=xt.secret"
You should receive a JSON response with user_info and server_info fields. To fetch the live category list:
curl "http://localhost:8901/player_api.php?username=xt&password=xt.secret&action=get_live_categories"

Common issues

If update_on_boot: true is set, tuliprox fetches the provider on first start. Check the logs for HTTP errors from the provider URL. You can also trigger a manual update from the Web UI.
Double-check the username and password fields in source.yml. Note that tuliprox does not attempt failover for 401 or 403 responses.
If proxy: redirect is set, the client connects directly to the provider. Switch to proxy: reverse so tuliprox buffers the stream, or ensure the client can reach the provider URL directly.
Check that xtream_skip_vod and xtream_skip_series are not set to true unintentionally. Also confirm the provider actually supplies those content types at the given URL.

Build docs developers (and LLMs) love