Páginas da documentação

Desenvolvedores · Referência · v1.2.0

Campanhas

Criar, consultar, alterar, duplicar e excluir campanhas, pelas mesmas rotinas do painel.

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

Listar campanhas

Campanhas da conta (criadas pela API, pelo painel e as importadas da Meta), das mais novas para as mais antigas, paginadas por cursor.

Parâmetros

status string creating, failed, pending_review, active, paused, rejected, error, completed ou cancelled.
goal string Objetivo (veja GET /reference).
search string Parte do nome da campanha.
limit integer Itens por página, de 1 a 100 (padrão 25).
cursor string Valor de meta.next_cursor (ou siga links.next).

Exemplo

cURL
curl -X GET "https://leadgo.com.br/api/v1/campaigns?status=active&limit=25" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json"

Resposta 200

HTTP 200
{
    "data": [
        {
            "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
            "name": "Promoção de outubro",
            "goal": "traffic",
            "goal_label": "Tráfego",
            "status": "active",
            "status_label": "Ativa",
            "created_via": "api",
            "budget": {
                "level": "campaign",
                "type": "daily",
                "amount_cents": 5000,
                "currency": "BRL"
            },
            "schedule": {
                "starts_at": "2026-10-28T03:00:00+00:00",
                "ends_at": null
            },
            "error": null,
            "platform": "meta",
            "platform_campaign_id": "120212345678900001",
            "published_at": "2026-10-28T15:02:11+00:00",
            "synced_at": "2026-10-28T15:40:00+00:00",
            "created_at": "2026-10-28T15:00:00+00:00",
            "updated_at": "2026-10-28T15:02:11+00:00",
            "links": {
                "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
            }
        }
    ],
    "links": {
        "first": null,
        "last": null,
        "prev": null,
        "next": "https://app.leadgo.com.br/api/v1/campaigns?cursor=eyJjcmVhdGVkX2F0Ijo..."
    },
    "meta": {
        "path": "https://app.leadgo.com.br/api/v1/campaigns",
        "per_page": 25,
        "next_cursor": "eyJjcmVhdGVkX2F0Ijo...",
        "prev_cursor": null
    }
}

Erros: validation_failed

POST /campaigns campaigns:write Idempotency-Key

Criar campanha

Cria a campanha pelas mesmas rotinas do painel: ela é gravada com status creating e a publicação na Meta segue pela fila (a resposta é 202, com Location). O fim chega pelo webhook campaign.published ou campaign.failed, ou consultando GET /campaigns/{id}. Com ?validate_only=true nada é criado: a resposta traz o rascunho como seria publicado, com os padrões aplicados (Pixel, datas, público). Os campos que faltarem seguem os padrões do assistente do painel. Cada item de creatives é um anúncio do mesmo conjunto: arte ou vídeo (media_id) ou carrossel (cards, um por campanha), até 10; do segundo item em diante, o título, o texto, a descrição e o botão que faltarem vêm do primeiro. Na resposta, um carrossel sozinho volta no formato antigo (format carousel, carousel.cards); junto de arte ou vídeo, volta no próprio item (media_type carousel, cards). Todo anúncio novo, de qualquer objetivo, sai com "Eventos do site" marcado (o Pixel é obrigatório: veja tracking.pixel_id; sem Pixel para escolher, 422 nesse campo) e sempre com os 4 UTMs padrão; tracking.url_tags acrescenta extras ou troca o valor de um dos 4.

Parâmetros

validate_only boolean Só confere o corpo (200, nada é criado).

Corpo

