Tutorial API Instagram per pubblicare post: pubblicare con la Graph API

Tutorial API Instagram per pubblicare post: pubblicare con la Graph API

Come pubblicare su Instagram tramite API: il flusso a due passaggi del container, i requisiti dell'account, il limite di 100 post al giorno e cosa costa davvero tempo.

Pubblicare su Instagram tramite API è una chiamata in due passaggi: crea un container media con POST /<IG_ID>/media, poi pubblicalo con POST /<IG_ID>/media_publish. Le parti difficili non sono le chiamate. Sono i requisiti dell’account, la revisione dell’app di Meta e il fatto che una risposta 200 dal passaggio del container non significa che qualcosa sia già pubblicato.

Questo articolo è scritto per uno sviluppatore che deve decidere se costruire tutto questo internamente.

Cosa può effettivamente pubblicare l’API di Instagram?

La documentazione Content Publishing di Meta elenca quattro valori media_type per i container: VIDEO, REELS, STORIES e CAROUSEL. Una semplice immagine singola è il valore predefinito quando passi image_url senza media_type.

FormatoSupportatoNote dalla documentazione
Immagine singolaJPEG, passata come image_url pubblico
Video / Reelsmedia_type=REELS con video_url
Storiemedia_type=STORIES
CaroselloFino a 10 immagini, video o un mix

Due cose sorprendono le persone. Primo, le Storie sono pubblicabili, ma quando rileggi una storia pubblicata, media_type restituisce IMAGE o VIDEO, quindi devi richiedere media_product_type per sapere cosa è realmente. Secondo, le immagini del carosello vengono tutte ritagliate per corrispondere alla prima immagine, con un rapporto predefinito 1:1, quindi le decisioni sul ritaglio sono prese al posto tuo.

Il divario che conta di più non è un formato. È l’account. La pubblicazione richiede un account Instagram professionale (Business o Creator) collegato a una Pagina Facebook, con instagram_basic, instagram_content_publish e pages_read_engagement concessi. Un account Instagram personale non può essere pubblicato tramite API in nessun caso, indipendentemente dal tuo codice. Se i tuoi utenti sono creator con account personali, l’integrazione è morta prima ancora che tu scriva una riga di codice.

Nota: i dati qui riportati sono stati verificati rispetto alla documentazione Instagram Platform Content Publishing di Meta a settembre 2026. Le piattaforme cambiano questi dettagli senza preavviso.

Come funziona l’autenticazione e quanto dura la revisione dell’app?

Ottieni un token di accesso utente tramite Facebook Login, poi scambi lato server il token a breve durata con uno a lunga durata tramite GET oauth/access_token con grant_type=fb_exchange_token. Meta documenta che il token utente a lunga durata dura circa 60 giorni. Il rinnovo automatico descritto da Meta si applica ai token gestiti dall’SDK, quindi se scambi i token tu stesso ti serve un tuo percorso di rinnovo o ri-autenticazione prima del sessantesimo giorno.

La revisione dell’app è obbligatoria per i permessi di pubblicazione prima che chiunque al di fuori dei ruoli della tua app possa usare l’integrazione. Meta non pubblica tempi di revisione garantiti in questa documentazione per sviluppatori, quindi considera la durata come sconosciuta e pianifica almeno un ciclo di rifiuto. Le registrazioni video fanno parte della candidatura, il che significa che ti serve una demo funzionante prima di ottenere l’approvazione, su un’app che non può ancora servire utenti reali.

Qual è la sequenza di chiamate per pubblicare?

  1. Carica i tuoi media da qualche parte raggiungibile pubblicamente. Meta li recupera tramite URL, quindi un URL firmato che scade in 60 secondi fallirà.
  2. POST /<IG_ID>/media con image_url o video_url, caption, e media_type se non è un’immagine semplice. Ricevi indietro un ID container.
  3. Interroga GET /<IG_CONTAINER_ID>?fields=status_code finché non legge FINISHED. Meta consiglia di interrogare una volta al minuto per non più di cinque minuti.
  4. POST /<IG_ID>/media_publish con creation_id impostato sull’ID del container.
  5. Salva l’ID media restituito. Quello, non l’ID del container, è il post pubblicato.
# 1. create the container
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media" \
  -d "image_url=https://example.com/photo.jpg" \
  -d "caption=Ship it." \
  -d "access_token=$TOKEN"
# -> {"id":"17889455560051444"}

