curl --request POST \
--url https://api.wegly.com.br/integrations/external/leads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Lead vindo do site",
"visibility": 0,
"crm_lead_source_id": "6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33",
"measurement_consent": "GRANTED",
"marketing": {
"url_conversion": "https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento"
},
"person": {
"name": "Maria Souza",
"contacts": [
{
"type": 0,
"value": "(11) 98888-7777"
}
],
"avoid_duplicate": true,
"duplicate_check_types": [
0
]
}
}
'import requests
url = "https://api.wegly.com.br/integrations/external/leads"
payload = {
"title": "Lead vindo do site",
"visibility": 0,
"crm_lead_source_id": "6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33",
"measurement_consent": "GRANTED",
"marketing": { "url_conversion": "https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento" },
"person": {
"name": "Maria Souza",
"contacts": [
{
"type": 0,
"value": "(11) 98888-7777"
}
],
"avoid_duplicate": True,
"duplicate_check_types": [0]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Lead vindo do site',
visibility: 0,
crm_lead_source_id: '6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33',
measurement_consent: 'GRANTED',
marketing: {
url_conversion: 'https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento'
},
person: {
name: 'Maria Souza',
contacts: [{type: 0, value: '(11) 98888-7777'}],
avoid_duplicate: true,
duplicate_check_types: [0]
}
})
};
fetch('https://api.wegly.com.br/integrations/external/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.wegly.com.br/integrations/external/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Lead vindo do site',
'visibility' => 0,
'crm_lead_source_id' => '6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33',
'measurement_consent' => 'GRANTED',
'marketing' => [
'url_conversion' => 'https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento'
],
'person' => [
'name' => 'Maria Souza',
'contacts' => [
[
'type' => 0,
'value' => '(11) 98888-7777'
]
],
'avoid_duplicate' => true,
'duplicate_check_types' => [
0
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.wegly.com.br/integrations/external/leads"
payload := strings.NewReader("{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.wegly.com.br/integrations/external/leads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wegly.com.br/integrations/external/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": 123,
"title": "<string>",
"measurement_consent": "GRANTED"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}Criação de lead
Cria um lead na empresa vinculada à chave de integração usando o usuário que criou a chave como ator padrão. - O estágio padrão é a primeira etapa do funil primário se stage_id não for informado. - Se responsible_id não for enviado, o responsável será o criador da chave. Se o usuário informado estiver inativo ou arquivado, o lead é atribuído ao usuário master da conta e recebe uma nota automática sobre a substituição; usuário inexistente ou de outra empresa retorna 400. - A única forma de informar uma origem manual é por crm_lead_source_id. O campo lead_source não é aceito nesta API. - A visibilidade padrão é privada (visibility = 0). - Quando marketing.wegly_code corresponder a um tracker ativo da empresa e crm_lead_source_id não for enviado, a origem do lead é a do tracker. Se os dois forem enviados, o tracker continua vinculado à aquisição, mas a origem retornada em lead_source e usada nos filtros é a de crm_lead_source_id. - Quando não houver tracker nem crm_lead_source_id, marketing.wegly_source ou marketing.utm_source busca/cria a origem automaticamente (wegly_source tem prioridade); IG, em qualquer caixa, é tratado como a origem Instagram. - marketing.url_conversion é parseada automaticamente para preencher parâmetros wegly_code, wegly_source, wegly_campaign, wegly_ad_set, wegly_content, wegly_displayed_on, wegly_conversion_tool, utm_*, gclid e fbclid faltantes; valores enviados manualmente prevalecem sobre os extraídos da URL. - Consentimento top-level, alias legado e URL são normalizados antes da idempotência e da deduplicação; qualquer divergência retorna 400 sem reservar evento, alterar pessoa ou criar lead. - Deduplicação de pessoa: quando person.avoid_duplicate = true e duplicate_check_types estiver preenchido, o serviço busca contatos existentes (pelos tipos informados) e reaproveita a pessoa encontrada, adicionando contatos faltantes. Nesse caso, a pessoa é incluída automaticamente em persons_id.
Aceita x-idempotency-key no header ou idempotency_key no body. Uma criação já concluída retorna o mesmo id, code e title com measurement_consent efetivo. Uma tentativa ainda em processamento retorna 409. Se a criação falhar depois de iniciada (referência inexistente, campo personalizado obrigatório ausente ou erro em seguidores/nota), a chave fica consumida e continua retornando 409; envie uma nova chave. Todos os campos personalizados obrigatórios da entidade precisam ser enviados. Seguidores e nota são gravados depois do registro: se falharem, a resposta é de erro, mas o registro permanece criado. Webhooks e notificações podem ser entregues de forma assíncrona após a resposta. measurement_consent é canônico; valores conflitantes com marketing.measurement_consent ou a URL retornam 400 antes das mutações. Contatos devem ficar em person.contacts: phone e email no primeiro nível são rejeitados com 400.
curl --request POST \
--url https://api.wegly.com.br/integrations/external/leads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Lead vindo do site",
"visibility": 0,
"crm_lead_source_id": "6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33",
"measurement_consent": "GRANTED",
"marketing": {
"url_conversion": "https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento"
},
"person": {
"name": "Maria Souza",
"contacts": [
{
"type": 0,
"value": "(11) 98888-7777"
}
],
"avoid_duplicate": true,
"duplicate_check_types": [
0
]
}
}
'import requests
url = "https://api.wegly.com.br/integrations/external/leads"
payload = {
"title": "Lead vindo do site",
"visibility": 0,
"crm_lead_source_id": "6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33",
"measurement_consent": "GRANTED",
"marketing": { "url_conversion": "https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento" },
"person": {
"name": "Maria Souza",
"contacts": [
{
"type": 0,
"value": "(11) 98888-7777"
}
],
"avoid_duplicate": True,
"duplicate_check_types": [0]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Lead vindo do site',
visibility: 0,
crm_lead_source_id: '6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33',
measurement_consent: 'GRANTED',
marketing: {
url_conversion: 'https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento'
},
person: {
name: 'Maria Souza',
contacts: [{type: 0, value: '(11) 98888-7777'}],
avoid_duplicate: true,
duplicate_check_types: [0]
}
})
};
fetch('https://api.wegly.com.br/integrations/external/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.wegly.com.br/integrations/external/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Lead vindo do site',
'visibility' => 0,
'crm_lead_source_id' => '6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33',
'measurement_consent' => 'GRANTED',
'marketing' => [
'url_conversion' => 'https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento'
],
'person' => [
'name' => 'Maria Souza',
'contacts' => [
[
'type' => 0,
'value' => '(11) 98888-7777'
]
],
'avoid_duplicate' => true,
'duplicate_check_types' => [
0
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.wegly.com.br/integrations/external/leads"
payload := strings.NewReader("{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.wegly.com.br/integrations/external/leads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.wegly.com.br/integrations/external/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Lead vindo do site\",\n \"visibility\": 0,\n \"crm_lead_source_id\": \"6d5b7dd0-3e0a-48bd-a99d-f8df1fd74d33\",\n \"measurement_consent\": \"GRANTED\",\n \"marketing\": {\n \"url_conversion\": \"https://meusite.com/obrigado?wegly_code=ABC123&utm_campaign=lancamento\"\n },\n \"person\": {\n \"name\": \"Maria Souza\",\n \"contacts\": [\n {\n \"type\": 0,\n \"value\": \"(11) 98888-7777\"\n }\n ],\n \"avoid_duplicate\": true,\n \"duplicate_check_types\": [\n 0\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": 123,
"title": "<string>",
"measurement_consent": "GRANTED"
}{
"statusCode": 123,
"message": "<string>",
"error": "<string>"
}Authorizations
Chave de integração com prefixo wegly_, enviada em Authorization: Bearer . Não é JWT. A chave deve estar ativa, não excluída e dentro da validade. Com allowed_domain, Origin (ou Referer na ausência de Origin) precisa informar o hostname permitido. A empresa e as permissões são obtidas pela chave.
Headers
Chave da tentativa lógica de criação. Tem prioridade sobre idempotency_key no body; mantenha a mesma chave ao repetir uma chamada sem resposta e use uma nova depois de uma criação que falhou após iniciada.
Body
1 - 150Estágio alvo. Caso omitido, usa a primeira etapa do funil primário.
Responsável pelo lead. Padrão: criador da chave. Se o usuário informado estiver inativo ou arquivado, o registro é atribuído ao usuário master da conta, com nota automática; usuário inexistente ou de outra empresa retorna 400.
1, 2, 3, 4, 5 Motivo da qualificação; obrigatório se o funil exigir.
0 = privado; 1 = visível ao time, conforme as regras de acesso do CRM.
0, 1 Lista de IDs de tags existentes. IDs inexistentes resultam em erro.
IDs de pessoas já cadastradas que serão associadas.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Organização existente. Conflita com organization.
Show child attributes
Show child attributes
Respostas dos campos personalizados. Todos os campos obrigatórios da entidade precisam ser enviados; campos do tipo arquivo não são aceitos nesta rota.
Show child attributes
Show child attributes
Padrão GRANTED quando omitido na criação.
GRANTED, DENIED, UNSPECIFIED Rastreio de marketing. Todos os valores são sanitizados (trim) e campos vazios são ignorados. utm_* são normalizados para wegly_* equivalentes quando estes não forem enviados. utm_term vira utm_search_term se o campo específico não for enviado. url_conversion tem seus parâmetros extraídos automaticamente (wegly_code, wegly_source, wegly_campaign, wegly_ad_set, wegly_content, wegly_displayed_on, wegly_conversion_tool, utm_*, gclid, fbclid). Em POST e PUT, measurement_consent na URL também é extraído. Valor desconhecido, duplicado divergente ou presente em URL malformada vira UNSPECIFIED; divergência com o body retorna 400. Sem GRANTED, obref é removido da query e o fragmento inteiro da URL completa é descartado; a URL integral nunca é registrada em logs. O alias isolado, um objeto vazio ou somente campos nulos/em branco não constituem aquisição e não criam snapshot/log. Quando wegly_code referencia um tracker válido e não há crm_lead_source_id, a origem do registro é a do tracker. No PUT, os campos enviados corrigem a aquisição atual: omitidos são preservados e null limpa o valor. Quando não há tracker nem origem explícita, wegly_source ou utm_source busca/cria a origem automaticamente.
Show child attributes
Show child attributes
Origem existente. Única forma aceita para informar origem manual nesta API.
Seguidores adicionados após a criação do lead. Usuários duplicados na lista são ignorados. Se a gravação falhar, a API retorna erro, mas o registro permanece criado.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Chave da tentativa lógica de criação. O header x-idempotency-key, quando preenchido, tem prioridade. Reutilize a mesma chave para repetir uma chamada sem resposta; depois de uma criação que falhou após iniciada, use uma nova chave.
255Response
Lead criado com sucesso.
Código sequencial interno do lead.
Consentimento para mensuração: GRANTED autoriza, DENIED recusa e UNSPECIFIED registra que não houve decisão informada. Em respostas de registros históricos sem valor canônico oficial, a API usa a decisão oficial do snapshot ativo mais recente; snapshots sem decisão não a sombreiam e a ausência de ambos resulta em UNSPECIFIED, sem backfill.
GRANTED, DENIED, UNSPECIFIED 