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).
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 asyncPassez un objet comme valeur de message pour définir un texte propre à chaque site :
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
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'].
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'].
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'].
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
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.
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.
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.
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.
const posts = await client.fetchLocationPosts(16808, { page: 1, perPage: 10 });Options
fetchBulkPost
Récupérez une campagne de publication en masse avec le statut de publication et les statistiques par établissement.
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.
const campaigns = await client.fetchLocationBulkPosts(16808, { page: 1, perPage: 10 });Ressources associées
- Établissements, rechercher les identifiants des établissements
- Gestion des erreurs,
ValidationErroret codes d’erreur de la plateforme