Pular para o conteúdo

API v1 · REST + JSON

Integre o DELM CRM ao seu site e seus sistemas

Capture leads das suas landing pages, sincronize o funil com o ERP, consulte a agenda e envie mensagens no WhatsApp. Receba eventos em tempo real por webhooks.

Introdução

A API do DELM CRM segue o padrão REST: recursos em URLs previsíveis, corpo e respostas em JSON (UTF-8), códigos HTTP padrão e autenticação por chave. Todas as datas estão em ISO 8601 (UTC) e valores em reais como número (4990.5).

URL base

https://central.delm.com.br/api/v1

Disponível nos planos com acesso à API. Os formulários de captura para landing pages funcionam em todos os planos.

Autenticação

Crie chaves em Configurações → Integrações e API (somente administradores). A chave completa aparece uma única vez; guardamos apenas um hash. Envie-a em um destes cabeçalhos:

curl https://central.delm.com.br/api/v1/pipelines \
  -H "Authorization: Bearer dlm_sk_SUA_CHAVE"

dlm_sk_… · secreta

Para o seu servidor. Acesso conforme os escopos escolhidos. Nunca coloque no HTML ou num app.

dlm_pk_… · publicável

Pode ir no código da landing page. Só cria leads (POST /leads) e só é aceita das origens autorizadas (cabeçalho Origin).

Escopos

leads:read
escopo
Ler leads
leads:write
escopo
Criar e alterar leads
contacts:read
escopo
Ler contatos
contacts:write
escopo
Criar e alterar contatos
pipelines:read
escopo
Ler funis, etapas e usuários
appointments:read
escopo
Ler agenda e horários livres
messages:send
escopo
Enviar mensagens no WhatsApp

Chaves secretas também podem ter origens autorizadas: nesse caso, chamadas feitas por navegadores (com Origin) só são aceitas dessas origens.

Erros

Erros sempre têm o mesmo formato, com um code estável para tratar no seu código e uma mensagem em português:

JSON
{
  "error": {
    "code": "validation_error",
    "message": "Dados inválidos. Veja error.details.",
    "details": [
      {
        "path": "phone",
        "message": "Telefone inválido"
      }
    ]
  }
}
HTTPcodeQuando
400invalid_json / validation_errorCorpo não é JSON válido ou parâmetro de consulta inválido.
401unauthorizedChave ausente, inválida ou revogada.
402plan_required / account_suspendedO plano não inclui API, ou a conta está suspensa.
403forbidden / insufficient_scope / invalid_originChave sem o escopo exigido, chave publicável fora de POST /leads, ou origem não autorizada.
404not_foundRecurso inexistente ou de outra empresa.
409conflict / channel_unavailableConflito de dados (telefone duplicado) ou nenhum WhatsApp conectado.
422validation_errorDados inválidos. error.details lista cada campo com problema.
429rate_limitedLimite de requisições excedido. Respeite o cabeçalho Retry-After.
500internal_errorErro inesperado. Pode tentar de novo com segurança em GETs.
502send_failedO WhatsApp recusou a mensagem (número inexistente, desconectado…).

Toda resposta traz X-Request-Id — informe-o ao suporte se precisar de ajuda.

Limites e paginação

OrigemLimite
Chave secreta120 requisições/minuto por chave
Chave publicável30 requisições/minuto por chave
Formulário (sem chave)10 envios/minuto por IP e formulário

As respostas trazem X-RateLimit-Limit e X-RateLimit-Remaining. Ao exceder, você recebe429 com Retry-After (segundos). Faça novas tentativas com espera crescente.

Paginação por cursor

Listas retornam { data, hasMore, nextCursor }. Use limit (1–100, padrão 50) e passe onextCursor recebido em ?cursor= para buscar a próxima página. Para sincronizar alterações, combine com updatedSince (leads). Parâmetros aceitam camelCase ou snake_case (stageId = stage_id).

