Públicos salvos da conta. Use o id em persona_id: a campanha herda idade, gênero, locais, interesses e grupos de interesses (o que vier em targeting sobrescreve, campo a campo).
Salva um público para reaproveitar nas campanhas e nos padrões. Aparece também no painel, no passo Público dos assistentes.
Corpo
name
obrigatório
string
Nome (até 120 caracteres).
description
string
Quem é esse cliente (até 2000).
source
string
manual (padrão) ou ai, quando vier de POST /personas/generate.
targeting.countries
string[]
Países (GET /reference). Sem país nem cidade, o Brasil.
targeting.cities
object[]
Cidades {key, name, country_code, radius_km} de GET /targeting/cities.
targeting.age_min
integer
De 13 a 65 (padrão 18).
targeting.age_max
integer
De 13 a 65 (padrão 65).
targeting.gender
string
all, male ou female.
targeting.interests
object[]
Interesses {id, name} de GET /targeting/interests: basta ter um deles (OU).
targeting.narrow_interests
object[][]
Grupos que o público também precisa ter: um interesse de cada grupo (E), além de um da lista principal (OU). Até 3 grupos. Na campanha, não combina com Advantage+ público.
Exemplo
cURL
curl -X POST "https://leadgo.com.br/api/v1/personas" \
-H "Authorization: Bearer $LEADGO_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "Mães que trabalham fora",
"description": "Mulheres de 28 a 45 anos, com filhos pequenos, sem tempo para cozinhar.",
"targeting": {
"countries": [
"BR"
],
"age_min": 28,
"age_max": 45,
"gender": "female",
"interests": [
{
"id": "6003107902433",
"name": "Maternidade"
}
]
}
}'
Resposta 201
HTTP 201
{
"data": {
"id": 5,
"name": "Mães que trabalham fora",
"description": "Mulheres de 28 a 45 anos, com filhos pequenos, sem tempo para cozinhar.",
"source": "manual",
"targeting": {
"countries": [
"BR"
],
"cities": [],
"age_min": 28,
"age_max": 45,
"gender": "female",
"interests": [
{
"id": "6003107902433",
"name": "Maternidade"
}
],
"narrow_interests": []
},
"created_at": "2026-10-10T12:00:00+00:00",
"updated_at": "2026-10-10T12:00:00+00:00"
}
}
Só o que vier muda; os campos de targeting enviados vão por cima dos atuais, um a um (enviar targeting.interests troca a lista toda; targeting.narrow_interests troca todos os grupos, e [] tira). Campanhas já criadas não mudam.
Corpo
name
string
Novo nome.
description
string
Nova descrição (null apaga).
targeting.countries
string[]
Países (GET /reference). Sem país nem cidade, o Brasil.
targeting.cities
object[]
Cidades {key, name, country_code, radius_km} de GET /targeting/cities.
targeting.age_min
integer
De 13 a 65 (padrão 18).
targeting.age_max
integer
De 13 a 65 (padrão 65).
targeting.gender
string
all, male ou female.
targeting.interests
object[]
Interesses {id, name} de GET /targeting/interests: basta ter um deles (OU).
targeting.narrow_interests
object[][]
Grupos que o público também precisa ter: um interesse de cada grupo (E), além de um da lista principal (OU). Até 3 grupos. Na campanha, não combina com Advantage+ público.
O "Criar com a IA" das personas: a partir do que o negócio vende e para quem, a IA sugere nome, descrição, idade, gênero, interesses e, quando o público pede um cruzamento, grupos de interesses em narrow_interests (procurados na Meta; os que não acharmos voltam em unresolved_keywords). Nada é salvo: revise e envie em POST /personas. Leva de 10 a 40 segundos. Limite de 10 por hora por pessoa, somado ao painel.
Corpo
prompt
obrigatório
string
O que o negócio vende e para quem (de 10 a 2000 caracteres).
Exemplo
cURL
curl -X POST "https://leadgo.com.br/api/v1/personas/generate" \
-H "Authorization: Bearer $LEADGO_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Marmitas fitness congeladas com entrega em São Paulo, para quem trabalha o dia todo e quer comer bem."
}'
Resposta 200
HTTP 200
{
"data": {
"name": "Profissional sem tempo",
"description": "Adultos de 25 a 45 anos que trabalham fora e cuidam da alimentação.",
"source": "ai",
"targeting": {
"countries": [
"BR"
],
"cities": [],
"age_min": 25,
"age_max": 45,
"gender": "all",
"interests": [
{
"id": "6003384248805",
"name": "Alimentação saudável"
}
],
"narrow_interests": []
},
"unresolved_keywords": [
"marmita fit"
]
}
}
Configurações prontas para reaproveitar (POST /templates/{id}/campaigns). Em creatives, um item por anúncio: has_media diz se o padrão já guarda a mídia daquele anúncio (no carrossel, de cada cartão, em cards).
Um padrão de campanha, com o rascunho completo em draft. Em creatives, um item por anúncio, na ordem: arte e vídeo trazem template_media_index, media_type e has_media; o carrossel traz media_type carousel e, em cards, o template_media_index e o has_media de cada cartão. Use esses índices em creatives[].template_media_index e creatives[].cards[].template_media_index.
Congela a configuração da campanha (objetivo, verba, público, textos e mídias) para a próxima nascer igual. Vale para as criadas aqui e para as importadas da Meta (essas gastam a cota de consultas à plataforma). O público vira uma persona nova (new_persona), usa uma existente (existing_persona) ou fica só no padrão (inline, o padrão). Com replace_template_id, atualiza um padrão que já existe em vez de criar outro. Campanhas com carrossel viram padrão com a imagem de cada cartão; posts impulsionados, não.
Corpo
name
obrigatório
string
Nome do padrão (até 120).
description
string
Até 500 caracteres.
audience.mode
string
new_persona, existing_persona ou inline (padrão).
audience.persona_name
string
Com new_persona: nome da persona criada.
audience.persona_id
integer
Com existing_persona: a persona a usar.
replace_template_id
integer
Padrão a atualizar (responde 200 em vez de 201).
Exemplo
cURL
curl -X POST "https://leadgo.com.br/api/v1/campaigns/{id}/template" \
-H "Authorization: Bearer $LEADGO_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "Oferta da semana",
"audience": {
"mode": "new_persona",
"persona_name": "Público da oferta da semana"
}
}'
Edita o padrão por completo, menos o objetivo e a conta de anúncio. Só com name, description e persona_id, troca esses campos sem conferir a configuração (persona_id null tira a persona: vale o público guardado no padrão). Com qualquer outro campo, aceita os mesmos de POST /templates/{id}/campaigns (verba, público, posicionamentos, lance, link, rastreamento, mensagem do WhatsApp, textos, mídias, carrossel e variações de texto), todos opcionais, mais duration_days, com a mesma junção: objetos se mesclam campo a campo, listas são trocadas inteiras e, em creatives, sai só o que veio ({} mantém o anúncio do padrão daquela posição; media_id ou cards trocam o anúncio, inclusive o tipo; cards troca a lista inteira). As regras são as de criar campanha, na conta de anúncio do padrão (verba mínima, Pixel, públicos), mas a mídia pode faltar: anúncio ou cartão sem mídia fica sem mídia guardada, e ela é pedida ao usar o padrão. A mídia enviada é conferida: media_id da biblioteca sobe para o armazenamento e vira mídia guardada, e template_media_index aponta uma que o padrão já tem. Para manter a imagem de um cartão ao reenviar cards, envie o template_media_index dele (GET /templates/{id}). Com persona, o público vem dela; de targeting, seguem do padrão audience_id, excluded_cities, excluded_audience_ids, languages e advantage_audience, e o público guardado no padrão fica como está (é o que vale com persona_id null). Quando o público tem grupos de interesses (os da persona ou os enviados), o Advantage+ guardado sai sozinho; advantage_audience true enviado junto com grupos é recusado (422). goal diferente do padrão é recusado (422): para outro objetivo, crie outro padrão. schedule, status, lead_form e lead_form_id não entram: o padrão não guarda datas (a data de término sai de duration_days) e o formulário de cadastro segue o dele. Com orçamento total (lifetime), duration_days é obrigatório quando o padrão não tem duração. Com ?validate_only=true, confere do mesmo jeito e nada é gravado nem enviado ao armazenamento: a resposta é 200 com {"data": {"valid": true, "template": ...}}, o padrão como ficaria (a mídia da biblioteca aparece com has_media true). As campanhas já criadas com o padrão não mudam.
Parâmetros
validate_only
boolean
Só confere (200 com valid e o padrão como ficaria; nada é gravado e nenhuma mídia sobe).
Corpo
name
string
Novo nome.
description
string
Nova descrição (null apaga).
persona_id
integer
Persona do padrão (null tira).
duration_days
integer
Duração das campanhas criadas com o padrão, de 1 a 365 dias (null: sem data de término).
budget
object
type e amount_cents, como em POST /campaigns (verba mínima da conta do padrão).
targeting
object
Público, como em POST /campaigns (os campos enviados trocam os do padrão).
link_url
string
Link de destino.
tracking.url_tags
object[]
Parâmetros de URL extras {key, value}, somados aos 4 UTMs padrão ([] = nenhum extra).
creatives
object[]
Os anúncios do padrão, na ordem, como em POST /templates/{id}/campaigns. Ausente ou null: ficam como estão. Item sem mídia é aceito.
creatives[].media_id
string
Arte ou vídeo da biblioteca que passa a ser a mídia guardada do anúncio.
creatives[].template_media_index
integer
Mídia que o padrão já guarda (GET /templates/{id}), inclusive a de outra posição.
creatives[].cards
object[]
Os cartões do carrossel (troca a lista inteira, de 2 a 10).
creatives[].cards[].media_id
string
Imagem da biblioteca que passa a ser a imagem guardada do cartão.
creatives[].cards[].template_media_index
integer
Imagem guardada do cartão. Sem ela (nem media_id), o cartão fica sem imagem.