Documentação API

SDRBOT.ai API

SDR com inteligencia artificial. Gerencie leads, envie mensagens via WhatsApp e RCS, configure webhooks e qualifique prospects via API.

Autenticação

Todas as requisições devem incluir o header Authorization com um token Bearer obtido no painel do SDRBOT.ai.

Base URL

https://sdrbot.ai/api/v1

Header de Autenticação

Authorization: Bearer SEU_TOKEN_AQUI

Codigos de Erro

Codigo HTTP Descrição
200 Sucesso
201 Recurso criado com sucesso
400 Requisicao inválida (parâmetros faltando ou incorretos)
401 Nao autorizado (token invalido ou ausente)
403 Proibido (sem permissao para o recurso)
404 Recurso nao encontrado
422 Entidade nao processavel (validacao falhou)
429 Rate limit excedido
500 Erro interno do servidor

Formato de Erro

{
  "error": true,
  "message": "Descrição do erro",
  "errors": {
    "campo": ["Mensagem de validacao"]
  }
}

Rate Limits

Limite Valor
Requisicoes por minuto 60
Requisicoes por dia 10.000

Quando o rate limit e excedido, a API retorna 429 Too Many Requests com o header Retry-After indicando quantos segundos aguardar.

Leads

GET /api/v1/leads Listar leads

Retorna a lista paginada de leads.

Parâmetros de Query

Parâmetro Tipo Descrição
page int Numero da pagina (default: 1)
per_page int Itens por pagina (default: 20, max: 100)
status string Filtrar por status: novo, qualificado, descartado, convertido
search string Busca por nome, email ou telefone

Exemplos

curl -X GET "https://sdrbot.ai/api/v1/leads?page=1&per_page=20&status=qualificado" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"
import requests

url = "https://sdrbot.ai/api/v1/leads"
headers = {
    "Authorization": "Bearer SEU_TOKEN_AQUI",
    "Accept": "application/json"
}
params = {
    "page": 1,
    "per_page": 20,
    "status": "qualificado"
}

response = requests.get(url, headers=headers, params=params)
data = response.json()
print(data)
const response = await fetch('https://sdrbot.ai/api/v1/leads?page=1&per_page=20&status=qualificado', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Accept': 'application/json'
  }
});

const data = await response.json();
console.log(data);
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sdrbot.ai/api/v1/leads?page=1&per_page=20&status=qualificado');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Accept: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer SEU_TOKEN_AQUI");
client.DefaultRequestHeaders.Add("Accept", "application/json");

var response = await client.GetAsync("https://sdrbot.ai/api/v1/leads?page=1&per_page=20&status=qualificado");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
Resposta 200 OK
{
  "data": [
    {
      "id": 1234,
      "name": "Joao Silva",
      "email": "joao@empresa.com",
      "phone": "5551999999999",
      "company": "Empresa LTDA",
      "status": "qualificado",
      "score": 85,
      "tags": ["hot-lead", "saas"],
      "custom_fields": {
        "cargo": "Diretor de TI",
        "origem": "site"
      },
      "created_at": "2026-01-10T14:30:00Z",
      "updated_at": "2026-01-15T09:20:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 20,
    "total": 150,
    "last_page": 8
  }
}
POST /api/v1/leads Criar lead

Parâmetros (Body JSON)

Parâmetro Tipo Obrigatório Descrição
name string Sim Nome do lead
email string Nao Email do lead
phone string Sim Telefone com código do pais (ex: 5551999999999)
company string Nao Nome da empresa
status string Nao Status inicial: novo (default), qualificado, descartado, convertido
tags array Nao Lista de tags
custom_fields object Nao Campos personalizados (chave-valor)

Exemplos

curl -X POST "https://sdrbot.ai/api/v1/leads" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "name": "Maria Santos",
    "email": "maria@empresa.com",
    "phone": "5551888888888",
    "company": "Tech Solutions",
    "status": "novo",
    "tags": ["inbound", "trial"],
    "custom_fields": {
      "cargo": "CEO",
      "origem": "landing-page",
      "segmento": "tecnologia"
    }
  }'
import requests

