API RapidVideoMaker
La API REST te permite procesar archivos de vídeo desde cualquier cliente HTTP — scripts Python, flujos de trabajo n8n, herramientas de terceros. Cinco modos disponibles: Fusionar vídeos (varios MP4), Editar audio (1 MP4 + 1 MP3), Crear un vídeo (1 JPG/PNG + 1 MP3), Superposición de vídeo (2 MP4 picture-in-picture). El procesamiento es asíncrono: envía los archivos y luego consulta el resultado.
Flujo de trabajo completo
Cada integración sigue la misma secuencia de 4 pasos:
POST /api/v1/render.phpmultipart/form-data con tu token Bearer. 1 imagen JPG/PNG + 1 MP3 + mode=image_to_video → generación de vídeo. 1 MP4 + 1 MP3 → edición de audio (añade mode=mix_audio para superponer pistas). Múltiples MP4 → fusión. El servidor devuelve un job_id único.GET /api/v1/jobs.php?job_id=…queued → processing → ready (o error). La respuesta incluye la posición en cola y un tiempo estimado restante.ready, la respuesta contiene un campo download_url listo para usar.GET /api/download.php?job_id=…410 Gone (en lugar de 404) para indicar que el trabajo existió pero ya no está disponible.Autenticación
Cada solicitud debe incluir tu token API. Se aceptan dos formatos:
Tu token está disponible en tu espacio de miembro — un token por cuenta, creado automáticamente al registrarse. Solo se muestra en claro una vez — guárdalo bien. Si lo pierdes, puedes regenerarlo desde tu espacio de miembro.
Cuota
Cada cuenta de miembro tiene 20 solicitudes por día, compartidas entre la interfaz web y la API. Los trabajos fallidos no consumen cuota. El contador se reinicia a medianoche UTC.
Las respuestas POST incluyen quota_used y quota_remaining. Cuando se supera el límite, el servidor responde 429.
Cola
Se procesa un trabajo a la vez. Si se envían varios trabajos simultáneamente, se ponen en cola y se procesan en orden de llegada. Mientras espera, la respuesta de estado incluye:
queue_position— posición del trabajo en la cola (1 = el próximo en procesarse)queue_total— número total de trabajos en esperaeta_minutes— tiempo estimado antes de que comience el procesamiento
/api/v1/jobs.php acepta como máximo 12 llamadas por minuto por token (1 cada 5 s). Más allá, el servidor responde 429 con un encabezado Retry-After: 5. Recomendación: 10 segundos entre cada llamada. Transiciones disponibles
Pasa transition_type=none (por defecto) para una fusión directa, o uno de los tipos siguientes para un fundido entre clips:
La duración (transition_duration) está entre 0,2 y 2,0 segundos. Si un clip es demasiado corto para acomodar la transición, se ignora y la fusión procede sin transición.
Endpoints
Cinco modos, accesibles mediante el campo mode (omite mode con varios MP4 para detectar automáticamente fusion):
| Uso | Modo(s) API | Archivos requeridos | Descripción |
|---|---|---|---|
| Fusionar vídeos | fusion |
2–20 archivos MP4 | Los clips se ensamblan de principio a fin en el orden indicado. Transiciones opcionales entre clips. |
| Editar audio | add_audio o mix_audio |
1 MP4 + 1 MP3 | Reemplaza o enriquece la pista de audio de un vídeo. La pista de vídeo nunca se recodifica (-c:v copy).add_audio — el audio original se elimina y se reemplaza completamente por el MP3.mix_audio — el audio original se mantiene y el MP3 se superpone (amix). Pasa options={"mp3_volume":…} para ajustar el volumen del MP3 añadido. Si el vídeo no tiene audio, se comporta como add_audio. |
| Crear un vídeo | image_to_video |
1 JPG/PNG + 1 MP3 | Genera un vídeo desde una imagen fija y un archivo de audio. Texto superpuesto, fundidos, resolución y fps configurables mediante el campo options. |
| Superposición de vídeo | overlay_video |
2 MP4 | Superpone un segundo vídeo sobre el principal. Posición, tamaño, opacidad y audio configurables mediante el campo options. |
| Texto a MP3 | text_to_mp3 |
(solo texto) | Convierte texto a voz y devuelve un archivo MP3. No se necesita subir archivos — envía mode=text_to_mp3, text y lang como campos de formulario. Compatible con los 20 idiomas del sitio. |
add_audio y mix_audio solo aceptan 1 MP4 + 1 MP3 (exactamente). image_to_video solo acepta 1 JPG/PNG + 1 MP3 (exactamente). Cualquier otra combinación se rechaza con un código de error explícito. Los tipos MIME se verifican por bytes mágicos, no solo por extensión. Múltiples MP4 sin campo mode → detección automática de fusion.-c:v copy).Parámetros comunes (multipart/form-data)
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
| videos[] | File[] | SÍ | Archivos a procesar. Según el modo: 2–20 MP4, o 1 MP4 + 1 MP3, o 1 imagen (JPG/PNG) + 1 MP3. Máx. 500 MB por archivo. |
| mode | string | * | image_to_video | add_audio | mix_audio. Requerido para estos tres modos. Ignorado (y detectado automáticamente) solo si todos los archivos son MP4 (fusion). Para edición de audio: add_audio elimina el original, mix_audio lo mantiene y superpone. Si se proporciona el campo mode, los archivos subidos deben coincidir exactamente — de lo contrario la solicitud es rechazada. |
| order | JSON | Solo modo fusion — array JSON de índices que define el orden de los clips. | |
| transition_type | string | Solo modo fusion. Por defecto: none. Ver la lista de transiciones disponibles. | |
| transition_duration | float | Solo modo fusion. Duración 0,2–2,0 s. Por defecto: 0,5. | |
| options | JSON | Solo modo image_to_video — objeto JSON de parámetros de renderizado (ver abajo). | |
| callback_url | string | URL pública (http/https) llamada al completarse el trabajo. La respuesta incluye un webhook_secret. |
Parámetros de options — modo image_to_video
Todos opcionales. Los valores no proporcionados → valores por defecto aplicados por el worker.
| Clave | Tipo | Por defecto | Descripción |
|---|---|---|---|
| text | string | "" | Texto mostrado como superposición. Vacío = sin texto. Máx. 500 caracteres. |
| font_size | int | 60 | Tamaño de fuente en píxeles. Rango: 10–300. Recomendado: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Color del texto (ej. white, yellow, #ffffff, 0xffffff). |
| text_position | string | "center" | Posición del texto: center, top, bottom. |
| box | bool | true | Fondo semitransparente detrás del texto. |
| box_color | string | "black@0.4" | Color + opacidad en formato FFmpeg: color@opacity. Colores: black, white, yellow, #ff4444, #00ccff, #ff8800, #ff69b4… Opacidad: 0,0–1,0 (ej. black@0.4 = negro al 40%, white@0.70 = blanco al 70%). |
| fade_duration | float | 0.5 | Duración del fundido de entrada/salida en segundos (0–2). El texto se incluye en el fundido. 0 = sin fundido. |
| width | int | 1080 | Ancho del vídeo en píxeles (64–3840, forzado par). Combinaciones estándar: 1080/1920/720/1280. |
| height | int | 1920 | Alto del vídeo en píxeles (64–3840, forzado par). |
| fps | int | 24 | Tasa de fotogramas (1–60). |
| image_fit | string | "contain" | Modo de encuadre: contain = la imagen completa es visible, áreas vacías rellenadas por bg_color (letterbox/pillarbox); cover = imagen ampliada para rellenar todo el marco, centrada, bordes sobrantes recortados (sin barras negras). El parámetro bg_color se ignora en modo cover. |
| bg_color | string | "black" | Color de fondo (relleno) si la imagen no ocupa la resolución objetivo — relevante solo con image_fit=contain (ej. black, white, #1a1a2e). |
| enable_image_motion | bool | false | Activa la animación de foto. Si es false, la imagen permanece estática. Si es true, se aplica el efecto definido por image_motion_effect mediante el filtro zoompan de FFmpeg. |
| image_motion_effect | string | "ken_burns" | Efecto de animación (ignorado si enable_image_motion es false). Valores aceptados: zoom_in, zoom_out, pan_left_to_right, pan_right_to_left, pan_top_to_bottom, pan_bottom_to_top, zoom_pan_soft, ken_burns. Por defecto si está ausente o es inválido: ken_burns. |
| motion_intensity | float | 1.0 | Intensidad de la animación de foto (0,25–2,0). Multiplica la amplitud de zoom y la velocidad de paneo. 0,25 = muy sutil, 1,0 = por defecto, 2,0 = doble amplitud. Ignorado si enable_image_motion es false. |
| text_effect | string | "none" | Animación del texto superpuesto (ignorado si text está ausente). Valores aceptados: none, fade_in (fundido de entrada), slide_up (deslizar desde abajo), slide_down (deslizar desde arriba), slide_left (deslizar desde la derecha), bounce (oscilación vertical continua). |
| text_effect_intensity | float | 1.0 | Intensidad de la animación de texto (0,25–2,0). Controla la velocidad del fundido, la duración de entrada del deslizamiento, o la frecuencia y amplitud del rebote. Ignorado si text_effect es none. |
| text_border_width | int | 0 | Grosor del contorno negro alrededor de los caracteres, en píxeles (0 = desactivado, 1–10). Mejora la legibilidad sobre fondos brillantes o de colores. Ignorado si text está ausente. |
| text_mode | string | "static" | Modo de revelación del texto. static (defecto): texto completo visible desde el primer fotograma. word_by_word: las palabras aparecen de una en una al ritmo de word_reveal_speed. Exclusivo con text_effect: si text_mode=word_by_word, text_effect se ignora. |
| word_reveal_speed | float | 1.5 | Velocidad de revelación en palabras por segundo (0.3–5.0, por defecto 1.5). Solo con text_mode=word_by_word. Valor recomendado para sincronización con voz OpenAI TTS: 2.0. |
| word_anim | string | "none" | Animación de aparición de cada palabra. none (por defecto): revelación instantánea. fade: cada nueva palabra aparece con un fundido de 0.2s y crossfade con el bloque anterior. Solo con text_mode=word_by_word. |
Parámetros options — modo overlay_video
Todos opcionales. El orden de envío importa: el primer archivo es el vídeo principal (fondo), el segundo archivo es el overlay (primer plano). Usa chroma_key para eliminar un fondo verde del overlay.
| Clave | Tipo | Por defecto | Descripción |
|---|---|---|---|
| position | string | "bottom-right" | Esquina donde se coloca el overlay: top-left, top-right, bottom-left, bottom-right, o center. |
| scale | float | 0.30 | Tamaño del overlay como fracción del ancho del vídeo principal. 0.25 = 25% del ancho. Rango: 0.05–1.0. |
| opacity | float | 1.0 | Transparencia del overlay. 1.0 = totalmente opaco, 0.0 = invisible. |
| margin | int | 10 | Separación en píxeles entre el overlay y el borde. Ignorado si position=center. Rango: 0–200. |
| audio | string | "main" | Audio a conservar. main: solo audio principal. overlay: solo audio del overlay. mix: ambas pistas mezcladas. |
| chroma_key | bool | false | Pon true para eliminar el fondo verde puro (#00FF00) del overlay — útil para webcam o animaciones filmadas en pantalla verde. |
| chroma_similarity | float | 0.20 | Tolerancia del chroma key. Bajo = coincidencia estricta. Alto = eliminación más amplia. Recomendado: 0.10–0.20 para verde digital, 0.25–0.45 para pantalla física. Rango: 0.01–0.60. |
Parámetros de options — Editar audio (mix_audio)
Disponible solo con mode=mix_audio. Ignorado para add_audio.
| Clave | Tipo | Por defecto | Descripción |
|---|---|---|---|
| mp3_volume | float | 1.0 | Volumen del MP3 superpuesto (0,0 = silenciado, 1,0 = volumen original, 2,0 = doble). Los valores superiores a 1,0 pueden provocar saturación. |
Respuesta de éxito (HTTP 200)
Ejemplo curl — modo image_to_video
Ejemplo curl — Editar audio
Ejemplo curl — modo overlay_video
Ejemplo curl — Fusionar vídeos
Estados posibles
| Estado | Significado | Campos adicionales |
|---|---|---|
| queued | En cola, aún no procesado | queue_position, queue_total, eta_minutes |
| processing | Procesamiento FFmpeg en curso | — |
| ready | Completado — archivo disponible | download_url, created_at, expires_at |
| error | Procesamiento fallido | error (message) |
Respuestas por estado
Ejemplo curl
Parámetros comunes (multipart/form-data)
| apidocs_th_param | Tipo | Por defecto | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Respuestas por estado
Publica un trabajo terminado (status=ready) en una o más cuentas sociales. El token debe pertenecer a una cuenta de miembro (no un token de administrador).
account_id de cada cuenta se muestra allí.Parámetros comunes (multipart/form-data)
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | ID del trabajo (hex 32 caracteres) del video terminado |
publications | array | apidocs_required | Array de objetos de publicación (máx. 10) |
Objeto de publicación
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID de la cuenta social conectada — encuéntralo en la página de Publicaciones de tu área de miembro |
title | string | — | Título del video (máx. 512 caracteres) |
description | string | — | Descripción del video (máx. 5 000 caracteres) |
tags | string | — | Etiquetas separadas por comas (máx. 1 024 caracteres) |
visibility | string | — | public | private | unlisted — Predeterminado: public |
tiktok_mode | string | — | draft | direct — Solo TikTok — predeterminado: direct |
tiktok_privacy | string | modo directo | Solo TikTok — requerido en modo directo |
allow_comment | boolean | — | Solo TikTok — permitir comentarios |
allow_duet | boolean | — | Solo TikTok — permitir duetos |
allow_stitch | boolean | — | Solo TikTok — permitir stitches |
your_brand | boolean | — | Solo TikTok — contenido promocional orgánico ("Tu marca"). |
branded_content | boolean | — | Solo TikTok — divulgación de contenido de marca |
tiktok_cover_ms | integer | — | Solo TikTok — marca de tiempo del fotograma de portada en ms (0–60 000, predeterminado 1 000) |
Respuestas por estado
Códigos de error por publicación
| apidocs_th_code | Significado |
|---|---|
job_not_ready | Trabajo aún no terminado |
mode_not_supported | Los trabajos text_to_mp3 no se pueden publicar |
account_not_found | Cuenta no encontrada o desconectada |
tiktok_privacy_required | Nivel de privacidad requerido en modo directo |
publication_failed | El proveedor devolvió un error durante la subida |
Ejemplo cURL
Devuelve el archivo MP4 final como flujo (Content-Type: video/mp4). No requiere token — la URL es suficientemente opaca. Disponible solo cuando el estado es ready.
El archivo se conserva 2 horas tras completarse el trabajo, luego se elimina. Descárgalo tan pronto como el estado sea ready.
Parámetro opcional
| Parámetro | Descripción |
|---|---|
| filename | Nombre sugerido para el archivo descargado (ej. mi-video.mp4) |
Ejemplo curl
Webhooks
Los webhooks son una alternativa al polling: en lugar de verificar el estado cada X segundos, proporcionas una URL y el servidor te llama automáticamente cuando el trabajo se completa.
Cómo funciona
- Pasa
callback_urlen el POST a/api/v1/render.php - La respuesta contiene un
webhook_secret— guárdalo para verificar firmas - Cuando el trabajo llega a
readyoerror, el servidor envía unPOSTJSON firmado a tu URL - Verifica la firma con
HMAC-SHA256(webhook_secret, raw_body)
callback_url debe ser una URL públicamente accesible (http o https). Las direcciones IP privadas, de loopback y reservadas están bloqueadas en el servidor. Tiempo de espera: 10 segundos. Payload recibido
Encabezados enviados por el servidor
| Encabezado | Valor |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — firma HMAC-SHA256 del cuerpo bruto |
| X-RVM-Job-Id | El job_id correspondiente |
Verificación de firma
Códigos de error
| HTTP | Código JSON | Causa |
|---|---|---|
| 401 | unauthorized | Token ausente, inválido o revocado |
| 400 | missing_files | No se recibieron archivos |
| 400 | too_few_files | Menos de 2 archivos enviados |
| 400 | too_many_files | Más de 20 archivos enviados |
| 400 | invalid_mime | Archivo no admitido — solo se aceptan MP4, MP3 e imágenes JPG/PNG (MIME verificado por bytes mágicos) |
| 400 | wrong_file_count | El número de archivos no coincide con el modo elegido (ej. 3 archivos con mode=add_audio que requiere 2) |
| 400 | wrong_file_types | Los tipos de archivos no coinciden con el modo elegido (ej. 2 MP4 con mode=add_audio que requiere 1 MP4 + 1 MP3; o 1 MP4 + 1 MP3 con mode=image_to_video) |
| 400 | invalid_file_combination | La combinación de archivos sin modo especificado no coincide con ningún modo admitido |
| 400 | invalid_options | El campo options no es JSON válido o contiene un objeto esperado |
| 400 | invalid_option | Un valor en options es inválido (color, nombre de fuente, posición…) |
| 400 | file_too_large | Un archivo supera los 500 MB |
| 400 | invalid_order | El array order no es una permutación válida |
| 400 | invalid_job_id | Formato de job_id incorrecto (debe ser hex de 32 caracteres) |
| 404 | job_not_found | Trabajo no encontrado — job_id desconocido o nunca existió |
| 410 | job_expired | Trabajo expirado — existió pero la ventana de recuperación de 2h ha pasado |
| 429 | quota_exceeded | 20 trabajos exitosos/día alcanzados (todos los modos combinados) |
| 429 | rate_limited | Más de 12 llamadas/min en /api/v1/jobs.php — espera Retry-After segundos |
| 500 | server_error | Error interno del servidor |
Ejemplos de integración
Ejemplos para cada modo — instala requests con pip install requests.
Configuración común
Modo image_to_video — imagen + audio → vídeo
Editar audio
Modo overlay_video — picture-in-picture
Fusionar vídeos
Polling + descarga (común a todos los modos)
Dos enfoques en n8n: polling (bucle de estado) o webhook (el servidor llama a n8n). El webhook es recomendado — más limpio, carga innecesaria cero.
Enfoque A — Webhook (recomendado)
Solo 3 nodos, sin bucle.
Nodo 1 — Webhook trigger
Agrega un nodo Webhook como entrada del flujo de trabajo (método POST). Anota la URL generada, ej.: https://tu-n8n.com/webhook/rvm-callback.
Nodo 2 — Crear el trabajo (HTTP Request)
| Método | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Autenticación | Header Auth — Authorization: Bearer rvm_… |
| Tipo de contenido | Form-Data Multipart |
| Body params | Campo Binary videos[] para cada clip + campo Text callback_url = URL del nodo Webhook de arriba |
Guarda el webhook_secret de la respuesta en una variable del flujo de trabajo para verificar la firma al recibirla.
Nodo 3 — Procesar el resultado (en el flujo de trabajo disparado por el Webhook)
Cuando n8n recibe el POST del servidor, $json.status es ready o error. Si es ready, $json.download_url contiene la URL de descarga directa.
{{ $headers['x-rvm-signature'] }} con sha256= + HMAC-SHA256 del cuerpo bruto desde tu webhook_secret. Usa un nodo Code con crypto.createHmac('sha256', secret).update(body).digest('hex').Enfoque B — Polling (sin webhook)
5 nodos, bucle de estado cada 10 s.
Nodo 1 — Crear el trabajo — misma configuración que arriba, sin callback_url.
Nodo 2 — Wait — 10 segundos.
Nodo 3 — Consultar estado (HTTP Request GET)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Parámetros de consulta | job_id = {{ $('Nodo 1').item.json.job_id }} |
| Autenticación | Header Auth — mismo token |
Nodo 4 — If: {{ $json.status }} === 'ready' → true: Nodo 5 / false: volver al Nodo 2.
Nodo 5 — Descargar: HTTP Request GET en {{ $json.download_url }}, Response Format File.
Paso 1 — Crear el trabajo (elegir un modo)
Paso 2 — Polling
Paso 3 — Descargar
Buenas prácticas
- Frecuencia de polling: el endpoint
/api/v1/jobs.phpestá limitado a 12 llamadas/min por token. Deja al menos 5 segundos entre llamadas (10 s recomendado) para evitar un429. La duración de un trabajo varía según el modo y el tamaño de los archivos (de unos segundos a varios minutos). - Tiempo de espera: implementa un tiempo de espera en el lado del cliente (ej. 10 minutos). Si el trabajo no está
readydespués de este tiempo, trátalo como un error. - Descarga rápida: tan pronto como el estado sea
ready, descarga el archivo. Se eliminará 2 horas después de que el trabajo se complete. - Gestión de cuota: verifica
quota_remainingen la respuesta POST. Si es0, el siguiente trabajo será rechazado con429. - Errores de red: en caso de error de red durante el polling, espera y vuelve a intentarlo — el trabajo continúa ejecutándose en el servidor de forma independiente.
ready.