Publicaciones
Publica anuncios, eventos y ofertas en Google y Facebook con el SDK listingsapi-js.
Los métodos de publicación publican contenido en Google Business Profile y Facebook y te permiten consultar el estado de publicación y las estadísticas de cada sitio. Todos los métodos de publicación están disponibles directamente en la instancia del cliente ListingsAPI.
La publicación es asíncrona: las llamadas de creación devuelven status: 'INPROGRESS' y el contenido se publica en segundo plano. Consulta fetchPost periódicamente hasta que el estado sea SUCCESS y comprueba publishDetails[].submissionError para detectar errores en cada sitio.
bulkPublish
Publica una publicación en Google y Facebook para varias ubicaciones con una sola llamada. sites incluye ambos de forma predeterminada. El mensaje (o el mapa por sitio) se expande a una entrada por sitio, los identificadores de ubicación se codifican automáticamente y el cuerpo de la solicitud se valida en el cliente antes de cualquier llamada de red (si el cuerpo no es válido, se lanza ValidationError de inmediato).
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 asyncPasa un objeto como message para usar un texto distinto en cada sitio:
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!',},});Opciones
createAnnouncement
Crea una publicación de tipo ANNOUNCEMENT: un mensaje sencillo con una llamada a la acción y contenido multimedia opcionales. Acepta las mismas opciones que bulkPublish, excepto postType y contextInfo; aquí, el valor predeterminado de sites es ['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
Crea una publicación de tipo EVENT con un título y un período de inicio y fin. title es obligatorio (Google lo exige); startDay y endDay son fechas en formato YYYY-MM-DD, y startTime/endTime son horas opcionales que se muestran. El valor predeterminado de sites es ['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
Crea una publicación de tipo OFFER con un cupón, un descuento y condiciones. title es obligatorio; todos los demás campos de la oferta son opcionales. El valor predeterminado de sites es ['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',});Opciones de la oferta
createPost
Crea una publicación a partir de un cuerpo sin procesar con campos sin anidamiento, sin validación en el cliente. El método incluye lo que le pasas dentro del objeto input que exige la API, por lo que el cuerpo que se envía es {"input": {...}}; un cuerpo sin ningún anidamiento se rechaza con un estado HTTP 400. Es preferible usar createAnnouncement, createEvent o createOffer, que construyen y validan este cuerpo por ti.
await client.createPost({postName: 'Grand Opening',locationIds: ['TG9jYXRpb246MTY4MDg='],postType: 'ANNOUNCEMENT',postSites: ['GOOGLE'],postMessage: [{ site: 'GOOGLE', message: 'We are now open!' }],});fetchPost
Obtén una publicación con su contenido, el estado de publicación en cada sitio y sus estadísticas. Úsalo para consultar periódicamente una publicación en estado INPROGRESS hasta que se publique.
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 una publicación y retírala de todos los sitios en los que se haya publicado.
await client.deletePost('U29jaWFsUG9zdDo0NDEyMg==');fetchLocationPosts
Enumera las campañas de publicaciones dirigidas a una ubicación. Usa paginación por desplazamiento (page y perPage) y devuelve postsByLocation al resolverse.
Esta ruta rechaza tag, por lo que, desde la versión 0.3.2, el SDK acepta la opción por compatibilidad con versiones anteriores y nunca la envía. Usa fetchLocationBulkPosts cuando necesites filtrar por etiquetas.
const posts = await client.fetchLocationPosts(16808, { page: 1, perPage: 10 });Opciones
fetchBulkPost
Obtén una campaña masiva con el estado de publicación y las estadísticas de cada ubicación.
const bulk = await client.fetchBulkPost('QnVsa1Bvc3Q6OTk=');fetchLocationBulkPosts
Enumera las campañas masivas (para varias ubicaciones) que incluyen una ubicación. Acepta las mismas opciones que fetchLocationPosts.
const campaigns = await client.fetchLocationBulkPosts(16808, { page: 1, perPage: 10 });Recursos relacionados
- Ubicaciones, consulta los ID de las ubicaciones
- Gestión de errores,
ValidationErrory códigos de error de la plataforma