Als je contentpijplijn in Python staat, of dat nu een scraper, een datataak of een LLM-workflow is, hoeft publiceren niet te betekenen dat je naar iets anders moet uitwijken.
Installeren en authenticeren
pip install bulkpublish
from bulkpublish import BulkPublish
bp = BulkPublish("bp_your_key_here")
De client leest ook BULKPUBLISH_API_KEY uit de omgeving, wat de betere gewoonte is:
import os
from bulkpublish import BulkPublish
bp = BulkPublish(os.environ["BULKPUBLISH_API_KEY"])
Maak eerst een concept
post = bp.posts.create(
content="Launching our new product today!",
channels=[
{"channelId": 1, "platform": "x"},
{"channelId": 2, "platform": "linkedin"},
],
status="draft",
)
Concepten zijn zichtbaar in de app, zodat je kunt zien wat je code daadwerkelijk heeft geproduceerd voordat een publiek dat doet. Ga naar "scheduled" zodra je tevreden bent.
Zoek je kanaal-ID’s op in plaats van ze te hardcoden:
channels = bp.channels.list()
Er een inplannen
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 is ISO-8601 en timezone is een IANA-naam. Geef de tijdzone expliciet mee voor alles wat terugkeert, anders verschuift je posttijd twee keer per jaar een uur wanneer de zomertijd verandert.
Per-platformvereisten
Dit is het deel dat mensen verrast. Sommige platforms hebben velden nodig die andere niet hebben, en platform_specific is waar die naartoe gaan. YouTube vereist bijvoorbeeld een titel van 1 tot 100 tekens.
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",
)
Als een verplicht per-platformveld ontbreekt, wordt de post geweigerd op het moment dat je hem maakt, in plaats van later stil te falen. Vang die exception op en log hem, want in een geautomatiseerde pijplijn kijkt niemand naar het scherm.
Verschillende tekst per platform
platform_content neemt per-platform overrides, wat de manier is waarop één aanroep naar meerdere netwerken publiceert zonder overal identieke tekst te sturen:
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",
)
De moeite waard om te gebruiken. Een pijplijn die identieke tekst naar vijftien netwerken uitzendt, is precies wat geautomatiseerd posten opvallend maakt.
Rate limits
| Free | Pro | Business | |
|---|---|---|---|
| API-verzoeken/dag | 30 | 5.000 | 50.000 |
| API-sleutels | 1 | 5 | 10 |
| De 30 verzoeken per dag van Free zijn voor het evalueren van de API. Een echte pijplijn heeft een betaald abonnement nodig, en een lus zonder backoff verbruikt de gratis toewijzing in seconden. |
Als een LLM de content schrijft
Twee regels die in Python meer ertoe doen dan waar dan ook, omdat dit is waar die pijplijnen meestal huizen.
Maak concepten, geen gepubliceerde posts, in elk geval totdat je het een tijdje hebt bekeken. Gegenereerde tekst is op een manier zelfverzekerd fout die een menselijk concept niet is.
Laat het model nooit een feit over een product vaststellen. Prijzen en limieten veranderen, en een model produceert net zo makkelijk een plausibel getal. Alles feitelijks komt uit een bron.
De korte versie
pip install bulkpublish, construeer met je sleutel uit de omgeving, roep bp.posts.create aan. Gebruik platform_specific voor verplichte per-platformvelden zoals YouTube-titels, platform_content voor verschillende tekst per netwerk, geef een tijdzone mee bij alles wat is ingepland, en begin met concepten.