name obrigatório string Nome da campanha (até 120 caracteres).
goal obrigatório string traffic, awareness, engagement, video_views, conversions, lead_generation ou whatsapp_messages.
status string paused (padrão) ou active: como a campanha nasce depois de aprovada.
budget.type string daily (padrão) ou lifetime (total, exige schedule.end_date).
budget.amount_cents obrigatório integer Valor em centavos (5000 = R$ 50,00). A diária respeita a mínima da conta.
schedule.start_date string AAAA-MM-DD no fuso da conta (padrão: hoje).
schedule.end_date string AAAA-MM-DD, depois do início. Obrigatória no orçamento total.
tracking.pixel_id string Pixel que marca "Eventos do site" nos anúncios, em qualquer objetivo (nas conversões, é também o Pixel que elas otimizam). Obrigatório: todo anúncio novo sai com ele. Sem pixel_id, vale o padrão da conta (default_pixel_id em GET /ad-account) e, sem padrão, o único que ela enxerga (GET /ad-account/pixels), que passa a ser o padrão. Com vários Pixels e nenhum padrão, sem nenhum Pixel ou com a consulta fora do ar, a campanha é recusada com 422 neste campo. Nas respostas, mostra o Pixel escolhido.
tracking.conversion_event string PURCHASE (padrão), LEAD, COMPLETE_REGISTRATION, ADD_TO_CART ou INITIATED_CHECKOUT.
special_ad_category string HOUSING, EMPLOYMENT, CREDIT, FINANCIAL_PRODUCTS_SERVICES ou ISSUES_ELECTIONS_POLITICS (anúncios desses temas têm segmentação restrita pela Meta).
persona_id integer Persona da conta: a base do público (targeting sobrescreve campo a campo).
targeting.countries string[] Países (padrão BR). Com cidades, o país sai delas.
targeting.cities object[] Cidades {key, name, country_code} de GET /targeting/cities (até 25).
targeting.age_min integer 13 a 65 (padrão 18).
targeting.age_max integer 13 a 65, maior ou igual à mínima (padrão 65).
targeting.gender string all (padrão), male ou female.
targeting.interests object[] Interesses {id, name} de GET /targeting/interests (até 25): 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 de até 25 interesses {id, name}. Não combina com Advantage+ público. Com persona, [] tira os grupos dela.
targeting.cities[].radius_km integer Raio em volta da cidade: 17, 25, 40, 50, 80 km (sem raio, só a cidade).
targeting.audience_id string Público da conta a incluir (platform_audience_id de GET /audiences).
targeting.excluded_audience_ids string[] Públicos a excluir (até 10), como quem já comprou.
targeting.excluded_cities object[] Cidades a excluir {key, name} de GET /targeting/cities (até 25).
targeting.languages string[] pt, es, en (sem idioma, todos).
targeting.advantage_audience boolean Deixa a Meta ampliar o público além do definido (Advantage+ público). Padrão false. Não vale com targeting.narrow_interests.
placements string[] Posicionamentos manuais (veja GET /reference). Vazio ou ausente: automáticos, o recomendado.
tracking.url_tags object[] UTMs extras {key, value}, somadas ao link de todos os anúncios. Os 4 padrão vão sempre (utm_source=facebook, utm_medium=paid, utm_campaign={{campaign.name}}, utm_content={{ad.name}}): ausente ou [], a campanha sai só com eles. Um extra com a chave de um dos 4 troca o valor dele (ex.: utm_campaign=blackfriday); os demais vêm depois, na ordem enviada. Até 10 extras: as chaves dos 4 não contam, então reenviar a lista de uma resposta passa. Aceita as macros da Meta, como {{campaign.name}} e {{ad.name}}. Vale em todo objetivo, inclusive cadastro e WhatsApp. Nas respostas, mostra a lista efetiva: os 4 (com o valor trocado, quando houver) e os extras.
instagram_account_id string Perfil do Instagram do anúncio (GET /ad-account/instagram-accounts). Sem ele, o ligado à Página. Não vale no WhatsApp.
bidding.strategy string COST_CAP (custo por resultado), LOWEST_COST_WITH_BID_CAP (lance máximo) ou LOWEST_COST_WITH_MIN_ROAS (ROAS mínimo, só vendas com Compra). Sem ela, lance automático.
bidding.amount_cents integer Valor em centavos, obrigatório em COST_CAP e LOWEST_COST_WITH_BID_CAP.
bidding.roas_floor number Retorno mínimo (2.5 = 2,5x), obrigatório em LOWEST_COST_WITH_MIN_ROAS.
format string single (padrão) ou carousel, o formato antigo do carrossel sozinho (segue aceito): um criativo só (texto principal, título e botão) e as imagens em carousel.cards. Para juntar o carrossel com arte ou vídeo, use creatives[].cards.
carousel.cards[].media_id string Formato antigo: imagem pronta da biblioteca de cada cartão (2 a 10 cartões).
carousel.cards[].headline string Título do cartão (obrigatório em cada cartão).
carousel.cards[].description string Descrição do cartão.
carousel.cards[].link_url string Link do cartão (padrão: link_url).
carousel.cards[].call_to_action string Botão do cartão (padrão: o do criativo).
carousel.optimize_order boolean true (padrão): a Meta reordena os cartões pelo desempenho. false: ordem fixa, até 5 cartões.
text_variations.headlines string[] Até 4 títulos alternativos que a Meta alterna (só num anúncio simples: um criativo, sem carrossel, objetivos com link).
text_variations.bodies string[] Até 4 textos principais alternativos.
link_url string URL https de destino. Obrigatória nos objetivos com link (veja needs_link em GET /reference).
creatives[].media_id string Arte ou vídeo pronto da biblioteca (POST /media): o tipo do anúncio sai da mídia. Cada item de creatives é um anúncio do mesmo conjunto, até 10. Cada item leva media_id ou cards, nunca os dois.
creatives[].headline obrigatório string Título (até 255). Obrigatório no primeiro item; nos demais, sem ele, vale o do primeiro.
creatives[].body obrigatório string Texto principal (até 2000). Obrigatório no primeiro item; nos demais, sem ele, vale o do primeiro.
creatives[].description string Descrição (até 255). Do segundo item em diante, sem ela, vale a do primeiro; envie null para o anúncio sair sem descrição.
creatives[].call_to_action string Botão (padrão LEARN_MORE; veja GET /reference). Do segundo item em diante, sem ele, vale o do primeiro; null volta ao LEARN_MORE. No WhatsApp, ignorado.
creatives[].cards object[] Carrossel: de 2 a 10 cartões, só imagens. Um carrossel por campanha, ao lado de artes e vídeos. Vale em todos os objetivos, menos video_views.
creatives[].cards[].media_id string Imagem (JPG ou PNG) da biblioteca para o cartão (obrigatória em cada cartão).
creatives[].cards[].headline string Título do cartão (obrigatório em cada cartão).
creatives[].cards[].description string Descrição do cartão.
creatives[].cards[].link_url string Link do cartão (padrão: link_url). No WhatsApp, não envie: o toque no cartão abre a conversa.
creatives[].cards[].call_to_action string Botão do cartão (padrão: o do anúncio). No WhatsApp, não envie: o botão é sempre o de conversa.
creatives[].optimize_order boolean No item com cards: true (padrão), a Meta reordena os cartões pelo desempenho; false, ordem fixa, até 5 cartões.
whatsapp.greeting string Boas-vindas da empresa na conversa (objetivo whatsapp_messages).
whatsapp.prefill string Mensagem que já vem digitada para o cliente enviar.
whatsapp.phone_number string Número em E.164 (+5511999998888); sem ele, o da Página.
lead_form_id string Formulário existente (platform_form_id de GET /ad-account/lead-forms), no objetivo lead_generation.
lead_form.name string Nome do formulário novo (padrão: o da campanha).
lead_form.fields string[] Campos padrão: FULL_NAME, EMAIL, PHONE, CITY, STATE, ZIP, COMPANY_NAME, JOB_TITLE (nome e telefone sempre entram).
lead_form.questions object[] Até 3 perguntas {question, options[]} (sem options, resposta livre).
lead_form.privacy_policy_url string Política de privacidade (padrão: a de Leads › Configurações; a Meta exige).
lead_form.thank_you.title string Título da tela final (obrigatório com lead_form).
lead_form.thank_you.body string Texto da tela final (obrigatório com lead_form).

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/campaigns" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Promoção de outubro",
    "goal": "traffic",
    "status": "paused",
    "budget": {
        "type": "daily",
        "amount_cents": 5000
    },
    "targeting": {
        "countries": [
            "BR"
        ],
        "age_min": 25,
        "age_max": 55,
        "gender": "all"
    },
    "link_url": "https://loja.exemplo.com.br/outubro",
    "creatives": [
        {
            "media_id": "01jbx3m7k2q8f5v9w4n6c0r1ht",
            "headline": "Outono com 30% off",
            "body": "Peças selecionadas com frete grátis até domingo.",
            "call_to_action": "SHOP_NOW"
        }
    ]
}'

