Tutorial API LinkedIn per pubblicare post: usare la Posts API

Tutorial API LinkedIn per pubblicare post: usare la Posts API

Come pubblicare su LinkedIn tramite la Posts API: caricamento di immagini e documenti, l’header x-restli-id e perché profili personali e pagine aziendali richiedono due app.

Pubblicare su LinkedIn è una singola chiamata POST https://api.linkedin.com/rest/posts, con l’URN del post creato restituito nell’header di risposta x-restli-id anziché nel corpo. I contenuti multimediali funzionano registrando prima un upload, caricando i byte, poi facendo riferimento all’URN restituito. Le complicazioni sono il modello dei permessi e il versioning mensile dell’API di LinkedIn.

Cosa può pubblicare la Posts API e cosa non può pubblicare?

Per i post organici (non sponsorizzati), la tabella dei tipi di contenuto di LinkedIn è esplicita.

Tipo di contenutoSupporto organico
Solo testo
Immagini
Video
Documenti (PDF, DOC, DOCX, PPT, PPTX)
Articolo
MultiImage
Sondaggio
CaroselloNo, solo sponsorizzato

I post con documenti sono la sorpresa piacevole: i caroselli PDF, il formato che va bene su LinkedIn, sono pienamente supportati tramite la Documents API. I limiti sono un file non più grande di 100 MB e non più di 300 pagine. I post carosello organici, nel senso pubblicitario del termine usato da LinkedIn, non sono supportati; l’equivalente organico è MultiImage. I post articolo non estraggono automaticamente i dati dall’URL, quindi devi fornire tu stesso titolo, descrizione e l’URN dell’immagine di anteprima.

Il vincolo strutturale è la divisione dei permessi. Pubblicare come persona richiede w_member_social. Pubblicare come pagina aziendale richiede w_organization_social, con r_organization_social per rileggere i dati, e il membro autenticato deve avere un ruolo ADMINISTRATOR, CONTENT_ADMIN o DIRECT_SPONSORED_CONTENT_POSTER su quella pagina. In pratica si tratta di prodotti API distinti con richieste di accesso separate, motivo per cui uno strumento che pubblica sia su un profilo sia su una pagina finisce per mantenere due app LinkedIn separate. La nostra integrazione fa esattamente questo.

Nota: i dati qui riportati sono stati verificati sulla documentazione della Posts API, Images API e Documents API di LinkedIn su Microsoft Learn, aggiornati a settembre 2026. Le piattaforme cambiano questi dettagli senza preavviso.

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

OAuth a tre passaggi per ottenere un token del membro, poi ogni richiesta porta tre header: Authorization: Bearer, X-Restli-Protocol-Version: 2.0.0 e LinkedIn-Version nel formato AAAAMM. Quest’ultimo non è facoltativo e non è permanente. LinkedIn rilascia versioni mensili e dismette quelle vecchie, con un avviso di deprecazione attualmente presente nella pagina che indica che la versione Marketing 202508 verrà dismessa il 17 agosto 2026. Una versione fissata l’anno scorso diventa un’interruzione di servizio.

L’accesso ai prodotti di community management viene concesso per singola applicazione. LinkedIn non pubblica un tempo di revisione in questa documentazione per sviluppatori, quindi considera la durata come sconosciuta. Nota anche che r_member_social è un permesso limitato “disponibile solo per utenti approvati”, quindi rileggere i post di un membro è una richiesta separata rispetto a scriverli.

Non siamo riusciti a verificare la durata dei token di accesso di LinkedIn dalle pagine di Posts, Images o Documents API, che non la specificano. Leggi il dato attuale dalla documentazione ufficiale di autenticazione di LinkedIn, non da un numero riportato in un articolo di blog, incluso questo.

Qual è la sequenza di chiamate per pubblicare?

Per un post di solo testo è una chiamata. Per i contenuti multimediali sono tre:

  1. POST /rest/images?action=initializeUpload (o /rest/documents?action=initializeUpload) con initializeUploadRequest.owner impostato sull’URN della persona o dell’organizzazione.
  2. Leggi uploadUrl e l’URN dell’asset (image o document) dall’oggetto value della risposta.
  3. Carica i byte su uploadUrl. Un caricamento riuscito di un documento restituisce 201.
  4. POST /rest/posts con author, commentary, visibility, distribution, lifecycleState: "PUBLISHED" e content.media.id impostato sull’URN dell’asset.
  5. Leggi l’URN del post creato dall’header di risposta x-restli-id sul 201. Non è nel corpo.
# 1. register the upload
curl -X POST 'https://api.linkedin.com/rest/documents?action=initializeUpload' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'X-Restli-Protocol-Version: 2.0.0' -H 'LinkedIn-Version: 202608' \
  -d '{"initializeUploadRequest":{"owner":"urn:li:organization:5515715"}}'
# -> value.uploadUrl, value.document = urn:li:document:...

