Vyexa

El servidor MCP Vyexa convierte videos horizontales largos (desde YouTube o mediante un enlace directo al archivo) en clips verticales cortos (formato 9:16) con subtítulos integrados y títulos atractivos.

Documentación

API de Vyexa

Envía un enlace de video — recibe clips cortos verticales con subtítulos incrustados. Un POST, una consulta, una descarga. Diseñado para que un agente pueda usarlo sin navegador.

Comienza en dos minutos — gratis

No necesitas hablar con ventas ni esperar aprobación. Crea una cuenta, genera una clave en tu panel, y envía tu primera solicitud.

  1. Crea una cuenta gratis en vyexa.net — no se requiere tarjeta.
  2. Abre Panel → Claves de API, haz clic en Crear clave y cópiala. La clave se muestra una sola vez.
  3. Envía tu primer trabajo con el curl de abajo y consulta el status_url devuelto hasta que los clips estén listos.
curl -X POST https://vyexa.net/api/v1/jobs \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/video.mp4", "num_clips": 3}'

El plan gratuito funciona a través de la API exactamente en los mismos términos que en el sitio web. Recibes clips gratis cada mes, y los clips de la API se descuentan del mismo saldo. Los clips del plan gratuito llevan marca de agua y la duración del video fuente está limitada; los planes de pago eliminan la marca de agua y aumentan los límites. Nada sobre facturación cambia porque uses la API en lugar de la aplicación web — los clips también aparecen en tu panel bajo Mis Videos.

Uso con Claude, Cursor, n8n MCP

Vyexa también es un servidor MCP remoto (HTTP Streamable) en https://vyexa.net/mcp. Envuelve esta misma API — misma clave, mismo saldo, mismos límites — y le da a un agente cuatro herramientas: create_clips, get_job, list_clips, get_options. Obtén una clave gratis en Panel → Claves de API, luego:

Claude Code

claude mcp add --transport http vyexa https://vyexa.net/mcp \
  --header "Authorization: Bearer YOUR_KEY"

Claude Desktop

Configuración → Conectores → agrega un conector personalizado, o usa el puente mcp-remote en claude_desktop_config.json:

