Se o seu pipeline de conteúdo está em Python, seja um scraper, um job de dados ou um fluxo de LLM, publicar não deveria significar recorrer a outra coisa.
Instalar e autenticar
pip install bulkpublish
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
O cliente também lê BULKPUBLISH_API_KEY do ambiente, o que é o hábito melhor:
import os
from bulkpublish import BulkPublish
bp = BulkPublish(os.environ["BULKPUBLISH_API_KEY"])
Crie primeiro um rascunho
post = bp.posts.create(
content="Launching our new product today!",
channels=[
{"channelId": 1, "platform": "x"},
{"channelId": 2, "platform": "linkedin"},
],
status="draft",
)
Rascunhos ficam visíveis no app, então você pode ver o que seu código realmente produziu antes que um público veja. Mude para "scheduled" quando estiver satisfeito.
Encontre os IDs dos seus canais em vez de fixá-los no código:
channels = bp.channels.list()
Agende um
post = bp.posts.create(
content="Launching our new product today!",
channels=[{"channelId": 1, "platform": "x"}],
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
timezone="America/New_York",
)
scheduled_at é ISO-8601 e timezone é um nome IANA. Passe o fuso horário explicitamente para qualquer coisa recorrente, senão seu horário de publicação vai se deslocar uma hora duas vezes por ano quando o horário de verão mudar.
Requisitos por plataforma
Esta é a parte que surpreende as pessoas. Algumas plataformas exigem campos que outras não exigem, e é em platform_specific que eles entram. O YouTube, por exemplo, exige um título de 1 a 100 caracteres.
post = bp.posts.create(
content="Behind the scenes on this month's build.",
channels=[{"channelId": 5, "platform": "youtube"}],
media_files=[file_id],
platform_specific={"youtube": {"title": "How we ship every week"}},
status="scheduled",
scheduled_at="2026-04-10T09:00:00Z",
)
Se um campo obrigatório por plataforma estiver faltando, o post é rejeitado no momento em que você o cria, em vez de falhar silenciosamente depois. Capture essa exceção e registre-a, porque em um pipeline automatizado ninguém está olhando a tela.
Texto diferente por plataforma
platform_content aceita substituições por plataforma, que é como uma única chamada publica em várias redes sem enviar o mesmo texto em todos os lugares:
bp.posts.create(
content="Default text for anything not overridden.",
platform_content={
"x": "The short version.",
"linkedin": "The longer version, with the reasoning behind it.",
},
channels=[
{"channelId": 1, "platform": "x"},
{"channelId": 2, "platform": "linkedin"},
],
status="draft",
)
Vale a pena usar. Um pipeline que transmite o mesmo texto para quinze redes é o que faz a publicação automatizada ficar evidente.
Limites de taxa
| Free | Pro | Business | |
|---|---|---|---|
| Requisições de API/dia | 30 | 5.000 | 50.000 |
| Chaves de API | 1 | 5 | 10 |
| As 30 requisições por dia do Free servem para avaliar a API. Um pipeline de verdade precisa de um plano pago, e um loop sem backoff vai queimar o limite gratuito em segundos. |
Se um LLM está escrevendo o conteúdo
Duas regras que importam mais em Python do que em qualquer outro lugar, porque é aqui que esses pipelines costumam viver.
Crie rascunhos, não posts publicados, pelo menos até você ter observado o comportamento por um tempo. Texto gerado erra com confiança de formas que um rascunho humano não erra.
Nunca deixe o modelo afirmar um fato sobre um produto. Preços e limites mudam, e um modelo vai produzir alegremente um valor plausível. Qualquer coisa factual vem de uma fonte.
A versão curta
pip install bulkpublish, construa o cliente com sua chave a partir do ambiente, chame bp.posts.create. Use platform_specific para campos obrigatórios por plataforma, como títulos do YouTube, platform_content para textos diferentes por rede, passe um fuso horário para qualquer coisa agendada e comece com rascunhos.