url = "https://sdrbot.ai/api/v1/leads"
headers = {
    "Authorization": "Bearer SEU_TOKEN_AQUI",
    "Content-Type": "application/json",
    "Accept": "application/json"
}
payload = {
    "name": "Maria Santos",
    "email": "maria@empresa.com",
    "phone": "5551888888888",
    "company": "Tech Solutions",
    "status": "novo",
    "tags": ["inbound", "trial"],
    "custom_fields": {
        "cargo": "CEO",
        "origem": "landing-page",
        "segmento": "tecnologia"
    }
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
const response = await fetch('https://sdrbot.ai/api/v1/leads', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  },
  body: JSON.stringify({
    name: 'Maria Santos',
    email: 'maria@empresa.com',
    phone: '5551888888888',
    company: 'Tech Solutions',
    status: 'novo',
    tags: ['inbound', 'trial'],
    custom_fields: {
      cargo: 'CEO',
      origem: 'landing-page',
      segmento: 'tecnologia'
    }
  })
});

const data = await response.json();
console.log(data);
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sdrbot.ai/api/v1/leads');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Content-Type: application/json',
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'name' => 'Maria Santos',
    'email' => 'maria@empresa.com',
    'phone' => '5551888888888',
    'company' => 'Tech Solutions',
    'status' => 'novo',
    'tags' => ['inbound', 'trial'],
    'custom_fields' => [
        'cargo' => 'CEO',
        'origem' => 'landing-page',
        'segmento' => 'tecnologia'
    ]
]));

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer SEU_TOKEN_AQUI");
client.DefaultRequestHeaders.Add("Accept", "application/json");

var payload = new {
    name = "Maria Santos",
    email = "maria@empresa.com",
    phone = "5551888888888",
    company = "Tech Solutions",
    status = "novo",
    tags = new[] { "inbound", "trial" },
    custom_fields = new {
        cargo = "CEO",
        origem = "landing-page",
        segmento = "tecnologia"
    }
};

var json = System.Text.Json.JsonSerializer.Serialize(payload);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PostAsync("https://sdrbot.ai/api/v1/leads", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Resposta 201 Created
{
  "data": {
    "id": 1235,
    "name": "Maria Santos",
    "email": "maria@empresa.com",
    "phone": "5551888888888",
    "company": "Tech Solutions",
    "status": "novo",
    "score": 0,
    "tags": ["inbound", "trial"],
    "custom_fields": {
      "cargo": "CEO",
      "origem": "landing-page",
      "segmento": "tecnologia"
    },
    "created_at": "2026-03-26T10:00:00Z",
    "updated_at": "2026-03-26T10:00:00Z"
  }
}
GET /api/v1/leads/{id} Buscar lead por ID

Retorna os dados de um lead especifico pelo seu ID.

Exemplos

curl -X GET "https://sdrbot.ai/api/v1/leads/1234" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"
import requests

url = "https://sdrbot.ai/api/v1/leads/1234"
headers = {
    "Authorization": "Bearer SEU_TOKEN_AQUI",
    "Accept": "application/json"
}

response = requests.get(url, headers=headers)
data = response.json()
print(data)
const response = await fetch('https://sdrbot.ai/api/v1/leads/1234', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Accept': 'application/json'
  }
});

const data = await response.json();
console.log(data);
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sdrbot.ai/api/v1/leads/1234');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Accept: application/json'
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
?>
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer SEU_TOKEN_AQUI");
client.DefaultRequestHeaders.Add("Accept", "application/json");

var response = await client.GetAsync("https://sdrbot.ai/api/v1/leads/1234");
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
Resposta 200 OK
{
  "data": {
    "id": 1234,
    "name": "Joao Silva",
    "email": "joao@empresa.com",
    "phone": "5551999999999",
    "company": "Empresa LTDA",
    "status": "qualificado",
    "score": 85,
    "tags": ["hot-lead", "saas"],
    "custom_fields": {
      "cargo": "Diretor de TI",
      "origem": "site"
    },
    "created_at": "2026-01-10T14:30:00Z",
    "updated_at": "2026-01-15T09:20:00Z"
  }
}
PUT /api/v1/leads/{id} Atualizar lead

Parâmetros (Body JSON)

Mesmos parâmetros do POST, todos opcionais. Apenas os campos enviados serao atualizados.

Exemplos

curl -X PUT "https://sdrbot.ai/api/v1/leads/1234" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "status": "qualificado",
    "tags": ["hot-lead", "saas", "enterprise"],
    "custom_fields": {
      "cargo": "CTO",
      "orcamento": "50000"
    }
  }'
