Post

Pubblica annunci, eventi e offerte su Google e Facebook con l'SDK listingsapi-js.

I metodi per i post pubblicano contenuti su Google Business Profile e Facebook, poi ti permettono di monitorare lo stato di pubblicazione e le statistiche per ciascun sito. Tutti i metodi per i post sono disponibili direttamente sull'istanza del client ListingsAPI.

La pubblicazione è asincrona: le chiamate di creazione restituiscono status: 'INPROGRESS' e il post viene pubblicato in background. Interroga periodicamente fetchPost finché lo stato non è SUCCESS e controlla publishDetails[].submissionError per individuare gli errori per ciascun sito.

bulkPublish

Pubblica un post su Google e Facebook per più sedi con una sola chiamata. sites include entrambi per impostazione predefinita. Il messaggio (o la mappa per sito) viene espanso in una voce per ciascun sito, gli ID delle sedi vengono codificati automaticamente e il payload viene convalidato lato client prima di qualsiasi chiamata di rete (un payload non valido genera immediatamente ValidationError).

TypeScript
const result = await client.bulkPublish({name: 'Holiday hours',locationIds: [16808, 16809, 16810],message: 'Open until 10pm through the holidays!',mediaUrl: 'https://cdn.example.com/holiday.jpg',ctaType: 'LEARN_MORE',ctaUrl: 'https://example.com/holiday-hours',});console.log(result.socialPost.id, result.socialPost.status); // INPROGRESS, publishes async

Passa un oggetto come message per specificare un testo diverso per ciascun sito:

TypeScript
await client.bulkPublish({name: 'Holiday hours',locationIds: [16808, 16809],message: {  GOOGLE: 'Open until 10pm through the holidays. Book online!',  FACEBOOK: 'We are staying open late for the holidays. See you soon!',},});

Opzioni

ParametroTipoDescrizione
namestringNome interno della campagna (non visibile ai clienti). Obbligatorio.
locationIdsArray<string | number>Sedi per cui pubblicare (ID numerici o in base64). Obbligatorie.
messagestring o mappa per sitoCorpo del post per tutti i siti, oppure mappa { GOOGLE, FACEBOOK }. Obbligatorio.
sitesPostSite[]Siti di destinazione; il valore predefinito è ['GOOGLE', 'FACEBOOK'].
postTypePostTypeANNOUNCEMENT (predefinito), EVENT, OFFER, COVID19 o PRODUCT.
ctaTypePostCtaTypeBOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP o GET_OFFER. Richiede ctaUrl.
ctaUrlstringDestinazione del pulsante CTA. Richiede ctaType.
mediaUrlstringURL pubblico dell'immagine allegata su ciascun sito.
scheduledDatesobject{ startDatetime, endDatetime, removalSites } per la pubblicazione o la scadenza programmate.
contextInfoobjectDettagli dell'evento o dell'offerta quando postType li richiede.
additionalFieldsobjectCampi camelCase aggiuntivi non annidati, aggiunti al corpo della richiesta senza modifiche.

createAnnouncement

Crea un post ANNOUNCEMENT: un semplice messaggio con CTA e contenuti multimediali facoltativi. Accetta le stesse opzioni di bulkPublish, tranne postType e contextInfo; qui il valore predefinito di sites è ['GOOGLE'].

TypeScript
await client.createAnnouncement({name: 'Grand Opening',locationIds: [16808],message: 'Acme Dental is now open in the Mission!',sites: ['GOOGLE'],ctaType: 'LEARN_MORE',ctaUrl: 'https://example.com/opening',});

createEvent

Crea un post EVENT con un titolo e un intervallo di inizio e fine. title è obbligatorio (lo richiede Google); startDay e endDay sono date YYYY-MM-DD, mentre startTime/endTime sono orari facoltativi da visualizzare. Il valore predefinito di sites è ['GOOGLE'].

TypeScript
await client.createEvent({name: 'Live music',locationIds: [16808],message: 'Join us Friday for live jazz!',title: 'Jazz Night',startDay: '2026-08-01',endDay: '2026-08-01',startTime: '7:00pm',endTime: '10:00pm',});

