Envio de arquivos
Envie imagens, vídeo e áudio ao Nodaro com POST /v1/upload, copie de URLs, importe vídeos de redes sociais, corte mídia salva grátis e liste a biblioteca.
O envio de arquivos coloca as suas próprias imagens, vídeos e áudios no armazenamento do Nodaro, para que qualquer nó possa usá-los pela URL. POST /v1/upload armazena um arquivo e retorna a URL dele. Outras rotas copiam um arquivo de uma URL, importam um vídeo de uma rede social, cortam um arquivo armazenado de graça ou listam a mídia que você armazenou.
Endpoints
| Método | Caminho | O que faz |
|---|---|---|
POST | /v1/upload | Envia um arquivo, como multipart form data. |
POST | /v1/save-to-storage | Copia um arquivo de uma URL para o seu armazenamento, como um job. |
POST | /v1/download-video | Importa um vídeo de uma rede social ou de um link direto de vídeo. |
GET | /v1/download-video/progress/:downloadId | O progresso da importação, como server-sent events. |
POST | /v1/video-metadata | Lê a duração, o tamanho e o título de um vídeo sem baixá-lo. |
POST | /v1/media/process | Corta ou recorta um arquivo de vídeo ou de áudio armazenado. Grátis e síncrono. |
GET | /v1/library | A sua mídia armazenada, com um resumo do armazenamento. |
Enviar um arquivo
Envie o arquivo como multipart form data, no campo file. Você também pode enviar type, com o valor image, video ou audio.
curl -s -X POST https://app.nodaro.ai/v1/upload \
-H "Authorization: Bearer $NODARO_API_KEY" \
-F "file=@portrait.png;type=image/png" \
-F "type=image"{
"data": {
"url": "https://…/portrait.png",
"assetId": "5d6e7f80-91a2-4b3c-8d4e-5f60718293a4",
"thumbnailUrl": "https://…/portrait-thumb.webp",
"category": "image",
"filename": "portrait.png",
"mimeType": "image/png",
"sizeBytes": 1482233,
"r2Key": "…/portrait.png"
}
}// In a browser, file comes from an <input type="file">.
// In Node 20 or newer, build it from bytes:
import { readFile } from 'node:fs/promises'
const file = new File([await readFile('portrait.png')], 'portrait.png', { type: 'image/png' })
const upload = await client.uploads.upload(file)
console.log(upload.url) // pass it as imageUrl, videoUrl or audioUrl| Campo | Significado |
|---|---|
url | A URL pública do arquivo armazenado. Use-a em qualquer nó. |
assetId | O ID do arquivo no seu armazenamento. |
thumbnailUrl | Uma miniatura para imagens e vídeo, ou null para áudio. |
category | image, video ou audio, conforme o servidor classificou o arquivo. |
filename | O nome de exibição do arquivo. |
mimeType | O tipo de arquivo que o servidor definiu. Veja abaixo. |
sizeBytes | O tamanho armazenado, em bytes. |
r2Key | A chave do arquivo no armazenamento. |
A CLI não tem comando de upload. Para copiar pelo terminal um arquivo que já está on-line para o seu armazenamento, use nodaro media save <url>.
Formatos e tipos de arquivo
| Mídia | Formatos |
|---|---|
| Imagem | PNG, JPEG, WebP |
| Vídeo | MP4, MOV, WebM |
| Áudio | MP3, WAV, M4A e AAC, OGG, WebM, FLAC. Até 50 MB. |
Cada tipo de mídia tem um limite de tamanho próprio. O tipo que o seu cliente declara não precisa ser o padrão, porque o servidor descobre o tipo real antes de verificar o arquivo:
- Os parâmetros são removidos.
audio/webm;codecs=opusviraaudio/webm. - As grafias alternativas comuns são convertidas.
audio/vnd.dlna.adts, que o Windows usa para um arquivo.aaccomum, viraaudio/aac,image/jpgviraimage/jpeg, evideo/movviravideo/quicktime. - Um tipo pouco informativo é deduzido do nome do arquivo. Com
application/octet-stream, ou sem tipo nenhum, a extensão decide:clip.mp4é armazenado comovideo/mp4.
Um tipo que ainda assim não corresponde a nenhum formato aceito retorna 400 validation_error, com a lista de formatos aceitos. O tipo que o servidor definiu volta como mimeType, e o arquivo é servido com ele.
Quando um envio é recusado
| Status | Código | Significado |
|---|---|---|
| 400 | validation_error | O arquivo não está em um formato aceito. |
| 413 | O seu armazenamento está cheio. O SDK lança StorageExceededError, com o seu limite em limitBytes. | |
| 422 | upload_blocked | A política de envio da implantação recusou o arquivo antes de armazená-lo. Mostre a message ao seu usuário como ela é. Só em implantações com essa política. |
Usar uma URL no lugar
A maioria das rotas recebe mídia por URL, como imageUrl, videoUrl, audioUrl e referenceImageUrls, então um arquivo que já está on-line não precisa ser enviado. A URL precisa ser um endereço público http ou https: uma URL que aponta para um endereço de rede privada, ou que usa outro esquema, é recusada.
Copie o arquivo para o armazenamento do Nodaro quando a URL for temporária, como um link assinado que expira, ou quando você quiser que o arquivo continue disponível:
curl -s -X POST https://app.nodaro.ai/v1/save-to-storage \
-H "Authorization: Bearer $NODARO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"mediaUrl": "https://example.com/clip.mp4", "filename": "clip.mp4", "mediaType": "video"}'
# {"jobId":"…"} poll the job; its output carries the stored fileconst { jobId } = await client.media.saveToStorage({
mediaUrl: 'https://example.com/clip.mp4',
filename: 'clip.mp4',
mediaType: 'video',
})nodaro media save https://example.com/clip.mp4 --filename clip.mp4 --type video --watchEm um workflow, passe a URL de um arquivo enviado para um nó Enviar imagem (Upload Image), Enviar vídeo (Upload Video) ou Enviar áudio (Upload Audio) pelas entradas da execução. Os campos url de mídia dos nós de entrada sempre podem ser substituídos por uma execução. Veja Executar um workflow com novos valores de entrada.
Importar um vídeo de uma rede social
POST /v1/download-video importa para o seu armazenamento um vídeo do YouTube, TikTok, Instagram, X ou Facebook, ou de um link direto para um arquivo de vídeo. A rota responde com um downloadId, não com um ID de job:
{ "url": "https://youtu.be/XXXX", "maxHeight": 720, "sectionStartSec": 30, "sectionEndSec": 90 }maxHeightlimita a resolução; omita o campo para obter a melhor disponível.sectionStartSecesectionEndSecbaixam só esse trecho do vídeo, com cerca de 3 segundos a mais em cada ponta, porque o corte cai nos quadros-chave. Envie os dois ou nenhum, e corte o resultado quando precisar de um corte exato.- Um vídeo sem faixa de som falha, a menos que você envie
requireAudio: false. - Cada conta pode fazer 4 importações ao mesmo tempo. Uma quinta retorna
429 too_many_downloads. GET /v1/download-video/progress/:downloadIdtransmite o progresso como server-sent events, cerca de duas vezes por segundo:{ phase, percent, videoUrl?, thumbnailUrl?, error? }. A transmissão termina quando a importação ficacompleted, com ovideoUrlarmazenado, oufailed, com umerror. O progresso só fica guardado por pouco tempo depois que a importação termina, então comece a lê-lo logo.- O vídeo pronto é salvo na sua biblioteca.
Para verificar um vídeo antes de importá-lo, POST /v1/video-metadata com { url } lê a duração, o tamanho e o título dele sem baixá-lo. No terminal: nodaro media download <url> --max-height 720 --watch e nodaro media metadata <url>. As outras ferramentas de mídia estão em Voz e mídia.
Cortar ou recortar um arquivo armazenado
POST /v1/media/process corta ou recorta um arquivo de vídeo ou de áudio armazenado. A rota é gratuita e responde na hora, sem job:
{
"sourceUrl": "https://…/interview.mp4",
"type": "video",
"trim": { "startTime": 12.5, "endTime": 48 },
"crop": { "x": 0, "y": 0, "width": 1080, "height": 1080 }
}A resposta é { "data": { url, thumbnailUrl, assetId, sizeBytes, mimeType, metadata } }. format define o formato de saída: mp4 ou webm para vídeo, mp3, wav, m4a ou aac para áudio. Com deleteSource: true, o arquivo de origem é removido depois, quando ele é seu e nada mais o usa, e assim o corte substitui o original. No SDK, chame client.media.process(input). Para cortar dentro de um workflow, use o nó Cortar vídeo (Trim Video), que custa créditos.
Listar a sua mídia armazenada
GET /v1/library retorna as suas imagens, vídeos e áudios armazenados, com um resumo do seu armazenamento. Filtre com type (image, video ou audio) e pagine com limit e cursor. No SDK, chame client.library.list({ type: 'image' }).
Enviar arquivos a partir de um assistente de IA
O servidor MCP oferece três jeitos de enviar arquivos, cada um para imagens, áudio e vídeo. Todos exigem o escopo assets:write.
| Jeito | Ferramentas | Funciona em |
|---|---|---|
| Seletor de arquivos no chat | upload_image_widget, upload_audio_widget, upload_video_widget | Claude.ai na web. O seletor de imagens aceita até 10 arquivos. |
| Página de envio no navegador | request_image_upload, request_audio_upload, request_video_upload | Todos os clientes MCP. A ferramenta retorna uma página para abrir em um navegador e a URL pública final do arquivo. |
| URL de upload pré-assinada | prepare_image_upload, prepare_audio_upload, prepare_video_upload | Clientes que conseguem executar comandos de shell, como Claude Code, Cursor ou Cline. Envie o arquivo com curl -X PUT --data-binary @file. Não funciona no Claude.ai web nem no Android. |
Perguntas frequentes
Páginas relacionadas
Nós
Voz e mídia
Enviar imagem
Workflows
Referência das ferramentas MCP
Última atualização
Execuções
Acompanhe uma execução de workflow nó a nó, leia o resultado de cada nó, liste execuções passadas e cancele agora ou quando os nós em andamento terminarem.
Webhooks
Inicie workflows de qualquer sistema pela URL de um Gatilho de webhook, agende-os pela API e envie os resultados ao seu servidor com a Saída de webhook.