import requests

url = "https://sdrbot.ai/api/v1/leads/1234"
headers = {
    "Authorization": "Bearer SEU_TOKEN_AQUI",
    "Content-Type": "application/json",
    "Accept": "application/json"
}
payload = {
    "status": "qualificado",
    "tags": ["hot-lead", "saas", "enterprise"],
    "custom_fields": {
        "cargo": "CTO",
        "orcamento": "50000"
    }
}

response = requests.put(url, json=payload, headers=headers)
print(response.json())
const response = await fetch('https://sdrbot.ai/api/v1/leads/1234', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  },
  body: JSON.stringify({
    status: 'qualificado',
    tags: ['hot-lead', 'saas', 'enterprise'],
    custom_fields: {
      cargo: 'CTO',
      orcamento: '50000'
    }
  })
});

const data = await response.json();
console.log(data);
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sdrbot.ai/api/v1/leads/1234');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Content-Type: application/json',
    'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'status' => 'qualificado',
    'tags' => ['hot-lead', 'saas', 'enterprise'],
    'custom_fields' => [
        'cargo' => 'CTO',
        'orcamento' => '50000'
    ]
]));

$response = curl_exec($ch);
curl_close($ch);
print_r(json_decode($response, true));
?>
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer SEU_TOKEN_AQUI");
client.DefaultRequestHeaders.Add("Accept", "application/json");

var payload = new {
    status = "qualificado",
    tags = new[] { "hot-lead", "saas", "enterprise" },
    custom_fields = new {
        cargo = "CTO",
        orcamento = "50000"
    }
};

var json = System.Text.Json.JsonSerializer.Serialize(payload);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

var response = await client.PutAsync("https://sdrbot.ai/api/v1/leads/1234", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Resposta 200 OK
{
  "data": {
    "id": 1234,
    "name": "Joao Silva",
    "email": "joao@empresa.com",
    "phone": "5551999999999",
    "company": "Empresa LTDA",
    "status": "qualificado",
    "score": 85,
    "tags": ["hot-lead", "saas", "enterprise"],
    "custom_fields": {
      "cargo": "CTO",
      "origem": "site",
      "orcamento": "50000"
    },
    "created_at": "2026-01-10T14:30:00Z",
    "updated_at": "2026-03-26T10:15:00Z"
  }
}
DELETE /api/v1/leads/{id} Excluir lead

Exemplos

curl -X DELETE "https://sdrbot.ai/api/v1/leads/1234" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"
import requests

url = "https://sdrbot.ai/api/v1/leads/1234"
headers = {
    "Authorization": "Bearer SEU_TOKEN_AQUI",
    "Accept": "application/json"
}

response = requests.delete(url, headers=headers)
print(response.status_code)  # 204
const response = await fetch('https://sdrbot.ai/api/v1/leads/1234', {
  method: 'DELETE',
  headers: {
    'Authorization': 'Bearer SEU_TOKEN_AQUI',
    'Accept': 'application/json'
  }
});

console.log(response.status);  // 204
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://sdrbot.ai/api/v1/leads/1234');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer SEU_TOKEN_AQUI',
    'Accept: application/json'
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $httpCode;  // 204
?>
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer SEU_TOKEN_AQUI");
client.DefaultRequestHeaders.Add("Accept", "application/json");

var response = await client.DeleteAsync("https://sdrbot.ai/api/v1/leads/1234");
Console.WriteLine(response.StatusCode);  // NoContent (204)
Resposta 204 No Content

Retorna status 204 sem corpo na resposta.

Mensagens WhatsApp

POST /api/v1/messages/whatsapp Enviar mensagem WhatsApp

Envia mensagens via WhatsApp Business API. Suporta texto livre, templates pre-aprovados e imagens.

Parâmetros (Body JSON)

Parâmetro Tipo Obrigatório Descrição
to string Sim Numero do destinatario com código do pais (ex: 5551999999999)
type string Sim Tipo da mensagem: text, template, image
text string Condicional Texto da mensagem (obrigatório quando type=text)
template_name string Condicional Nome do template (obrigatório quando type=template)
template_params array Nao Parâmetros do template, em ordem
template_language string Nao Idioma do template (default: pt_BR)
image_url string Condicional URL da imagem (obrigatório quando type=image)
caption string Nao Legenda da imagem
lead_id int Nao ID do lead associado

Exemplo: Mensagem de Texto

curl -X POST "https://sdrbot.ai/api/v1/messages/whatsapp" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "text",
    "text": "Ola Joao! Tudo bem? Gostaria de agendar uma demonstracao do nosso produto.",
    "lead_id": 1234
  }'

