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:

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

Python
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,) -> APIObject
ArgumentoTipoDescrição
namestrNome interno da campanha (não exibido aos clientes). Obrigatório.
location_idslist[str | int]Todos os locais nos quais publicar (IDs numéricos ou em base64). Obrigatório.
messagestr | dictCorpo da publicação para todos os sites ou um dict por site. Obrigatório.
siteslist[str]Sites de destino. O padrão é ["GOOGLE", "FACEBOOK"].
post_typestrANNOUNCEMENT (padrão), EVENT, OFFER, COVID19 ou PRODUCT.
cta_typestrBotão de chamada para ação opcional; requer cta_url.
cta_urlstrDestino do botão de CTA.
media_urlstrURL pública opcional de uma imagem a ser anexada em todos os sites.
scheduled_datesdictPeríodo opcional de {"startDatetime", "endDatetime"}.
context_infodictDetalhes do evento ou da oferta quando exigidos por post_type.
additional_fieldsdictCampos adicionais de camelCase, sem aninhamento, incorporados sem alterações.
Python
result = 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 async

posts.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"].

Python
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,) -> APIObject
Python
result = 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".

Python
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,) -> APIObject
Python
result = 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.

Python
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,) -> APIObject
Python
result = 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.

Python
client.posts.create(body: dict) -> APIObject

Obrigatórios: postName, locationIds (base64), postType, postSites.

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

Python
client.posts.retrieve(post_id: str) -> APIObject
Python
post = 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.

Python
client.posts.delete(post_id: str) -> APIObject
Python
client.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.

Python
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,) -> APIObject
Python
result = 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.

Python
client.posts.bulk_retrieve(bulk_post_id: str) -> APIObject
Python
bulk = 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.

Python
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,) -> APIObject
Python
result = client.posts.bulk_list_for_location(16808, page=1, per_page=10)for campaign in result.records:  print(campaign.id, campaign.name)

Veja também

  • Locais: crie e gerencie os locais em que você publica
  • Listagens: verifique o status de sincronização de cada local
  • Análises: análises de perfis no Google, Bing e Facebook