Como mandar posts para o PostaChat pela API
Este guia explica, do zero, como um sistema ou um agente de IA (um assistente que produz conteúdo, uma ferramenta de agendamento ou qualquer outro programa) pode preparar posts do Instagram e deixá-los esperando a aprovação de alguém da equipe no PostaChat.
Você não precisa saber programar para entender o guia. Quem for montar a integração encontra, no fim de cada parte, o exemplo pronto para copiar.
Resumo em 30 segundos
- Alguém da equipe gera uma chave em Configurações > API e passa para quem vai integrar.
- O sistema envia as fotos ou vídeos do post para o PostaChat.
- O sistema cria o post como rascunho, com legenda, horário sugerido e opções.
- O post aparece na tela Publicações > para aprovar. Só vai para o Instagram depois que alguém aprova.
Nada é publicado sozinho pela API. A palavra final é sempre de uma pessoa da equipe (dono ou admin da conta).
Palavras que aparecem neste guia
| Palavra | O que quer dizer aqui |
|---|---|
| API | A "porta de entrada" que deixa outro programa conversar com o PostaChat sem usar a tela. Em vez de clicar, o programa manda pedidos. |
| Chave (chave da API) | Uma senha longa que começa com ic_. Diz ao PostaChat de qual conta do Instagram é o pedido. Quem tem a chave consegue mandar rascunhos para aquela conta. |
| Rota | O endereço de cada tipo de pedido. Exemplo: o endereço para enviar um vídeo é diferente do endereço para criar o post. |
| Mídia | A foto ou o vídeo do post. |
| Item | O "recibo" que o PostaChat devolve quando você envia uma mídia. É ele que você usa depois para montar o post. |
| Rascunho | Post pronto que ainda não foi aprovado. Fica em Publicações > para aprovar. |
| JSON | O formato de texto que os programas usam para trocar informações, com chaves e valores entre aspas, por exemplo {"post_type": "reel"}. |
| Cabeçalho | Uma informação que vai "por fora" de cada pedido. A chave vai no cabeçalho, nunca no meio do texto. |
| UTC | O horário mundial que os computadores usam. Brasília fica 3 horas atrás do UTC: 9h em Brasília = 12h UTC. |
Antes de começar (uma vez só)
1. A conta precisa estar liberada para publicar. Na tela Publicações, se aparecer o aviso amarelo "libere a publicação desta conta", clique em liberar publicação e confirme no Instagram. Sem isso dá para receber rascunhos, mas ninguém consegue aprovar.
2. Gere a chave.
- Entre no PostaChat e escolha a conta no menu lateral.
- Vá em Configurações > API.
- Clique em gerar chave API.
- Copie na hora. Por segurança, a chave aparece uma vez só. Depois a tela mostra só o final dela (exemplo:
ic_…x7Kq), para você saber qual está ativa.
Perdeu a chave? Clique em gerar nova chave. A antiga para de funcionar no mesmo instante, então atualize em todo lugar que usava.
Quer cortar o acesso de vez? Clique em revogar.
Cuidados com a chave:
- Trate como uma senha. Não cole em grupo, post, print ou e-mail aberto.
- Cada conta do Instagram tem a sua chave. A chave de uma conta não serve para outra.
- Só dono e admin da conta veem e geram a chave. Atendente não tem acesso.
Passo 1: enviar a foto ou o vídeo
Para cada foto ou vídeo do post, mande um pedido de envio. O PostaChat guarda o arquivo, ajusta a foto para o formato que o Instagram aceita e devolve o item (o recibo).
O que mandar:
- o arquivo (foto JPG, PNG ou WebP, ou vídeo MP4 ou MOV);
- para que ele serve:
feed: foto de post, vídeo de Reels ou item de carrossel. É o padrão;story: foto ou vídeo de story;cover: imagem de capa de um Reels.
O que o PostaChat faz sozinho com a foto:
- converte para JPG (o Instagram só aceita JPG);
- PNG com fundo transparente ganha fundo branco;
- foto muito grande é reduzida para 1440 pixels de largura.
O que volta (o item):
{
"key": "publishing/9f1c.../a83b2e.mp4",
"kind": "video",
"content_type": "video/mp4",
"size": 18234112,
"url": "https://... (link para conferir o arquivo, vale 1 hora)"
}
Guarde esse item inteiro: ele vai no Passo 2. Foto volta também com a largura (width) e a altura (height).
Quando o envio é recusado (a mensagem vem em português, ver a tabela "Deu erro"):
- foto de feed que não está entre 4:5 (retrato, tipo 1080 x 1350) e 1,91:1 (paisagem). Foto 9:16 (vertical de celular) só serve como story;
- foto com menos de 320 pixels de largura ou com mais de 30 MB;
- vídeo de feed com mais de 300 MB, ou vídeo de story com mais de 100 MB;
- arquivo que não é foto nem vídeo aceito;
- capa que não é foto.
Exemplo para quem programa:
POST https://api.postachat.com.br/api/v1/content/uploadMedia
Cabeçalho: Authorization: Bearer SUA_CHAVE
Formulário (multipart): file = o arquivo, purpose = feed | story | cover
curl -X POST https://api.postachat.com.br/api/v1/content/uploadMedia \
-H "Authorization: Bearer $POSTACHAT_KEY" \
-F "file=@R011.mp4" \
-F "purpose=feed"
Passo 2: criar o post para aprovar
Com os itens em mãos, crie o post. Ele entra como rascunho e aparece em Publicações > para aprovar.
Os 4 tipos de post
| Tipo | O que escrever em post_type | Quantas mídias | Legenda |
|---|---|---|---|
| Reels | reel | exatamente 1 vídeo | sim |
| Foto no feed | image | exatamente 1 foto | sim |
| Carrossel | carousel | de 2 a 20, fotos e vídeos misturados | sim |
| Story | story | 1 foto ou 1 vídeo | não (o Instagram não deixa) |
O que dá para mandar
| Campo | Precisa? | Para que serve |
|---|---|---|
post_type | sim | O tipo do post (tabela acima). |
items | sim | Os itens do Passo 1, na ordem em que devem aparecer. Pode mandar o item inteiro, como veio. |
caption | não | A legenda. Até 2.200 caracteres, 30 hashtags e 20 @menções (limites do Instagram). |
scheduled_at | não | O dia e a hora sugeridos para publicar. Quem aprova pode mudar. Veja "Como escrever a data". |
options | não | As opções extras (próxima tabela). |
automation_id | não | O código de uma automação de comentário do PostaChat (ex.: "Comenta PETISCO"). Quando o post sair, ela passa a responder os comentários dele e é ligada. Só serve automação do tipo "comentário em post específico". Não vale em story. |
source_label | não | Quem mandou, aparece na tela (ex.: "Agente de conteúdo"). |
Opções extras (options)
| Opção | Em quais posts | O que faz | Quando usar |
|---|---|---|---|
"ai_generated": true | foto, Reels, carrossel | Mostra o selo "Feito com IA" no post. | Conteúdo gerado ou editado com IA. |
"first_comment": "texto" | foto, Reels, carrossel | A própria conta comenta esse texto logo depois de publicar. Esse comentário não dispara a automação. | "Receita no link da bio", hashtags fora da legenda. |
"trial": "manual" ou "auto" | Reels | Reels de teste: primeiro só quem não segue a conta vê. Com manual, você libera para os seguidores pelo app do Instagram; com auto, o Instagram libera sozinho se o vídeo for bem. | Testar um gancho novo sem gastar o alcance dos seguidores. |
"share_to_feed": false | Reels | O Reels aparece só na aba Reels, não no feed. (Sem essa opção, aparece nos dois.) Em Reels de teste é ignorada. | Raro. |
"audio_name": "texto" | Reels | Dá nome ao áudio original do vídeo. Só dá para mudar uma vez. | Quando o áudio é marca da conta (ex.: "Som da Loja"). |
"thumb_offset_ms": 1500 | Reels | Usa como capa o quadro do vídeo no segundo 1,5 (o número é em milésimos de segundo). | Capa sem precisar de imagem. |
"cover_key": "..." | Reels | Usa como capa uma imagem enviada no Passo 1 com purpose = cover (coloque aqui o key dela). Vence o thumb_offset_ms. | Capa desenhada. |
E por foto: dentro de cada item de foto (post de foto ou carrossel) dá para pôr "alt_text": "descrição", até 1.000 caracteres. É o texto alternativo, lido em voz alta para quem usa leitor de tela. Em vídeo e story não vale.
Story não aceita selo de IA, primeiro comentário, texto alternativo nem automação: é limite do Instagram, não do PostaChat.
Como escrever a data (scheduled_at)
Formato: ano-mês-diaThora:minuto:segundo.
| Você quer | Escreva |
|---|---|
| 24 de outubro de 2026, 9h de Brasília | "2026-10-24T09:00:00" |
| O mesmo, deixando o fuso explícito | "2026-10-24T09:00:00-03:00" |
| 18h30 de Brasília | "2026-10-24T18:30:00" |
- Sem fuso, o PostaChat entende como horário de Brasília.
- Precisa ser um horário no futuro.
- Na resposta, o horário volta em UTC (9h de Brasília aparece como
12:00:00+00:00). É o mesmo horário, só escrito no padrão mundial. - Sem
scheduled_at, o rascunho fica sem data, esperando quem aprova escolher. - Se o horário sugerido passar e ninguém tiver aprovado, o rascunho não é publicado: vira "vencido", e a equipe pode remarcar na tela.
Exemplos
Reels para amanhã às 9h, com selo de IA e primeiro comentário:
{
"post_type": "reel",
"items": [{"key": "publishing/9f1c.../a83b2e.mp4", "kind": "video"}],
"caption": "Sorvetinho de melancia que o seu cachorro pode comer 🍉 Comenta PETISCO",
"options": {"ai_generated": true, "first_comment": "A receita completa está no link da bio"},
"scheduled_at": "2026-10-24T09:00:00",
"source_label": "Agente de conteúdo"
}
Reels de teste com nome do áudio:
{
"post_type": "reel",
"items": [{"key": "publishing/.../b1.mp4", "kind": "video"}],
"caption": "Será que ele aprova? 🐶",
"options": {"trial": "auto", "audio_name": "Som da Loja", "ai_generated": true},
"source_label": "Agente de conteúdo"
}
Carrossel com texto alternativo:
{
"post_type": "carousel",
"items": [
{"key": "publishing/.../1.jpg", "kind": "image", "alt_text": "Cachorro caramelo segurando um picolé de banana"},
{"key": "publishing/.../2.jpg", "kind": "image", "alt_text": "Potinho com cubos de melancia congelada"},
{"key": "publishing/.../3.mp4", "kind": "video"}
],
"caption": "5 petiscos pro calor (salva pra não esquecer)",
"options": {"ai_generated": true},
"source_label": "Agente de conteúdo"
}
Foto no feed ligando a automação de comentário:
{
"post_type": "image",
"items": [{"key": "publishing/.../foto.jpg", "kind": "image"}],
"caption": "Comenta MELANCIA que eu te mando a receita",
"automation_id": "id-da-automacao (pegue em GET /api/v1/page/getFlows)"
}
Story:
{
"post_type": "story",
"items": [{"key": "publishing/.../story.mp4", "kind": "video"}],
"scheduled_at": "2026-10-24T19:00:00"
}
O que volta: a confirmação com o post criado, já com "status": "draft" (para aprovar) e o id dele.
{"status": "success", "data": {"id": "5d1e...", "status": "draft", "post_type": "reel", "scheduled_at": "2026-10-24T12:00:00+00:00"}}
Exemplo para quem programa:
curl -X POST https://api.postachat.com.br/api/v1/content/createDraft \
-H "Authorization: Bearer $POSTACHAT_KEY" \
-H "Content-Type: application/json" \
-d '{"post_type": "reel", "items": [{"key": "publishing/.../a83b2e.mp4", "kind": "video"}], "caption": "Comenta PETISCO", "source_label": "Agente de conteúdo"}'
Passo 3: acompanhar o que aconteceu
Peça a lista de posts da conta (os 100 mais novos). Dá para filtrar por situação.
Situação (status) | Em português | O que fazer |
|---|---|---|
draft | para aprovar | Esperar a equipe aprovar. |
scheduled | agendado | Já aprovado, sai no horário. |
publishing | publicando | O Instagram está processando o vídeo. Leva de segundos a alguns minutos. |
published | publicado | Está no ar. O campo permalink traz o link do post. |
failed | falhou | O campo error diz o motivo em português. A equipe corrige e tenta de novo na tela. |
expired | vencido | Passou da hora sugerida sem aprovação. A equipe pode remarcar. |
curl "https://api.postachat.com.br/api/v1/content/getPosts?status=published" \
-H "Authorization: Bearer $POSTACHAT_KEY"
O que acontece depois que alguém aprova
- O PostaChat confere a fila a cada minuto e publica na hora marcada.
- Se o Instagram falhar por instabilidade, o PostaChat tenta de novo sozinho até 3 vezes (depois de 1, 3 e 10 minutos). Só então marca como "falhou".
- Nenhum post sai duas vezes, mesmo se o Instagram demorar para responder.
- Se tiver primeiro comentário, ele sai logo depois do post. Se o Instagram recusar o comentário, o post continua no ar e a tela avisa.
- Se tiver automação, ela passa a responder os comentários desse post.
- As fotos e vídeos ficam guardados no PostaChat até 7 dias depois de publicados (o Instagram já tem a cópia dele). Arquivo enviado que nunca virou post é apagado em 2 dias.
Deu erro: o que fazer
Quando algo está errado, a resposta traz o motivo no campo detail.
| Mensagem (ou código) | O que quer dizer | O que fazer |
|---|---|---|
401 / Invalid API key | Chave errada, trocada ou revogada, ou faltou o cabeçalho. | Confira o cabeçalho Authorization: Bearer SUA_CHAVE. Se a chave foi trocada, peça a nova. |
Foto alta demais para o feed... | Foto vertical demais (ex.: 9:16) para post de feed. | Corte para 4:5 (1080 x 1350) ou mande como story (purpose = story). |
Foto larga demais para o feed... | Foto horizontal demais. | Corte para no máximo 1,91:1. |
Foto pequena demais... | Menos de 320 pixels de largura. | Use uma foto maior. |
Formato não aceito... | O arquivo não é JPG, PNG, WebP, MP4 nem MOV. | Converta o arquivo. |
Vídeo grande demais... | Passou de 300 MB (feed) ou 100 MB (story). | Exporte com qualidade menor. |
Reels leva exatamente um vídeo. (e parecidas) | Quantidade ou tipo de mídia errado para o tipo de post. | Veja a tabela "Os 4 tipos de post". |
Mídia não encontrada nesta conta... | O key não veio de um envio desta conta (copiado errado ou de outra conta). | Envie o arquivo de novo pelo Passo 1 com a chave desta conta. |
Esse horário já passou... | scheduled_at no passado. | Mande um horário futuro, ou não mande horário. |
Legenda passou de 2200 caracteres. / ...30 hashtags... / ...20 menções... | Passou dos limites do Instagram. | Encurte a legenda. Hashtags podem ir no primeiro comentário. |
Escolha uma automação com o gatilho "comentário em post específico". | A automação escolhida é de outro tipo. | Crie ou escolha uma automação desse tipo no PostaChat. |
Story não recebe comentário: tire a automação. | Mandou automação num story. | Tire o automation_id. |
Opção de Reels de teste inválida. | trial diferente de manual ou auto. | Use um dos dois. |
422 com uma lista de campos | Algum campo veio com formato errado (ex.: texto onde devia ser número, tipo de post escrito errado). | Confira os nomes e valores com os exemplos acima. |
503 / Armazenamento de mídia... | O armazenamento de arquivos do PostaChat está fora do ar. | Tente de novo em alguns minutos. Se continuar, fale com o suporte do PostaChat. |
Erros que aparecem depois, no campo error de um post failed (vindos do Instagram), também chegam em português. Exemplos: "Vídeo não aceito: use MP4 ou MOV (H.264 ou HEVC), de 3 segundos a 15 minutos.", "Limite da Meta: no máximo 100 posts publicados pela API a cada 24 horas.", "Sem permissão de publicar nesta conta...".
Perguntas frequentes
Dá para publicar direto, sem aprovação? Não. É de propósito: tudo que chega pela API passa por uma pessoa da equipe.
Mandei com horário e ninguém aprovou. O que acontece? Na hora marcada o post não sai. Ele vira "vencido" e continua na tela para ser remarcado.
Dá para editar ou apagar um rascunho pela API? Não. Editar, remarcar e excluir é pela tela Publicações. Se precisar mudar algo, mande um rascunho novo e avise para excluir o antigo.
O vídeo precisa estar em algum lugar público na internet? Não. Você envia o arquivo direto no Passo 1. O PostaChat guarda e entrega para o Instagram.
Posso usar o mesmo arquivo em dois posts? Envie o arquivo de novo para cada post (Passo 1). O item é apagado junto quando um dos posts é excluído, e 7 dias depois que ele é publicado; reaproveitar pode fazer o outro post falhar.
Quanto tempo o Instagram leva para processar um Reels? Normalmente de alguns segundos a poucos minutos. Se passar de 30 minutos, o post é marcado como "falhou".
Por que o horário voltou diferente do que mandei? Ele volta em UTC, o horário mundial. 12h UTC é 9h em Brasília: é o mesmo momento.
Funciona para várias contas do Instagram? Sim, mas cada conta tem a própria chave. Use a chave da conta onde o post deve sair.
Quantos posts posso mandar? O PostaChat não limita rascunhos. O Instagram limita a 100 publicações por conta a cada 24 horas (carrossel conta como 1).
Limites do Instagram
| Item | Limite |
|---|---|
| Publicações pela API | até 100 por conta a cada 24 horas |
| Foto | JPG (o PostaChat converte), até 8 MB depois de convertida; no feed, de 4:5 a 1,91:1 |
| Vídeo de Reels e de carrossel | MP4 ou MOV, H.264 ou HEVC, de 3 segundos a 15 minutos, até 300 MB, de preferência vertical 9:16 |
| Vídeo de story | de 3 a 60 segundos, até 100 MB |
| Carrossel | de 2 a 20 itens; todas as fotos ficam no formato da primeira |
| Legenda | 2.200 caracteres, 30 hashtags, 20 @menções |
O Instagram não deixa fazer pela API: figurinha, enquete, link ou música da biblioteca no story; marcar produto; parceria paga.
Exemplo completo em Python (para agentes)
Envia um vídeo e cria o rascunho de Reels. Basta trocar o nome do arquivo e a legenda.
import os
import httpx
API = "https://api.postachat.com.br/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['POSTACHAT_KEY']}"}
def enviar(caminho: str, para: str = "feed") -> dict:
"""Passo 1: envia foto ou vídeo e devolve o item."""
with open(caminho, "rb") as arquivo:
r = httpx.post(
f"{API}/content/uploadMedia",
headers=HEADERS,
files={"file": (os.path.basename(caminho), arquivo)},
data={"purpose": para},
timeout=300, # vídeo grande demora para subir
)
if r.status_code != 200:
raise RuntimeError(f"envio recusado: {r.json().get('detail')}")
return r.json()
def criar_rascunho(tipo: str, itens: list[dict], legenda: str = "", **extras) -> dict:
"""Passo 2: cria o post para aprovar."""
r = httpx.post(
f"{API}/content/createDraft",
headers=HEADERS,
json={"post_type": tipo, "items": itens, "caption": legenda, **extras},
timeout=60,
)
if r.status_code != 201:
raise RuntimeError(f"rascunho recusado: {r.json().get('detail')}")
return r.json()["data"]
video = enviar("R011.mp4")
post = criar_rascunho(
"reel",
[video],
"Biscoito de aveia em 3 passos 🐶 Comenta PETISCO",
options={"ai_generated": True, "first_comment": "Receita no link da bio"},
scheduled_at="2026-10-25T09:00:00", # 9h de Brasília
source_label="Agente de conteúdo",
)
print("rascunho criado:", post["id"], post["status"]) # aparece em Publicações > para aprovar
Para testar sem programar
Abra o Swagger, procure o grupo "API pública: posts para aprovar", clique em uma rota, depois em Try it out. Cole a chave no campo Authorization como Bearer SUA_CHAVE, preencha e clique em Execute.
Outras coisas que a API faz
Usam a mesma chave e o mesmo cabeçalho. As respostas vêm no formato {"status": "success", "data": ...}.
| Endereço | O que faz |
|---|---|
GET /api/v1/page/getInfo | Mostra os dados da conta (o @ e o nome). Bom para testar se a chave funciona. |
GET /api/v1/page/getTags | Lista as etiquetas da conta. |
POST /api/v1/page/createTag com {"name": "..."} | Cria uma etiqueta. |
GET /api/v1/page/getCustomFields | Lista os campos personalizados. |
GET /api/v1/page/getFlows | Lista as automações (com o id usado em automation_id). |
GET /api/v1/subscriber/getInfo?subscriber_id=... | Mostra um contato. |
GET /api/v1/subscriber/findByName?name=... | Procura contatos pelo nome. |
POST /api/v1/subscriber/addTag com {"subscriber_id": "...", "tag_id": "..."} | Põe uma etiqueta num contato. |
POST /api/v1/subscriber/setCustomField com {"subscriber_id": "...", "field_id": "...", "field_value": "..."} | Preenche um campo de um contato. |
POST /api/v1/sending/sendContent | Manda mensagem de texto para um contato. Só funciona se ele falou com a conta nas últimas 24 horas (regra do Instagram). |