Exemplo: Mensagem com Template

curl -X POST "https://sdrbot.ai/api/v1/messages/whatsapp" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "template",
    "template_name": "boas_vindas",
    "template_params": ["Joao", "SDRBOT.ai"],
    "template_language": "pt_BR",
    "lead_id": 1234
  }'

Exemplo: Mensagem com Imagem

curl -X POST "https://sdrbot.ai/api/v1/messages/whatsapp" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "image",
    "image_url": "https://seusite.com.br/img/proposta-comercial.png",
    "caption": "Confira nossa proposta comercial personalizada!",
    "lead_id": 1234
  }'
Resposta 200 OK
{
  "data": {
    "id": "msg_abc123def456",
    "to": "5551999999999",
    "type": "text",
    "status": "sent",
    "lead_id": 1234,
    "created_at": "2026-03-26T10:30:00Z"
  }
}

Templates

GET /api/v1/templates Listar templates WhatsApp

Lista os templates aprovados disponiveis para envio de mensagens WhatsApp.

Parâmetros de Query

Parâmetro Tipo Descrição
page int Numero da pagina (default: 1)
per_page int Itens por pagina (default: 20)
status string Filtrar por status: approved, pending, rejected

Exemplo

curl -X GET "https://sdrbot.ai/api/v1/templates?status=approved" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"
Resposta 200 OK
{
  "data": [
    {
      "id": 10,
      "name": "boas_vindas",
      "language": "pt_BR",
      "status": "approved",
      "category": "MARKETING",
      "body": "Ola 1! Bem-vindo ao 2. Estamos felizes em te-lo conosco.",
      "params_count": 2,
      "created_at": "2026-01-05T08:00:00Z"
    },
    {
      "id": 11,
      "name": "agendamento_demo",
      "language": "pt_BR",
      "status": "approved",
      "category": "UTILITY",
      "body": "Ola 1, sua demonstracao esta confirmada para 2 as 3. Ate la!",
      "params_count": 3,
      "created_at": "2026-01-10T10:00:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "per_page": 20,
    "total": 2,
    "last_page": 1
  }
}

Mensagens RCS

POST /api/v1/messages/rcs Enviar mensagem RCS

Envia mensagens via RCS (Rich Communication Services). Suporta texto, cards, carousels, mensagens com resposta e localizacao.

Parâmetros Comuns (Body JSON)

Parâmetro Tipo Obrigatório Descrição
to string Sim Numero do destinatario com código do pais
type string Sim Tipo: text, card, carousel, replyable_text, location
lead_id int Nao ID do lead associado

Exemplo: Texto Simples

curl -X POST "https://sdrbot.ai/api/v1/messages/rcs" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "text",
    "text": "Ola! Obrigado pelo seu interesse. Como posso ajudar?"
  }'

Exemplo: Card

curl -X POST "https://sdrbot.ai/api/v1/messages/rcs" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "card",
    "card": {
      "title": "Plano Empresarial",
      "description": "Ideal para empresas com mais de 50 colaboradores. Inclui suporte prioritario e integração completa.",
      "image_url": "https://seusite.com.br/img/plano-empresarial.jpg",
      "buttons": [
        {
          "type": "url",
          "text": "Ver detalhes",
          "url": "https://seusite.com.br/planos/empresarial"
        },
        {
          "type": "reply",
          "text": "Quero contratar",
          "payload": "contratar_empresarial"
        }
      ]
    },
    "lead_id": 1234
  }'

Exemplo: Carousel

