PUBLICAR / Publicar conteúdo

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

TipoO que éFunciona em
text_onlySó textoThreads, Facebook, LinkedIn
postTexto + 1 fotoInstagram, Facebook, Threads, LinkedIn
carouselTexto + 2 a 20 fotos/vídeosInstagram, Facebook
reelVídeo vertical curto (até 90s)Instagram
storyFoto ou vídeo efêmero (24h)Instagram, Facebook
videoVídeo longo com títuloYouTube
shortVídeo vertical (até 60s)YouTube
threadSequência de até 25 postsThreads
link_shareTexto + 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:

StatusDescrição
draftRascunho. Sem dispatch, sem agendamento. Default ao criar sem schedule_at.
storedEstoque. Pronto pra publicar, sem data marcada.
awaiting_mediaEsperando upload via PUT na presigned URL (large media >100MB).
scheduledAguardando schedule_at. O QStash dispara no horário (notBefore).
queuedWorker pegou, dispatch pendente.
publishing1+ job em execução contra plataforma.
processing_remoteUpload concluído, plataforma processando (YouTube/LinkedIn vídeo). Sistema faz polling automático.
publishedTodos os jobs concluídos com sucesso.
partialAlguns jobs published, outros failed.
failedTodos os jobs falharam.
cancelledCancelado 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

HeaderObrigatórioDescrição
AuthorizationSimBearer opst_live_* ou Bearer access_token (OAuth)
Content-TypeSimapplication/json
Idempotency-KeyRecomendadoString 8–128 chars. Replays com mesma key retornam original (TTL 24h).

Body

CampoTipoDescrição
brand_iduuidBrand ao qual o content pertence.
content_typeenumVeja tabela de tipos.
target_platformsstring[]1 a 10 itens: instagram, facebook, threads, youtube, linkedin.
target_connectionsuuid[] (opcional)Quando brand tem >1 conta na mesma plataforma. Sem isso + ambiguidade = 422 connections_required.
contentobjectCampos variam por content_type.
schedule_atISO-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!" }
  }'
{
  "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

@outposted/node
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);

Nesta página