API RapidVideoMaker
A API REST permite processar arquivos de vídeo de qualquer cliente HTTP — scripts Python, fluxos n8n, ferramentas de terceiros. Cinco modos disponíveis: Mesclar vídeos (vários MP4), Editar áudio (1 MP4 + 1 MP3), Criar um vídeo (1 JPG/PNG + 1 MP3), Sobreposição de vídeo (2 MP4 picture-in-picture). O processamento é assíncrono: envie os arquivos e consulte o resultado.
Fluxo de trabalho completo
Toda integração segue a mesma sequência de 4 etapas:
POST /api/v1/render.phpmultipart/form-data com seu token Bearer. 1 JPG/PNG + 1 MP3 + mode=image_to_video → geração de vídeo. 1 MP4 + 1 MP3 → edição de áudio (mode=mix_audio para sobrepor). Vários MP4 → mesclar. O servidor retorna um job_id único.GET /api/v1/jobs.php?job_id=…queued → processing → ready (ou error). A resposta inclui a posição na fila e o tempo estimado restante.ready, a resposta contém um campo download_url pronto para uso.GET /api/download.php?job_id=…410 Gone.Autenticação
Toda requisição deve incluir seu token de API. Dois formatos são aceitos:
Seu token está disponível em seu espaço de membro — um token por conta, criado automaticamente no cadastro. É mostrado em texto claro apenas uma vez — guarde-o com segurança. Se perdido, pode ser regerado no espaço de membro.
Cota
Cada conta tem 20 requisições por dia, compartilhadas entre interface web e API. Jobs com falha não consomem cota. O contador reinicia à meia-noite UTC.
As respostas POST incluem quota_used e quota_remaining. Quando o limite é excedido, o servidor responde 429.
Fila
Um job é processado por vez. Se vários jobs forem enviados simultaneamente, são enfileirados em ordem de chegada. Enquanto aguarda, a resposta de status inclui:
queue_position— posição do job na fila (1 = próximo)queue_total— número total de jobs aguardandoeta_minutes— tempo estimado antes do início do processamento
/api/v1/jobs.php aceita no máximo 12 chamadas por minuto por token. Além disso, responde 429 com Retry-After: 5. Recomendação: 10 segundos entre chamadas. Transições disponíveis
Passe transition_type=none (padrão) para mesclagem direta, ou um dos tipos abaixo para uma transição entre clipes:
A duração (transition_duration) é entre 0,2 e 2,0 segundos. Se um clipe é muito curto, a transição é ignorada.
Endpoints
Cinco modos, acessíveis pelo campo mode (omita mode com vários MP4 para detectar automaticamente fusion):
| Uso | Modo API | Arquivos necessários | Descrição |
|---|---|---|---|
| Mesclar vídeos | fusion |
2–20 arquivos MP4 | Os clipes são montados em sequência na ordem fornecida. Transições opcionais entre clipes. |
| Editar áudio | add_audio ou mix_audio |
1 MP4 + 1 MP3 | Substitui ou enriquece a faixa de áudio de um vídeo. A faixa de vídeo nunca é recodificada (-c:v copy).add_audio — o áudio original é excluído e substituído pelo MP3.mix_audio — o áudio original é mantido e o MP3 é sobreposto (amix). options={"mp3_volume":…} para ajustar o volume. |
| Criar um vídeo | image_to_video |
1 JPG/PNG + 1 MP3 | Gera um vídeo a partir de uma imagem estática e um arquivo de áudio. Sobreposição de texto, fades, resolução e FPS configuráveis via o campo options. |
| Sobreposição de vídeo | overlay_video |
2 MP4 | Sobrepõe um segundo vídeo ao vídeo principal. Posição, tamanho, opacidade e áudio configuráveis via o campo options. |
| Texto para MP3 | text_to_mp3 |
(somente texto) | Converte texto em fala e retorna um arquivo MP3. Nenhum upload de arquivo necessário — envie mode=text_to_mp3, text e lang como campos de formulário. Suporta todos os 20 idiomas do site. |
add_audio e mix_audio aceitam apenas 1 MP4 + 1 MP3. image_to_video apenas 1 JPG/PNG + 1 MP3. Os tipos MIME são verificados por magic bytes.-c:v copy).Parâmetros comuns (multipart/form-data)
| Campo | Tipo | Obr. | Descrição |
|---|---|---|---|
| videos[] | File[] | SIM | Arquivos a processar. Dependendo do modo: 2–20 MP4, ou 1 MP4 + 1 MP3, ou 1 imagem (JPG/PNG) + 1 MP3. Máx. 500 MB por arquivo. |
| mode | string | * | image_to_video | add_audio | mix_audio. Obrigatório para esses três modos. Ignorado (detectado automaticamente) apenas se todos os arquivos forem MP4 (fusion). Se fornecido, os arquivos devem corresponder exatamente — caso contrário a requisição é rejeitada. |
| order | JSON | Apenas modo fusion — array JSON de índices para a ordem dos clipes. | |
| transition_type | string | Apenas modo fusion. Padrão: none. Veja lista de transições disponíveis. | |
| transition_duration | float | Apenas modo fusion. Duração 0,2–2,0 seg. Padrão: 0.5. | |
| options | JSON | Apenas modo image_to_video — objeto JSON de parâmetros de renderização (veja abaixo). | |
| callback_url | string | URL pública (http/https) chamada ao concluir o job. A resposta inclui um webhook_secret. |
Parâmetros options — modo image_to_video
Todos opcionais. Valores não fornecidos → padrões do worker.
| Chave | Tipo | Padrão | Descrição |
|---|---|---|---|
| text | string | "" | Texto exibido como sobreposição. Vazio = sem texto. Máx. 500 caracteres. |
| font_size | int | 60 | Tamanho da fonte em pixels. Intervalo: 10–300. Recomendados: 36, 48, 60, 72, 96. |
| text_color | string | "white" | Cor do texto (ex. white, yellow, #ffffff, 0xffffff). |
| text_position | string | "center" | Posição do texto: center, top, bottom. |
| box | bool | true | Fundo semi-transparente atrás do texto. |
| box_color | string | "black@0.4" | Cor + opacidade no formato FFmpeg: cor@opacidade. Opacidade: 0,0–1,0 (ex. black@0.4 = preto a 40%). |
| fade_duration | float | 0.5 | Duração do fade in/out em segundos (0–2). 0 = sem fade. |
| width | int | 1080 | Largura do vídeo em pixels (64–3840, par forçado). Padrão: 1080/1920/720/1280. |
| height | int | 1920 | Altura do vídeo em pixels (64–3840, par forçado). |
| fps | int | 24 | Frame rate (1–60). |
| image_fit | string | "contain" | Modo de enquadramento: contain = imagem completa visível, áreas vazias com bg_color; cover = imagem ampliada, bordas cortadas. bg_color ignorado em cover. |
| bg_color | string | "black" | Cor de fundo se a imagem não preencher a resolução — apenas com image_fit=contain (ex. black, white, #1a1a2e). |
| enable_image_motion | bool | false | Ativa a animação de foto. Se false, a imagem fica estática. Se true, aplica o efeito de image_motion_effect via FFmpeg zoompan. |
| image_motion_effect | string | "ken_burns" | Efeito de animação. Valores: 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. Padrão: ken_burns. |
| motion_intensity | float | 1.0 | Intensidade da animação de foto (0,25–2,0). Multiplica amplitude do zoom e velocidade do pan. |
| text_effect | string | "none" | Animação do texto. Valores: none, fade_in, slide_up, slide_down, slide_left, bounce. |
| text_effect_intensity | float | 1.0 | Intensidade da animação de texto (0,25–2,0). |
| text_border_width | int | 0 | Espessura do contorno preto em pixels (0 = desativado, 1–10). Melhora a legibilidade. |
| text_mode | string | "static" | Modo de revelação do texto. static (padrão): texto completo visível desde o primeiro quadro. word_by_word: palavras aparecem uma por uma no ritmo de word_reveal_speed. Exclusivo com text_effect: se text_mode=word_by_word, text_effect é ignorado. |
| word_reveal_speed | float | 1.5 | Velocidade de revelação em palavras por segundo (0.3–5.0, padrão 1.5). Somente com text_mode=word_by_word. Valor recomendado para sincronização com voz OpenAI TTS: 2.0. |
| word_anim | string | "none" | Animação de aparição de cada palavra. none (padrão): revelação instantânea. fade: cada nova palavra aparece com um fade de 0.2s e crossfade com o bloco anterior. Usado apenas com text_mode=word_by_word. |
Parâmetros options — modo overlay_video
Todos opcionais. A ordem de envio importa: o primeiro arquivo é o vídeo principal (fundo), o segundo arquivo é o overlay (primeiro plano). Use chroma_key para remover um fundo verde do overlay.
| Chave | Tipo | Padrão | Descrição |
|---|---|---|---|
| position | string | "bottom-right" | Canto onde o overlay é posicionado: top-left, top-right, bottom-left, bottom-right, ou center. |
| scale | float | 0.30 | Tamanho do overlay como fração da largura do vídeo principal. 0.25 = 25% da largura. Intervalo: 0.05–1.0. |
| opacity | float | 1.0 | Transparência do overlay. 1.0 = totalmente opaco, 0.0 = invisível. |
| margin | int | 10 | Espaço em pixels entre o overlay e a borda. Ignorado se position=center. Intervalo: 0–200. |
| audio | string | "main" | Qual áudio manter. main: só o áudio principal. overlay: só o áudio do overlay. mix: ambas as faixas misturadas. |
| chroma_key | bool | false | Defina como true para remover o fundo verde puro (#00FF00) do overlay — útil para webcam ou animações filmadas em chroma key. |
| chroma_similarity | float | 0.20 | Tolerância do chroma key. Baixo = correspondência estrita. Alto = remoção mais ampla. Recomendado: 0.10–0.20 para verde digital, 0.25–0.45 para tela física. Intervalo: 0.01–0.60. |
Parâmetros options — Editar áudio (mix_audio)
Disponível apenas com mode=mix_audio. Ignorado para add_audio.
| Chave | Tipo | Padrão | Descrição |
|---|---|---|---|
| mp3_volume | float | 1.0 | Volume do MP3 sobreposto (0,0 = mudo, 1,0 = original, 2,0 = dobro). Valores acima de 1,0 podem saturar. |
Resposta de sucesso (HTTP 200)
Exemplo curl — modo image_to_video
Exemplo curl — Editar áudio
Exemplo curl — modo overlay_video
Exemplo curl — Mesclar vídeos
Status possíveis
| Status | Significado | Campos adicionais |
|---|---|---|
| queued | Na fila, ainda não processado | queue_position, queue_total, eta_minutes |
| processing | Processamento FFmpeg em andamento | — |
| ready | Concluído — arquivo disponível | download_url, created_at, expires_at |
| error | Processamento falhou | error (message) |
Respostas por status
Exemplo curl
Parâmetros comuns (multipart/form-data)
| apidocs_th_param | Tipo | Padrão | apidocs_th_desc |
|---|---|---|---|
page | integer | 1 | Page number (starts at 1) |
limit | integer | 20 | Results per page (max 50, default 20) |
Respostas por status
Publica um trabalho concluído (status=ready) em uma ou mais contas sociais. O token deve pertencer a uma conta de membro (não um token de administrador).
account_id de cada conta é exibido lá.Parâmetros comuns (multipart/form-data)
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
job_id | string | apidocs_required | ID do trabalho (hex 32 caracteres) do vídeo concluído |
publications | array | apidocs_required | Array de objetos de publicação (máx. 10) |
Objeto de publicação
| apidocs_th_param | Tipo | apidocs_th_required | apidocs_th_desc |
|---|---|---|---|
account_id | integer | apidocs_required | ID da conta social conectada — encontre-o na página de Publicações da área do membro |
title | string | — | Título do vídeo (máx. 512 caracteres) |
description | string | — | Descrição do vídeo (máx. 5 000 caracteres) |
tags | string | — | Tags separadas por vírgula (máx. 1 024 caracteres) |
visibility | string | — | public | private | unlisted — Padrão: public |
tiktok_mode | string | — | draft | direct — Somente TikTok — padrão: direct |
tiktok_privacy | string | modo direct | Somente TikTok — obrigatório no modo direct |
allow_comment | boolean | — | Somente TikTok — permitir comentários |
allow_duet | boolean | — | Somente TikTok — permitir duetos |
allow_stitch | boolean | — | Somente TikTok — permitir stitches |
your_brand | boolean | — | Somente TikTok — conteúdo promocional orgânico ("Sua marca"). |
branded_content | boolean | — | Somente TikTok — divulgação de conteúdo de marca |
tiktok_cover_ms | integer | — | Somente TikTok — timestamp do quadro de capa em ms (0–60 000, padrão 1 000) |
Respostas por status
Códigos de erro por publicação
| apidocs_th_code | Significado |
|---|---|
job_not_ready | Trabalho ainda não concluído |
mode_not_supported | Jobs text_to_mp3 não podem ser publicados |
account_not_found | Conta não encontrada ou desconectada |
tiktok_privacy_required | Nível de privacidade necessário no modo direct |
publication_failed | O provedor retornou um erro durante o upload |
Exemplo cURL
Retorna o arquivo MP4 final como stream (Content-Type: video/mp4). Não requer token. Disponível apenas quando o status é ready.
O arquivo é mantido por 2 horas após a conclusão, depois excluído. Baixe assim que o status se tornar ready.
Parâmetro opcional
| Parâmetro | Descrição |
|---|---|
| filename | Nome sugerido para o arquivo baixado (ex. meu-video.mp4) |
Exemplo curl
Webhooks
Webhooks são uma alternativa ao polling: em vez de verificar o status a cada X segundos, você fornece uma URL e o servidor te chama automaticamente quando o job é concluído.
Como funciona
- Passe
callback_urlno POST para/api/v1/render.php - A resposta contém um
webhook_secret— guarde-o para verificar assinaturas - Quando o job atinge
readyouerror, o servidor envia umPOSTJSON assinado para sua URL - Verifique a assinatura com
HMAC-SHA256(webhook_secret, raw_body)
callback_url deve ser uma URL publicamente acessível. IPs privados e de loopback são bloqueados. Timeout: 10 segundos. Payload recebido
Headers enviados pelo servidor
| Header | Valor |
|---|---|
| Content-Type | application/json |
| X-RVM-Signature | sha256=<hmac_hex> — assinatura HMAC-SHA256 do body bruto |
| X-RVM-Job-Id | O job_id relevante |
Verificação de assinatura
Códigos de erro
| HTTP | Código JSON | Causa |
|---|---|---|
| 401 | unauthorized | Token ausente, inválido ou revogado |
| 400 | missing_files | Nenhum arquivo recebido |
| 400 | too_few_files | Menos de 2 arquivos enviados |
| 400 | too_many_files | Mais de 20 arquivos enviados |
| 400 | invalid_mime | Arquivo não suportado — apenas MP4, MP3 e JPG/PNG aceitos (MIME verificado por magic bytes) |
| 400 | wrong_file_count | O número de arquivos não corresponde ao modo escolhido |
| 400 | wrong_file_types | Os tipos de arquivo não correspondem ao modo escolhido |
| 400 | invalid_file_combination | Combinação de arquivos não corresponde a nenhum modo suportado |
| 400 | invalid_options | O campo options não é JSON válido ou não contém um objeto |
| 400 | invalid_option | Um valor em options é inválido (cor, fonte, posição…) |
| 400 | file_too_large | Um arquivo excede 500 MB |
| 400 | invalid_order | O array order não é uma permutação válida |
| 400 | invalid_job_id | Formato de job_id incorreto (deve ser hexadecimal de 32 caracteres) |
| 404 | job_not_found | Job não encontrado — job_id desconhecido ou nunca existiu |
| 410 | job_expired | Job expirado — existia mas a janela de 2 horas passou |
| 429 | quota_exceeded | 20 jobs bem-sucedidos/dia atingidos |
| 429 | rate_limited | Mais de 12 chamadas/min em /api/v1/jobs.php — aguardar Retry-After segundos |
| 500 | server_error | Erro interno do servidor |
Exemplos de integração
Exemplos para cada modo — instalar requests com pip install requests.
Configuração comum
Modo image_to_video — imagem + áudio → vídeo
Editar áudio
Modo overlay_video — picture-in-picture
Mesclar vídeos
Polling + download (comum a todos os modos)
Duas abordagens no n8n: polling (loop de status) ou webhook (servidor chama o n8n). O webhook é recomendado — mais limpo, zero carga desnecessária.
Abordagem A — Webhook (recomendado)
Apenas 3 nodes, sem loop.
Node 1 — Trigger Webhook
Adicione um node Webhook como entrada do workflow (método POST). Anote a URL gerada, ex. https://seu-n8n.com/webhook/rvm-callback.
Node 2 — Criar o job (HTTP Request)
| Método | POST |
| URL | https://rapidvideomaker.com/api/v1/render.php |
| Autenticação | Header Auth — Authorization: Bearer rvm_… |
| Tipo de conteúdo do body | Form-Data Multipart |
| Body params | Campo Binary videos[] para cada clipe + Campo Text callback_url = URL do node webhook |
Guarde o webhook_secret da resposta em uma variável do workflow.
Node 3 — Processar o resultado (no workflow ativado pelo webhook)
Quando o n8n recebe o POST do servidor, $json.status é ready ou error. Se ready, $json.download_url contém a URL de download direto.
{{ $headers['x-rvm-signature'] }} com sha256= + HMAC-SHA256 do body bruto. Node Code: crypto.createHmac('sha256', secret).update(body).digest('hex').Abordagem B — Polling (sem webhook)
5 nodes, loop de status a cada 10 seg.
Node 1 — Criar o job — mesma configuração, sem callback_url.
Node 2 — Aguardar — 10 segundos.
Node 3 — Verificar status (HTTP Request GET)
| URL | https://rapidvideomaker.com/api/v1/jobs.php |
| Parâmetros de query | job_id = {{ $('Node 1').item.json.job_id }} |
| Autenticação | Header Auth — mesmo token |
Node 4 — If: {{ $json.status }} === 'ready' → true: Node 5 / false: volta ao Node 2.
Node 5 — Download: HTTP Request GET em {{ $json.download_url }}, formato de resposta File.
Etapa 1 — Criar o job (escolha um modo)
Etapa 2 — Polling
Etapa 3 — Download
Boas práticas
- Frequência de polling: o endpoint
/api/v1/jobs.phpé limitado a 12 chamadas/min por token. Aguarde pelo menos 5 segundos entre chamadas (10 seg. recomendado). - Timeout: implemente um timeout do lado do cliente (ex. 10 minutos). Se o job não estiver
ready, trate-o como erro. - Baixe rapidamente: assim que o status for
ready, baixe o arquivo. Ele é excluído 2 horas após a conclusão. - Gestão de cota: verifique
quota_remainingna resposta POST. Se0, o próximo job será rejeitado com429. - Erros de rede: em caso de erro de rede durante o polling, aguarde e tente novamente — o job continua no servidor.
ready.