curl -X POST "https://sdrbot.ai/api/v1/messages/rcs" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "carousel",
    "carousel": {
      "cards": [
        {
          "title": "Plano Starter",
          "description": "Para pequenas empresas. Ate 10 usuarios.",
          "image_url": "https://seusite.com.br/img/plano-starter.jpg",
          "buttons": [
            { "type": "reply", "text": "Saber mais", "payload": "info_starter" }
          ]
        },
        {
          "title": "Plano Business",
          "description": "Para empresas em crescimento. Ate 50 usuarios.",
          "image_url": "https://seusite.com.br/img/plano-business.jpg",
          "buttons": [
            { "type": "reply", "text": "Saber mais", "payload": "info_business" }
          ]
        },
        {
          "title": "Plano Enterprise",
          "description": "Para grandes empresas. Usuarios ilimitados.",
          "image_url": "https://seusite.com.br/img/plano-enterprise.jpg",
          "buttons": [
            { "type": "reply", "text": "Saber mais", "payload": "info_enterprise" }
          ]
        }
      ]
    },
    "lead_id": 1234
  }'

Exemplo: Texto com Opcoes de Resposta

curl -X POST "https://sdrbot.ai/api/v1/messages/rcs" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "replyable_text",
    "text": "Qual horario funciona melhor para uma demonstracao?",
    "replies": [
      { "text": "Manha (9h-12h)", "payload": "horario_manha" },
      { "text": "Tarde (14h-17h)", "payload": "horario_tarde" },
      { "text": "Noite (18h-20h)", "payload": "horario_noite" }
    ],
    "lead_id": 1234
  }'

Exemplo: Localizacao

curl -X POST "https://sdrbot.ai/api/v1/messages/rcs" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "5551999999999",
    "type": "location",
    "location": {
      "latitude": -30.0346,
      "longitude": -51.2177,
      "label": "IAGENTE - Escritorio Porto Alegre",
      "address": "Porto Alegre, RS, Brasil"
    },
    "lead_id": 1234
  }'
Resposta RCS 200 OK
{
  "data": {
    "id": "rcs_xyz789abc123",
    "to": "5551999999999",
    "type": "card",
    "status": "sent",
    "lead_id": 1234,
    "created_at": "2026-03-26T11:00:00Z"
  }
}

Webhooks

POST /api/v1/webhooks Criar webhook

Parâmetros (Body JSON)

Parâmetro Tipo Obrigatório Descrição
url string Sim URL de callback (HTTPS)
events array Sim Lista de eventos para escutar
secret string Nao Chave secreta para verificacao de assinatura
active boolean Nao Ativar/desativar webhook (default: true)
curl -X POST "https://sdrbot.ai/api/v1/webhooks" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://seusite.com.br/webhooks/sdrbot",
    "events": ["lead.created", "lead.updated", "message.sent", "message.delivered", "message.read"],
    "secret": "sua_chave_secreta_aqui",
    "active": true
  }'
GET /api/v1/webhooks Listar webhooks
curl -X GET "https://sdrbot.ai/api/v1/webhooks" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"
PUT /api/v1/webhooks/{id} Atualizar webhook

Mesmos parâmetros do POST, todos opcionais.

curl -X PUT "https://sdrbot.ai/api/v1/webhooks/5" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Content-Type: application/json" \
  -d '{
    "events": ["lead.created", "lead.updated", "lead.deleted", "message.sent", "message.delivered", "message.read", "message.failed"],
    "active": true
  }'
DELETE /api/v1/webhooks/{id} Excluir webhook
curl -X DELETE "https://sdrbot.ai/api/v1/webhooks/5" \
  -H "Authorization: Bearer SEU_TOKEN_AQUI" \
  -H "Accept: application/json"

Eventos Disponiveis

Evento Descrição
lead.created Novo lead criado
lead.updated Lead atualizado
lead.deleted Lead excluido
lead.qualified Lead qualificado pela IA
lead.converted Lead convertido em cliente
message.sent Mensagem enviada
message.delivered Mensagem entregue
message.read Mensagem lida
message.failed Falha no envio da mensagem
message.received Mensagem recebida do lead

Formato do Webhook

POST https://seusite.com.br/webhooks/sdrbot

Headers:
  Content-Type: application/json
  X-SDRBOT-Signature: sha256=abc123def456...
  X-SDRBOT-Event: lead.qualified
  X-SDRBOT-Delivery: evt_789xyz

