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).

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

Pasa un objeto como message para usar un texto distinto en cada sitio:

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

Opciones

ParámetroTipoDescripción
namestringNombre interno de la campaña (no se muestra a los clientes). Obligatorio.
locationIdsArray<string | number>Ubicaciones en las que publicar (identificadores numéricos o en base64). Obligatorio.
messagestring o mapa por sitioCuerpo de la publicación para todos los sitios o mapa { GOOGLE, FACEBOOK }. Obligatorio.
sitesPostSite[]Sitios de destino; el valor predeterminado es ['GOOGLE', 'FACEBOOK'].
postTypePostTypeANNOUNCEMENT (predeterminado), EVENT, OFFER, COVID19 o PRODUCT.
ctaTypePostCtaTypeBOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP o GET_OFFER. Requiere ctaUrl.
ctaUrlstringDestino del botón de llamada a la acción. Requiere ctaType.
mediaUrlstringURL pública de la imagen que se adjunta en todos los sitios.
scheduledDatesobject{ startDatetime, endDatetime, removalSites } para programar la publicación o la caducidad.
contextInfoobjectDetalles del evento o de la oferta cuando postType los requiera.
additionalFieldsobjectCampos camelCase adicionales sin anidamiento que se incorporan al cuerpo de la solicitud sin modificaciones.

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'].

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 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'].

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 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'].

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

Opciones de la oferta

ParámetroTipoDescripción
titlestringTítulo de la oferta. Obligatorio.
couponCodestringCódigo que canjean los clientes.
discountstringDescripción del descuento, por ejemplo, '20%'.
redeemUrlstringEnlace para canjear la oferta en línea.
termsConditionsstringTexto de los términos y condiciones.
startDaystringInicio de la validez de la oferta, YYYY-MM-DD.
endDaystringFin de la validez de la oferta, YYYY-MM-DD.

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.

TypeScript
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.

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 una publicación y retírala de todos los sitios en los que se haya publicado.

TypeScript
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.

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

Opciones

ParámetroTipoDescripción
tagstringSe acepta, pero no se envía en esta ruta. Consulta la nota anterior.
pagenumberNúmero de página (a partir de 1).
perPagenumberResultados por página.
filtersobjectCampos de filtro de publicaciones (se codifican automáticamente en JSON).
sortFieldsobjectObjeto de ordenación como { field: 'created_at', order: 'Descending' }.

fetchBulkPost

Obtén una campaña masiva con el estado de publicación y las estadísticas de cada ubicación.

TypeScript
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.

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