Player y biblioteca en la API.
Controla el player por eventos. Gestiona videos, colecciones y analytics con la REST versionada.
player.on("timeupdate", ({ currentTime }) =>
setBar(currentTime / player.duration));Ver en profundidadControla el player con una API de eventos completa. Gestiona la biblioteca con la REST API versionada. Recibe un webhook firmado y granular para cada paso del video. Protege el contenido con tokens de corta duración que firma tu backend. Todo documentado, con ejemplos que corren. Hecho por un desarrollador con más de 15 años de oficio, para desarrolladores.
Programo hace más de 15 años. Buena parte de ellos integrando video en el producto de otros.
Sé dónde se traba. API que hace la mitad. Webhook que avisa poco y tarde. Seguridad tratada como ítem de roadmap, no como base.
Moviie es la herramienta que me hubiera gustado recibir lista. No porque sea especial. Porque ya me golpeé lo suficiente para saber lo que no puede faltar.
No tienes que creerme. Lee la doc. Toca el player de arriba. Mira la firma de los webhooks. El producto habla por mí.
Eres tú quien decide. El resto de esta página es la lista de razones para decidirte por Moviie.
Entrega lo básico y deja el resto fuera de tu alcance. Sin versión, sin OpenAPI, sin automatización en lo que importa. Cada cosa que la API no cubre se vuelve trabajo manual que vuelve cada semana.
Cómo lo resuelve MoviieLo estilizas hasta donde te dejan. Pasado eso, empieza el override de CSS, el hack en el DOM, el fork que se rompe en la próxima actualización. Sin API de eventos, tu UI nunca queda sincronizada.
Cómo lo resuelve MoviiePocos eventos, sin firma, sin retry. Terminas haciendo polling, colas improvisadas, y descubres el estado del video preguntando, no porque te avisen. Y cuando llega el aviso, llega sin forma de confiar en su origen.
Cómo lo resuelve MoviieEnlace abierto, embed que corre en cualquier lugar, clave sin alcance. La protección se vuelve backlog hasta el día en que el video se filtra. Ahí ya no es un detalle.
Cómo lo resuelve MoviieControla el player por eventos. Gestiona videos, colecciones y analytics con la REST versionada.
player.on("timeupdate", ({ currentTime }) =>
setBar(currentTime / player.duration));Ver en profundidadTe suscribes solo a lo que importa. Cada entrega llega firmada, con retry y contador de intentos.
{ "type": "video.ready",
"data": { "video": { "id": "…" } } }Ver en profundidadVideo privado, token de minutos atado a un solo video, URL de asset efímera.
jwt.sign({ sub: videoId }, signingKey, {
algorithm: "HS256", expiresIn: "5m" });Ver en profundidadLa REST API vive en api.moviie.ai/v1, versionada por prefijo. Te autenticas con una clave Bearer creada en el panel, en Settings → API Keys. Lista, busca, actualiza, borra y sube video. Organiza en colecciones. Trae métricas de audiencia. Tiene OpenAPI publicada, así generas el client en tu lenguaje sin adivinar el contrato. Y el panel refleja todo eso, con la clave a dos clics.
# chave secreta criada no dash: Settings > API Keys
curl https://api.moviie.ai/v1/me \
-H "Authorization: Bearer mvi_sua_chave"
# { "organization": { "id": "...", "name": "Acme", "plan": "pro" } }Primera llamada autenticada en una línea.
Sube el embed con controls=0 y construye tus propios controles. El player expone la API con métodos para todo: play, pause, seek, volumen, velocidad, pantalla completa, picture-in-picture. Y una API de eventos completa mantiene tu interfaz sincronizada, incluso cuando el viewer usa un atajo de teclado, una tecla de medios o los controles del sistema. La diferencia con un player cerrado: aquí la UI es tuya, y nunca miente sobre el estado.
<iframe src="https://watch.moviie.ai/embed/EMBED_ID?controls=0"
allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>// sua UI dirige o player; os eventos mantem ela em sincronia
const player = Moviie.getPlayer(iframe);
player.on("play", () => paintPlaying());
player.on("pause", () => paintPaused());
player.on("timeupdate", ({ currentTime }) =>
setBar(currentTime / player.duration));
seekBar.oninput = (e) =>
player.seek(player.duration * (e.target.value / 100));Es el mismo modelo de la demo de arriba.
Catálogo granular de eventos: upload, encoding, publicación, subtítulos, capítulos, CTA, y telemetría con milestones de 25, 50, 75 y 100 por ciento, completion rate, view milestones y umbrales de banda y storage. Habilitas por endpoint solo lo que importa. Cada entrega llega firmada con HMAC-SHA256 en el header, con contador de intentos, y retry automático de hasta seis intentos con backoff que respeta tu sistema. Y una falla de verdad solo se vuelve evento después de confirmada, sin falsa alarma de un callback inestable.

Un recorte del catálogo. Enciendes solo lo que necesitas, por endpoint.
Marca el video como privado y no sirve nada sin un token válido. Tu backend firma un JWT corto, atado a un solo video, con la clave de firma que queda en el servidor. El asset vuelve como URL firmada y efímera. La clave de firma la rotas sin downtime y la revocas al instante. Suma a eso allowed domains y claves separadas por función: publishable en el cliente, secreta en el servidor, signing para tokens. Sin prometer DRM de Hollywood. Protección por token, URL firmada y dominio, dicha de frente.
import jwt from "jsonwebtoken";
// chave de assinatura (mvi_sign_) fica no backend
const token = jwt.sign({ sub: videoId }, signingKeySecret, {
algorithm: "HS256",
keyid: signingKeyId,
expiresIn: "5m", // token curto, por sessao
});<iframe src="https://watch.moviie.ai/embed/EMBED_ID?token=THE_JWT"></iframe>¿Token equivocado para el video equivocado? 403. Sin excepción.
No estás evaluando un plugin. Es la misma malla de entrega que sostiene lanzamientos, áreas de miembros y VSL en el pico. Rate limits y SLA
Todo esto está en la doc. No es promesa, es referencia. Abrir la documentación
14 días de trial completo. Tarjeta al registrarte, cancelación en un clic. Sin llamada de ventas. Sales del trial sabiendo si Moviie resuelve tu problema.