Body:
{
  "event": "lead.qualified",
  "timestamp": "2026-03-26T10:30:00Z",
  "data": {
    "id": 1234,
    "name": "Joao Silva",
    "email": "joao@empresa.com",
    "phone": "5551999999999",
    "company": "Empresa LTDA",
    "status": "qualificado",
    "score": 85,
    "tags": ["hot-lead", "saas"],
    "qualification_reason": "Lead demonstrou alto interesse, respondeu em menos de 5 minutos e solicitou demonstracao."
  }
}

Verificacao de Assinatura

Se voce configurou um secret no webhook, cada requisição incluira o header X-SDRBOT-Signature com uma assinatura HMAC-SHA256 do corpo da requisição. Verifique a assinatura para garantir que a requisição e autentica.

<?php
$secret = 'sua_chave_secreta_aqui';
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SDRBOT_SIGNATURE'] ?? '';

$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    echo json_encode(['error' => 'Assinatura invalida']);
    exit;
}

// Assinatura válida - processar o webhook
$data = json_decode($payload, true);
$event = $_SERVER['HTTP_X_SDRBOT_EVENT'] ?? '';

switch ($event) {
    case 'lead.created':
        // Processar novo lead
        break;
    case 'lead.qualified':
        // Processar lead qualificado
        break;
    case 'message.received':
        // Processar mensagem recebida
        break;
}

http_response_code(200);
echo json_encode(['ok' => true]);
?>
import hmac
import hashlib
import json
from flask import Flask, request, jsonify

app = Flask(__name__)
SECRET = 'sua_chave_secreta_aqui'

@app.route('/webhooks/sdrbot', methods=['POST'])
def handle_webhook():
    payload = request.get_data()
    signature = request.headers.get('X-SDRBOT-Signature', '')

    expected = 'sha256=' + hmac.new(
        SECRET.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(expected, signature):
        return jsonify({'error': 'Assinatura invalida'}), 401

    data = json.loads(payload)
    event = request.headers.get('X-SDRBOT-Event', '')

    if event == 'lead.created':
        # Processar novo lead
        pass
    elif event == 'lead.qualified':
        # Processar lead qualificado
        pass
    elif event == 'message.received':
        # Processar mensagem recebida
        pass

    return jsonify({'ok': True}), 200
const crypto = require('crypto');
const express = require('express');
const app = express();

const SECRET = 'sua_chave_secreta_aqui';

app.post('/webhooks/sdrbot', express.raw({ type: 'application/json' }), (req, res) => {
    const payload = req.body;
    const signature = req.headers['x-sdrbot-signature'] || '';

    const expected = 'sha256=' + crypto
        .createHmac('sha256', SECRET)
        .update(payload)
        .digest('hex');

    if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
        return res.status(401).json({ error: 'Assinatura invalida' });
    }

    const data = JSON.parse(payload);
    const event = req.headers['x-sdrbot-event'] || '';

    switch (event) {
        case 'lead.created':
            // Processar novo lead
            break;
        case 'lead.qualified':
            // Processar lead qualificado
            break;
        case 'message.received':
            // Processar mensagem recebida
            break;
    }

    res.json({ ok: true });
});
using System.Security.Cryptography;
using System.Text;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("webhooks/sdrbot")]
public class SdrbotWebhookController : ControllerBase
{
    private const string Secret = "sua_chave_secreta_aqui";

    [HttpPost]
    public IActionResult HandleWebhook()
    {
        using var reader = new StreamReader(Request.Body);
        var payload = reader.ReadToEndAsync().Result;
        var signature = Request.Headers["X-SDRBOT-Signature"].ToString();

        using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(Secret));
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payload));
        var expected = "sha256=" + BitConverter.ToString(hash).Replace("-", "").ToLower();

        if (!CryptographicOperations.FixedTimeEquals(
            Encoding.UTF8.GetBytes(expected),
            Encoding.UTF8.GetBytes(signature)))
        {
            return Unauthorized(new { error = "Assinatura invalida" });
        }

        var eventType = Request.Headers["X-SDRBOT-Event"].ToString();

        switch (eventType)
        {
            case "lead.created":
                // Processar novo lead
                break;
            case "lead.qualified":
                // Processar lead qualificado
                break;
            case "message.received":
                // Processar mensagem recebida
                break;
        }

        return Ok(new { ok = true });
    }
}

Precisa de ajuda? Entre em contato com nosso suporte tecnico pelo WhatsApp ou acesse a Central de Ajuda.