Social

Endpoint Social: brand, link di connessione ospitati, pubblicazione singola e massiva, pianificazione, statistiche e limite globale di connessioni.

La Social API pubblica su Facebook, Instagram, X, LinkedIn e Pinterest. L'intero modello si basa su due oggetti. Un brand è l'identità con cui pubblichi: un nome, un fuso orario e gli account social associati. Una connessione è un singolo account social autorizzato, associato a un brand su una piattaforma. Con un piano API, i brand sono illimitati e gratuiti. Il piano conteggia le connessioni, quindi il limite di connessioni è il vincolo da tenere presente nella progettazione.

Non puoi collegare un account dal tuo server. L'utente finale deve autorizzarlo sulla piattaforma, quindi devi richiedere un link ospitato e reindirizzarvi l'utente. La pubblicazione è asincrona: ogni chiamata di creazione restituisce una risposta non appena il post viene accettato, e devi effettuare richieste periodiche per ottenere il risultato per ciascun canale.

Panoramica degli endpoint

MetodoPercorsoFunzioneRiferimento
POST/social/brandsCrea un brand.Crea un brand
GET/social/brandsUna pagina dei brand dell'account.Elenca i brand
GET/social/brands/{brandId}Un brand con tutti i suoi dettagli.Ottieni un brand
POST/social/brands/updateModifica i campi di un brand esistente.Aggiorna un brand
POST/social/brands/archiveArchivia un brand e le sue connessioni.Archivia un brand
POST/social/brands/{brandId}/connections/linkUn URL ospitato per collegare una piattaforma.Ottieni un link di connessione
GET/social/brands/{brandId}/connectionsGli account collegati a un brand.Elenca le connessioni di un brand
POST/social/connections/disconnectRimuove una connessione.Disconnetti una connessione
POST/social/postsCrea una bozza, pianifica o pubblica un post.Crea un post social
GET/social/posts/{postId}Un post con lo stato di pubblicazione per ciascun canale.Ottieni un post social
GET/social/brands/{brandId}/postsUna pagina dei post di un brand.Elenca i post di un brand
POST/social/posts/cancelAnnulla un post che non è ancora stato pubblicato.Annulla un post pianificato
GET/social/posts/{postId}/insightsConteggi delle interazioni e commenti per un canale.Ottieni i dati statistici e i commenti del post
POST/social/bulk-postsFino a 500 post in una richiesta.Crea post in blocco
GET/social/bulk-posts/{bulkJobId}Lo stato di un processo in blocco e i risultati per ciascuna riga.Ottieni un processo di creazione di post in blocco
GET/social/limitsIl limite di connessioni e quante ne sono state utilizzate.Ottieni i limiti e l'utilizzo del piano Social

Valori che userai ovunque

CampoValori accettati
platforms[] e channelFACEBOOK, INSTAGRAM, TWITTER (X), LINKEDIN, PINTEREST
actionDRAFT, SCHEDULE, PUBLISH

I valori delle piattaforme sono nomi enum in maiuscolo. L'invio di "instagram" viene rifiutato. TWITTER corrisponde a X; il nome enum non è cambiato quando è cambiato quello del prodotto.

Crea un brand

POST /social/brands

profileName e timezone sono obbligatori. Il fuso orario è un oggetto e tzCode è il campo rilevante: è l'identificatore IANA usato per interpretare ogni scheduleDate e scheduleTime nei post di questo brand. Le altre tre chiavi sono etichette di visualizzazione.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "profileName": "Jenny Home",      "timezone": {        "label": "(GMT-05:00) Eastern Time",        "tzCode": "America/New_York",        "name": "Eastern Standard Time",        "utc": "-05:00"      },      "categories": ["Furniture Store"],      "siteUrl": "https://jennyhome.example"    }  }'

Conserva l'ID del brand restituito. È il token brandId nel percorso di tutti gli altri endpoint dei brand e il campo socialProfileId del corpo quando pubblichi.

Elenca e leggi i brand

GET /social/brands restituisce una pagina di brand. GET /social/brands/{brandId} ne restituisce uno con tutti i suoi dettagli.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/brands?page=1&size=25"

Se una richiesta con un ID restituisce SY95043, il brand non appartiene a questo account oppure è già stato archiviato.

Aggiorna un brand

POST /social/brands/update

L'ID del brand va nel corpo come input.profileId, non nel percorso. Invia solo i campi che stai modificando; tutto ciò che ometti mantiene il valore attuale.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/update \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"profileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "bio": "Handmade furniture for real homes."}}'

Archivia un brand

POST /social/brands/archive

Un brand deve esistere da almeno 90 giorni prima di poter essere archiviato. Prima di questa soglia, la chiamata viene rifiutata con SY95051 e non cambia nulla. Una volta raggiunta questa soglia, l'archiviazione ha effetto immediato e archivia contemporaneamente tutte le connessioni del brand.

Queste connessioni smettono subito di pubblicare, ma i loro slot continuano a essere conteggiati fino alla fine del periodo di fatturazione, esattamente come avviene con una disconnessione manuale. L'archiviazione non è un modo per liberare capacità oggi.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/archive \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902"}}'

