VendeeDocs
Referência

Entrada de lead

Porta de entrada de lead vindo de formulário, landing page ou anúncio. Cria contato, empresa e negócio numa tacada.

POST   {BASE_URL}/api-v1-leads  # cria

O que continua no endereço antigo. POST {BASE_URL}/api-v1-leads só atende neste endereço — no endereço novo ({BASE_URL}/api-v1/leads) essa chamada devolve 405 method_not_allowed.

Escopo: leads:write.

Só POST — não existe listar nem detalhe. Contato, empresa e negócio são criados de uma vez: ou entra tudo, ou não entra nada. Permissão única: leads:write. Em workspace que usa a camada de leads, nasce um lead (não um negócio) e a resposta traz lead_id, idempotent e open_deal_id (negócio aberto da mesma empresa, só informativo).

Campos

CampoTipoEscritaNotas
external_idstringcriar: opcionalDe 1 a 255 caracteres.
first_namestringcriar: obrigatórioCampo montado pela API (não é coluna direta). de 1 a 120 caracteres.
last_namestringcriar: opcionalCampo montado pela API (não é coluna direta). máximo 120 caracteres; omitido → "".
emailstringcriar: opcionalCampo montado pela API (não é coluna direta). formato email; máximo 255 caracteres; normalizado para minúsculas.
phonestringcriar: opcionalCampo montado pela API (não é coluna direta). máximo 40 caracteres.
company_namestringcriar: opcionalCampo montado pela API (não é coluna direta). de 1 a 255 caracteres.
cnpjstringcriar: opcionalSó vale quando o workspace usa a camada de leads: a empresa é reaproveitada pelo CNPJ (só dígitos). Campo montado pela API (não é coluna direta). máximo 32 caracteres.
valuenumbercriar: opcionalMínimo 0.
recurring_valuenumbercriar: opcionalMínimo 0.
pipeline_iduuidcriar: opcionalFormato uuid; deve existir na ficha pipelines.
stage_iduuidcriar: opcionalFormato uuid.
owner_iduuidcriar: opcionalFormato uuid; deve existir na ficha owners.
sourcestringcriar: opcionalMáximo 120 caracteres.
utmobjetocriar: opcionalObjeto {source, medium, campaign, term, content}. Campos chapados utm_source/utm_medium/... também são aceitos. Campo montado pela API (não é coluna direta).
custom_fieldsobjetocriar: opcional, editar: simObjeto chave→valor. As chaves são as definidas na ficha custom-fields. até 50 chaves; até 10 KB; omitido → {}.

Criar

POST {BASE_URL}/api-v1-leads — escopo leads:write.

CampoTipoObrigatórioNotas
external_idstringNãoDe 1 a 255 caracteres.
first_namestringSimCampo montado pela API (não é coluna direta). de 1 a 120 caracteres.
last_namestringNãoCampo montado pela API (não é coluna direta). máximo 120 caracteres; omitido → "".
emailstringNãoCampo montado pela API (não é coluna direta). formato email; máximo 255 caracteres; normalizado para minúsculas.
phonestringNãoCampo montado pela API (não é coluna direta). máximo 40 caracteres.
company_namestringNãoCampo montado pela API (não é coluna direta). de 1 a 255 caracteres.
cnpjstringNãoSó vale quando o workspace usa a camada de leads: a empresa é reaproveitada pelo CNPJ (só dígitos). Campo montado pela API (não é coluna direta). máximo 32 caracteres.
valuenumberNãoMínimo 0.
recurring_valuenumberNãoMínimo 0.
pipeline_iduuidNãoFormato uuid; deve existir na ficha pipelines.
stage_iduuidNãoFormato uuid.
owner_iduuidNãoFormato uuid; deve existir na ficha owners.
sourcestringNãoMáximo 120 caracteres.
utmobjetoNãoObjeto {source, medium, campaign, term, content}. Campos chapados utm_source/utm_medium/... também são aceitos. Campo montado pela API (não é coluna direta).
custom_fieldsobjetoNãoObjeto chave→valor. As chaves são as definidas na ficha custom-fields. até 50 chaves; até 10 KB; omitido → {}.