Resposta 202

HTTP 202
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "creating",
        "status_label": "Publicando",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": null,
        "published_at": null,
        "synced_at": null,
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "draft": {
            "name": "Promoção de outubro",
            "goal": "traffic",
            "status": "paused",
            "budget": {
                "type": "daily",
                "amount_cents": 5000
            },
            "schedule": {
                "start_date": "2026-10-28",
                "end_date": null
            },
            "tracking": {
                "pixel_id": "123456789012345",
                "conversion_event": null,
                "url_tags": [
                    {
                        "key": "utm_source",
                        "value": "facebook"
                    },
                    {
                        "key": "utm_medium",
                        "value": "paid"
                    },
                    {
                        "key": "utm_campaign",
                        "value": "{{campaign.name}}"
                    },
                    {
                        "key": "utm_content",
                        "value": "{{ad.name}}"
                    }
                ]
            },
            "special_ad_category": null,
            "targeting": {
                "countries": [
                    "BR"
                ],
                "cities": [],
                "age_min": 25,
                "age_max": 55,
                "gender": "all",
                "interests": [],
                "narrow_interests": [],
                "audience_id": null
            },
            "link_url": "https://loja.exemplo.com.br/outubro",
            "creatives": [
                {
                    "media_type": "image",
                    "headline": "Outono com 30% off",
                    "body": "Peças selecionadas com frete grátis até domingo.",
                    "call_to_action": "SHOP_NOW"
                }
            ],
            "whatsapp": null,
            "lead_form": null
        },
        "ad_sets": [],
        "brain": {
            "mode": null,
            "effective_mode": "manual",
            "target_cpa_cents": null,
            "target_roas": null,
            "effective_target_cpa_cents": 3000,
            "effective_target_roas": null,
            "locked_until": null,
            "last_touched_at": null,
            "last_touched_by": null
        },
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: validation_failed, ad_account_not_linked, too_many_publishing, campaign_creation_limit, idempotency_key_reused, idempotency_in_progress

POST /campaigns/preview campaigns:write

Prévia antes de criar

Recebe o mesmo corpo de POST /campaigns e devolve a prévia da Meta de cada posicionamento, sem criar nada. Com vários anúncios, escolha qual em ?creative= (o primeiro é 0): o carrossel é o anúncio da posição dele em creatives e aparece com todos os cartões; no carrossel sozinho, é sempre 0. url é o endereço da prévia para um <iframe> (expira em minutos). Vale para arte e carrossel em anúncios com link; vídeo e WhatsApp respondem preview_unavailable.

Parâmetros

creative integer Posição do anúncio em creatives (padrão 0).
formats string Formatos separados por vírgula (veja GET /ads/{id}/preview).

Corpo

