Xtream Codes: un software convertido en protocolo
Xtream Codes era originalmente el nombre de un software comercial para gestionar servidores de difusión de vídeo: permitía a un operador gestionar flujos, cuentas de clientes, categorías y estadísticas desde un panel de administración. El software dejó de distribuirse en 2019, pero la interfaz de programación (API) que ofrecía a los reproductores se mantuvo. Muchos programas de servidor la han retomado de forma idéntica para seguir siendo compatibles con las aplicaciones existentes.

Hoy, «Xtream Codes» designa sobre todo una forma estandarizada de conectarse: un reproductor que «habla» esta API puede conectarse a cualquier servidor que la implemente. No es un servicio, ni un proveedor, ni un contenido. Como ocurre con una lista M3U, la legalidad depende por completo del servicio al que te conectes: un operador que tiene los derechos de emisión puede usar perfectamente esta API, mientras que un servicio que redifunde canales sin autorización sigue siendo ilegal, sea cual sea la técnica empleada.
Los tres datos de conexión
Un servicio compatible facilita a su cliente tres elementos:
- la dirección del servidor, a menudo acompañada de un puerto, por ejemplo
http://serveur.exemple.fr:8080; - un usuario (username);
- una contraseña (password).
El puerto es el número de «puerta» por la que escucha el servidor. Sin indicación, http usa el puerto 80 y https el puerto 443; muchos servidores de este tipo usan otros puertos como 8080 o 25461. Un error frecuente es olvidar el puerto o pegar una ruta superflua tras la dirección (/get.php, /c/…): la aplicación construye ella misma las rutas y espera solo la dirección raíz.
| Lo que escribes | Resultado |
|---|---|
http://serveur.exemple.fr:8080 | Correcto |
serveur.exemple.fr:8080 | Lo acepta la mayoría de los reproductores, que añaden http:// |
http://serveur.exemple.fr (puerto olvidado) | Falla si el servidor no escucha en el puerto 80 |
http://serveur.exemple.fr:8080/player_api.php | Fallo frecuente: ruta añadida dos veces |
https:// en lugar de http:// | Falla si el servidor no ofrece cifrado en ese puerto |
El usuario y la contraseña suelen distinguir mayúsculas de minúsculas: «Martin» y «martin» son dos cuentas distintas. Un espacio copiado por error al final de un campo también basta para que falle la conexión.
Qué ocurre al conectarse: player_api.php
Cuando validas tus datos, el reproductor envía una primera petición HTTP al script player_api.php del servidor, con tus credenciales como parámetros:
http://serveur.exemple.fr:8080/player_api.php?username=IDENTIFIANT&password=MOTDEPASSE
El servidor responde con un documento JSON (un formato de datos de texto estructurado) compuesto por dos bloques. Esta es una respuesta simplificada:
{
"user_info": {
"auth": 1,
"status": "Active",
"exp_date": "1798761600",
"is_trial": "0",
"active_cons": "0",
"max_connections": "1",
"allowed_output_formats": ["m3u8", "ts"]
},
"server_info": {
"url": "serveur.exemple.fr",
"port": "8080",
"https_port": "8443",
"server_protocol": "http",
"timezone": "Europe/Paris"
}
}
El bloque user_info describe tu cuenta; el bloque server_info describe el servidor. Si auth vale 0, las credenciales se rechazan y el reproductor muestra un error de conexión. Si el servidor no responde en absoluto, o devuelve una página HTML en lugar de JSON, el problema está antes de la autenticación: dirección errónea, puerto cerrado, servidor fuera de línea o red que bloquea la conexión.
Las principales acciones de la API
Una vez autenticado, el reproductor carga el catálogo añadiendo un parámetro action a la misma dirección. Cada acción devuelve una lista JSON. Las más utilizadas son las siguientes.
| Acción | Qué devuelve |
|---|---|
get_live_categories | Las categorías de canales en directo (identificador y nombre) |
get_live_streams | Los canales, filtrados opcionalmente con &category_id=, con nombre, logotipo e identificador EPG |
get_vod_categories | Las categorías de vídeo bajo demanda |
get_vod_streams | Las películas disponibles, con póster, valoración, fecha de alta y extensión del archivo |
get_vod_info | La ficha detallada de una película (&vod_id=): resumen, duración, pistas |
get_series_categories | Las categorías de series |
get_series | La lista de series |
get_series_info | Las temporadas y los episodios de una serie (&series_id=) |
get_short_epg | Los próximos programas de un canal (&stream_id=) |
La guía completa de programación está disponible, por su parte, en formato XMLTV mediante el script xmltv.php, con las mismas credenciales. Es una de las ventajas de la API: el reproductor no necesita una dirección de guía aparte. El funcionamiento de esta guía se detalla en nuestro artículo sobre la EPG y XMLTV.
Cómo se reproducen después los vídeos
Las listas JSON no contienen los vídeos, solo identificadores. Para iniciar una reproducción, el reproductor construye una dirección según un modelo fijo:
http://serveur:port/live/IDENTIFIANT/MOTDEPASSE/12345.ts
http://serveur:port/movie/IDENTIFIANT/MOTDEPASSE/67890.mkv
http://serveur:port/series/IDENTIFIANT/MOTDEPASSE/24680.mp4
En el directo, la extensión elegida (.ts para un flujo MPEG-TS continuo, .m3u8 para HLS) debe figurar en la lista allowed_output_formats de la cuenta. En las películas y los episodios, la extensión corresponde al archivo realmente almacenado en el servidor. Estos formatos se presentan en HLS, MPEG-TS y DASH.
Estado, caducidad y conexiones simultáneas
El bloque user_info contiene varios campos útiles para entender un rechazo o un corte.
El estado
El campo status suele valer Active. Otros valores como Expired, Banned o Disabled indican que la cuenta ya no puede reproducir contenido, aunque la propia conexión se complete. El campo is_trial señala una cuenta de prueba.
La fecha de caducidad
El campo exp_date no es una fecha legible sino una marca de tiempo Unix: el número de segundos transcurridos desde el 1 de enero de 1970 a medianoche UTC. En el ejemplo anterior, 1798761600 corresponde al 1 de enero de 2027 a las 0 h UTC. Los reproductores la convierten en fecha para mostrarla. Un valor vacío o null significa por lo general una cuenta sin fecha de fin.
Las conexiones simultáneas
max_connections indica cuántos flujos pueden reproducirse al mismo tiempo con la misma cuenta, y active_cons cuántos lo están haciendo en ese momento. Si el límite es 1 y otro aparato del hogar ya está viendo un canal, la nueva reproducción falla o corta la anterior. Ojo con una trampa habitual: al cambiar de canal, la conexión anterior tarda a veces unos segundos en cerrarse en el servidor. Cambiar de canal muy deprisa puede provocar, por tanto, un rechazo breve por «demasiadas conexiones», que desaparece solo.
Xtream Codes o lista M3U: las diferencias
La mayoría de los servicios compatibles ofrecen también una lista M3U generada a partir de la misma cuenta. Los dos métodos dan acceso al mismo catálogo, pero no de la misma manera.
| Criterio | Conexión Xtream Codes | Lista M3U |
|---|---|---|
| Carga | Por categoría, bajo demanda | Un único archivo, a veces muy voluminoso |
| Películas y series | Fichas, pósteres, temporadas y episodios estructurados | Lista plana, a menudo sin temporadas |
| Guía de programación | Se facilita automáticamente | Hay que indicar la dirección url-tvg |
| Información de la cuenta | Caducidad y conexiones visibles | Ninguna |
| Servidores admitidos | Solo los que implementan la API | Cualquier origen, incluidos tus archivos |
En resumen, la API es más cómoda cuando el servicio la ofrece, sobre todo para los catálogos de películas y series; la lista M3U es más universal. La sintaxis de las listas se explica en el formato M3U línea por línea, y la introducción de los dos tipos de cuenta en AICKO IPTV, en la página Xtream Codes y M3U.
Seguridad y diagnóstico
Una particularidad de esta API merece conocerse: el usuario y la contraseña viajan en la dirección de cada petición y de cada flujo. En un servidor con http simple, circulan por tanto en claro por la red. Algunas consecuencias prácticas:
- no uses nunca para esta cuenta una contraseña que emplees en otro sitio (correo, banco);
- no publiques capturas de pantalla ni registros de errores que contengan una dirección de flujo completa: revela tus credenciales;
- prefiere
httpscuando el servicio lo ofrezca (el campohttps_portlo indica).
Para diagnosticar un fallo, el método más eficaz consiste en abrir la dirección player_api.php?username=…&password=… en un navegador, en la misma red:
- Ninguna respuesta o tiempo agotado: dirección o puerto erróneos, servidor detenido o red que bloquea ese puerto.
- Respuesta con
"auth":0: usuario o contraseña incorrectos. - Respuesta con un estado distinto de
Active: cuenta caducada o suspendida, que hay que resolver con el servicio. - Respuesta correcta: la conexión funciona; si la reproducción falla de todos modos, mira el formato del flujo, la red o la decodificación del aparato.
En resumen
- Xtream Codes es hoy una API de conexión que han retomado muchos servidores, no un servicio.
- La conexión se basa en una dirección con puerto, un usuario y una contraseña que distinguen mayúsculas de minúsculas.
- El script
player_api.phpdevuelve el estado de la cuenta y después el catálogo mediante acciones comoget_live_streamsoget_series. exp_datees una marca de tiempo Unix ymax_connectionslimita las reproducciones simultáneas.- Las credenciales viajan en las direcciones: usa una contraseña única.
Preguntas frecuentes
¿Es legal Xtream Codes?
La técnica es neutra: es una interfaz de conexión entre un reproductor y un servidor. Lo que importa es el servicio al que te conectas. Debes tener los derechos sobre los programas que ves; un servicio que redifunde canales de pago sin autorización sigue siendo ilegal.
¿Por qué mi conexión funciona en un aparato y en otro no?
Comprueba primero si hay una errata, sobre todo en las mayúsculas o un espacio final. Si lo escrito es idéntico, puede que se haya alcanzado el límite de conexiones simultáneas, o que el segundo aparato esté en una red que bloquea el puerto que usa el servidor.
¿Cómo conozco la fecha de caducidad de mi cuenta?
La mayoría de los reproductores la muestran en la información del perfil. Si no, la respuesta de player_api.php contiene el campo exp_date, una marca de tiempo Unix que cualquier conversor en línea transforma en una fecha legible.
¿Hay que introducir una dirección de guía de TV con una conexión Xtream Codes?
Por lo general no: el reproductor obtiene la guía del mismo servidor. Una dirección de guía externa solo es útil si la del servicio está vacía o incompleta.