# 2. upload the bytes
curl -i --upload-file ./deck.pdf -H "Authorization: Bearer $TOKEN" "$UPLOAD_URL"

# 3. create the post, then read x-restli-id from the 201
curl -i -X POST 'https://api.linkedin.com/rest/posts' \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -H 'X-Restli-Protocol-Version: 2.0.0' -H 'LinkedIn-Version: 202608' \
  -d '{
    "author": "urn:li:organization:5515715",
    "commentary": "Our Q3 teardown, 12 pages.",
    "visibility": "PUBLIC",
    "distribution": {"feedDistribution":"MAIN_FEED","targetEntities":[],
                     "thirdPartyDistributionChannels":[]},
    "content": {"media": {"title":"deck.pdf","id":"urn:li:document:..."}},
    "lifecycleState": "PUBLISHED",
    "isReshareDisabledByAuthor": false
  }'

Gli asset hanno un proprio campo di stato: WAITING_UPLOAD, PROCESSING, PROCESSING_FAILED o AVAILABLE. Fare riferimento a uno che non ha ancora raggiunto AVAILABLE è una causa comune di post pubblicati senza il loro contenuto multimediale.

Quali sono i limiti di frequenza?

La tabella degli errori della Posts API di LinkedIn documenta 429 TOO_MANY_REQUESTS con l’indicazione di ridurre la frequenza delle richieste e riprovare dopo un ritardo, ma la pagina non specifica numeri concreti per app o per membro. Non siamo riusciti a verificare cifre concrete di throttling dalle pagine di Posts, Images o Documents API. LinkedIn pubblica limiti giornalieri a livello di applicazione e di membro nel portale sviluppatori, specifici per la tua app: è l’unica fonte accurata per la tua quota, quindi leggili lì invece di assumere un numero condiviso.

Due limiti sono indicati in modo concreto e vale la pena progettare tenendone conto: i documenti sono limitati a 100 MB e 300 pagine, e le immagini devono restare sotto 36.152.320 pixel, in formato JPG, GIF o PNG, con le GIF limitate a 250 fotogrammi.

Nota: i dati qui riportati sono stati verificati sulla documentazione della Posts API, Images API e Documents API di LinkedIn su Microsoft Learn, aggiornati a settembre 2026. Le piattaforme cambiano questi dettagli senza preavviso.

Cosa ti costerà davvero tre settimane?

Due app, due revisioni. La pubblicazione sul profilo personale e quella sulla pagina aziendale sono prodotti separati con approvazioni separate. Se il tuo prodotto promette entrambe, stai gestendo due flussi OAuth, due set di credenziali e due processi di revisione, e uno può essere approvato mentre l’altro no.

Versioning mensile. LinkedIn-Version richiede un piano: un aggiornamento programmato, un test che verifichi la versione corrente e qualcuno che legga gli avvisi di deprecazione. È il costo di manutenzione che le persone dimenticano quando stimano il lavoro di sviluppo.

Pipeline multimediale. Caricamento in due passaggi per immagini, documenti e video, ciascuno con il proprio endpoint e il proprio stato dell’asset da attendere, oltre alla validazione di formato e dimensione prima di sprecare un upload.

Asincronia e fallimento parziale. Un 201 da /rest/posts è la conferma più forte che una delle grandi piattaforme ti dia, ma il passaggio dell’asset che lo precede è asincrono, e lifecycleState può tornare come PUBLISH_FAILED, richiedendo una modifica per riprovare. Modella uno stato processing, come trattato nella nostra guida alle API di programmazione social media, e non dichiarare mai il successo basandoti solo sulla chiamata di upload.

Se stai anche scrivendo il testo, il contatore di caratteri per LinkedIn mostra dove cade il taglio del “vedi altro”.

La versione breve

  • Una sola chiamata POST /rest/posts; l’URN del post torna in x-restli-id, non nel corpo.
  • I contenuti multimediali richiedono initializeUpload, un upload, poi l’URN dell’asset in content.media.id.
  • I documenti (PDF e file Office) sono supportati organicamente, fino a 100 MB e 300 pagine.
  • Profili personali e pagine aziendali usano permessi diversi e, in pratica, due app.
  • LinkedIn-Version è obbligatorio e le versioni vengono dismesse. Pianifica gli aggiornamenti.

Farlo una volta sola invece che per ogni piattaforma

Se LinkedIn è una delle diverse reti di cui hai bisogno, il lavoro per piattaforma si moltiplica invece di sommarsi. BulkPublish pubblica su 15 piattaforme tramite un’unica API REST, inclusi i profili personali e le pagine aziendali di LinkedIn (entrambe le app, entrambe le revisioni, già fatte) e i post con documenti LinkedIn. Header di versione, polling degli asset e refresh dei token restano dalla nostra parte, e un post rivolto a più reti riporta partial quando una di esse fallisce invece di far finta che tutto sia andato bene. Il riferimento API è su /developers/ e la panoramica dell’integrazione REST su /integrations/rest-api/.

Correlati