name obrigatório string Nome da campanha (até 120 caracteres).
goal obrigatório string traffic, awareness, engagement, video_views, conversions, lead_generation ou whatsapp_messages.
status string paused (padrão) ou active: como a campanha nasce depois de aprovada.
budget.type string daily (padrão) ou lifetime (total, exige schedule.end_date).
budget.amount_cents obrigatório integer Valor em centavos (5000 = R$ 50,00). A diária respeita a mínima da conta.
schedule.start_date string AAAA-MM-DD no fuso da conta (padrão: hoje).
schedule.end_date string AAAA-MM-DD, depois do início. Obrigatória no orçamento total.
tracking.pixel_id string Pixel que marca "Eventos do site" nos anúncios, em qualquer objetivo (nas conversões, é também o Pixel que elas otimizam). Obrigatório: todo anúncio novo sai com ele. Sem pixel_id, vale o padrão da conta (default_pixel_id em GET /ad-account) e, sem padrão, o único que ela enxerga (GET /ad-account/pixels), que passa a ser o padrão. Com vários Pixels e nenhum padrão, sem nenhum Pixel ou com a consulta fora do ar, a campanha é recusada com 422 neste campo. Nas respostas, mostra o Pixel escolhido.
tracking.conversion_event string PURCHASE (padrão), LEAD, COMPLETE_REGISTRATION, ADD_TO_CART ou INITIATED_CHECKOUT.
special_ad_category string HOUSING, EMPLOYMENT, CREDIT, FINANCIAL_PRODUCTS_SERVICES ou ISSUES_ELECTIONS_POLITICS (anúncios desses temas têm segmentação restrita pela Meta).
persona_id integer Persona da conta: a base do público (targeting sobrescreve campo a campo).
targeting.countries string[] Países (padrão BR). Com cidades, o país sai delas.
targeting.cities object[] Cidades {key, name, country_code} de GET /targeting/cities (até 25).
targeting.age_min integer 13 a 65 (padrão 18).
targeting.age_max integer 13 a 65, maior ou igual à mínima (padrão 65).
targeting.gender string all (padrão), male ou female.
targeting.interests object[] Interesses {id, name} de GET /targeting/interests (até 25): 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 de até 25 interesses {id, name}. Não combina com Advantage+ público. Com persona, [] tira os grupos dela.
targeting.cities[].radius_km integer Raio em volta da cidade: 17, 25, 40, 50, 80 km (sem raio, só a cidade).
targeting.audience_id string Público da conta a incluir (platform_audience_id de GET /audiences).
targeting.excluded_audience_ids string[] Públicos a excluir (até 10), como quem já comprou.
targeting.excluded_cities object[] Cidades a excluir {key, name} de GET /targeting/cities (até 25).
targeting.languages string[] pt, es, en (sem idioma, todos).
targeting.advantage_audience boolean Deixa a Meta ampliar o público além do definido (Advantage+ público). Padrão false. Não vale com targeting.narrow_interests.
placements string[] Posicionamentos manuais (veja GET /reference). Vazio ou ausente: automáticos, o recomendado.
tracking.url_tags object[] UTMs extras {key, value}, somadas ao link de todos os anúncios. Os 4 padrão vão sempre (utm_source=facebook, utm_medium=paid, utm_campaign={{campaign.name}}, utm_content={{ad.name}}): ausente ou [], a campanha sai só com eles. Um extra com a chave de um dos 4 troca o valor dele (ex.: utm_campaign=blackfriday); os demais vêm depois, na ordem enviada. Até 10 extras: as chaves dos 4 não contam, então reenviar a lista de uma resposta passa. Aceita as macros da Meta, como {{campaign.name}} e {{ad.name}}. Vale em todo objetivo, inclusive cadastro e WhatsApp. Nas respostas, mostra a lista efetiva: os 4 (com o valor trocado, quando houver) e os extras.
instagram_account_id string Perfil do Instagram do anúncio (GET /ad-account/instagram-accounts). Sem ele, o ligado à Página. Não vale no WhatsApp.
bidding.strategy string COST_CAP (custo por resultado), LOWEST_COST_WITH_BID_CAP (lance máximo) ou LOWEST_COST_WITH_MIN_ROAS (ROAS mínimo, só vendas com Compra). Sem ela, lance automático.
bidding.amount_cents integer Valor em centavos, obrigatório em COST_CAP e LOWEST_COST_WITH_BID_CAP.
bidding.roas_floor number Retorno mínimo (2.5 = 2,5x), obrigatório em LOWEST_COST_WITH_MIN_ROAS.
format string single (padrão) ou carousel, o formato antigo do carrossel sozinho (segue aceito): um criativo só (texto principal, título e botão) e as imagens em carousel.cards. Para juntar o carrossel com arte ou vídeo, use creatives[].cards.
carousel.cards[].media_id string Formato antigo: imagem pronta da biblioteca de cada cartão (2 a 10 cartões).
carousel.cards[].headline string Título do cartão (obrigatório em cada cartão).
carousel.cards[].description string Descrição do cartão.
carousel.cards[].link_url string Link do cartão (padrão: link_url).
carousel.cards[].call_to_action string Botão do cartão (padrão: o do criativo).
carousel.optimize_order boolean true (padrão): a Meta reordena os cartões pelo desempenho. false: ordem fixa, até 5 cartões.
text_variations.headlines string[] Até 4 títulos alternativos que a Meta alterna (só num anúncio simples: um criativo, sem carrossel, objetivos com link).
text_variations.bodies string[] Até 4 textos principais alternativos.
link_url string URL https de destino. Obrigatória nos objetivos com link (veja needs_link em GET /reference).
creatives[].media_id string Arte ou vídeo pronto da biblioteca (POST /media): o tipo do anúncio sai da mídia. Cada item de creatives é um anúncio do mesmo conjunto, até 10. Cada item leva media_id ou cards, nunca os dois.
creatives[].headline obrigatório string Título (até 255). Obrigatório no primeiro item; nos demais, sem ele, vale o do primeiro.
creatives[].body obrigatório string Texto principal (até 2000). Obrigatório no primeiro item; nos demais, sem ele, vale o do primeiro.
creatives[].description string Descrição (até 255). Do segundo item em diante, sem ela, vale a do primeiro; envie null para o anúncio sair sem descrição.
creatives[].call_to_action string Botão (padrão LEARN_MORE; veja GET /reference). Do segundo item em diante, sem ele, vale o do primeiro; null volta ao LEARN_MORE. No WhatsApp, ignorado.
creatives[].cards object[] Carrossel: de 2 a 10 cartões, só imagens. Um carrossel por campanha, ao lado de artes e vídeos. Vale em todos os objetivos, menos video_views.
creatives[].cards[].media_id string Imagem (JPG ou PNG) da biblioteca para o cartão (obrigatória em cada cartão).
creatives[].cards[].headline string Título do cartão (obrigatório em cada cartão).
creatives[].cards[].description string Descrição do cartão.
creatives[].cards[].link_url string Link do cartão (padrão: link_url). No WhatsApp, não envie: o toque no cartão abre a conversa.
creatives[].cards[].call_to_action string Botão do cartão (padrão: o do anúncio). No WhatsApp, não envie: o botão é sempre o de conversa.
creatives[].optimize_order boolean No item com cards: true (padrão), a Meta reordena os cartões pelo desempenho; false, ordem fixa, até 5 cartões.
whatsapp.greeting string Boas-vindas da empresa na conversa (objetivo whatsapp_messages).
whatsapp.prefill string Mensagem que já vem digitada para o cliente enviar.
whatsapp.phone_number string Número em E.164 (+5511999998888); sem ele, o da Página.
lead_form_id string Formulário existente (platform_form_id de GET /ad-account/lead-forms), no objetivo lead_generation.
lead_form.name string Nome do formulário novo (padrão: o da campanha).
lead_form.fields string[] Campos padrão: FULL_NAME, EMAIL, PHONE, CITY, STATE, ZIP, COMPANY_NAME, JOB_TITLE (nome e telefone sempre entram).
lead_form.questions object[] Até 3 perguntas {question, options[]} (sem options, resposta livre).
lead_form.privacy_policy_url string Política de privacidade (padrão: a de Leads › Configurações; a Meta exige).
lead_form.thank_you.title string Título da tela final (obrigatório com lead_form).
lead_form.thank_you.body string Texto da tela final (obrigatório com lead_form).

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/campaigns/preview?formats=INSTAGRAM_STORY%2CMOBILE_FEED_STANDARD" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Promoção de outubro",
    "goal": "traffic",
    "status": "paused",
    "budget": {
        "type": "daily",
        "amount_cents": 5000
    },
    "targeting": {
        "countries": [
            "BR"
        ],
        "age_min": 25,
        "age_max": 55,
        "gender": "all"
    },
    "link_url": "https://loja.exemplo.com.br/outubro",
    "creatives": [
        {
            "media_id": "01jbx3m7k2q8f5v9w4n6c0r1ht",
            "headline": "Outono com 30% off",
            "body": "Peças selecionadas com frete grátis até domingo.",
            "call_to_action": "SHOP_NOW"
        }
    ]
}'

