postmatic

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 por URL
{ "mediaItems": [{ "type": "image", "url": "https://cdn.exemplo.com/foto.jpg" }] }
  • https. O host precisa resolver para um endereço público: URLs internas, localhost e 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.

POST /v1/media
curl -X POST https://api.uat.postmatic.dev/v1/media \
  -H "x-access-key: pm_live_…" \
  -F "file=@foto.jpg"
Resposta 201
{
  "success": true,
  "media": { "id": "med_…", "url": "https://…/media/…jpg", "width": 1080, "height": 1350, "bytes": 412873, "mime": "image/jpeg" }
}
mediaItems por mediaId
{ "mediaItems": [{ "type": "image", "mediaId": "med_…" }] }
  • multipart/form-data, um arquivo por requisição, no campo file.
  • Limite de 60 uploads por minuto por chave.
  • A mesma imagem enviada duas vezes devolve o mesmo id (deduplicação por conteúdo).
  • Um mediaId só vale no projeto que o criou; em outro projeto a criação do post responde 400 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 por URL
{ "mediaItems": [{ "type": "video", "url": "https://cdn.exemplo.com/reel.mp4" }] }

Upload de vídeo em três passos

1. Peça a URL
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 }'
Resposta 201
{
  "success": true,
  "upload": {
    "mediaId": "med_…",
    "path": "proj_…/med_….mp4",
    "uploadUrl": "https://…/storage/v1/object/upload/sign/…",
    "token": "…",
    "expiresIn": 7200
  }
}
2. Envie o arquivo para a URL
curl -X PUT "$UPLOAD_URL" \
  -H "content-type: video/mp4" \
  --data-binary @reel.mp4
3. Confirme
curl -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 por mediaId
{ "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

RegraValor
ContêinerMP4 ou MOV
Codec de vídeoH.264 ou HEVC
Codec de áudioAAC, até 48 kHz, mono ou estéreo
Taxa de quadros23 a 60 por segundo
Larguraaté 1920 px
Proporçãode 0.01:1 a 10:1 (9:16 recomendado)
Duraçãode 3 segundos a 15 minutos
Tamanhoaté 300 MB
Índicemoov 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:

Mover o índice para o início
ffmpeg -i entrada.mp4 -c copy -movflags +faststart saida.mp4

Limites

RegraValor
Formatos aceitosJPEG, PNG, WebP (detectados pelo conteúdo, não pela extensão)
Tamanhoaté 8 MB
Largurade 320 a 1920 px na ingestão; feed aceita até 1440 px
Proporçãode 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ídaJPEG, qualidade 90

Quando a imagem é recusada, details.reason diz o motivo:

reasonSignificado
missingSem campo file ou requisição que não é multipart.
too_manyMais de um arquivo (ou partes demais) na requisição.
too_largeImagem acima de 8 MB; vídeo acima de 300 MB (Reel) ou 100 MB (Story e carrossel).
mimeFormato não aceito.
widthImagem fora de 320 a 1920 px (ou de 320 a 1440 px para o feed); vídeo acima de 1920 px.
aspectProporçã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).
durationReel fora de 3 s a 15 min; Story ou item de carrossel fora de 3 s a 60 s.
fpsTaxa de quadros fora de 23 a 60.
codecCodec 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.
bitrateTaxa 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.

Mídia — Documentação Postmatic