Publicaciones
Publica anuncios, eventos y ofertas en Google y Facebook mediante client.posts.
Todos los métodos de publicaciones se encuentran en client.posts. Los métodos que reciben un location_id aceptan IDs numéricos o codificados en base64; consulta IDs de ubicación.
Las publicaciones se publican en dos sitios: GOOGLE y FACEBOOK. Los tipos de publicación son ANNOUNCEMENT, EVENT, OFFER, COVID19 y PRODUCT. Los tipos de llamada a la acción son BOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP y GET_OFFER; cta_type y cta_url siempre deben proporcionarse juntos.
Publicación asíncrona
La publicación es asíncrona. Las llamadas de creación devuelven status: INPROGRESS; consulta periódicamente posts.retrieve() (o posts.bulk_retrieve() para campañas masivas) hasta que el estado sea SUCCESS y comprueba publishDetails[].submissionError para detectar fallos por sitio.
Mensajes por sitio
Todos los métodos de creación aceptan message como una cadena de texto simple, que publica el mismo texto en todos los sitios, o como un dict que asigna un texto a cada sitio:
message = { "GOOGLE": "Book your summer checkup today!", "FACEBOOK": "Summer checkups are here. Tag a friend who needs one!",}Cuando message es un dict, debe contener una entrada para cada sitio de sites; si falta alguna, el SDK lanza ValidationError antes de realizar cualquier llamada de red.
posts.bulk_publish
Publica una misma publicación en varias ubicaciones de Google y Facebook con una sola llamada. Esta es la forma recomendada de publicar: sites incluye ambos de forma predeterminada, el mensaje único (o el dict por sitio) se convierte en una entrada por sitio, los IDs de ubicación se codifican automáticamente y los datos que se van a enviar se validan en el cliente antes de realizar cualquier llamada de red.
client.posts.bulk_publish( *, name: str, location_ids: list[str | int], message: str | dict[str, str], sites: list[str] | None = None, post_type: str = "ANNOUNCEMENT", cta_type: str | None = None, cta_url: str | None = None, media_url: str | None = None, scheduled_dates: dict | None = None, context_info: dict | None = None, additional_fields: dict | None = None,) -> APIObjectresult = client.posts.bulk_publish( name="Holiday hours", location_ids=[16808, 16809, 16810], message="Open until 10pm through the holidays!", media_url="https://cdn.example.com/holiday.jpg", cta_type="LEARN_MORE", cta_url="https://example.com/holiday-hours",)print(result.socialPost.id, result.socialPost.status) # INPROGRESS, publishes asyncposts.create_announcement
Crea una publicación de tipo ANNOUNCEMENT: un mensaje simple con una llamada a la acción y contenido multimedia opcionales. El valor predeterminado de sites es ["GOOGLE"].
client.posts.create_announcement( *, name: str, location_ids: list[str | int], message: str | dict[str, str], sites: list[str] | None = None, cta_type: str | None = None, cta_url: str | None = None, media_url: str | None = None, scheduled_dates: dict | None = None, additional_fields: dict | None = None,) -> APIObjectresult = client.posts.create_announcement( name="Grand Opening", location_ids=[16808], message="Acme Dental is now open!", sites=["GOOGLE"], cta_type="LEARN_MORE", cta_url="https://acmedental.example.com/opening",)print(result.socialPost.id)posts.create_event
Crea una publicación de tipo EVENT con un título y un intervalo de inicio y fin. Google exige el título del evento; el SDK lanza ValidationError si falta. start_day y end_day son fechas (YYYY-MM-DD); start_time y end_time son cadenas de texto para mostrar, como "10:00am".
client.posts.create_event( *, name: str, location_ids: list[str | int], message: str | dict[str, str], title: str, start_day: str, end_day: str, start_time: str | None = None, end_time: str | None = None, sites: list[str] | None = None, cta_type: str | None = None, cta_url: str | None = None, media_url: str | None = None, scheduled_dates: dict | None = None, additional_fields: dict | None = None,) -> APIObjectresult = client.posts.create_event( name="Free checkup day", location_ids=[16808], message="Join us for free dental checkups!", title="Free Checkup Day", start_day="2026-08-01", end_day="2026-08-01", start_time="10:00am", end_time="4:00pm", cta_type="BOOK", cta_url="https://acmedental.example.com/book",)print(result.socialPost.id)posts.create_offer
Crea una publicación de tipo OFFER con un cupón, un descuento y las condiciones. title da nombre a la oferta y es obligatorio; start_day y end_day (YYYY-MM-DD) delimitan su vigencia.
client.posts.create_offer( *, name: str, location_ids: list[str | int], message: str | dict[str, str], title: str, coupon_code: str | None = None, discount: str | None = None, redeem_url: str | None = None, terms_conditions: str | None = None, start_day: str | None = None, end_day: str | None = None, sites: list[str] | None = None, cta_type: str | None = None, cta_url: str | None = None, media_url: str | None = None, scheduled_dates: dict | None = None, additional_fields: dict | None = None,) -> APIObjectresult = client.posts.create_offer( name="Summer whitening sale", location_ids=[16808], message="20% off teeth whitening all week!", title="Summer Whitening Sale", coupon_code="SUMMER20", discount="20%", redeem_url="https://acmedental.example.com/sale", terms_conditions="One per patient. Not valid with other offers.", start_day="2026-08-01", end_day="2026-08-07",)print(result.socialPost.id)posts.create
Crea una publicación a partir de un dict con el cuerpo sin procesar. Pasas los campos sin anidar en camelCase y la función auxiliar los incluye en el objeto input que exige la API antes de enviarlos: el cuerpo transmitido es {"input": {...}}, nunca un cuerpo sin anidar. locationIds ya debe estar codificado en base64. Da preferencia a los métodos de creación tipados anteriores para usar argumentos con nombre, codificación automática de IDs y validación en el cliente.
client.posts.create(body: dict) -> APIObjectObligatorios: postName, locationIds (base64), postType, postSites.
result = client.posts.create({ "postName": "Grand Opening", "locationIds": ["TG9jYXRpb246MTY4MDg="], "postType": "ANNOUNCEMENT", "postSites": ["GOOGLE"], "postMessage": [{"site": "GOOGLE", "message": "We are now open!"}],})print(result.socialPost.id)posts.retrieve
Obtén una publicación con su contenido, el estado de publicación por sitio y los datos analíticos. Consulta este método periódicamente después de una creación hasta que status sea SUCCESS.
client.posts.retrieve(post_id: str) -> APIObjectpost = client.posts.retrieve("U29jaWFsUG9zdDo0NDEyMg==")print(post.status)for detail in post.publishDetails: print(detail.site, detail.submissionError)posts.delete
Elimina una publicación y retírala de todos los sitios en los que se publicó.
client.posts.delete(post_id: str) -> APIObjectclient.posts.delete("U29jaWFsUG9zdDo0NDEyMg==")posts.list_for_location
Enumera las campañas de publicaciones dirigidas a una ubicación. La paginación se basa en el desplazamiento: el resultado contiene .records y .pageInfo con totalPages, totalRecords y hasNextPage. La respuesta se encuentra en postsByLocation.
Esta ruta rechaza un tag, por lo que, desde la versión 0.5.3, el SDK acepta el argumento por compatibilidad con versiones anteriores y nunca lo incluye en la solicitud enviada. Usa posts.bulk_list_for_location cuando necesites filtrar por etiquetas.
client.posts.list_for_location( location_id: str | int, *, tag: str = "all", page: int | None = None, per_page: int | None = None, filters: dict | None = None, sort_fields: dict | None = None,) -> APIObjectresult = client.posts.list_for_location(16808, page=1, per_page=10)for post in result.records: print(post.id, post.name)print(result.pageInfo.totalRecords)posts.bulk_retrieve
Obtén una campaña masiva (para varias ubicaciones) con el estado de publicación y los datos analíticos por ubicación.
client.posts.bulk_retrieve(bulk_post_id: str) -> APIObjectbulk = client.posts.bulk_retrieve("QnVsa1Bvc3Q6OTk=")print(bulk.status)posts.bulk_list_for_location
Enumera las campañas masivas (para varias ubicaciones) que incluyen una ubicación. Los parámetros y la estructura del resultado son los mismos que los de posts.list_for_location.
client.posts.bulk_list_for_location( location_id: str | int, *, tag: str = "all", page: int | None = None, per_page: int | None = None, filters: dict | None = None, sort_fields: dict | None = None,) -> APIObjectresult = client.posts.bulk_list_for_location(16808, page=1, per_page=10)for campaign in result.records: print(campaign.id, campaign.name)Consulta también
- Ubicaciones: crea y gestiona las ubicaciones en las que publicas
- Fichas: consulta el estado de sincronización por ubicación
- Analítica: analítica de perfiles de Google, Bing y Facebook