Resposta 200

HTTP 200
{
    "data": {
        "creative": 0,
        "previews": [
            {
                "format": "INSTAGRAM_STORY",
                "label": "Stories do Instagram",
                "url": "https://www.facebook.com/ads/api/preview_iframe.php?d=AQ...&t=AQ...",
                "html": "<iframe src=\"https://www.facebook.com/ads/api/preview_iframe.php?d=AQ...&t=AQ...\" width=\"274\" height=\"213\" scrolling=\"yes\" style=\"border: none;\"></iframe>"
            }
        ]
    }
}

Erros: validation_failed, preview_unavailable, ad_account_not_linked, platform_quota_exceeded, platform_rejected

POST /boosts campaigns:write Idempotency-Key

Impulsionar post

Transforma um post que já está no Facebook ou no Instagram em anúncio, mantendo as curtidas e os comentários. Cria campanha, conjunto e anúncio pela mesma fila da criação (202, status creating; o fim chega por campaign.published ou campaign.failed). Posts do Instagram vêm de GET /ad-account/instagram-posts; no Facebook, use {idDaPágina}_{idDoPost}. Objetivos: engagement, traffic, awareness, video_views (tráfego leva link_url e call_to_action). O criativo de um post impulsionado não muda depois (boost_creative_locked). O anúncio sai com "Eventos do site" marcado, com o Pixel escolhido como em POST /campaigns (tracking.pixel_id, o padrão da conta ou o único que ela enxerga; sem Pixel para escolher, 422 em tracking.pixel_id, também no validate_only), e com os 4 UTMs padrão, em todo objetivo (o impulsionamento não aceita extras). Com ?validate_only=true só confere o corpo.

Parâmetros

validate_only boolean Só confere (200, nada é criado).

Corpo

name obrigatório string Nome da campanha.
goal obrigatório string engagement, traffic, awareness, video_views.
post.source obrigatório string instagram ou facebook.
post.id obrigatório string Id da mídia do Instagram ou do post do Facebook ({idDaPágina}_{idDoPost}).
post.caption string Legenda, para mostrar no painel.
post.thumbnail_url string Imagem do post, para mostrar no painel.
post.permalink string Link público do post.
status string paused (padrão) ou active.
budget.type string daily (padrão) ou lifetime (exige schedule.end_date).
budget.amount_cents obrigatório integer Valor em centavos (respeita a mínima da conta).
schedule.start_date string AAAA-MM-DD no fuso da conta (padrão: hoje).
schedule.end_date string AAAA-MM-DD.
persona_id integer Persona como base do público.
targeting object Países, cidades (com radius_km), idade, gênero, interesses, grupos de interesses (narrow_interests) e audience_id, como em POST /campaigns.
link_url string Destino do botão (obrigatório em traffic).
call_to_action string Botão em traffic (padrão LEARN_MORE).
instagram_account_id string Perfil do Instagram com que o anúncio roda.
tracking.pixel_id string Pixel que marca "Eventos do site" no anúncio (GET /ad-account/pixels). Sem ele, o padrão da conta ou o único que ela enxerga, como em POST /campaigns. Na resposta, boost.tracking.pixel_id mostra o Pixel escolhido.

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/boosts" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Impulsionar | Coleção de verão",
    "goal": "engagement",
    "budget": {
        "amount_cents": 2000
    },
    "post": {
        "source": "instagram",
        "id": "17900000000000001"
    },
    "targeting": {
        "cities": [
            {
                "key": "269969",
                "name": "São Paulo, São Paulo",
                "country_code": "BR",
                "radius_km": 25
            }
        ],
        "age_min": 20,
        "age_max": 45
    }
}'

