Ir para o conteúdo

Endpoints da API

Referência de cada endpoint da API pública do Data Lead, com exemplos de curl e respostas JSON de leads, conversas, playbooks, uso e webhooks.

Atualizado em

Todos os endpoints ficam sob https://app.datalead.datastone.com.br/api/v1 e exigem Authorization: Bearer dl_…, exceto a especificação OpenAPI. Veja API pública para tokens, escopos, limites e paginação.

Nos exemplos abaixo, $DL é o seu token:

export DL="dl_SEU_TOKEN"
export API="https://app.datalead.datastone.com.br/api/v1"

Resumo

Método e rota Escopo Paginação
GET /leads leitura cursor
GET /leads/{id} leitura —
PATCH /leads/{id} escrita —
GET /conversations leitura cursor
GET /conversations/{id} leitura —
GET /playbooks leitura lista completa
GET /usage leitura —
GET /webhooks leitura lista completa
GET /openapi.json público —

GET /leads

Lista os leads da conta, do mais recente para o mais antigo. Aceita ?limit= (1 a 200, padrão 50) e ?cursor=. Um ?limit= fora dessa faixa devolve 400, com a faixa na mensagem — não é recortado em silêncio.

curl -H "Authorization: Bearer $DL" "$API/leads?limit=2"
{
  "data": [
    {
      "id": "5f1c8b0e-9d2a-4a11-9a0e-2c6d1f3b7e40",
      "created_at": "2026-09-05T14:22:07.118Z",
      "name": "João Ribeiro",
      "email": "jo***@padariacentral.com.br",
      "phone": "(11) 9****-0042",
      "company": "Padaria Central",
      "score": 82,
      "status": "qualified",
      "conversation_id": "c2b0f6a1-3d4e-4f52-8b77-9e1a5c0d2f31",
      "crm": {
        "hubspot": {
          "id": "701234567",
          "url": "https://app.hubspot.com/contacts/0/contact/701234567",
          "status": "synced"
        }
      }
    },
    {
      "id": "8a7d2c14-6e3b-4c90-b2f1-0d4e9a6c7b52",
      "created_at": "2026-09-05T11:03:44.902Z",
      "name": "Marina Alves",
      "email": null,
      "phone": "(21) 9****-1188",
      "company": null,
      "score": 41,
      "status": "open",
      "conversation_id": "3d9f1a72-8c05-4be6-a7d3-1f28e4b90c65",
      "crm": {}
    }
  ],
  "next_cursor": "MjAyNi0wOS0wNVQxMTowMzo0NC45MDJafDhhN2QyYzE0LTZlM2ItNGM5MC1iMmYxLTBkNGU5YTZjN2I1Mg"
}

status é um de open, qualified, disqualified, converted. O objeto crm traz uma chave por provedor conectado, com status de sincronização em pending, synced ou error.

GET /leads/{id}

curl -H "Authorization: Bearer $DL" "$API/leads/5f1c8b0e-9d2a-4a11-9a0e-2c6d1f3b7e40"

A resposta é o objeto de lead acima, sem envelope. Um lead inexistente — ou de outra conta — devolve o mesmo 404, para o identificador não virar oráculo de existência.

PATCH /leads/{id}

Única escrita da API. Exige token com escopo de escrita; um token de leitura recebe 403.

curl -X PATCH \
  -H "Authorization: Bearer $DL" \
  -H "Content-Type: application/json" \
  -d '{"status":"converted"}' \
  "$API/leads/5f1c8b0e-9d2a-4a11-9a0e-2c6d1f3b7e40"

A resposta é o lead atualizado, com o contato mascarado como no GET:

{
  "id": "5f1c8b0e-9d2a-4a11-9a0e-2c6d1f3b7e40",
  "created_at": "2026-09-05T14:22:07.118Z",
  "name": "João Ribeiro",
  "email": "jo***@padariacentral.com.br",
  "phone": "(11) 9****-0042",
  "company": "Padaria Central",
  "score": 82,
  "status": "converted",
  "conversation_id": "c2b0f6a1-3d4e-4f52-8b77-9e1a5c0d2f31",
  "crm": { "hubspot": { "id": "701234567", "url": "https://app.hubspot.com/contacts/0/contact/701234567", "status": "synced" } }
}

O corpo aceita apenas status. Qualquer outro campo é recusado com 400:

{ "error": "Corpo inválido. Envie { \"status\": … } com um destes valores: open, qualified, disqualified, converted." }

Recusar em vez de ignorar é deliberado: quem manda { "status": …, "score": … } acredita ter mudado os dois, e gravar só um deixaria o seu CRM e o Data Lead divergentes sem ninguém perceber. O score é calculado pelo agente e o contato é dado do visitante — nenhum dos dois é gravável pela API.

GET /conversations

Aceita ?limit=, ?cursor=, ?since= (data ISO 8601) e ?outcome= (open, qualified, disqualified, handoff, closed). A lista não traz a transcrição.

