Páginas da documentação

Desenvolvedores · Referência · v1.2.0

Personas e padrões

Públicos salvos (à mão ou sugeridos pela IA) e padrões de campanha: criar, alterar, excluir e reaproveitar.

https://leadgo.com.br/api/v1 Baixar arquivo para IA OpenAPI 3.1 Criar token
GET /personas campaigns:read

Listar personas

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

Exemplo

cURL
curl -X GET "https://leadgo.com.br/api/v1/personas" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 200

HTTP 200
{
    "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"
        }
    ]
}
GET /personas/{id} campaigns:read

Consultar persona

Uma persona da conta.

Exemplo

cURL
curl -X GET "https://leadgo.com.br/api/v1/personas/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 200

HTTP 200
{
    "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"
    }
}

Erros: not_found

POST /personas campaigns:write

Criar persona

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"
    }
}

Erros: validation_failed

PATCH /personas/{id} campaigns:write

Alterar persona

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.

Exemplo

cURL
curl -X PATCH "https://leadgo.com.br/api/v1/personas/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "targeting": {
        "age_min": 30
    }
}'

Resposta 200

HTTP 200
{
    "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"
    }
}

Erros: validation_failed, not_found

DELETE /personas/{id} campaigns:write

Excluir persona

Os padrões que usavam a persona passam a usar o público guardado neles; campanhas já criadas não mudam.

Exemplo

cURL
curl -X DELETE "https://leadgo.com.br/api/v1/personas/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 204

Sem corpo.

Erros: not_found

POST /personas/generate ai:draft

Sugerir persona pela IA

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"
        ]
    }
}

Erros: validation_failed, ai_rate_limited, ai_unavailable, platform_quota_exceeded

GET /templates campaigns:read

Listar padrões de campanha

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

Exemplo

cURL
curl -X GET "https://leadgo.com.br/api/v1/templates" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 200

HTTP 200
{
    "data": [
        {
            "id": 9,
            "name": "Oferta da semana",
            "description": null,
            "goal": "traffic",
            "persona_id": null,
            "duration_days": 7,
            "uses_count": 12,
            "last_used_at": "2026-10-27T10:00:00+00:00",
            "creatives": [
                {
                    "template_media_index": 0,
                    "media_type": "image",
                    "has_media": true
                },
                {
                    "media_type": "carousel",
                    "cards": [
                        {
                            "template_media_index": 1,
                            "has_media": true
                        },
                        {
                            "template_media_index": 2,
                            "has_media": true
                        }
                    ]
                }
            ],
            "has_lead_form": false,
            "draft": {
                "name": "Oferta da semana",
                "goal": "traffic",
                "budget": {
                    "type": "daily",
                    "amount_cents": 3000
                },
                "link_url": "https://loja.exemplo.com.br"
            },
            "created_at": "2026-10-01T12:00:00+00:00"
        }
    ]
}
GET /templates/{id} campaigns:read

Consultar padrão

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.

Exemplo

cURL
curl -X GET "https://leadgo.com.br/api/v1/templates/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 200

HTTP 200
{
    "data": {
        "id": 9,
        "name": "Oferta da semana",
        "description": null,
        "goal": "traffic",
        "persona_id": null,
        "duration_days": 7,
        "uses_count": 12,
        "last_used_at": "2026-10-27T10:00:00+00:00",
        "creatives": [
            {
                "template_media_index": 0,
                "media_type": "image",
                "has_media": true
            },
            {
                "media_type": "carousel",
                "cards": [
                    {
                        "template_media_index": 1,
                        "has_media": true
                    },
                    {
                        "template_media_index": 2,
                        "has_media": true
                    }
                ]
            }
        ],
        "has_lead_form": false,
        "draft": {
            "name": "Oferta da semana",
            "goal": "traffic",
            "budget": {
                "type": "daily",
                "amount_cents": 3000
            },
            "link_url": "https://loja.exemplo.com.br"
        },
        "created_at": "2026-10-01T12:00:00+00:00"
    }
}

Erros: not_found

POST /campaigns/{id}/template campaigns:write

Criar padrão a partir de uma campanha

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"
    }
}'

Resposta 201

HTTP 201
{
    "data": {
        "id": 9,
        "name": "Oferta da semana",
        "description": null,
        "goal": "traffic",
        "persona_id": null,
        "duration_days": 7,
        "uses_count": 12,
        "last_used_at": "2026-10-27T10:00:00+00:00",
        "creatives": [
            {
                "template_media_index": 0,
                "media_type": "image",
                "has_media": true
            },
            {
                "media_type": "carousel",
                "cards": [
                    {
                        "template_media_index": 1,
                        "has_media": true
                    },
                    {
                        "template_media_index": 2,
                        "has_media": true
                    }
                ]
            }
        ],
        "has_lead_form": false,
        "draft": {
            "name": "Oferta da semana",
            "goal": "traffic",
            "budget": {
                "type": "daily",
                "amount_cents": 3000
            },
            "link_url": "https://loja.exemplo.com.br"
        },
        "created_at": "2026-10-01T12:00:00+00:00"
    }
}

Erros: validation_failed, not_found, campaign_not_templatable, operation_failed, platform_quota_exceeded, platform_unavailable

PATCH /templates/{id} campaigns:write

Alterar padrão

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.

Exemplo

cURL
curl -X PATCH "https://leadgo.com.br/api/v1/templates/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "budget": {
        "amount_cents": 6000
    },
    "duration_days": 14,
    "tracking": {
        "url_tags": [
            {
                "key": "utm_term",
                "value": "inverno"
            }
        ]
    },
    "creatives": [
        {
            "media_id": "01jbx3m7k2q8f5v9w4n6c0r1ht",
            "headline": "Coleção de inverno"
        }
    ]
}'

Resposta 200

HTTP 200
{
    "data": {
        "id": 9,
        "name": "Oferta da semana",
        "description": null,
        "goal": "traffic",
        "persona_id": null,
        "duration_days": 7,
        "uses_count": 12,
        "last_used_at": "2026-10-27T10:00:00+00:00",
        "creatives": [
            {
                "template_media_index": 0,
                "media_type": "image",
                "has_media": true
            },
            {
                "media_type": "carousel",
                "cards": [
                    {
                        "template_media_index": 1,
                        "has_media": true
                    },
                    {
                        "template_media_index": 2,
                        "has_media": true
                    }
                ]
            }
        ],
        "has_lead_form": false,
        "draft": {
            "name": "Oferta da semana",
            "goal": "traffic",
            "budget": {
                "type": "daily",
                "amount_cents": 3000
            },
            "link_url": "https://loja.exemplo.com.br"
        },
        "created_at": "2026-10-01T12:00:00+00:00"
    }
}

Erros: validation_failed, not_found, operation_failed, platform_quota_exceeded, platform_rejected, platform_unavailable, platform_rate_limited

DELETE /templates/{id} campaigns:write

Excluir padrão

As campanhas criadas com o padrão não mudam.

Exemplo

cURL
curl -X DELETE "https://leadgo.com.br/api/v1/templates/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 204

Sem corpo.

Erros: not_found