Resposta 202

HTTP 202
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Impulsionar | Coleção de verão",
        "goal": "engagement",
        "goal_label": "Engajamento",
        "status": "creating",
        "status_label": "Publicando",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": null,
        "published_at": null,
        "synced_at": null,
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        },
        "draft": null,
        "boost": {
            "name": "Impulsionar | Coleção de verão",
            "goal": "engagement",
            "status": "paused",
            "budget": {
                "type": "daily",
                "amount_cents": 2000
            },
            "post": {
                "source": "instagram",
                "id": "17900000000000001",
                "caption": null,
                "thumbnail_url": null,
                "permalink": null
            },
            "tracking": {
                "pixel_id": "123456789012345"
            }
        },
        "ad_sets": []
    }
}

Erros: validation_failed, ad_account_not_linked, too_many_publishing, campaign_creation_limit, idempotency_key_reused, idempotency_in_progress

GET /campaigns/{id} campaigns:read

Consultar campanha

A campanha com os conjuntos, os anúncios (com a situação da revisão da Meta) e, se foi criada pelo LeadGo, o rascunho de criação em draft. Em status failed, o motivo vem em error.message.

Exemplo

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

Resposta 200

HTTP 200
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "pending_review",
        "status_label": "Em análise",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": "120212345678900001",
        "published_at": "2026-10-28T15:02:11+00:00",
        "synced_at": "2026-10-28T15:40:00+00:00",
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "draft": {
            "name": "Promoção de outubro",
            "goal": "traffic",
            "status": "paused",
            "budget": {
                "type": "daily",
                "amount_cents": 5000
            },
            "schedule": {
                "start_date": "2026-10-28",
                "end_date": null
            },
            "tracking": {
                "pixel_id": "123456789012345",
                "conversion_event": null,
                "url_tags": [
                    {
                        "key": "utm_source",
                        "value": "facebook"
                    },
                    {
                        "key": "utm_medium",
                        "value": "paid"
                    },
                    {
                        "key": "utm_campaign",
                        "value": "{{campaign.name}}"
                    },
                    {
                        "key": "utm_content",
                        "value": "{{ad.name}}"
                    }
                ]
            },
            "special_ad_category": null,
            "targeting": {
                "countries": [
                    "BR"
                ],
                "cities": [],
                "age_min": 25,
                "age_max": 55,
                "gender": "all",
                "interests": [],
                "narrow_interests": [],
                "audience_id": null
            },
            "link_url": "https://loja.exemplo.com.br/outubro",
            "creatives": [
                {
                    "media_type": "image",
                    "headline": "Outono com 30% off",
                    "body": "Peças selecionadas com frete grátis até domingo.",
                    "call_to_action": "SHOP_NOW"
                }
            ],
            "whatsapp": null,
            "lead_form": null
        },
        "ad_sets": [
            {
                "id": 88,
                "campaign_id": "01jby0q4c8m2d6t9v3k7w5r1xa",
                "name": "Promoção de outubro - Público",
                "status": "pending_review",
                "budget": null,
                "optimization_goal": "LINK_CLICKS",
                "targeting": {
                    "geo_locations": {
                        "countries": [
                            "BR"
                        ]
                    },
                    "age_min": 25,
                    "age_max": 55
                },
                "platform_ad_set_id": "120212345678900002",
                "ads": [
                    {
                        "id": 140,
                        "campaign_id": "01jby0q4c8m2d6t9v3k7w5r1xa",
                        "ad_set_id": 88,
                        "name": "Promoção de outubro - Anúncio 1",
                        "status": "pending_review",
                        "review_status": "PENDING_REVIEW",
                        "rejection_reason": null,
                        "platform_ad_id": "120212345678900003",
                        "creative": {
                            "headline": "Outono com 30% off",
                            "body": "Peças selecionadas com frete grátis até domingo.",
                            "description": null,
                            "call_to_action": "SHOP_NOW",
                            "link_url": "https://loja.exemplo.com.br/outubro",
                            "image_url": "https://cdn.zernio.com/u/outubro.jpg",
                            "video_id": null
                        },
                        "url_tags": null
                    }
                ]
            }
        ],
        "brain": {
            "mode": null,
            "effective_mode": "manual",
            "target_cpa_cents": null,
            "target_roas": null,
            "effective_target_cpa_cents": 3000,
            "effective_target_roas": null,
            "locked_until": "2026-10-31T15:02:11+00:00",
            "last_touched_at": null,
            "last_touched_by": null
        },
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: not_found

PATCH /campaigns/{id} campaigns:write

Alterar campanha

Nome, orçamento e status (ligar ou pausar) de uma campanha publicada, aplicados nessa ordem na Meta. Se um falhar, details.applied diz o que já mudou. Cada mudança abre a janela de maturação do Gestor IA (ele não mexe na campanha por alguns dias). O bloco brain muda a regra do Gestor IA só desta campanha (vale também antes de publicar e exige, de quem criou o token, a permissão de configurar a IA); a regra atual vem em brain no GET /campaigns/{id}.

Corpo