curl -H "Authorization: Bearer $DL" \
  "$API/conversations?since=2026-09-01T00:00:00Z&outcome=qualified&limit=1"
{
  "data": [
    {
      "id": "c2b0f6a1-3d4e-4f52-8b77-9e1a5c0d2f31",
      "started_at": "2026-09-05T14:18:02.005Z",
      "last_message_at": "2026-09-05T14:22:05.771Z",
      "ended_at": "2026-09-05T14:22:07.118Z",
      "outcome": "qualified",
      "score": 82,
      "is_test": false,
      "playbook_id": "b41d7e59-2a68-4f03-8c1d-5e7a9b0c2d34",
      "summary": "Padaria com 12 funcionários buscando controle de estoque; pediu contato comercial."
    }
  ],
  "next_cursor": null
}

Uma data ilegível em since devolve 400 (Parâmetro since deve ser uma data ISO 8601), e um outcome fora da lista devolve Parâmetro outcome inválido — aceitar em silêncio devolveria a base inteira para quem pediu "só o que mudou desde ontem".

GET /conversations/{id}

A conversa com a transcrição, em ordem cronológica.

curl -H "Authorization: Bearer $DL" "$API/conversations/c2b0f6a1-3d4e-4f52-8b77-9e1a5c0d2f31"
{
  "id": "c2b0f6a1-3d4e-4f52-8b77-9e1a5c0d2f31",
  "started_at": "2026-09-05T14:18:02.005Z",
  "last_message_at": "2026-09-05T14:22:05.771Z",
  "ended_at": "2026-09-05T14:22:07.118Z",
  "outcome": "qualified",
  "score": 82,
  "is_test": false,
  "playbook_id": "b41d7e59-2a68-4f03-8c1d-5e7a9b0c2d34",
  "summary": "Padaria com 12 funcionários buscando controle de estoque; pediu contato comercial.",
  "messages": [
    { "id": "0f2a…", "role": "assistant", "content": "Oi! Posso ajudar a escolher o plano?", "ts": "2026-09-05T14:18:03.220Z" },
    { "id": "1b8c…", "role": "user", "content": "Meu e-mail é jo***@padariacentral.com.br", "ts": "2026-09-05T14:21:40.010Z" }
  ],
  "messages_truncated": false
}

O texto das mensagens sai com e-mail e telefone mascarados, as mesmas máscaras de /leads. A transcrição íntegra só é acessível no painel, autenticado por pessoa.

Teto da transcrição. messages traz no máximo 5.000 mensagens. Acima disso vêm as 5.000 primeiras e messages_truncated vira true — o campo está sempre na resposta, inclusive como false, para o seu código poder conferir sem adivinhar. Uma conversa desse tamanho é sinal de laço ou de integração reaproveitando a mesma conversa; se você precisar dela inteira, fale com o suporte antes de montar contorno.

GET /playbooks

Lista completa, sem a definição interna do playbook (perguntas, critérios e instruções não saem pela API). next_cursor é sempre null.

curl -H "Authorization: Bearer $DL" "$API/playbooks"
{
  "data": [
    {
      "id": "b41d7e59-2a68-4f03-8c1d-5e7a9b0c2d34",
      "name": "Qualificação B2B",
      "objective": "meeting",
      "active": true,
      "created_at": "2026-08-14T09:12:31.400Z"
    }
  ],
  "next_cursor": null
}

objective é um de meeting, lead, whatsapp, sale.

Escrita de playbook é substituição inteira. A API pública não grava playbooks — quem grava é o painel, e a rota que ele usa (PUT /api/v1/agent/playbooks/{id}, autenticada pela sessão, não por token) troca a definição completa. Tudo o que você não mandar no corpo é apagado, sem erro nenhum: perguntas, critérios, o link de checkout do playbook e o rótulo do botão de checkout. Se você automatiza esse PUT, monte o corpo a partir da leitura mais recente daquele playbook — nunca de um snapshot guardado antes de uma atualização do produto.

GET /usage

Consumo do mês corrente e limite do plano. Não tem envelope de lista.

curl -H "Authorization: Bearer $DL" "$API/usage"
{
  "month": "2026-09-01",
  "identifications": 37,
  "credits": 44,
  "by_kind": { "reveal": 25, "enrich": 12 },
  "plan": { "id": "pro", "name": "Pro", "identifications_per_month": 1000 }
}

GET /webhooks

Lista completa dos endpoints cadastrados. O segredo de assinatura nunca é devolvido.

curl -H "Authorization: Bearer $DL" "$API/webhooks"
{
  "data": [
    {
      "id": "9a2b6d70-4c15-4e83-b0a9-7f3c2e1d8b46",
      "url": "https://seusistema.com/webhooks/datalead",
      "events": ["lead.created", "lead.qualified"],
      "active": true,
      "description": "ERP interno",
      "last_status": 204,
      "last_delivery_at": "2026-09-05T14:22:09.640Z",
      "failures": 0,
      "created_at": "2026-08-20T17:45:02.117Z"
    }
  ],
  "next_cursor": null
}

GET /openapi.json

Documento OpenAPI 3.1, público e sem token:

curl https://app.datalead.datastone.com.br/api/v1/openapi.json

Veja também

Precisa de ajuda?

Fale com o suporte da Data Stone pelo canal combinado com a sua conta. Tenha à mão a rota chamada, o status recebido e o horário da chamada.