POST /social/brands/{brandId}/connections/link

Questo è l'unico modo per aggiungere una connessione. La risposta contiene un url ospitato, valido per expiresIn secondi. Reindirizza l'utente finale a questo indirizzo: l'utente concede l'autorizzazione sulla piattaforma e viene poi reindirizzato al tuo redirectUrl con l'esito nella stringa di query. Passa errorUrl per distinguere gli annullamenti dagli esiti positivi e state per mantenere un tuo valore di correlazione durante l'intero flusso di andata e ritorno.

Ricorda che questo corpo ha una struttura piatta, senza un contenitore input.

Shell
curl -X POST https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/connections/link \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "channel": "INSTAGRAM",    "redirectUrl": "https://app.example.com/social/connected",    "errorUrl": "https://app.example.com/social/failed"  }'
JSON
{  "data": {    "connectSocialAccount": {      "status": "success",      "url": "https://social.listingsapi.com/connect/start?token=bfac8e06-8d72-4810-9c50-ae7ee12a7b52",      "expiresIn": 900    }  }}

Controlla status prima di reindirizzare. Una risposta failed non restituisce alcun url e indica il motivo in title, il più delle volte il limite di connessioni (SY95042) o una piattaforma di cui l'account non dispone (SY95044).

Elenca le connessioni di un brand

GET /social/brands/{brandId}/connections

Restituisce gli account collegati al brand, ciascuno con il relativo id necessario per pubblicare su una connessione specifica o per disconnetterla.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/connections

Disconnetti una connessione

POST /social/connections/disconnect

Accetta il valore id della connessione dall'elenco precedente. L'account smette subito di pubblicare, ma lo slot che occupava non torna disponibile fino alla fine del periodo di fatturazione. Riconnettere lo stesso account allo stesso brand entro il periodo riutilizza quello slot e non comporta costi; collegarlo a un brand diverso occupa un secondo slot.

Shell
curl -X POST https://listingsapi.com/api/v4/social/connections/disconnect \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialProfileConnectedChannelId": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7"}}'

Pubblica un post

POST /social/posts

Una sola chiamata pubblica lo stesso contenuto su tutte le piattaforme in platforms. Ciascuna di queste piattaforme deve già avere una connessione sul brand, altrimenti la chiamata restituisce SY95045. Instagram e Pinterest richiedono almeno un elemento in mediaUrls.

Programma un post in uno dei due modi, mai con entrambi. scheduledAt è un timestamp ISO-8601 con uno scostamento rispetto a UTC. scheduleDate e scheduleTime vengono inviati insieme e interpretati nel fuso orario del brand. L'invio di entrambe le modalità di programmazione, o di una programmazione nel passato, restituisce SY95046.

Shell
curl -X POST https://listingsapi.com/api/v4/social/posts \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",      "name": "Autumn collection launch",      "platforms": ["INSTAGRAM", "FACEBOOK"],      "content": "Our autumn collection lands today.",      "mediaUrls": ["https://cdn.example.com/social/autumn-collection.jpg"],      "action": "SCHEDULE",      "scheduleDate": "2026-10-02",      "scheduleTime": "09:30",      "clientReference": "campaign-4471-slot-01"    }  }'

Imposta clientReference sul tuo identificatore. Viene memorizzato e restituito, consentendoti di associare un post ai tuoi record senza conservare l'UUID.

Leggi un singolo post

GET /social/posts/{postId}

In questo modo puoi verificare se la pubblicazione è riuscita. Il valore status del post è un riepilogo; l'esito effettivo è indicato per ciascun canale in connectedChannels, dove ogni elemento contiene il proprio status, un liveLink quando la piattaforma accetta il post e reason o error quando non lo accetta.

JSON
{  "connectedChannels": [    {      "platform": "INSTAGRAM",      "status": "SUCCESS",      "liveLink": "https://www.instagram.com/p/CxYz1234abc/",      "error": null    }  ]}

Interroga periodicamente questo endpoint dopo un PUBLISH. La pubblicazione può fallire su un canale e riuscire sugli altri, quindi controlla ogni elemento anziché soltanto il valore status al livello principale.

Elenca i post di un brand

GET /social/brands/{brandId}/posts

Una pagina di post del brand, con filtri per restringere i risultati in base allo stato. Usala per eseguire una riconciliazione in blocco invece di interrogare gli id uno alla volta.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/brands/6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902/posts?page=1&size=25"

Annulla un post programmato

POST /social/posts/cancel

Annulla un post che non è ancora stato pubblicato. Un post già pubblicato su una piattaforma non può essere ritirato tramite questo endpoint.

Shell
curl -X POST https://listingsapi.com/api/v4/social/posts/cancel \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{"input": {"socialPostId": "a3f81c62-9d4e-4a17-b5c0-2e7f6d8a9b10"}}'

Leggi statistiche e commenti

GET /social/posts/{postId}/insights