name string Novo nome (até 120 caracteres).
budget.amount_cents integer Novo orçamento em centavos (respeita a verba mínima da conta).
status string active ou paused.
brain.mode string auto, manual ou off só nesta campanha; null volta a seguir a conta. O automático depende do plano.
brain.target_cpa_cents integer Meta de custo por resultado em centavos (null usa a da conta).
brain.target_roas number Meta de ROAS, de 0 a 1000 (null usa a da conta).

Exemplo

cURL
curl -X PATCH "https://leadgo.com.br/api/v1/campaigns/{id}" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "budget": {
        "amount_cents": 8000
    },
    "status": "active",
    "brain": {
        "mode": "manual",
        "target_cpa_cents": 2500
    }
}'

Resposta 200

HTTP 200
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "active",
        "status_label": "Ativa",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": "120212345678900001",
        "published_at": "2026-10-28T15:02:11+00:00",
        "synced_at": "2026-10-28T15:40:00+00:00",
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "draft": {
            "name": "Promoção de outubro",
            "goal": "traffic",
            "status": "paused",
            "budget": {
                "type": "daily",
                "amount_cents": 5000
            },
            "schedule": {
                "start_date": "2026-10-28",
                "end_date": null
            },
            "tracking": {
                "pixel_id": "123456789012345",
                "conversion_event": null,
                "url_tags": [
                    {
                        "key": "utm_source",
                        "value": "facebook"
                    },
                    {
                        "key": "utm_medium",
                        "value": "paid"
                    },
                    {
                        "key": "utm_campaign",
                        "value": "{{campaign.name}}"
                    },
                    {
                        "key": "utm_content",
                        "value": "{{ad.name}}"
                    }
                ]
            },
            "special_ad_category": null,
            "targeting": {
                "countries": [
                    "BR"
                ],
                "cities": [],
                "age_min": 25,
                "age_max": 55,
                "gender": "all",
                "interests": [],
                "narrow_interests": [],
                "audience_id": null
            },
            "link_url": "https://loja.exemplo.com.br/outubro",
            "creatives": [
                {
                    "media_type": "image",
                    "headline": "Outono com 30% off",
                    "body": "Peças selecionadas com frete grátis até domingo.",
                    "call_to_action": "SHOP_NOW"
                }
            ],
            "whatsapp": null,
            "lead_form": null
        },
        "ad_sets": [
            {
                "id": 88,
                "campaign_id": "01jby0q4c8m2d6t9v3k7w5r1xa",
                "name": "Promoção de outubro - Público",
                "status": "active",
                "budget": null,
                "optimization_goal": "LINK_CLICKS",
                "targeting": {
                    "geo_locations": {
                        "countries": [
                            "BR"
                        ]
                    },
                    "age_min": 25,
                    "age_max": 55
                },
                "platform_ad_set_id": "120212345678900002",
                "ads": [
                    {
                        "id": 140,
                        "campaign_id": "01jby0q4c8m2d6t9v3k7w5r1xa",
                        "ad_set_id": 88,
                        "name": "Promoção de outubro - Anúncio 1",
                        "status": "active",
                        "review_status": "APPROVED",
                        "rejection_reason": null,
                        "platform_ad_id": "120212345678900003",
                        "creative": {
                            "headline": "Outono com 30% off",
                            "body": "Peças selecionadas com frete grátis até domingo.",
                            "description": null,
                            "call_to_action": "SHOP_NOW",
                            "link_url": "https://loja.exemplo.com.br/outubro",
                            "image_url": "https://cdn.zernio.com/u/outubro.jpg",
                            "video_id": null
                        },
                        "url_tags": null
                    }
                ]
            }
        ],
        "brain": {
            "mode": null,
            "effective_mode": "manual",
            "target_cpa_cents": null,
            "target_roas": null,
            "effective_target_cpa_cents": 3000,
            "effective_target_roas": null,
            "locked_until": "2026-10-31T15:02:11+00:00",
            "last_touched_at": null,
            "last_touched_by": null
        },
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: validation_failed, permission_denied, campaign_not_published, campaign_not_toggleable, operation_failed, platform_rejected

DELETE /campaigns/{id} campaigns:write

Excluir campanha

Publicada: exclui de vez na Meta, com conjuntos e anúncios. Não publicada (falhou): descarta o rascunho. Durante a publicação, responde 409.

Exemplo

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

Resposta 204

Sem corpo.

Erros: not_found, campaign_publishing, platform_rejected

POST /campaigns/{id}/retry campaigns:write Idempotency-Key

Reenviar publicação

Tenta de novo publicar uma campanha com status failed, depois de corrigir o motivo (forma de pagamento, Página, conexão, Pixel...). As mídias que já subiram não sobem de novo. Uma campanha sem Pixel (publicada antes da 1.2.0) ganha o padrão da conta ou o único que ela enxerga; sem Pixel para escolher, o reenvio é recusado com operation_failed.

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/campaigns/{id}/retry" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)"

Resposta 202

HTTP 202
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "creating",
        "status_label": "Publicando",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": null,
        "published_at": null,
        "synced_at": null,
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: not_found, operation_failed

POST /campaigns/{id}/duplicate campaigns:write Idempotency-Key

Duplicar campanha

Nova campanha igual a uma criada pelo LeadGo, trocando só o que vier no corpo (mesmos campos de POST /campaigns, todos opcionais). Mídias e formulário de cadastro são os da origem; o objetivo não muda. Saem todos os anúncios da origem, cada um com o tipo dele (arte, vídeo ou carrossel): os criativos se mesclam por posição e só os textos mudam. Envie [{"headline": "..."}] para trocar só o título do primeiro. media_id ou template_media_index num criativo ou num cartão é recusado (422); para outra mídia, crie a campanha em POST /campaigns. No carrossel, cards troca a lista inteira: envie todos os cartões, no mesmo número e na mesma ordem da origem (as imagens seguem as da origem). Num carrossel sozinho, os cartões ficam em carousel.cards, como no draft de GET /campaigns/{id}; creatives[0].cards também vale. Sem name, vira "Nome (cópia)".