Além de first_name, informe ao menos um entre email, phone ou a empresa (company_name ou cnpj). Sem nenhum deles a resposta é 422 validation_error.

curl -X POST "{BASE_URL}/api-v1-leads" \
  -H "X-API-Key: vnd_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{ "first_name": "..." }'

Webhooks desta ficha

  • lead.received

Formato do envio, cabeçalhos e verificação da assinatura em Webhooks.

Erros

HTTPcodeQuando
401missing_api_key / invalid_api_key / revoked_api_keyAutenticação.
403insufficient_scopeA chave não tem leads:write.
422validation_errorCampo fora das regras da tabela acima.
422invalid_referencepipeline_id, owner_id aponta para fora deste cliente.
405method_not_allowedMétodo não suportado neste endereço.
500internal_errorFalha interna.

Catálogo completo em Erros.

Resposta de sucesso

201 Created em uma criação nova; 200 OK quando a chamada é idempotente (mesmo external_id já processado):

{
  "lead": {
    "deal_id": "8f3c...",
    "contact_id": "1a2b...",
    "company_id": "9d8e...",
    "workspace_id": "44c1...",
    "status": "aberto",
    "pipeline_id": "7b6a...",
    "stage_id": "0f1e...",
    "owner_id": "3c2d...",
    "created_at": "2026-06-27T12:00:00.000Z"
  },
  "idempotent": false,
  "created": { "company": true, "contact": true, "deal": true }
}
  • company_id vem null quando o lead não traz company_name.
  • created indica o que foi efetivamente criado nesta chamada.

Idempotência

Se você enviar um external_id que já foi processado, a API não cria um segundo negócio: responde 200 OK com "idempotent": true e os ids do registro original. Isso torna seguro reenviar em caso de timeout de rede. Sem external_id, cada chamada cria um novo lead.

Origem do lead (source)

O source é casado com as origens que já existem no workspace sem diferenciar maiúsculas nem espaços nas pontas: "Site", " site " e "SITE" caem na mesma origem. Se ela estiver arquivada, volta a ficar ativa. Se nenhuma origem tiver esse nome, a API cria a origem com o nome enviado (sem os espaços das pontas, até 120 caracteres). Assim cada campanha pode mandar o próprio nome sem cadastro prévio.

Reaproveitamento de contato sem e-mail, pelo telefone

Quando o lead não traz email, a API tenta casar o phone com um contato que já existe neste workspace antes de criar um novo. A comparação ignora formatação — DDD com ou sem parênteses, hífen, espaço, com ou sem o DDI +55 casam entre si. O contato encontrado não é alterado (nome, empresa e telefone continuam como estavam); o lead novo só se liga a ele, e created.contact vem false.

Com email informado o comportamento não muda: o casamento continua sendo só por e-mail, mesmo que ele não encontre ninguém — não cai para o telefone.

Limite conhecido: um celular brasileiro com e sem o nono dígito ((48) 99999-0000 × (48) 9999-0000) é tratado como dois números diferentes — não gera reaproveitamento entre eles.

Resolução automática de responsável

Quando owner_id não é informado (ou aponta para alguém que não está no workspace), o Vendee escolhe o responsável nesta ordem:

  1. O owner_id informado, se for um membro ativo do workspace.
  2. O usuário que criou a API Key.
  3. O membro de gestão (admin/gestor) ativo mais antigo do workspace.

Se nenhum se aplicar, a resposta é 422 owner_unresolved.

Erros específicos desta ficha

HTTPcodeQuando
400invalid_bodyCorpo ausente ou JSON inválido.
422pipeline_not_found / no_default_pipelineProblema ao resolver o pipeline.
422stage_not_found / pipeline_has_no_stageProblema ao resolver a etapa.
422owner_unresolvedSem responsável ativo possível.

Veja todos em Erros.

Nesta página