Conteggi delle interazioni e commenti per un singolo post su un singolo canale. Il canale è obbligatorio, perché un post pubblicato su tre piattaforme ha tre insiemi distinti di dati numerici.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  "https://listingsapi.com/api/v4/social/posts/a3f81c62-9d4e-4a17-b5c0-2e7f6d8a9b10/insights?socialConnectedChannelId=b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7"

Crea post in blocco

POST /social/bulk-posts

Accetta da 1 a 500 righe in input.posts. Ogni riga è lo stesso oggetto che POST /social/posts accetta come input, e le righe possono riguardare brand diversi nella stessa richiesta.

L'intero batch viene convalidato prima che venga creato qualsiasi elemento. Se una qualsiasi riga non supera la convalida, ricevi SY95050 con gli errori per ciascuna riga e nulla viene messo in coda, quindi correggi e invia di nuovo. Con più di 500 righe viene restituito SY95048, anche in questo caso senza creare nulla. Un batch valido restituisce un job da interrogare periodicamente.

Shell
curl -X POST https://listingsapi.com/api/v4/social/bulk-posts \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H "Content-Type: application/json" \  -d '{    "input": {      "name": "October launch batch",      "posts": [        {          "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",          "name": "Launch day",          "platforms": ["FACEBOOK"],          "content": "Doors open at nine.",          "action": "SCHEDULE",          "scheduleDate": "2026-10-02",          "scheduleTime": "09:00"        }      ]    }  }'

Un'operazione in blocco conta come una sola richiesta ai fini del limite di frequenza delle richieste, il che la rende la soluzione efficiente per batch di grandi dimensioni.

Interroga periodicamente un job di elaborazione in blocco

GET /social/bulk-posts/{bulkJobId}

Restituisce lo stato del job con i risultati per ciascuna riga, inclusi l'id del post creato per ogni riga e le eventuali righe la cui elaborazione non è riuscita dopo l'inserimento in coda. I job non vengono conservati per sempre; per un id il cui periodo di conservazione è scaduto, viene restituito SY95047.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/bulk-posts/f47ac10b-58cc-4372-a567-0e02b2c3d479

Controlla limiti e utilizzo

GET /social/limits

Consulta queste informazioni prima di creare connessioni, anziché dopo aver ricevuto SY95042. Confronta usage.connections con maxConnections: il primo è il conteggio fatturabile, che comprende le connessioni attuali più quelle rilasciate in precedenza in questo periodo. usage.connectionsActive indica ciò che è attivo in questo momento, mentre usage.connectionsReleased indica quanta capacità torna disponibile al rinnovo.

brands viene restituito con il valore null, che significa illimitato. I brand non sono soggetti a conteggio in un piano API.

Shell
curl -H "Authorization: API $LISTINGSAPI_KEY" \  https://listingsapi.com/api/v4/social/limits

Errori che potresti incontrare

CodiceSignificatoCosa fare
SY90001Nessun abbonamento Social sull'account.Aggiungi il prodotto Social prima di chiamare questi endpoint.
SY95042Limite massimo di connessioni raggiunto per questo periodo di fatturazione.Confronta usage.connections con maxConnections. Una disconnessione recente non risolve questa situazione, perché lo slot rimane occupato fino alla fine del periodo.
SY95043Il brand non esiste in questo account oppure è archiviato.Rileggi l'id da Elenca i brand.
SY95044Piattaforma non abilitata per l'account.Scegli una piattaforma disponibile per l'account oppure contatta l'assistenza.
SY95045Il brand non ha alcuna connessione per quella piattaforma.Indirizza l'utente a un link di connessione oppure rimuovi la piattaforma da platforms.
SY95046Programmazione o fuso orario non validi.Invia scheduledAt oppure scheduleDate insieme a scheduleTime, mai entrambe le alternative.
SY95047Il job di elaborazione in blocco non esiste.Rileggi job.id dalla risposta alla creazione in blocco.
SY95048Più di 500 righe.Dividi il batch. Non è stato creato nulla.
SY95049URL di reindirizzamento non valido.redirectUrl e errorUrl devono essere URL https assoluti.
SY95050Convalida in blocco non riuscita.Leggi gli errori per ciascuna riga, correggi le righe interessate e invia di nuovo il batch.
SY95051Il brand è stato creato da meno di 90 giorni.Attendi che siano trascorsi 90 giorni dalla sua creazione, poi archivialo.

L'elenco completo è disponibile nella documentazione di riferimento dei codici di errore.

Passaggi successivi

Leggi Piani e componenti aggiuntivi per sapere come interagiscono il limite massimo di connessioni, i pacchetti da 5 connessioni e la regola di archiviazione dei 90 giorni, e Reagisci agli eventi con i webhook per ricevere gli eventi social_post.* e social_connection.* invece di effettuare interrogazioni periodiche.

Il Python SDK supporta questi endpoint tramite client.social.brands, client.social.connections, client.social.posts e client.social.bulk; consulta la risorsa Social. Il Node SDK non supporta ancora Social, quindi chiama gli endpoint REST direttamente da Node.