Tudo que dá pra publicar
Texto, foto, carrossel, reel, vídeo, story, thread, link. Cada rede aceita coisas diferentes — esta página mostra o que cabe onde.
Os 9 tipos de post
| Tipo | O que é | Funciona em |
|---|---|---|
text_only | Só texto | Threads, Facebook, LinkedIn |
post | Texto + 1 foto | Instagram, Facebook, Threads, LinkedIn |
carousel | Texto + 2 a 20 fotos/vídeos | Instagram, Facebook |
reel | Vídeo vertical curto (até 90s) | |
story | Foto ou vídeo efêmero (24h) | Instagram, Facebook |
video | Vídeo longo com título | YouTube |
short | Vídeo vertical (até 60s) | YouTube |
thread | Sequência de até 25 posts | Threads |
link_share | Texto + link (gera prévia) | Facebook, LinkedIn |
Limites por rede (chars, MB, dimensões) em Plataformas.
Casos práticos
"Quero publicar um texto no Threads E no Facebook ao mesmo tempo"
Tipo: text_only. Lista as duas redes.
"Quero publicar carrossel de 5 imagens no Instagram"
Tipo: carousel. Mídia: 5 URLs de imagem. Rede: Instagram.
"Quero publicar reel no Instagram"
Tipo: reel. Mídia: 1 vídeo vertical ≤90s. Rede: Instagram.
"Quero publicar um vídeo no YouTube"
Tipo: video. Não esqueça do título.
"Quero soltar uma thread de 5 posts no Threads"
Tipo: thread. Conteúdo: array com 5 posts.
"Quero agendar pra amanhã às 13h"
Qualquer tipo. Adiciona schedule_at com a data e hora.
"Tenho 3 contas de Facebook na mesma marca" Por padrão, quando você não especifica e tem mais de uma, devolvemos "qual destas?". Reenvia escolhendo.
Status do post
Depois que você envia, o post passa por estes estados:
| Status | Descrição |
|---|---|
draft | Rascunho. Sem dispatch, sem agendamento. Default ao criar sem schedule_at. |
stored | Estoque. Pronto pra publicar, sem data marcada. |
awaiting_media | Esperando upload via PUT na presigned URL (large media >100MB). |
scheduled | Aguardando schedule_at. O QStash dispara no horário (notBefore). |
queued | Worker pegou, dispatch pendente. |
publishing | 1+ job em execução contra plataforma. |
processing_remote | Upload concluído, plataforma processando (YouTube/LinkedIn vídeo). Sistema faz polling automático. |
published | Todos os jobs concluídos com sucesso. |
partial | Alguns jobs published, outros failed. |
failed | Todos os jobs falharam. |
cancelled | Cancelado pelo usuário. Reativável (→ draft ou stored). |
Pra acompanhar, você tem 3 opções:
- Painel — lista de posts mostra status em tempo real.
- Avisos automáticos (webhooks) — seu sistema é notificado quando algo muda. Recomendado pra integração. Veja Webhooks.
- Polling — chama nossa API a cada X segundos. Não recomendado.
Pra integradores
POST /api/v1/workspaces/:wsId/contents
Headers
| Header | Obrigatório | Descrição |
|---|---|---|
Authorization | Sim | Bearer opst_live_* ou Bearer access_token (OAuth) |
Content-Type | Sim | application/json |
Idempotency-Key | Recomendado | String 8–128 chars. Replays com mesma key retornam original (TTL 24h). |
Body
| Campo | Tipo | Descrição |
|---|---|---|
brand_id | uuid | Brand ao qual o content pertence. |
content_type | enum | Veja tabela de tipos. |
target_platforms | string[] | 1 a 10 itens: instagram, facebook, threads, youtube, linkedin. |
target_connections | uuid[] (opcional) | Quando brand tem >1 conta na mesma plataforma. Sem isso + ambiguidade = 422 connections_required. |
content | object | Campos variam por content_type. |
schedule_at | ISO-8601 (opcional) | Futuro absoluto. Omita pra publicar agora. |
Exemplo: text_only multi-plataforma
curl -X POST "https://api.outposted.one/api/v1/workspaces/$WS_ID/contents" \
-H "Authorization: Bearer opst_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-2026-06-05-1" \
-d '{
"brand_id": "a79c29e7-b986-43f4-b14f-0263b17a1794",
"content_type": "text_only",
"target_platforms": ["threads", "facebook"],
"content": { "caption": "Olá mundo via Outposted!" }
}'Exemplo: carousel Instagram
{
"brand_id": "...",
"content_type": "carousel",
"target_platforms": ["instagram"],
"content": {
"caption": "5 lições da última semana 🧵",
"media_urls": [
"https://cdn.example.com/slide1.jpg",
"https://cdn.example.com/slide2.jpg",
"https://cdn.example.com/slide3.jpg",
"https://cdn.example.com/slide4.jpg",
"https://cdn.example.com/slide5.jpg"
],
"hashtags": ["#aprendizado", "#producthunt"]
}
}Exemplo: agendar pra futuro
{
"brand_id": "...",
"content_type": "text_only",
"target_platforms": ["linkedin"],
"content": { "caption": "Bom dia 👋" },
"schedule_at": "2026-06-10T13:00:00Z"
}Resposta 202 Accepted
{
"content_id": "cef7e46c-a85b-4654-ac71-103ec70c9d34",
"status": "publishing",
"jobs": [
{
"id": "job_1...",
"platform_slug": "threads",
"connected_account_id": "...",
"status": "queued"
}
]
}Resposta 422 connections_required
{
"error": "connections_required",
"message": "Brand has multiple Facebook connections; specify target_connections.",
"options": {
"facebook": [
{ "connection_id": "...", "display_label": "Multicargo" },
{ "connection_id": "...", "display_label": "DNA da Persuasão" }
]
}
}Reenvie incluindo target_connections: ["connection_id"].
GET /contents/:contentId
Retorna content + jobs com URLs externas quando publicados:
{
"content": {
"id": "cef7e46c-...",
"status": "published",
"content_type": "text_only",
"target_platforms": ["threads", "facebook"],
"created_at": "2026-06-05T02:11:55Z"
},
"jobs": [
{
"platform_slug": "threads",
"status": "published",
"external_post_id": "18122184094729302",
"external_post_url": "https://www.threads.com/@conteudooriginal.ai/post/...",
"processing_ms": 5421
},
{
"platform_slug": "facebook",
"status": "published",
"external_post_id": "475869855598930_...",
"external_post_url": "https://www.facebook.com/.../posts/..."
}
]
}Via SDK
import { Outposted } from '@outposted/node';
const client = new Outposted({ apiKey: process.env.OUTPOSTED_API_KEY! });
const result = await client.contents.create({
workspaceId: 'e9fe5698-...',
brandId: 'a79c29e7-...',
contentType: 'text_only',
targetPlatforms: ['threads', 'facebook'],
content: { caption: 'Olá mundo!' },
idempotencyKey: 'post-2026-06-05-1',
});
console.log(result.contentId, result.status);