Publicações
Publique anúncios, eventos e ofertas no Google e no Facebook por meio de client.posts.
Todos os métodos de publicação estão em client.posts. Os métodos que recebem um location_id aceitam IDs numéricos ou codificados em base64; consulte IDs de locais.
As publicações são enviadas para dois sites: GOOGLE e FACEBOOK. Os tipos de publicação são ANNOUNCEMENT, EVENT, OFFER, COVID19 e PRODUCT. Os tipos de chamada para ação são BOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP e GET_OFFER; cta_type e cta_url devem sempre ser fornecidos juntos.
Publicação assíncrona
A publicação é assíncrona. As chamadas de criação retornam status: INPROGRESS; consulte periodicamente posts.retrieve() (ou posts.bulk_retrieve() para campanhas em massa) até que o status seja SUCCESS e verifique publishDetails[].submissionError para identificar falhas por site.
Mensagens por site
Todos os métodos de criação aceitam message como uma string simples, que publica o mesmo texto em todos os sites, ou como um dict que associa cada site a um texto:
message = { "GOOGLE": "Book your summer checkup today!", "FACEBOOK": "Summer checkups are here. Tag a friend who needs one!",}Quando message é um dict, ele deve conter uma entrada para cada site em sites; o SDK lança ValidationError antes de qualquer chamada de rede se alguma entrada estiver ausente.
posts.bulk_publish
Envie uma publicação para vários locais no Google e no Facebook em uma única chamada. Esta é a forma recomendada de publicar: sites inclui ambos por padrão, a mensagem única (ou o dict por site) é expandida em uma entrada por site, os IDs dos locais são codificados automaticamente e o payload é validado no cliente antes de qualquer chamada de rede.
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
Crie uma publicação do tipo ANNOUNCEMENT: uma mensagem simples com CTA e mídia opcionais. O valor padrão de sites é ["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
Crie uma publicação do tipo EVENT com um título e um período com início e fim. O Google exige o título do evento; o SDK lança ValidationError se ele estiver ausente. start_day e end_day são datas (YYYY-MM-DD); start_time e end_time são strings de exibição, 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
Crie uma publicação do tipo OFFER com cupom, desconto e termos. title dá nome à oferta e é obrigatório; start_day e end_day (YYYY-MM-DD) delimitam sua validade.
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
Crie uma publicação a partir de um dict com o corpo bruto. Você passa os campos sem aninhamento em camelCase, e a função auxiliar os envolve no objeto input exigido pela API antes do envio: o corpo transmitido é {"input": {...}}, nunca um corpo sem aninhamento. locationIds já deve estar codificado em base64. Prefira os métodos de criação tipados acima para usar argumentos nomeados, codificação automática de IDs e validação no cliente.
client.posts.create(body: dict) -> APIObjectObrigatórios: 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
Obtenha uma publicação com seu conteúdo, status de publicação por site e dados analíticos. Consulte este método periodicamente após a criação até que status seja 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
Exclua uma publicação e remova-a de todos os sites nos quais ela foi publicada.
client.posts.delete(post_id: str) -> APIObjectclient.posts.delete("U29jaWFsUG9zdDo0NDEyMg==")posts.list_for_location
Liste as campanhas de publicação direcionadas a um local. A paginação usa offset: o resultado contém .records e .pageInfo com totalPages, totalRecords e hasNextPage. A resposta vem em postsByLocation.
Esta rota rejeita um tag, portanto, desde a versão 0.5.3, o SDK aceita o argumento para manter a compatibilidade com versões anteriores e nunca o transmite. Use posts.bulk_list_for_location quando precisar filtrar por tags.
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
Obtenha uma campanha em massa (para vários locais) com status de publicação e dados analíticos por local.
client.posts.bulk_retrieve(bulk_post_id: str) -> APIObjectbulk = client.posts.bulk_retrieve("QnVsa1Bvc3Q6OTk=")print(bulk.status)posts.bulk_list_for_location
Liste as campanhas em massa (para vários locais) que incluem um local. Os parâmetros e a estrutura do resultado são os mesmos 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)