JavaScript
let cursor = null;
do {
  const url = new URL("https://central.delm.com.br/api/v1/leads");
  url.searchParams.set("limit", "100");
  url.searchParams.set("updatedSince", "2026-10-01T00:00:00Z");
  if (cursor) url.searchParams.set("cursor", cursor);
  const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.DELM_API_KEY}` } });
  const page = await res.json();
  for (const lead of page.data) console.log(lead.id, lead.stage?.name);
  cursor = page.nextCursor;
} while (cursor);

Captura de leads

Landing pages

Crie um formulário em Configurações → Integrações e API → Formulários: escolha os campos, o funil, a etapa, o responsável (ou a fila para distribuir), uma mensagem de boas-vindas no WhatsApp e as origens autorizadas. Depois use uma das opções abaixo — nenhuma exige chave de API.

1. Script pronto (mais fácil)

Desenha o formulário com os campos configurados, valida, envia sem recarregar a página e mostra a mensagem de sucesso (ou redireciona).

HTML
<!-- Formulário DELM CRM: cole onde o formulário deve aparecer -->
<div data-delm-form="frm_7Hq2kLm9PzXa"></div>
<script src="https://central.delm.com.br/embed/delm-forms.js" async></script>

Personalize o botão com data-button="Quero uma demonstração". O script dispara os eventosdelm:success e delm:error no formulário (útil para o Pixel/GA). Em SPAs, chame window.DelmForms.init() depois de montar o HTML.

2. Seu próprio formulário HTML

Mantenha o visual do seu site. O name de cada campo deve ser o nome técnico configurado. Funciona até sem JavaScript (redireciona para a página de obrigado ou mostra uma confirmação); com o script, envia por AJAX.

HTML
<form action="https://central.delm.com.br/api/v1/forms/frm_7Hq2kLm9PzXa/submit" method="POST" data-delm-form-id="frm_7Hq2kLm9PzXa">
  <label>Nome
    <input type="text" name="name" required>
  </label>
  <label>WhatsApp
    <input type="tel" name="phone" required>
  </label>
  <label>E-mail
    <input type="email" name="email">
  </label>
  <!-- armadilha anti-robô: deixe oculto e vazio -->
  <input type="text" name="_hp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true">
  <button type="submit">Enviar</button>
</form>
<!-- Opcional: envia sem recarregar a página, mostra a mensagem de sucesso e captura utm_* da URL -->
<script src="https://central.delm.com.br/embed/delm-forms.js" async></script>

3. JavaScript (React, Vue, Webflow, Elementor…)

JavaScript
const res = await fetch("https://central.delm.com.br/api/v1/forms/frm_7Hq2kLm9PzXa/submit", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "name": "Maria Souza",
    "phone": "11988887777",
    "email": "maria@empresa.com",
    "utm_source": "google",
    "utm_campaign": "black-friday"
  }),
});
const data = await res.json();
if (res.ok) {
  alert(data.message);                       // mensagem de sucesso configurada
  if (data.redirectUrl) location.href = data.redirectUrl;
} else {
  alert(data.error.message);                 // ex.: "Preencha: WhatsApp."
}
Boas práticas: mantenha o campo-armadilha _hp oculto e vazio (robôs o preenchem e o envio é descartado em silêncio); configure as origens autorizadas para que só o seu domínio envie; e peça consentimento para contato por WhatsApp (LGPD).

Campos utm_source, utm_medium, utm_campaign, utm_term, utm_content,gclid, fbclid, page_url e referrer são capturados automaticamente pelo script e guardados na qualificação do lead. Se o mesmo telefone já tem um lead aberto no funil, os dados são somados a ele em vez de duplicar.

Prefere a API completa na landing page? Use uma chave publicável comPOST /api/v1/leads — veja Criar lead.

Metadados públicos do formulário

get/api/v1/forms/{publicId}sem chave

Usado pelo script de embed para desenhar o formulário. Não exige chave.

Parâmetros de caminho

publicId
stringobrigatório
ID público (frm_…)

Respostas de erro

  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
Requisição
curl "https://central.delm.com.br/api/v1/forms/frm_7Hq2kLm9PzXa"
Resposta 200JSON
{
  "publicId": "frm_7Hq2kLm9PzXa",
  "name": "Landing Black Friday",
  "company": "Sua Empresa",
  "fields": [
    {
      "name": "name",
      "label": "Nome",
      "type": "text",
      "required": true
    },
    {
      "name": "phone",
      "label": "WhatsApp",
      "type": "tel",
      "required": true
    },
    {
      "name": "email",
      "label": "E-mail",
      "type": "email"
    }
  ],
  "successMessage": "Recebemos seus dados! Em breve entraremos em contato.",
  "redirectUrl": null,
  "brandColor": "#4743e3",
  "honeypotField": "_hp"
}

Enviar formulário

post/api/v1/forms/{publicId}/submitsem chave

Recebe o envio de um formulário de landing page sem chave de API. Aceita JSON, application/x-www-form-urlencoded ou multipart/form-data. Cria contato + lead conforme a configuração do formulário (funil, etapa, responsável), envia a mensagem de boas-vindas no WhatsApp (se configurada) e dispara form.submitted. Campos utm_*, page_url e referrer são guardados na qualificação do lead. O campo _hp é uma armadilha para robôs: deixe-o vazio e oculto. Com JSON (ou Accept: application/json) a resposta é JSON; um <form> HTML comum recebe 303 para a URL de redirecionamento ou uma página de agradecimento. Limite: 10 envios por minuto por IP.

Parâmetros de caminho

publicId
stringobrigatório
ID público (frm_…)

Respostas de erro

  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 422Dados inválidos
  • 429Muitas requisições
Requisição
curl -X POST "https://central.delm.com.br/api/v1/forms/frm_7Hq2kLm9PzXa/submit" \
  -H "Content-Type: application/json" \
  -d '{"name":"Maria Souza","phone":"11988887777","email":"maria@empresa.com","utm_source":"instagram","_hp":""}'
Resposta 200JSON
{
  "ok": true,
  "message": "Recebemos seus dados! Em breve entraremos em contato.",
  "redirectUrl": null,
  "leadId": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12"
}

Leads

Oportunidades no funil. Cada lead pertence a um contato, um funil e uma etapa. Campos livres (respostas de formulário, UTMs, dados levantados pela I.A.) ficam em qualification.

Listar leads

get/api/v1/leadsescopo: leads:read

Lista leads do mais novo para o mais antigo, com paginação por cursor.

Parâmetros de consulta

limit
integer
Itens por página (1–100, padrão 50)
cursor
string
Valor de nextCursor da página anterior
status
string
OPEN, WON ou LOST
pipelineId
string (uuid)
Filtra por funil
stageId
string (uuid)
Filtra por etapa
ownerId
string (uuid)
Filtra por responsável
contactId
string (uuid)
Filtra por contato
source
string
Origem (api, form, landing_page, whatsapp, manual…)
updatedSince
string (date-time)
Só leads alterados a partir desta data (ISO 8601). Útil para sincronização.

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/leads?updatedSince=2026-10-01T00%3A00%3A00Z" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "data": [
    {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Criar lead

post/api/v1/leadsescopo: leads:writeaceita chave publicável

Cria o contato (ou reaproveita o existente pelo telefone) e o lead no funil. Sem pipelineId/stageId, usa o funil padrão e a primeira etapa. Por padrão (dedupe: true), se o contato já tiver um lead aberto no mesmo funil, os dados são mesclados nele e a resposta é 200 com created: false. Aceita chave publicável (dlm_pk_) vinda das origens autorizadas.

Corpo (JSON)

name
string
Nome do contato
phone
stringobrigatório
Telefone/WhatsApp em qualquer formato
email
string (email)
title
string
Título do lead (padrão: nome do contato)
company
string
value
number
pipelineId
string (uuid)
Padrão: funil padrão da empresa
stageId
string (uuid)
Padrão: primeira etapa do funil
ownerId
string (uuid)
Responsável (veja GET /users)
source
string
Origem (padrão: api; com chave publicável: landing_page)
utm
object
utm_source
string
utm_medium
string
utm_campaign
string
utm_term
string
utm_content
string
fields
object
Campos extras guardados na qualificação
notes
string
tags
string[]
Etiquetas somadas ao contato
dedupe
boolean
Reaproveita lead aberto do mesmo contato no mesmo funilPadrão: true

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 422Dados inválidos
  • 429Muitas requisições
Requisição
curl -X POST "https://central.delm.com.br/api/v1/leads" \
  -H "Authorization: Bearer $DELM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Maria Souza","phone":"(11) 98888-7777","email":"maria@empresa.com","company":"Empresa X","source":"site","utm":{"source":"google","medium":"cpc","campaign":"black-friday"},"fields":{"Interesse":"Plano Pro","Funcionários":"11-50"}}'
Resposta 200JSON
{
  "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
  "title": "Maria Souza",
  "status": "OPEN",
  "value": 0,
  "score": 0,
  "source": "api",
  "company": "Empresa X",
  "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
  "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
  "stage": {
    "id": "a1b2c3d4-0000-4000-8000-000000000001",
    "name": "Novo",
    "position": 0
  },
  "ownerId": null,
  "owner": null,
  "contact": {
    "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
    "phone": "5511988887777",
    "name": "Maria Souza",
    "email": "maria@empresa.com",
    "kind": "LEAD",
    "tags": [
      "landing-page"
    ],
    "notes": null,
    "createdAt": "2026-10-04T13:20:00.000Z"
  },
  "qualification": {
    "utm_source": "google",
    "utm_campaign": "black-friday",
    "Interesse": "Plano Pro"
  },
  "lostReason": null,
  "createdAt": "2026-10-04T13:20:00.000Z",
  "updatedAt": "2026-10-04T13:20:00.000Z",
  "created": false
}

Buscar lead

get/api/v1/leads/{id}escopo: leads:read

Parâmetros de caminho

id
string (uuid)obrigatório
ID do lead

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/leads/3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
  "title": "Maria Souza",
  "status": "OPEN",
  "value": 0,
  "score": 0,
  "source": "api",
  "company": "Empresa X",
  "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
  "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
  "stage": {
    "id": "a1b2c3d4-0000-4000-8000-000000000001",
    "name": "Novo",
    "position": 0
  },
  "ownerId": null,
  "owner": null,
  "contact": {
    "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
    "phone": "5511988887777",
    "name": "Maria Souza",
    "email": "maria@empresa.com",
    "kind": "LEAD",
    "tags": [
      "landing-page"
    ],
    "notes": null,
    "createdAt": "2026-10-04T13:20:00.000Z"
  },
  "qualification": {
    "utm_source": "google",
    "utm_campaign": "black-friday",
    "Interesse": "Plano Pro"
  },
  "lostReason": null,
  "createdAt": "2026-10-04T13:20:00.000Z",
  "updatedAt": "2026-10-04T13:20:00.000Z"
}

Atualizar lead

patch/api/v1/leads/{id}escopo: leads:write

Move de etapa (stageId), marca como ganho/perdido (status), altera valor, responsável ou campos de qualificação. Dispara os webhooks lead.updated, lead.stage_changed, lead.won e lead.lost conforme o caso.

Parâmetros de caminho

id
string (uuid)obrigatório
ID do lead

Corpo (JSON)

title
string
company
string | null
value
number
pipelineId
string (uuid)
Troca de funil (vai para a primeira etapa, ou para stageId)
stageId
string (uuid)
Etapa de destino
status
string
Valores: OPENWONLOST
lostReason
string | null
Motivo da perda (com status LOST)
ownerId
string | null (uuid)
score
integer
fields
object
Mescla na qualificação; null remove a chave

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 422Dados inválidos
  • 429Muitas requisições
Requisição
curl -X PATCH "https://central.delm.com.br/api/v1/leads/3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12" \
  -H "Authorization: Bearer $DELM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stageId":"a1b2c3d4-0000-4000-8000-000000000002","value":4990,"ownerId":"3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6"}'
Resposta 200JSON
{
  "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
  "title": "Maria Souza",
  "status": "OPEN",
  "value": 4990,
  "score": 0,
  "source": "api",
  "company": "Empresa X",
  "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
  "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
  "stage": {
    "id": "a1b2c3d4-0000-4000-8000-000000000001",
    "name": "Novo",
    "position": 0
  },
  "ownerId": null,
  "owner": null,
  "contact": {
    "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
    "phone": "5511988887777",
    "name": "Maria Souza",
    "email": "maria@empresa.com",
    "kind": "LEAD",
    "tags": [
      "landing-page"
    ],
    "notes": null,
    "createdAt": "2026-10-04T13:20:00.000Z"
  },
  "qualification": {
    "utm_source": "google",
    "utm_campaign": "black-friday",
    "Interesse": "Plano Pro"
  },
  "lostReason": null,
  "createdAt": "2026-10-04T13:20:00.000Z",
  "updatedAt": "2026-10-04T13:20:00.000Z"
}

Contatos

Pessoas com quem sua empresa conversa. O telefone é a identidade: dois contatos não podem ter o mesmo número. Telefones são guardados só com dígitos e DDI (5511988887777).

Listar contatos

get/api/v1/contactsescopo: contacts:read

Parâmetros de consulta

limit
integer
Itens por página (1–100, padrão 50)
cursor
string
Valor de nextCursor da página anterior
phone
string
Telefone (qualquer formato; é normalizado)
email
string
E-mail exato
q
string
Busca por nome ou parte do telefone
kind
string
UNKNOWN, LEAD ou CUSTOMER
tag
string
Contatos com esta etiqueta
createdSince
string (date-time)
Criados a partir desta data (ISO 8601)

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/contacts" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "data": [
    {
      "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "phone": "5511988887777",
      "name": "Maria Souza",
      "email": "maria@empresa.com",
      "kind": "LEAD",
      "tags": [
        "landing-page"
      ],
      "notes": null,
      "createdAt": "2026-10-04T13:20:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Criar contato

post/api/v1/contactsescopo: contacts:write

Contatos são únicos por telefone. Se já existir, devolve o existente (200, created: false) preenchendo nome/e-mail vazios e somando as tags.

Corpo (JSON)

phone
stringobrigatório
Qualquer formato. Números brasileiros sem DDI (DDD + número) recebem 55 automaticamente.
name
string
email
string (email)
tags
string[]
notes
string
kind
string
Valores: UNKNOWNLEADCUSTOMER

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 422Dados inválidos
  • 429Muitas requisições
Requisição
curl -X POST "https://central.delm.com.br/api/v1/contacts" \
  -H "Authorization: Bearer $DELM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"11988887777","name":"Maria Souza","email":"maria@empresa.com","tags":["evento-2026"]}'
Resposta 200JSON
{
  "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
  "phone": "5511988887777",
  "name": "Maria Souza",
  "email": "maria@empresa.com",
  "kind": "LEAD",
  "tags": [
    "landing-page"
  ],
  "notes": null,
  "createdAt": "2026-10-04T13:20:00.000Z",
  "created": false
}

Buscar contato

get/api/v1/contacts/{id}escopo: contacts:read

Inclui a lista resumida de leads do contato.

Parâmetros de caminho

id
string (uuid)obrigatório
ID do contato

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/contacts/3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
  "phone": "5511988887777",
  "name": "Maria Souza",
  "email": "maria@empresa.com",
  "kind": "LEAD",
  "tags": [
    "landing-page"
  ],
  "notes": null,
  "createdAt": "2026-10-04T13:20:00.000Z",
  "leads": [
    {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e"
    }
  ]
}

Atualizar contato

patch/api/v1/contacts/{id}escopo: contacts:write

Parâmetros de caminho

id
string (uuid)obrigatório
ID do contato

Corpo (JSON)

phone
string
name
string | null
email
string | null
tags
string[]
Substitui a lista inteira
notes
string | null
kind
string
Valores: UNKNOWNLEADCUSTOMER

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 409Conflito (ex.: telefone já usado por outro contato)
  • 422Dados inválidos
  • 429Muitas requisições
Requisição
curl -X PATCH "https://central.delm.com.br/api/v1/contacts/3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12" \
  -H "Authorization: Bearer $DELM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Maria S. Souza","tags":["cliente-vip"],"kind":"CUSTOMER"}'
Resposta 200JSON
{
  "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
  "phone": "5511988887777",
  "name": "Maria Souza",
  "email": "maria@empresa.com",
  "kind": "LEAD",
  "tags": [
    "landing-page"
  ],
  "notes": null,
  "createdAt": "2026-10-04T13:20:00.000Z"
}

Funis

Use para descobrir os IDs de funis e etapas que vão em pipelineId e stageId.

Listar funis e etapas

get/api/v1/pipelinesescopo: pipelines:read

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/pipelines" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "data": [
    {
      "id": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "name": "Vendas",
      "isDefault": true,
      "createdAt": "2026-09-01T12:00:00.000Z",
      "stages": [
        {
          "id": "a1b2c3d4-0000-4000-8000-000000000001",
          "name": "Novo",
          "position": 0,
          "probability": 10,
          "color": "#64748b"
        },
        {
          "id": "a1b2c3d4-0000-4000-8000-000000000002",
          "name": "Qualificado",
          "position": 1,
          "probability": 30,
          "color": "#3b82f6"
        },
        {
          "id": "a1b2c3d4-0000-4000-8000-000000000003",
          "name": "Reunião agendada",
          "position": 2,
          "probability": 50,
          "color": "#8b5cf6"
        }
      ]
    }
  ]
}

Usuários

Usuários ativos da empresa, para atribuir leads (ownerId) ou consultar a agenda de um vendedor.

Listar usuários

get/api/v1/usersescopo: pipelines:read

Usuários ativos da empresa. Use role=SELLER para obter os vendedores (ex.: para ownerId).

Parâmetros de consulta

role
string
ADMIN, SUPERVISOR, AGENT ou SELLER

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/users" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "data": [
    {
      "id": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "name": "João Vendedor",
      "email": "joao@empresa.com",
      "role": "SELLER",
      "timezone": "America/Sao_Paulo"
    }
  ]
}

Mensagens

Envie mensagens de texto no WhatsApp pelos números conectados da empresa. Exige o escopo messages:send.

Enviar mensagem no WhatsApp

post/api/v1/messagesescopo: messages:send

Envia um texto para o telefone por um número (canal) da empresa. Sem channelId, usa o primeiro número conectado. A mensagem aparece no histórico da conversa na Central de atendimento. Respeite as políticas do WhatsApp: envie apenas para quem autorizou o contato.

Corpo (JSON)

phone
stringobrigatório
text
stringobrigatório
channelId
string (uuid)
Número de WhatsApp de envio (padrão: primeiro conectado)

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 409Nenhum número de WhatsApp conectado
  • 422Dados inválidos
  • 429Muitas requisições
  • 502O provedor do WhatsApp recusou o envio
Requisição
curl -X POST "https://central.delm.com.br/api/v1/messages" \
  -H "Authorization: Bearer $DELM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone":"11988887777","text":"Olá Maria! Recebemos seu cadastro. 👋"}'
Resposta 201JSON
{
  "id": "9a8b7c6d-0000-4000-8000-0000000000aa",
  "conversationId": "c0ffee00-1234-4abc-8def-001122334455",
  "contactId": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
  "channelId": "b16b00b5-0000-4000-8000-00000000000a",
  "status": "sent",
  "createdAt": "2026-10-04T13:21:00.000Z"
}

Agenda

Reuniões marcadas pelos vendedores ou pelo SDR com I.A., e horários livres para oferecer ao cliente.

Listar agendamentos

get/api/v1/appointmentsescopo: appointments:read

Agendamentos em ordem cronológica (paginação por cursor).

Parâmetros de consulta

limit
integer
Itens por página (1–100, padrão 50)
cursor
string
Valor de nextCursor da página anterior
from
string (date-time)
Início a partir de (ISO 8601)
to
string (date-time)
Início antes de (ISO 8601)
status
string
SCHEDULED, CONFIRMED, CANCELED, DONE ou NO_SHOW
sellerId
string (uuid)
Vendedor
leadId
string (uuid)
Lead
contactId
string (uuid)
Contato

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/appointments" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "data": [
    {
      "id": "7d2e9f10-1111-4a2b-8c3d-444455556666",
      "title": "Reunião com Maria",
      "notes": null,
      "status": "SCHEDULED",
      "startAt": "2026-10-06T13:00:00.000Z",
      "endAt": "2026-10-06T13:30:00.000Z",
      "sellerId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "seller": {
        "id": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
        "name": "João Vendedor",
        "email": "joao@empresa.com"
      },
      "leadId": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "contactId": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "name": "Maria Souza",
        "phone": "5511988887777",
        "email": "maria@empresa.com"
      },
      "createdBy": "AI",
      "attendeeEmail": "maria@empresa.com",
      "createdAt": "2026-10-04T13:25:00.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Horários livres

get/api/v1/availabilityescopo: appointments:read

Horários livres considerando a disponibilidade semanal do vendedor, a duração da reunião e os compromissos já marcados (antecedência mínima de 1h). Sem sellerId, considera todos os vendedores ativos.

Parâmetros de consulta

sellerId
string (uuid)
Vendedor (opcional)
date
string (date)
Dia inicial YYYY-MM-DD (padrão: hoje, horário de Brasília)
days
integer
Quantidade de dias (1 a 14, padrão 1)

Respostas de erro

  • 401Chave ausente, inválida ou revogada
  • 402Plano sem acesso à API ou conta suspensa
  • 403Escopo insuficiente, chave publicável fora do lugar ou origem não autorizada
  • 404Recurso não encontrado
  • 429Muitas requisições
Requisição
curl "https://central.delm.com.br/api/v1/availability?date=2026-10-06" \
  -H "Authorization: Bearer $DELM_API_KEY"
Resposta 200JSON
{
  "date": "2026-10-06",
  "days": 1,
  "data": [
    {
      "sellerId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "sellerName": "João Vendedor",
      "start": "2026-10-06T12:00:00.000Z",
      "end": "2026-10-06T12:30:00.000Z",
      "label": "segunda-feira, 06/10, 09:00"
    }
  ]
}

Webhooks

Cadastre a URL do seu sistema em Configurações → Integrações e API → Webhooks e escolha os eventos. A cada evento enviamos um POST com JSON:

JSON
{
  "id": "evt_3kTq9Zp1Lm8Xw2Rb",
  "event": "lead.created",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "f5c0abce-af6b-4567-96f2-5042f4aee075",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    }
  }
}
X-Delm-Event
header
Nome do evento, ex.: lead.won
X-Delm-Delivery
header
ID da entrega (cada tentativa da mesma entrega mantém o ID)
X-Delm-Signature
header
t=<unix>,v1=<hex> — HMAC-SHA256 do texto ${t}.${corpo} com o segredo do endpoint

Responda com status 2xx em até 8 segundos. Em caso de erro de rede, timeout, 5xx, 408 ou429, tentamos de novo mais 2 vezes (após 1s e 3s). Todas as entregas ficam no painel, com o botão Reenviar. O id do evento é o mesmo em reenvios: use-o para ignorar duplicados. O botão Enviar teste manda o evento ping.

Eventos

lead.createdUm novo lead entrou no funil (manual, WhatsApp, API ou formulário).ver payload ▸
{
  "id": "evt_…",
  "event": "lead.created",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    }
  }
}
lead.updatedDados do lead mudaram (valor, responsável, título, qualificação…).ver payload ▸
{
  "id": "evt_…",
  "event": "lead.updated",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 4990,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    },
    "changes": [
      "value"
    ]
  }
}
lead.stage_changedO lead foi movido para outra etapa do funil.ver payload ▸
{
  "id": "evt_…",
  "event": "lead.stage_changed",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000002",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000002",
        "name": "Qualificado",
        "position": 1
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    },
    "previousStageId": "a1b2c3d4-0000-4000-8000-000000000001"
  }
}
lead.wonO lead foi marcado como ganho.ver payload ▸
{
  "id": "evt_…",
  "event": "lead.won",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "WON",
      "value": 4990,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    }
  }
}
lead.lostO lead foi marcado como perdido.ver payload ▸
{
  "id": "evt_…",
  "event": "lead.lost",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "LOST",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": "Sem orçamento",
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    },
    "lostReason": "Sem orçamento"
  }
}
contact.createdUm novo contato foi cadastrado.ver payload ▸
{
  "id": "evt_…",
  "event": "contact.created",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "contact": {
      "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "phone": "5511988887777",
      "name": "Maria Souza",
      "email": "maria@empresa.com",
      "kind": "LEAD",
      "tags": [
        "landing-page"
      ],
      "notes": null,
      "createdAt": "2026-10-04T13:20:00.000Z"
    }
  }
}
appointment.createdUm agendamento foi criado (pelo vendedor ou pela I.A.).ver payload ▸
{
  "id": "evt_…",
  "event": "appointment.created",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "appointment": {
      "id": "7d2e9f10-1111-4a2b-8c3d-444455556666",
      "title": "Reunião com Maria",
      "notes": null,
      "status": "SCHEDULED",
      "startAt": "2026-10-06T13:00:00.000Z",
      "endAt": "2026-10-06T13:30:00.000Z",
      "sellerId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "seller": {
        "id": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
        "name": "João Vendedor",
        "email": "joao@empresa.com"
      },
      "leadId": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "contactId": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "name": "Maria Souza",
        "phone": "5511988887777",
        "email": "maria@empresa.com"
      },
      "createdBy": "AI",
      "attendeeEmail": "maria@empresa.com",
      "createdAt": "2026-10-04T13:25:00.000Z"
    }
  }
}
appointment.confirmedO cliente confirmou presença.ver payload ▸
{
  "id": "evt_…",
  "event": "appointment.confirmed",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "appointment": {
      "id": "7d2e9f10-1111-4a2b-8c3d-444455556666",
      "title": "Reunião com Maria",
      "notes": null,
      "status": "CONFIRMED",
      "startAt": "2026-10-06T13:00:00.000Z",
      "endAt": "2026-10-06T13:30:00.000Z",
      "sellerId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "seller": {
        "id": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
        "name": "João Vendedor",
        "email": "joao@empresa.com"
      },
      "leadId": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "contactId": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "name": "Maria Souza",
        "phone": "5511988887777",
        "email": "maria@empresa.com"
      },
      "createdBy": "AI",
      "attendeeEmail": "maria@empresa.com",
      "createdAt": "2026-10-04T13:25:00.000Z"
    }
  }
}
appointment.canceledO agendamento foi cancelado.ver payload ▸
{
  "id": "evt_…",
  "event": "appointment.canceled",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "appointment": {
      "id": "7d2e9f10-1111-4a2b-8c3d-444455556666",
      "title": "Reunião com Maria",
      "notes": null,
      "status": "CANCELED",
      "startAt": "2026-10-06T13:00:00.000Z",
      "endAt": "2026-10-06T13:30:00.000Z",
      "sellerId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "seller": {
        "id": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
        "name": "João Vendedor",
        "email": "joao@empresa.com"
      },
      "leadId": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "contactId": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "name": "Maria Souza",
        "phone": "5511988887777",
        "email": "maria@empresa.com"
      },
      "createdBy": "AI",
      "attendeeEmail": "maria@empresa.com",
      "createdAt": "2026-10-04T13:25:00.000Z"
    }
  }
}
conversation.closedUma conversa do WhatsApp foi finalizada.ver payload ▸
{
  "id": "evt_…",
  "event": "conversation.closed",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "conversation": {
      "id": "c0ffee00-1234-4abc-8def-001122334455",
      "channelId": "b16b00b5-0000-4000-8000-00000000000a",
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "assignedUserId": "3273dbdb-b3c5-47a2-8626-5dbfaac2c6e6",
      "closedAt": "2026-10-04T15:00:00.000Z"
    }
  }
}
form.submittedAlguém preencheu um formulário de captura da landing page.ver payload ▸
{
  "id": "evt_…",
  "event": "form.submitted",
  "createdAt": "2026-10-04T13:20:01.000Z",
  "organizationId": "…",
  "data": {
    "form": {
      "id": "f0f0f0f0-0000-4000-8000-000000000001",
      "publicId": "frm_7Hq2kLm9PzXa",
      "name": "Landing Black Friday"
    },
    "fields": {
      "name": "Maria Souza",
      "phone": "11988887777",
      "email": "maria@empresa.com",
      "utm_source": "google"
    },
    "lead": {
      "id": "3f6c1d2b-8a4e-4b1f-9c7d-2e5a8b9c0d12",
      "title": "Maria Souza",
      "status": "OPEN",
      "value": 0,
      "score": 0,
      "source": "api",
      "company": "Empresa X",
      "pipelineId": "5b38b5c4-0d06-48be-abd3-7400db95726e",
      "stageId": "a1b2c3d4-0000-4000-8000-000000000001",
      "stage": {
        "id": "a1b2c3d4-0000-4000-8000-000000000001",
        "name": "Novo",
        "position": 0
      },
      "ownerId": null,
      "owner": null,
      "contact": {
        "id": "8c1f2a9e-3b7d-4c2e-9a51-1f0d6b2e7c11",
        "phone": "5511988887777",
        "name": "Maria Souza",
        "email": "maria@empresa.com",
        "kind": "LEAD",
        "tags": [
          "landing-page"
        ],
        "notes": null,
        "createdAt": "2026-10-04T13:20:00.000Z"
      },
      "qualification": {
        "utm_source": "google",
        "utm_campaign": "black-friday",
        "Interesse": "Plano Pro"
      },
      "lostReason": null,
      "createdAt": "2026-10-04T13:20:00.000Z",
      "updatedAt": "2026-10-04T13:20:00.000Z"
    }
  }
}

Verificar a assinatura

Sempre valide o cabeçalho X-Delm-Signature com o segredo do endpoint (whsec_…, visível no painel) e rejeite timestamps com mais de 5 minutos para evitar replays. Calcule o HMAC sobre o corpo bruto, exatamente como recebido.

import crypto from "node:crypto";
import express from "express";

const app = express();
const SECRET = process.env.DELM_WEBHOOK_SECRET; // whsec_...

// Importante: use o corpo BRUTO (antes do JSON.parse) para calcular a assinatura
app.post("/webhooks/delm", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("X-Delm-Signature") ?? "";            // t=1759584000,v1=5f2c...
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const body = req.body.toString("utf8");

  const expected = crypto.createHmac("sha256", SECRET).update(`${parts.t}.${body}`).digest("hex");
  const valid = parts.v1 && expected.length === parts.v1.length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300; // 5 minutos

  if (!valid || !fresh) return res.status(400).send("assinatura inválida");

  const event = JSON.parse(body);
  // event.id se repete em reenvios: use para não processar duas vezes
  if (event.event === "lead.created") {
    console.log("Novo lead:", event.data.lead.title, event.data.lead.contact?.phone);
  }
  res.sendStatus(200); // responda rápido (até 8s); processe pesado em fila
});

Especificação OpenAPI 3.1

Importe no Postman, Insomnia ou gere um cliente tipado a partir de https://central.delm.com.br/api/v1/openapi.json.