Publicar em plataformas sociais a partir do Node normalmente significa um fluxo OAuth, um pipeline de mídia e um modelo de publicação por plataforma, cada um dos quais continua mudando. Isso faz isso através de um único cliente.
Instale e autentique
npm install bulkpublish
import { BulkPublish } from 'bulkpublish';
const bp = new BulkPublish({ apiKey: process.env.BULKPUBLISH_API_KEY });
Consiga uma chave nas configurações de desenvolvedor da sua conta. Mantenha-a numa variável de ambiente, não no código-fonte.
Crie um rascunho
Comece aqui em vez de com publicação imediata. Um rascunho é visível no app, então você pode ver exatamente o que seu código produziu antes de qualquer coisa chegar a uma audiência.
const post = await bp.posts.create({
content: 'Check out our latest update!',
channels: [
{ channelId: 1, platform: 'facebook' },
{ channelId: 2, platform: 'x' },
{ channelId: 3, platform: 'linkedin' },
],
status: 'draft',
});
Cada canal é um objeto com um channelId e uma platform. Para encontrar os seus:
const channels = await bp.channels.list();
Não fixe IDs de canal de um script pontual em algo duradouro. Consulte-os, ou guarde-os numa configuração onde possam ser mudados sem um deploy.
Agende uma
const post = await bp.posts.create({
content: 'Check out our new feature!',
channels: [{ channelId: 1, platform: 'instagram' }],
mediaFiles: [uploadedFile.id],
postFormat: 'reel',
status: 'scheduled',
scheduledAt: '2026-04-10T14:00:00Z',
timezone: 'America/New_York',
});
Dois campos que vale entender juntos. scheduledAt é um timestamp ISO-8601, e timezone é um nome de fuso IANA. Passar o fuso explicitamente é o que faz a lógica recorrente se comportar sensatamente através de mudanças de horário de verão, em vez de derivar uma hora duas vezes por ano.
Mídia
A mídia é carregada primeiro, depois referenciada por id ao criar a postagem:
const file = await bp.media.upload(/* … */);
await bp.posts.create({
content: 'New drop.',
mediaFiles: [file.id],
channels: [{ channelId: 1, platform: 'instagram' }],
status: 'scheduled',
scheduledAt: '2026-04-10T14:00:00Z',
});
As regras de mídia de cada plataforma diferem, e são validadas antes de a postagem entrar na fila em vez de no momento de publicar. Esse é o comportamento que você quer de um script: uma rejeição que você pode capturar e registrar agora, não uma falha silenciosa às 9h de amanhã.
Os recursos disponíveis
O cliente expõe posts, channels, channel sets, media, labels, schedules, RSS feeds, analytics e platforms. Então um script pode fazer mais do que criar: consultar o que está na fila, checar a cota, extrair métricas depois de publicar.
Coisas que vale acertar
Nunca publique diretamente na primeira versão. Crie rascunhos, olhe para eles, depois mude para scheduled. O custo é zero e isso pega problemas de formatação que são invisíveis no código.
Lide com limites de taxa. A cota do seu plano é um teto real:
| Free | Pro | Business | |
|---|---|---|---|
| Requisições de API/dia | 30 | 5.000 | 50.000 |
| Chaves de API | 1 | 5 | 10 |
| As 30 do Free por dia são dimensionadas para experimentar a API, não para rodar qualquer coisa. Um script num loop de retry vai esgotá-las em segundos. |
Não gere seus próprios fatos de plano. Se o seu script escreve texto de postagem, mantenha números de produto fora dele. Qualquer coisa factual deveria vir de uma fonte em vez de um template que vai estar errado depois da próxima mudança de preço.
O resumo
npm install bulkpublish, crie um cliente com sua chave de API, chame bp.posts.create com content e channels. Comece com rascunhos, consulte IDs de canal em vez de fixá-los, passe um fuso horário com qualquer coisa agendada.