Publications

Publiez des annonces, des événements et des offres sur Google et Facebook avec le SDK listingsapi-js.

Les méthodes de publication publient du contenu sur Google Business Profile et Facebook, puis vous permettent de suivre le statut de publication et les statistiques pour chaque site. Toutes les méthodes de publication sont directement disponibles sur l’instance du client ListingsAPI.

La publication est asynchrone : les appels de création renvoient status: 'INPROGRESS', et la publication s’effectue en arrière-plan. Interrogez régulièrement fetchPost jusqu’à ce que le statut soit SUCCESS, et consultez publishDetails[].submissionError pour vérifier les échecs propres à chaque site.

bulkPublish

Publiez un même contenu sur Google et Facebook pour plusieurs établissements en un seul appel. Par défaut, sites cible les deux sites. Le message (ou la table de correspondance par site) est converti en une entrée par site, les identifiants des établissements sont encodés automatiquement et les données sont validées côté client avant tout appel réseau (des données invalides déclenchent immédiatement 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

Passez un objet comme valeur de message pour définir un texte propre à chaque site :

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!',},});

Options

ParamètreTypeDescription
namestringNom interne de la campagne (non visible par les clients). Obligatoire.
locationIdsArray<string | number>Établissements pour lesquels publier (identifiants numériques ou en base64). Obligatoire.
messagestring ou table de correspondance par siteCorps de la publication commun à tous les sites, ou table de correspondance { GOOGLE, FACEBOOK }. Obligatoire.
sitesPostSite[]Sites cibles ; la valeur par défaut est ['GOOGLE', 'FACEBOOK'].
postTypePostTypeANNOUNCEMENT (par défaut), EVENT, OFFER, COVID19 ou PRODUCT.
ctaTypePostCtaTypeBOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP ou GET_OFFER. Nécessite ctaUrl.
ctaUrlstringDestination du bouton d’appel à l’action. Nécessite ctaType.
mediaUrlstringURL publique de l’image jointe sur chaque site.
scheduledDatesobject{ startDatetime, endDatetime, removalSites } pour programmer la publication et l’expiration.
contextInfoobjectDétails de l’événement ou de l’offre lorsque postType les nécessite.
additionalFieldsobjectChamps camelCase supplémentaires non imbriqués, intégrés tels quels au corps de la requête.

createAnnouncement

Créez une publication ANNOUNCEMENT : un simple message avec un appel à l’action et des médias facultatifs. Cette méthode accepte les mêmes options que bulkPublish, à l’exception de postType et contextInfo ; ici, la valeur par défaut de sites est ['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

Créez une publication EVENT avec un titre et une période de début et de fin. title est obligatoire (Google l’exige) ; startDay et endDay sont des dates au format YYYY-MM-DD, et startTime/endTime sont des heures facultatives à afficher. La valeur par défaut de sites est ['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

Créez une publication OFFER avec un coupon, une remise et des conditions. title est obligatoire ; tous les autres champs de l’offre sont facultatifs. La valeur par défaut de sites est ['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',});

Options de l’offre

ParamètreTypeDescription
titlestringTitre de l’offre. Obligatoire.
couponCodestringCode que les clients utilisent pour bénéficier de l’offre.
discountstringDescription de la remise, par exemple '20%'.
redeemUrlstringLien permettant de bénéficier de l’offre en ligne.
termsConditionsstringTexte des conditions générales.
startDaystringDébut de validité de l’offre, YYYY-MM-DD.
endDaystringFin de validité de l’offre, YYYY-MM-DD.

createPost

Créez une publication à partir d’un corps brut composé de champs non imbriqués, sans validation côté client. La méthode place les données que vous lui passez dans l’objet input requis par l’API, de sorte que le corps transmis est {"input": {...}} ; un corps entièrement dépourvu d’imbrication est rejeté avec un statut HTTP 400. Privilégiez createAnnouncement, createEvent ou createOffer, qui construisent et valident ce corps pour vous.

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

fetchPost

Récupérez une publication avec son contenu, son statut de publication par site et ses statistiques. Utilisez cette méthode pour interroger régulièrement une publication INPROGRESS jusqu’à ce qu’elle soit publiée.

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

Supprimez une publication et retirez-la de tous les sites sur lesquels elle a été publiée.

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

fetchLocationPosts

Listez les campagnes de publication qui ciblent un établissement. Cette méthode utilise une pagination par décalage (page et perPage) et renvoie une promesse dont la valeur de résolution est postsByLocation.

Cette route rejette tag ; depuis la version 0.3.2, le SDK accepte donc cette option pour assurer la rétrocompatibilité, mais ne la transmet jamais sur le réseau. Utilisez fetchLocationBulkPosts lorsque vous avez besoin de filtrer par étiquette.

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

Options

ParamètreTypeDescription
tagstringAccepté, mais non envoyé sur cette route. Consultez la remarque ci-dessus.
pagenumberNuméro de page (à partir de 1).
perPagenumberRésultats par page.
filtersobjectChamps de filtrage des publications (encodés automatiquement en JSON).
sortFieldsobjectObjet de tri tel que { field: 'created_at', order: 'Descending' }.

fetchBulkPost

Récupérez une campagne de publication en masse avec le statut de publication et les statistiques par établissement.

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

fetchLocationBulkPosts

Listez les campagnes de publication en masse (pour plusieurs établissements) qui incluent un établissement. Cette méthode accepte les mêmes options que fetchLocationPosts.

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