{
  "mcpServers": {
    "vyexa": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://vyexa.net/mcp",
               "--header", "Authorization: Bearer YOUR_KEY"]
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "vyexa": {
      "url": "https://vyexa.net/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}

curl

curl -X POST https://vyexa.net/mcp \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"create_clips","arguments":{"url":"https://example.com/video.mp4","num_clips":3}}}'

n8n — Nodo de Solicitud HTTP

Importa este nodo (Flujo de trabajo → pegar) o configura los mismos campos manualmente. Consulta con un segundo nodo en GET /api/v1/jobs/{{ $json.job_id }} hasta que status sea completed o partial.

{
  "nodes": [{
    "name": "Vyexa: create clips",
    "type": "n8n-nodes-base.httpRequest",
    "typeVersion": 4.2,
    "position": [0, 0],
    "parameters": {
      "method": "POST",
      "url": "https://vyexa.net/api/v1/jobs",
      "sendHeaders": true,
      "headerParameters": { "parameters": [
        { "name": "Authorization", "value": "Bearer YOUR_KEY" }
      ]},
      "sendBody": true,
      "specifyBody": "json",
      "jsonBody": "={ \"url\": \"{{ $json.video_url }}\", \"num_clips\": 3 }"
    }
  }],
  "connections": {}
}

Legible por máquina: /openapi.json (OpenAPI 3.1), /.well-known/mcp.json (tarjeta del servidor MCP), /llms.txt.

Qué hace

Envías cualquier enlace de video público — una publicación en TikTok, YouTube, Instagram, Vimeo, Twitch y otras plataformas, o un enlace directo a un archivo de video en tu propio almacenamiento. Vyexa lo descarga, encuentra los momentos más fuertes con IA, y los renderiza como clips 9:16 con título y subtítulos. Consultas un endpoint hasta que los clips estén listos, luego descargas los MP4.

  • Asíncrono por diseño — cada trabajo regresa inmediatamente con un job_id.
  • Los clips se renderizan, no solo se cortan: se aplican encuadre, títulos y subtítulos.
  • Los segmentos de subtítulos con tiempos pueden devolverse como JSON junto con el video.
  • Todo es JSON excepto la descarga del clip, que es el flujo MP4.

URL base y autenticación

URL base: https://vyexa.net. Cada solicitud necesita un token de portador:

Authorization: Bearer vx_your_api_key

Las solicitudes sin una clave válida, activa y no expirada reciben 401. Las claves se emiten por cuenta — los clips creados a través de la API también aparecen en el panel de esa cuenta y se facturan contra su saldo de clips. Genera una tú mismo en Panel → Claves de API (hasta 5 claves por cuenta, válidas por un año, revocables en cualquier momento).

  • Trata la clave como una contraseña: solo del lado del servidor, nunca en código del lado del cliente o en un repositorio público.
  • Almacenamos solo un hash de ella. Si la pierdes, emitimos una nueva — no podemos recuperar la anterior.
  • Las claves expiran (1 año por defecto) y pueden revocarse en cualquier momento.
  • Siempre llama a la API a través de HTTPS.

Inicio rápido

1. Crea un trabajo.

curl -X POST https://vyexa.net/api/v1/jobs \
  -H "Authorization: Bearer vx_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/video.mp4",
    "language": "en",
    "num_clips": 5,
    "segment_duration": 50
  }'
{
  "success": true,
  "job_id": 123,
  "status": "pending",
  "status_url": "https://vyexa.net/api/v1/jobs/123"
}

2. Consulta la URL de estado hasta que status sea completed, partial o failed. Cada 10–15 segundos es suficiente.

curl https://vyexa.net/api/v1/jobs/123 \
  -H "Authorization: Bearer vx_your_api_key"

3. Descarga los clips desde el download_url de cada elemento.

curl -L -o clip.mp4 \
  -H "Authorization: Bearer vx_your_api_key" \
  https://vyexa.net/api/v1/clips/A3HK7Z2Q/download

POST /api/v1/jobs

Crea un trabajo de recorte. Responde 202 Accepted; el trabajo ocurre en segundo plano.

CampoTipoRequeridoDescripción
urlstringsíEnlace al video fuente: una publicación en TikTok, YouTube, Instagram, Vimeo, Twitch y otras plataformas, o un enlace https:// directo a un archivo de video. Debe ser accesible sin inicio de sesión.
languagestringnoIdioma hablado de la fuente (en, uk, pl, …). Omítelo o envía auto para detectarlo.
num_clipsintnoCuántos clips quieres. Esto es un techo, no una promesa: los momentos débiles se descartan antes de renderizar, así que puedes recibir menos. Solo se te facturan los clips realmente entregados.
segment_durationintnoDuración del clip en segundos. Conjunto fijo: 30, 50, 90 — y está limitado por plan: gratis 30, Creador 30/50, Pro 30/50/90. Cualquier otro valor se rechaza, nunca se cambia silenciosamente: un valor fuera del conjunto devuelve 422 invalid_clip_duration, un valor válido por encima de tu plan devuelve 422 clip_duration_not_in_plan. Omite el campo para que elijamos nosotros.
generate_titleboolnoGenera un título de IA para cada clip. Por defecto true.
titlestringnoTítulo fijo para cada clip en lugar de los de IA. Máximo 32 caracteres — eso es lo que cabe en la barra de título de un corto vertical. Las cadenas más largas se recortan, no se rechazan.
highlight_colorstringnoColor de acento de la palabra activa del subtítulo y del resaltado del título. Ya sea un id de catálogo (FFD600, 40BFC3, FFFFFF+FFD600 …, lista completa en GET /api/v1/options → job_options.highlight_color.values) o cualquier color HTML #RRGGBB, p. ej. "#1E90FF"; un par "#1E90FF+#FFFFFF" alterna dos acentos. Omítelo para usar la configuración de tu cuenta. Cualquier otra cosa devuelve 422 invalid_highlight_color. El valor aplicado se refleja como highlight_color en el estado del trabajo.
profanity_censorboolnoCensura malas palabras en este trabajo: se enmascaran en los subtítulos (f***) y se silencian en el audio. Omítelo para usar la configuración de tu cuenta (desactivado por defecto); true / false anula esa configuración solo para este trabajo, incluidas ediciones posteriores de sus clips. Cualquier cosa que no sea booleano devuelve 422 invalid_profanity_censor. La detección se basa en diccionario (en, ru, uk, pl, de, fr, es, it) y es de mejor esfuerzo.
constructorobjectnoApariencia y encuadre — ver abajo.
logoobjectnoTu logo incrustado en cada clip, en una de 9 posiciones. Solo planes de pago — ver Tu logo en clips.

El objeto constructor

CampoPredeterminadoValores aceptadosQué controla
layoutautoauto, full, frame_70, frame_50, frame_40, dual, streaming, lessonCómo se encuadra la fuente 16:9 en 9:16.
subtitle_styledefaultdefault, none, karaoke, simple, big, minimal, highlighter, focus, popline, backdrop, glow, punch, beasty, stackAnimación y apariencia de los subtítulos. none no renderiza subtítulos.
title_stylecleanclean, box, chip, box_accent, outline, offTratamiento del título. off no renderiza título.
fontmontserratmontserrat, rubik, russoTipografía para títulos y subtítulos.
subtitle_positionautoauto, bottom, middle, topDónde se colocan los subtítulos. auto sigue el diseño.

Un valor desconocido no es un error — cae silenciosamente al predeterminado para ese campo. Aun así, no codifiques estas listas: agregamos estilos y diseños regularmente. GET /api/v1/options siempre devuelve el conjunto actual con una nota breve de "cuándo elegir esto" y recomendaciones de tipo de contenido. Léelo una vez al inicio y deja que tu agente elija desde ahí.

{
  "url": "https://example.com/video.mp4",
  "language": "en",
  "num_clips": 5,
  "segment_duration": 50,
  "generate_title": true,
  "highlight_color": "#1E90FF",
  "profanity_censor": true,
  "constructor": {
    "layout": "auto",
    "subtitle_style": "karaoke",
    "title_style": "clean",
    "font": "montserrat",
    "subtitle_position": "auto"
  }
}

GET /api/v1/jobs/{job_id}

Estado del trabajo y, una vez que comienza el renderizado, los clips producidos hasta ahora.

statusstageSignificado
pendingimportingDescargando el video fuente.
processinggeneratingRenderizando clips.
completeddoneTodos los clips listos.
partialdoneAlgunos clips listos, algunos fallaron.
failedimportNo se pudo descargar la fuente.
faileddoneTodos los clips fallaron al renderizar.

Agrega ?include_subtitles=1 para obtener segmentos de subtítulos con tiempos en milisegundos para cada clip.

{
  "success": true,
  "job_id": 123,
  "status": "completed",
  "stage": "done",
  "clips_expected": 5,
  "clips_ready": 5,
  "clips_failed": 0,
  "profanity_censor": true,
  "logo": {
    "position": "top-right",
    "size": 20,
    "size_applied": 20,
    "margin": 4,
    "opacity": 0.9,
    "format": "png",
    "animated": false
  },
  "source": {
    "duration": 612.4,
    "source_language": "en",
    "available_languages": ["en", "uk"],
    "requested_language": "en",
    "recommended_clips": 7,
    "max_clips": 15
  },
  "clips": [
    {
      "id": "A3HK7Z2Q",
      "title": "The one habit that changed everything",
      "duration": 58.4,
      "download_url": "https://vyexa.net/api/v1/clips/A3HK7Z2Q/download"
    }
  ]
}

El bloque source es retroalimentación para tu próxima llamada: max_clips es el techo duro para la duración de este video, y available_languages te dice qué valores de language existen realmente en la fuente. Aparece una vez que la importación termina, por lo que está ausente mientras stage sea importing.

profanity_censor siempre está presente y muestra el valor realmente aplicado al trabajo: el que enviaste, o la configuración de tu cuenta si no enviaste ninguno. Cuando es true, los subtítulos devueltos por ?include_subtitles=1 llevan la misma máscara que el clip renderizado.

El id del clip es un token opaco, no un id de base de datos. Úsalo tal cual.

GET /api/v1/clips/{clip_id}/download

Transmite el MP4. Requiere el mismo token de portador, y solo devuelve clips que pertenecen a tu cuenta — cualquier otra cosa es 404.

GET /api/v1/clips/{clip_id}

Estado de un clip individual: processing, ready o failed, más download_url cuando está listo. Úsalo para consultar después de una edición.

POST /api/v1/clips/{clip_id}/edit

Re-renderiza un clip existente en su lugar — mismo id, nuevo título y/o recorte. Responde 202; consulta el endpoint de estado del clip hasta que sea ready. Cada edición cuesta un clip de tu saldo, como una regeneración.

{
  "title": "New title",
  "trim": { "start": 0, "end": 21 }
}

Los valores de recorte son segundos relativos al clip. Para un clip de duración D: start >= 0, end - start >= 1, end <= D. Un rango inválido devuelve 422 invalid_trim y no se renderiza ni factura nada. Al menos uno de title o trim debe estar presente. En la edición, title debe tener 1..32 caracteres — a diferencia de la creación de trabajos, se valida, no se recorta, por lo que una cadena más larga devuelve 422 invalid_title.

GET /api/v1/options

Endpoint de descubrimiento. Devuelve cada valor aceptado para los campos constructor con una etiqueta, una descripción de "cuándo elegir esto" y los tipos de contenido que le convienen, más un pequeño bloque de recomendaciones que mapea el tipo de contenido a un diseño y estilo de subtítulos sensatos. Los indicadores de nivel superior del trabajo como profanity_censor se listan bajo job_options. Llámalo en lugar de codificar.

Errores y límites

Los errores son JSON con un error_code estable y legible por máquina.

{
  "success": false,
  "error_code": "invalid_trim",
  "error": "Trim range is outside the clip."
}
EstadoCuándo
401Falta, desconocida, deshabilitada o clave caducada.
403 logo_requires_paid_planlogo se envió con una clave de plan gratuito.
404Trabajo o clip desconocido, o uno que pertenece a otra cuenta.
409El clip aún se está renderizando y no se puede editar todavía.
422Entrada incorrecta: URL no compatible, recorte no válido, nada que editar, un profanity_censor no booleano, una duración de clip que tu plan no permite, o un logo incorrecto (invalid_logo_position, invalid_logo_size, invalid_logo_margin, invalid_logo_opacity, invalid_logo_url, logo_download_failed, unsupported_logo_format, invalid_logo_dimensions, logo_too_large, logo_bad_aspect_ratio, not_a_logo).
429 rate_limitDemasiadas solicitudes. Respeta el encabezado Retry-After.
429 concurrent_limitOtra generación de esta cuenta aún se está ejecutando. Las cuentas gratuitas ejecutan un trabajo a la vez; las cuentas de pago (Creator, Pro) ejecutan hasta 5 en paralelo.
429 insufficient_balanceLos trabajos en ejecución ya han reservado todo tu saldo de clips. Espera a que terminen o recarga.
failed source_minutes_limitSe informa en el estado del trabajo después de la importación: el video fuente no se ajusta a la asignación mensual de minutos de video fuente de tu plan (Gratis 200, Creator 1500, Pro 4000). Los minutos se gastan una vez por video fuente en su primera generación; un window cuenta solo su propia duración. Espera al reinicio mensual o mejora de plan.
failed source_duration_limitSe informa en el estado del trabajo después de la importación: en el plan gratuito, un solo video fuente está limitado a 90 minutos.

Los límites de velocidad son por clave en una ventana deslizante, por separado para creación de trabajos, consulta de estado, ediciones y descargas, además de un límite diario en cuántos enlaces fuente puedes importar. Si necesitas límites más altos para una integración de producción, escribe a support@vyexa.net.

Consulta el estado en lugar de saturarlo: una solicitud cada 10–15 segundos por trabajo es suficiente, y un trabajo normalmente termina en unos minutos dependiendo de la duración de la fuente. También hay un límite de ráfaga por IP, así que no dispares docenas de solicitudes en el mismo segundo — espácialas.

El saldo se reserva por adelantado

No comenzaremos un trabajo que no podamos entregar. Antes de aceptar un trabajo, sumamos los clips ya prometidos por tus trabajos sin terminar; una vez que esa reserva cubre todo tu saldo, el siguiente trabajo se rechaza con 429 insufficient_balance en lugar de transcribirse y analizarse en vano.

La regla es deliberadamente indulgente en el límite: con un saldo de 20, trabajos de 10, 6 y 5 clips se aceptan todos (el último puede entregar un clip menos), pero un cuarto trabajo se rechaza. Espera a que los trabajos en ejecución terminen, o recarga.

Notas para constructores de agentes

  • Lee GET /api/v1/options al inicio y deja que el modelo elija layout y subtitle_style de las descripciones.
  • Trata num_clips como un límite superior y maneja clips_ready < clips_expected como algo normal, no como un error.
  • No te expandas más allá de tu límite: una cuenta gratuita ejecuta una generación a la vez, una cuenta de pago (Creator, Pro) hasta 5 en paralelo. Mantente en eso y no dispares ráfagas — activan el límite por IP.
  • Trata insufficient_balance como "vuelve más tarde", no como un bucle de reintentos — el saldo se libera a medida que los trabajos en ejecución terminan.
  • Maneja clip_duration_not_in_plan explícitamente: significa que la solicitud fue correcta pero la cuenta necesita un plan superior — comunícalo a tu usuario en lugar de reintentar.
  • Usa source.max_clips y source.available_languages de la primera respuesta de estado para corregir tu próxima solicitud.
  • partial es un estado de éxito — algunos clips son utilizables.
  • Guarda el id del clip; permanece estable entre ediciones.
  • El audio siempre es el audio fuente. No hay opción de voz en off o música de fondo en la API pública.

Lo que necesitas para comenzar

  • Una cuenta de Vyexa — gratuita, sin tarjeta.
  • Una clave API de Panel → Claves API.
  • Un enlace de video público — publicación de plataforma o archivo directo — y cualquier cosa que pueda enviar una solicitud HTTPS.

Eso es todo. Los clips gratuitos son suficientes para probar todo el flujo de principio a fin antes de pagar por algo. Si necesitas límites de velocidad más altos o tienes una pregunta sobre una integración de producción, escribe a support@vyexa.net.