Parâmetros

validate_only boolean Só confere (200, nada é criado).

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/campaigns/{id}/duplicate" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "budget": {
        "amount_cents": 9000
    },
    "creatives": [
        {
            "headline": "Agora com 40% off"
        }
    ]
}'

Resposta 202

HTTP 202
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "creating",
        "status_label": "Publicando",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": null,
        "published_at": null,
        "synced_at": null,
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: validation_failed, campaign_not_duplicable, ad_account_changed, too_many_publishing

POST /templates/{id}/campaigns campaigns:write Idempotency-Key

Criar campanha a partir de um padrão

Vale a configuração do padrão e o corpo traz só o que muda (mesmos campos de POST /campaigns, todos opcionais). Sem creatives (ou com null), saem todos os anúncios do padrão. Com creatives, sai só o que veio: um anúncio por item, na ordem, e os anúncios do padrão que não vierem ficam de fora. Na posição de um anúncio do padrão, {} o mantém como está (textos e mídia guardada), um item só com textos troca os textos e mantém a mídia, e um item com media_id ou cards troca o anúncio, inclusive o tipo (arte, vídeo ou carrossel). Itens além dos do padrão viram anúncios a mais no mesmo conjunto: repetem o título, o texto, a descrição e o botão do primeiro (já com o que veio no corpo) e trazem a própria mídia. Num padrão de um anúncio, por exemplo, [{"media_id": "<foto>"}, {"media_id": "<vídeo>"}] publica a foto e o vídeo como dois anúncios com os mesmos textos; com só uma das duas, envie um item. Cada cartão de carrossel usa a imagem guardada no padrão (template_media_index) ou uma nova (media_id). creatives [] é recusado. Até 10 anúncios, um carrossel só; variações de texto valem num anúncio simples. O padrão só de carrossel aceita também o formato antigo (format carousel e carousel.cards). Com persona no padrão, o público vem dela; o público da conta (audience_id), as exclusões (excluded_cities, excluded_audience_ids), os idiomas e o Advantage+ seguem os guardados no padrão. persona_id null usa o público guardado no padrão. Com duração definida no padrão, a data de término é calculada.

Parâmetros

validate_only boolean Só confere (200, nada é criado).

Corpo

creatives object[] Os anúncios a publicar, na ordem. Ausente ou null: todos os do padrão. Com a lista, só os enviados ({} mantém o anúncio do padrão daquela posição).
creatives[].media_id string Arte ou vídeo novo da biblioteca para o anúncio dessa posição (troca o que o padrão tinha ali). Obrigatória nos itens além dos do padrão.
creatives[].template_media_index integer Arte ou vídeo guardado no padrão (template_media_index e has_media em creatives de GET /templates/{id}).
creatives[].cards object[] Carrossel nesta posição, com os mesmos campos de POST /campaigns (troca a lista inteira). Cada cartão leva media_id ou template_media_index.
creatives[].cards[].media_id string Imagem nova da biblioteca para o cartão.
creatives[].cards[].template_media_index integer Imagem guardada no padrão para o cartão (creatives[].cards em GET /templates/{id}).

Exemplo

cURL
curl -X POST "https://leadgo.com.br/api/v1/templates/{id}/campaigns" \
  -H "Authorization: Bearer $LEADGO_TOKEN" \
  -H "Accept: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Oferta de novembro",
    "budget": {
        "amount_cents": 7000
    },
    "creatives": [
        {
            "media_id": "01jbx3m7k2q8f5v9w4n6c0r1ht"
        },
        {
            "media_id": "01jbx3n2p6s0d4g8j2m6q0t4wy"
        },
        {
            "cards": [
                {
                    "media_id": "01jbx3p5r9t3e7h1k5n9r3v7c2",
                    "headline": "Vestidos",
                    "link_url": "https://loja.exemplo.com.br/verao/vestidos"
                },
                {
                    "media_id": "01jbx3q8v2w6a0c4f8j2m6p0s4",
                    "headline": "Sandálias",
                    "link_url": "https://loja.exemplo.com.br/verao/sandalias"
                }
            ]
        }
    ]
}'

Resposta 202

HTTP 202
{
    "data": {
        "id": "01jby0q4c8m2d6t9v3k7w5r1xa",
        "name": "Promoção de outubro",
        "goal": "traffic",
        "goal_label": "Tráfego",
        "status": "creating",
        "status_label": "Publicando",
        "created_via": "api",
        "budget": {
            "level": "campaign",
            "type": "daily",
            "amount_cents": 5000,
            "currency": "BRL"
        },
        "schedule": {
            "starts_at": "2026-10-28T03:00:00+00:00",
            "ends_at": null
        },
        "error": null,
        "platform": "meta",
        "platform_campaign_id": null,
        "published_at": null,
        "synced_at": null,
        "created_at": "2026-10-28T15:00:00+00:00",
        "updated_at": "2026-10-28T15:02:11+00:00",
        "links": {
            "panel": "https://app.leadgo.com.br/app/campaigns/01jby0q4c8m2d6t9v3k7w5r1xa"
        }
    }
}

Erros: validation_failed, operation_failed, too_many_publishing