Pubblicare su piattaforme social da Node normalmente significa un flusso OAuth, una pipeline multimediale e un modello di pubblicazione per piattaforma, ognuno dei quali continua a cambiare. Questo lo fa tramite un unico client.
Installazione e autenticazione
npm install bulkpublish
import { BulkPublish } from 'bulkpublish';
const bp = new BulkPublish({ apiKey: process.env.BULKPUBLISH_API_KEY });
Ottieni una chiave dalle impostazioni sviluppatore nel tuo account. Tienila in una variabile d’ambiente, non nel codice sorgente.
Crea una bozza
Inizia da qui invece che dalla pubblicazione immediata. Una bozza è visibile nell’app, così puoi vedere esattamente cosa ha prodotto il tuo codice prima che raggiunga un pubblico.
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',
});
Ogni canale è un oggetto con un channelId e una platform. Per trovare i tuoi:
const channels = await bp.channels.list();
Non inserire nel codice ID di canale hard-coded da uno script usa e getta in nulla di duraturo. Cercali, oppure conservali in una configurazione dove possono essere cambiati senza un deploy.
Programmane uno
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',
});
Due campi da capire insieme. scheduledAt è un timestamp ISO-8601, e timezone è un nome di fuso orario IANA. Passare esplicitamente il fuso orario è ciò che fa comportare sensatamente la logica ricorrente attraverso i cambi di ora legale, invece di andare alla deriva di un’ora due volte l’anno.
Contenuti multimediali
I contenuti multimediali vengono caricati prima, poi referenziati per id quando si crea il post:
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',
});
Le regole sui contenuti multimediali di ogni piattaforma differiscono, e vengono convalidate prima che il post sia messo in coda invece che al momento della pubblicazione. Questo è il comportamento che vuoi da uno script: un rifiuto che puoi intercettare e registrare adesso, non un fallimento silenzioso alle 9 del mattino di domani.
Le risorse disponibili
Il client espone post, canali, gruppi di canali, contenuti multimediali, etichette, programmazioni, feed RSS, analitiche e piattaforme. Quindi uno script può fare più che creare: controllare cosa è in coda, verificare la quota, estrarre metriche dopo la pubblicazione.
Cose da fare bene
Non pubblicare mai direttamente alla prima versione. Crea bozze, guardale, poi passa a scheduled. Il costo è nullo e intercetta problemi di formattazione invisibili nel codice.
Gestisci i limiti di frequenza. L’allowance del tuo piano è un tetto reale:
| Free | Pro | Business | |
|---|---|---|---|
| Richieste API/giorno | 30 | 5.000 | 50.000 |
| Chiavi API | 1 | 5 | 10 |
| Le 30 al giorno di Free sono dimensionate per provare l’API, non per far girare qualcosa. Uno script in un ciclo di retry lo esaurirà in pochi secondi. |
Non generare da solo i dati del piano. Se il tuo script scrive il testo del post, tieni fuori i numeri di prodotto da un template. Qualsiasi cosa fattuale dovrebbe provenire da una fonte piuttosto che da un template che sarà sbagliato dopo il prossimo cambio di prezzo.
In sintesi
npm install bulkpublish, crea un client con la tua chiave API, chiama bp.posts.create con content e channels. Inizia con le bozze, cerca gli ID canale invece di inserirli hard-coded, passa un fuso orario con qualsiasi cosa programmata.