Mídia
Duas formas de anexar imagens a um post, por URL pública ou upload direto, e os limites de formato, tamanho e proporção que a Postmatic valida antes de publicar.
Cada item de mediaItems em um post aponta para uma imagem de duas formas: uma URL pública, que a Postmatic baixa e guarda, ou um mediaId de uma imagem enviada antes por upload. Nos dois casos a imagem passa pela mesma validação e é convertida para JPEG.
Por URL
{ "mediaItems": [{ "type": "image", "url": "https://cdn.exemplo.com/foto.jpg" }] }- Só
https. O host precisa resolver para um endereço público: URLs internas,localhoste IPs privados são recusados. - Até 5 redirecionamentos, todos também
https. - Tempo limite de 30 segundos para o download.
- O download acontece na criação do post, antes da resposta. A URL não precisa continuar acessível depois.
Falha no download responde 400 MEDIA_FETCH_FAILED ou 400 MEDIA_UNREACHABLE; imagem fora dos limites responde 400 MEDIA_INVALID.
Por upload
Envie a imagem primeiro e use o id retornado nos posts. Útil quando as imagens não têm URL pública ou quando você quer validar antes de agendar.
curl -X POST https://api.uat.postmatic.dev/v1/media \
-H "x-access-key: pm_live_…" \
-F "file=@foto.jpg"{
"success": true,
"media": { "id": "med_…", "url": "https://…/media/…jpg", "width": 1080, "height": 1350, "bytes": 412873, "mime": "image/jpeg" }
}{ "mediaItems": [{ "type": "image", "mediaId": "med_…" }] }multipart/form-data, um arquivo por requisição, no campofile.- Limite de 60 uploads por minuto por chave.
- A mesma imagem enviada duas vezes devolve o mesmo
id(deduplicação por conteúdo). - Um
mediaIdsó vale no projeto que o criou; em outro projeto a criação do post responde400 VALIDATION_ERROR.
Vídeo
Um vídeo publica como Reel. Há dois caminhos, e a diferença entre eles é de onde o arquivo vem na hora de publicar.
Por URL. A Postmatic lê alguns trechos do arquivo para validar e passa a mesma URL ao Instagram, que busca o vídeo. Nenhum byte é copiado. Em troca, a URL precisa continuar acessível até a publicação, o que importa para um post agendado com semanas de antecedência.
Por upload. O arquivo vai direto do seu servidor para o nosso armazenamento, sem passar pela API, e a publicação não depende mais de nada seu. É o caminho recomendado para agendamentos e para arquivos grandes.
{ "mediaItems": [{ "type": "video", "url": "https://cdn.exemplo.com/reel.mp4" }] }Upload de vídeo em três passos
curl -X POST https://api.uat.postmatic.dev/v1/media/upload-url \
-H "x-access-key: pm_live_…" \
-H "content-type: application/json" \
-d '{ "filename": "reel.mp4", "mimeType": "video/mp4", "bytes": 41234567 }'{
"success": true,
"upload": {
"mediaId": "med_…",
"path": "proj_…/med_….mp4",
"uploadUrl": "https://…/storage/v1/object/upload/sign/…",
"token": "…",
"expiresIn": 7200
}
}curl -X PUT "$UPLOAD_URL" \
-H "content-type: video/mp4" \
--data-binary @reel.mp4curl -X POST https://api.uat.postmatic.dev/v1/media/confirm \
-H "x-access-key: pm_live_…" \
-H "content-type: application/json" \
-d '{ "mediaId": "med_…" }'A confirmação valida o arquivo e devolve o registro de mídia. Use o mediaId no post:
{ "mediaItems": [{ "type": "video", "mediaId": "med_…" }] }A URL assinada vale 2 horas. Um arquivo que não passa na validação é removido do armazenamento e não vira registro.
Limites do vídeo
| Regra | Valor |
|---|---|
| Contêiner | MP4 ou MOV |
| Codec de vídeo | H.264 ou HEVC |
| Codec de áudio | AAC, até 48 kHz, mono ou estéreo |
| Taxa de quadros | 23 a 60 por segundo |
| Largura | até 1920 px |
| Proporção | de 0.01:1 a 10:1 (9:16 recomendado) |
| Duração | de 3 segundos a 15 minutos |
| Tamanho | até 300 MB |
| Índice | moov no início do arquivo |
Vídeo sem faixa de áudio é aceito.
O índice precisa vir na frente
O Instagram exige que o índice do MP4 (a caixa moov) esteja no início do arquivo, antes dos dados de imagem. É o mesmo requisito de qualquer vídeo que começa a tocar antes de terminar de baixar, e a maioria dos editores chama a opção de faststart. Um arquivo com o índice no fim é recusado com reason: moov.
Para corrigir um arquivo existente, reescreva o contêiner sem recodificar:
ffmpeg -i entrada.mp4 -c copy -movflags +faststart saida.mp4Limites
| Regra | Valor |
|---|---|
| Formatos aceitos | JPEG, PNG, WebP (detectados pelo conteúdo, não pela extensão) |
| Tamanho | até 8 MB |
| Largura | de 320 a 1920 px na ingestão; feed aceita até 1440 px |
| Proporção | de 0,1:1 a 10:1 na ingestão; feed exige de 4:5 (0,8) a 1,91:1; Story recomenda 9:16 |
| Saída | JPEG, qualidade 90 |
Quando a imagem é recusada, details.reason diz o motivo:
reason | Significado |
|---|---|
missing | Sem campo file ou requisição que não é multipart. |
too_many | Mais de um arquivo (ou partes demais) na requisição. |
too_large | Imagem acima de 8 MB; vídeo acima de 300 MB (Reel) ou 100 MB (Story e carrossel). |
mime | Formato não aceito. |
width | Imagem fora de 320 a 1920 px (ou de 320 a 1440 px para o feed); vídeo acima de 1920 px. |
aspect | Proporção fora do destino: feed 4:5 a 1,91:1; Story 0,1:1 a 10:1; carrossel com itens de proporções diferentes (details.position diz qual). |
duration | Reel fora de 3 s a 15 min; Story ou item de carrossel fora de 3 s a 60 s. |
fps | Taxa de quadros fora de 23 a 60. |
codec | Codec de vídeo diferente de H.264 ou HEVC. |
audio | Áudio que não é AAC, acima de 48 kHz ou com mais de 2 canais. |
bitrate | Taxa de bits de vídeo acima de 25 Mbps. |
moov | Índice do MP4 no fim do arquivo. |
Carrossel exige todos os itens na mesma proporção (tolerância de 1 %): o Instagram recortaria todos para a proporção do primeiro, e preferimos recusar a surpreender.
Retenção
As imagens ficam guardadas para o post poder ser publicado e reexibido no painel. Ainda não há expiração automática nem rota para apagar mídia; veja o Roadmap.