Vyexa
O servidor MCP Vyexa converte vídeos horizontais longos (do YouTube ou por link direto de arquivo) em vídeos verticais curtos (formato 9:16) com legendas embutidas e títulos atraentes.
Documentação
API do Vyexa
Envie um link de vídeo — receba clipes verticais curtos com legendas incorporadas. Um POST, uma consulta, um download. Feito para que um agente possa usá-lo sem navegador.
Comece em dois minutos — grátis
Você não precisa falar com vendas nem esperar aprovação. Crie uma conta, gere uma chave no seu painel e envie sua primeira solicitação.
- Crie uma conta gratuita em vyexa.net — sem necessidade de cartão.
- Abra Painel → Chaves de API, clique em Criar chave e copie-a. A chave é exibida apenas uma vez.
- Envie seu primeiro job com o curl abaixo e consulte o
status_urlretornado até que os clipes estejam prontos.
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}'
O plano gratuito funciona pela API exatamente nos mesmos termos do site. Você recebe clipes grátis todo mês, e os clipes da API são descontados do mesmo saldo. Clipes do plano gratuito têm marca d'água e o comprimento do vídeo de origem é limitado; planos pagos removem a marca d'água e aumentam os limites. Nada muda na cobrança por você chamar a API em vez do aplicativo web — os clipes também aparecem no seu painel em Meus Vídeos.
Use com Claude, Cursor, n8n MCP
O Vyexa também é um servidor MCP remoto (Streamable HTTP) em https://vyexa.net/mcp. Ele encapsula esta mesma API — mesma chave, mesmo saldo, mesmos limites — e oferece ao agente quatro ferramentas: create_clips, get_job, list_clips, get_options. Obtenha uma chave gratuita em Painel → Chaves de API e então:
Claude Code
claude mcp add --transport http vyexa https://vyexa.net/mcp \
--header "Authorization: Bearer YOUR_KEY"
Claude Desktop
Configurações → Conectores → adicione um conector personalizado, ou use a ponte mcp-remote em 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 — nó de Solicitação HTTP
Importe este nó (Workflow → colar) ou defina os mesmos campos manualmente. Consulte com um segundo nó em GET /api/v1/jobs/{{ $json.job_id }} até que status seja completed ou 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": {}
}
Legível por máquina: /openapi.json (OpenAPI 3.1), /.well-known/mcp.json (cartão do servidor MCP), /llms.txt.
O que faz
Você envia qualquer link de vídeo público — uma publicação no TikTok, YouTube, Instagram, Vimeo, Twitch e outras plataformas, ou um link direto para um arquivo de vídeo no seu próprio armazenamento. O Vyexa baixa o vídeo, encontra os momentos mais fortes com IA e os renderiza como clipes 9:16 com título e legendas. Você consulta um endpoint até que os clipes estejam prontos e então baixa os MP4s.
- Assíncrono por design — todo job retorna imediatamente com um
job_id. - Os clipes são renderizados, não apenas cortados: enquadramento, títulos e legendas são aplicados.
- Segmentos de legenda com marcações de tempo podem ser retornados em JSON junto com o vídeo.
- Tudo é JSON, exceto o download do clipe, que é o fluxo MP4.
URL base e autenticação
URL base: https://vyexa.net. Toda solicitação precisa de um token de portador:
Authorization: Bearer vx_your_api_key
Solicitações sem uma chave válida, ativa e não expirada recebem 401. As chaves são emitidas por conta — clipes criados pela API também aparecem no painel dessa conta e são cobrados no saldo de clipes dela. Gere uma você mesmo em Painel → Chaves de API (até 5 chaves por conta, válidas por um ano, revogáveis a qualquer momento).
- Trate a chave como uma senha: somente no servidor, nunca em código do lado do cliente ou em repositório público.
- Armazenamos apenas um hash dela. Se você a perder, emitimos uma nova — não podemos recuperar a antiga.
- As chaves expiram (1 ano por padrão) e podem ser revogadas a qualquer momento.
- Sempre chame a API via HTTPS.
Início rápido
1. Crie um job.
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. Consulte a URL de status até que status seja completed, partial ou failed. A cada 10–15 segundos é suficiente.
curl https://vyexa.net/api/v1/jobs/123 \
-H "Authorization: Bearer vx_your_api_key"
3. Baixe os clipes do download_url de cada item.
curl -L -o clip.mp4 \
-H "Authorization: Bearer vx_your_api_key" \
https://vyexa.net/api/v1/clips/A3HK7Z2Q/download
POST /api/v1/jobs
Cria um job de clipes. Responde 202 Accepted; o trabalho acontece em segundo plano.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url | string | sim | Link para o vídeo de origem: uma publicação no TikTok, YouTube, Instagram, Vimeo, Twitch e outras plataformas, ou um link https:// direto para um arquivo de vídeo. Ele precisa estar acessível sem login. |
language | string | não | Idioma falado da origem (en, uk, pl, …). Omita ou envie auto para detectar automaticamente. |
num_clips | int | não | Quantos clipes você deseja. Este é um teto, não uma promessa: momentos fracos são descartados antes da renderização, então você pode receber menos. Você só é cobrado pelos clipes efetivamente entregues. |
segment_duration | int | não | Duração do clipe em segundos. Conjunto fixo: 30, 50, 90 — e é limitado pelo plano: grátis 30, Criador 30/50, Pro 30/50/90. Qualquer outro valor é rejeitado, nunca alterado silenciosamente: um valor fora do conjunto retorna 422 invalid_clip_duration, um valor válido acima do seu plano retorna 422 clip_duration_not_in_plan. Omita o campo para deixarmos que escolhamos. |
generate_title | bool | não | Gera um título de IA para cada clipe. Padrão true. |
title | string | não | Título fixo para todos os clipes em vez dos gerados por IA. Máximo de 32 caracteres — é o que cabe na barra de título de um curto vertical. Strings mais longas são truncadas, não rejeitadas. |
highlight_color | string | não | Cor de destaque da palavra ativa da legenda e do realce do título. Um id de catálogo (FFD600, 40BFC3, FFFFFF+FFD600 …, lista completa em GET /api/v1/options → job_options.highlight_color.values) ou qualquer cor HTML #RRGGBB, ex.: "#1E90FF"; um par "#1E90FF+#FFFFFF" alterna dois destaques. Omita para usar a configuração da sua conta. Qualquer outra coisa retorna 422 invalid_highlight_color. O valor aplicado é ecoado como highlight_color no status do job. |
profanity_censor | bool | não | Censura palavrões neste job: eles são mascarados nas legendas (f***) e abafados no áudio. Omita para usar a configuração da sua conta (desativado por padrão); true / false substitui essa configuração apenas para este job, incluindo edições posteriores dos seus clipes. Qualquer coisa que não seja booleano retorna 422 invalid_profanity_censor. A detecção é baseada em dicionário (en, ru, uk, pl, de, fr, es, it) e de melhor esforço. |
constructor | objeto | não | Aparência e enquadramento — veja abaixo. |
logo | objeto | não | Seu logotipo incorporado em cada clipe, em uma de 9 posições. Somente planos pagos — veja Seu logotipo nos clipes. |
O objeto construtor
| Campo | Padrão | Valores aceitos | O que controla |
|---|---|---|---|
layout | auto | auto, full, frame_70, frame_50, frame_40, dual, streaming, lesson | Como a origem 16:9 é enquadrada em 9:16. |
subtitle_style | default | default, none, karaoke, simple, big, minimal, highlighter, focus, popline, backdrop, glow, punch, beasty, stack | Animação e aparência das legendas. none renderiza sem legendas. |
title_style | clean | clean, box, chip, box_accent, outline, off | Tratamento do título. off renderiza sem título. |
font | montserrat | montserrat, rubik, russo | Tipografia para títulos e legendas. |
subtitle_position | auto | auto, bottom, middle, top | Onde as legendas ficam. auto segue o layout. |
Um valor desconhecido não é um erro — ele volta silenciosamente ao padrão daquele campo. Ainda assim, não codifique essas listas: adicionamos estilos e layouts regularmente. GET /api/v1/options sempre retorna o conjunto atual com uma breve nota de "quando escolher isto" e recomendações de tipo de conteúdo. Leia uma vez na inicialização e deixe seu agente escolher a partir dela.
{
"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}
Status do job e, quando a renderização começa, os clipes produzidos até o momento.
status | stage | Significado |
|---|---|---|
pending | importing | Baixando o vídeo de origem. |
processing | generating | Renderizando clipes. |
completed | done | Todos os clipes prontos. |
partial | done | Alguns clipes prontos, alguns falharam. |
failed | import | Não foi possível baixar a origem. |
failed | done | Todos os clipes falharam ao renderizar. |
Adicione ?include_subtitles=1 para obter segmentos de legenda com marcações de tempo em milissegundos para cada clipe.
{
"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"
}
]
}
O bloco source é um feedback para sua próxima chamada: max_clips é o teto rígido para o comprimento deste vídeo, e available_languages informa quais valores de language realmente existem na origem. Ele aparece quando a importação termina, portanto está ausente enquanto stage é importing.
profanity_censor está sempre presente e mostra o valor realmente aplicado ao job: o que você enviou, ou a configuração da sua conta se você não enviou nenhum. Quando é true, as legendas retornadas por ?include_subtitles=1 carregam a mesma máscara do clipe renderizado.
O id do clipe é um token opaco, não um id de banco de dados. Use-o como está.
GET /api/v1/clips/{clip_id}/download
Transmite o MP4. Exige o mesmo token de portador e só retorna clipes que pertencem à sua conta — qualquer outra coisa é 404.
GET /api/v1/clips/{clip_id}
Status de um único clipe: processing, ready ou failed, além de download_url quando pronto. Use-o para consultar após uma edição.
POST /api/v1/clips/{clip_id}/edit
Re-renderiza um clipe existente no lugar — mesmo id, novo título e/ou corte. Responde 202; consulte o endpoint de status do clipe até que ele seja ready. Cada edição custa um clipe do seu saldo, como uma regeneração.
{
"title": "New title",
"trim": { "start": 0, "end": 21 }
}
Os valores de corte são em segundos relativos ao clipe. Para um clipe de comprimento D: start >= 0, end - start >= 1, end <= D. Um intervalo inválido retorna 422 invalid_trim e nada é renderizado ou cobrado. Pelo menos um de title ou trim deve estar presente. Na edição, title deve ter 1..32 caracteres — diferente da criação de job, aqui é validado, não truncado, então uma string mais longa retorna 422 invalid_title.
GET /api/v1/options
Endpoint de descoberta. Retorna todos os valores aceitos para os campos constructor com um rótulo, uma descrição de "quando escolher isto" e os tipos de conteúdo adequados, além de um pequeno bloco de recomendações mapeando tipo de conteúdo para um layout e estilo de legenda sensatos. Flags de nível superior do job, como profanity_censor, são listadas em job_options. Chame-o em vez de codificar valores.
Erros e limites
Erros são JSON com um error_code estável e legível por máquina.
{
"success": false,
"error_code": "invalid_trim",
"error": "Trim range is outside the clip."
}
| Status | Quando |
|---|---|
401 | Chave ausente, desconhecida, desativada ou expirada. |
403 logo_requires_paid_plan | logo foi enviado com uma chave do plano gratuito. |
404 | Trabalho ou clipe desconhecido, ou que pertence a outra conta. |
409 | O clipe ainda está sendo renderizado e não pode ser editado ainda. |
422 | Entrada inválida — URL não suportado, corte inválido, nada para editar, um profanity_censor não booleano, uma duração de clipe que seu plano não permite, ou um logo inválido (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_limit | Muitas solicitações. Respeite o cabeçalho Retry-After. |
429 concurrent_limit | Outra geração desta conta ainda está em execução. Contas gratuitas executam um trabalho por vez; contas pagas (Creator, Pro) executam até 5 em paralelo. |
429 insufficient_balance | Os trabalhos em execução já reservaram todo o seu saldo de clipes. Aguarde eles terminarem ou adicione créditos. |
failed source_minutes_limit | Relatado no status do trabalho após a importação: o vídeo de origem não se encaixa na cota mensal de minutos de vídeo de origem do seu plano (Free 200, Creator 1500, Pro 4000). Os minutos são gastos uma vez por vídeo de origem na primeira geração; um window conta apenas o próprio comprimento. Aguarde a redefinição mensal ou faça upgrade. |
failed source_duration_limit | Relatado no status do trabalho após a importação: no plano gratuito, um único vídeo de origem é limitado a 90 minutos. |
Os limites de taxa são por chave em uma janela deslizante, separadamente para criação de trabalhos, consulta de status, edições e downloads, além de um limite diário de quantos links de origem você pode importar. Se precisar de limites maiores para uma integração de produção, escreva para support@vyexa.net.
Consulte o status em vez de sobrecarregar: uma solicitação a cada 10–15 segundos por trabalho é suficiente, e um trabalho normalmente termina em alguns minutos, dependendo do comprimento da origem. Há também um limite de rajada por IP, então não dispare dezenas de solicitações no mesmo segundo — distribua-as.
O saldo é reservado antecipadamente
Não começaremos um trabalho que não podemos entregar. Antes de um trabalho ser aceito, somamos os clipes já prometidos pelos seus trabalhos não concluídos; uma vez que essa reserva cubra todo o seu saldo, o próximo trabalho é recusado com 429 insufficient_balance em vez de ser transcrito e analisado à toa.
A regra é deliberadamente tolerante no limite: com um saldo de 20, trabalhos de 10, 6 e 5 clipes são todos aceitos (o último pode entregar um clipe a menos), mas um quarto trabalho é recusado. Aguarde os trabalhos em execução terminarem ou adicione créditos.
Notas para construtores de agentes
- Leia
GET /api/v1/optionsna inicialização e deixe o modelo escolherlayoutesubtitle_stylea partir das descrições. - Trate
num_clipscomo um limite superior e lide comclips_ready < clips_expectedcomo normal, não como um erro. - Não exceda seu limite: uma conta gratuita executa uma geração por vez, uma conta paga (Creator, Pro) até 5 em paralelo. Mantenha-se nisso e não dispare rajadas — elas acionam o limite por IP.
- Trate
insufficient_balancecomo "volte mais tarde", não como um loop de repetição — o saldo é liberado conforme os trabalhos em execução terminam. - Lide com
clip_duration_not_in_planexplicitamente: significa que a solicitação estava correta, mas a conta precisa de um plano superior — comunique isso ao seu usuário em vez de tentar novamente. - Use
source.max_clipsesource.available_languagesda primeira resposta de status para corrigir sua próxima solicitação. partialé um estado de sucesso — alguns clipes são utilizáveis.- Armazene o
iddo clipe; ele permanece estável entre edições. - O áudio é sempre o áudio de origem. Não há opção de narração ou música de fundo na API pública.
O que você precisa para começar
- Uma conta Vyexa — gratuita, sem cartão.
- Uma chave de API em Dashboard → API keys.
- Um link de vídeo público — postagem de plataforma ou arquivo direto — e qualquer coisa que possa enviar uma solicitação HTTPS.
Isso é tudo. Clipes gratuitos são suficientes para testar todo o fluxo de ponta a ponta antes de pagar por qualquer coisa. Se precisar de limites de taxa maiores ou tiver uma pergunta sobre uma integração de produção, escreva para support@vyexa.net.