# 2. poll until FINISHED
curl "https://graph.facebook.com/v23.0/17889455560051444?fields=status_code&access_token=$TOKEN"

# 3. publish
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media_publish" \
  -d "creation_id=17889455560051444" -d "access_token=$TOKEN"

Lo status_code del container può essere IN_PROGRESS, FINISHED, ERROR, EXPIRED o PUBLISHED. EXPIRED significa che il container non è stato pubblicato entro 24 ore. Per un carosello, crei un container per ogni elemento con is_carousel_item=true, poi un container genitore con media_type=CAROUSEL e un elenco children separato da virgole.

Quali sono i rate limit?

Il limite di pubblicazione documentato è diretto: gli account Instagram sono limitati a 100 post pubblicati via API in un periodo mobile di 24 ore, e un carosello conta come un post. Puoi leggere l’utilizzo attuale da GET /<IG_ID>/content_publishing_limit invece di indovinare, il che è ciò che dovresti fare prima di un’esecuzione massiva.

Si tratta di una finestra mobile, non di un giorno di calendario. Se esaurisci 100 post alle 15:00, non ottieni un nuovo margine a mezzanotte. Qualsiasi coda tu costruisca deve modellare la finestra, non un contatore giornaliero.

Nota: i dati qui riportati sono stati verificati rispetto alla documentazione Instagram Platform Content Publishing di Meta a settembre 2026. Le piattaforme cambiano questi dettagli senza preavviso.

Cosa ti costerà davvero tre settimane?

Non le due chiamate API. Queste quattro cose:

Revisione dell’app. Non puoi lanciare finché Meta non approva instagram_content_publish, e non puoi fare una demo pulita finché non hai costruito la cosa. Metti in conto una nuova candidatura.

Rinnovo del token. Token a lunga durata di sessanta giorni significano un job in background, uno stato di errore nella tua interfaccia per “questo account deve essere ricollegato”, ed un’email all’utente prima che il token scada, non dopo. Se salti questo passaggio, ogni integrazione smette di funzionare silenziosamente due mesi dopo il lancio.

Hosting dei media e vincoli di formato. Meta recupera i media dal tuo URL. Questo significa hosting pubblico, tipi di contenuto corretti e transcodifica in ciò che Instagram accetta. Le immagini singole sono JPEG. I video devono sopravvivere al passaggio di elaborazione di Instagram, che avviene dopo che la tua chiamata è tornata.

Gestione dei fallimenti asincroni. Un 200 sulla chiamata del container significa che Meta ha accettato un lavoro. Il post può comunque fallire durante l’elaborazione, e lo scopri solo interrogando status_code e vedendo ERROR. Se il tuo modello dati ha solo “pubblicato” e “fallito”, segnalerai come riuscito un post mai apparso. Modella uno stato processing e un vero controllo terminale, come trattato nella nostra guida sull’API di programmazione social media.

Poi moltiplica. Reels e Storie hanno le loro particolarità, e se vuoi anche TikTok o LinkedIn ricominci da capo con un modello di autenticazione diverso, un flusso di caricamento diverso e un processo di revisione diverso.

La versione breve

  • Due chiamate: crea il container, poi media_publish. Interroga status_code nel mezzo.
  • Richiede un account Instagram professionale collegato a una Pagina Facebook.
  • 100 post pubblicati via API ogni 24 ore mobili; controlla content_publishing_limit.
  • I token a lunga durata durano circa 60 giorni. Costruisci il rinnovo prima del lancio.
  • La revisione dell’app è obbligatoria e la sua durata non è pubblicata nella documentazione.

Se stai scrivendo le didascalie mentre costruisci, il contatore gratuito di caratteri per Instagram mostra dove cade il troncamento.

Farlo una volta invece che una volta per piattaforma

L’alternativa a scrivere tutto questo per ogni rete è un’unica API che detiene già i token, i container, il polling e i tentativi. BulkPublish pubblica su 15 piattaforme tramite un’unica API REST e SDK, quindi un post Instagram e un post LinkedIn sono la stessa chiamata con un ID canale diverso. Il rinnovo del token, il limite della finestra mobile e il controllo dello stato asincrono sono gestiti dal nostro lato, e un post che fallisce su una piattaforma viene segnalato come partial invece che come un falso successo. Il riferimento è su /it/developers/ e la pagina di integrazione REST è su /it/integrations/rest-api/.

Correlati