createOffer

Crea un post OFFER con un coupon, uno sconto e le condizioni. title è obbligatorio; tutti gli altri campi dell'offerta sono facoltativi. Il valore predefinito di sites è ['GOOGLE'].

TypeScript
await client.createOffer({name: 'Summer sale',locationIds: [16808],message: '20% off whitening all week!',title: 'Summer Sale',couponCode: 'SUMMER20',discount: '20%',redeemUrl: 'https://example.com/sale',termsConditions: 'One per customer.',startDay: '2026-08-01',endDay: '2026-08-07',});

Opzioni dell'offerta

ParametroTipoDescrizione
titlestringTitolo dell'offerta. Obbligatorio.
couponCodestringCodice che i clienti utilizzano per ottenere l'offerta.
discountstringDescrizione dello sconto, ad esempio '20%'.
redeemUrlstringLink per usufruire dell'offerta online.
termsConditionsstringTesto dei termini e delle condizioni.
startDaystringInizio della validità dell'offerta, YYYY-MM-DD.
endDaystringFine della validità dell'offerta, YYYY-MM-DD.

createPost

Crea un post a partire da un corpo grezzo con campi non annidati, senza convalida lato client. Il metodo racchiude ciò che passi nell'oggetto input richiesto dall'API, quindi il corpo trasmesso è {"input": {...}}; un corpo privo di qualsiasi annidamento viene rifiutato con uno stato HTTP 400. Preferisci createAnnouncement, createEvent o createOffer, che costruiscono e convalidano questo corpo per te.

TypeScript
await client.createPost({postName: 'Grand Opening',locationIds: ['TG9jYXRpb246MTY4MDg='],postType: 'ANNOUNCEMENT',postSites: ['GOOGLE'],postMessage: [{ site: 'GOOGLE', message: 'We are now open!' }],});

fetchPost

Recupera un post con il suo contenuto, lo stato di pubblicazione per ciascun sito e le statistiche. Usalo per interrogare periodicamente un post INPROGRESS finché non viene pubblicato.

TypeScript
let post = await client.fetchPost('U29jaWFsUG9zdDo0NDEyMg=='); while (post.status === 'INPROGRESS') {await new Promise((resolve) => setTimeout(resolve, 5000));post = await client.fetchPost('U29jaWFsUG9zdDo0NDEyMg==');} for (const detail of post.publishDetails ?? []) {if (detail.submissionError) {  console.log('failed:', detail.submissionError);}}

deletePost

Elimina un post e rimuovilo da tutti i siti su cui è stato pubblicato.

TypeScript
await client.deletePost('U29jaWFsUG9zdDo0NDEyMg==');

fetchLocationPosts

Elenca le campagne di post destinate a una sede. Usa la paginazione con offset (page e perPage) e restituisce postsByLocation al completamento.

Questa route rifiuta un tag, quindi dalla versione 0.3.2 l'SDK accetta l'opzione per compatibilità con le versioni precedenti e non la trasmette mai. Usa fetchLocationBulkPosts quando devi filtrare per tag.

TypeScript
const posts = await client.fetchLocationPosts(16808, { page: 1, perPage: 10 });

Opzioni

ParametroTipoDescrizione
tagstringAccettato ma non inviato su questa route. Vedi la nota sopra.
pagenumberNumero di pagina (a partire da 1).
perPagenumberRisultati per pagina.
filtersobjectCampi di filtro dei post (codificati automaticamente in JSON).
sortFieldsobjectOggetto di ordinamento come { field: 'created_at', order: 'Descending' }.

fetchBulkPost

Recupera una campagna collettiva con lo stato di pubblicazione e le statistiche per ciascuna sede.

TypeScript
const bulk = await client.fetchBulkPost('QnVsa1Bvc3Q6OTk=');

fetchLocationBulkPosts

Elenca le campagne collettive (per più sedi) che includono una sede. Accetta le stesse opzioni di fetchLocationPosts.

TypeScript
const campaigns = await client.fetchLocationBulkPosts(16808, { page: 1, perPage: 10 });