Pular para o conteúdo principal

Referência da API REST

Visão Geral

O LeadHub inclui uma API REST completa que permite a ferramentas externas ler e escrever os seus dados — leads, pipelines, automatizações, formulários e mais. Use-a para integrar com o Zapier, criar dashboards personalizados, ligar o seu website ou automatizar qualquer coisa.


URL Base

Todos os pedidos de API vão para:

https://yourdomain.com/api/v1

Substitua yourdomain.com pelo seu domínio LeadHub real.


Autenticação

Cada pedido (exceto o health check) requer uma chave de API.

Crie chaves de API no painel de administração em Definições → Chaves de API. Consulte a página de Definições para instruções.

Inclua a sua chave de API em cada pedido como token Bearer no cabeçalho Authorization:

Authorization: Bearer lh_your_api_key_here

Se enviar um pedido sem chave de API, ou com uma chave inválida, receberá uma resposta 401 Unauthorized.


Limitação de Taxa

Cada chave de API está limitada a 1.000 pedidos por hora por padrão (configurável por chave). Se exceder este limite, receberá uma resposta 429 Too Many Requests.

Cada resposta inclui estes cabeçalhos para que possa acompanhar o seu uso:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1711580400

X-RateLimit-Reset é um timestamp Unix de quando o seu limite é reiniciado.


Paginação

Os endpoints que devolvem listas de registos suportam paginação. Adicione estes parâmetros de query:

ParâmetroPadrãoMáximo
page1
per_page15100

Exemplo: GET /api/v1/leads?page=2&per_page=25


Formato de Resposta

Resposta de Sucesso

{
"data": { ... },
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 15,
"total": 73,
"from": 1,
"to": 15
},
"links": {
"first": "https://yourdomain.com/api/v1/leads?page=1",
"last": "https://yourdomain.com/api/v1/leads?page=5",
"prev": null,
"next": "https://yourdomain.com/api/v1/leads?page=2",
"self": "https://yourdomain.com/api/v1/leads?page=1"
}
}

Para respostas de registo único (show, create, update), data contém o objeto do registo e meta é omitido.

Resposta de Erro

{
"status": "error",
"message": "The given data was invalid.",
"code": "VALIDATION_FAILED",
"errors": {
"email": ["The email field must be a valid email address."]
}
}

Códigos de erro comuns:

CódigoEstado HTTPSignificado
UNAUTHORIZED401Chave de API ausente ou inválida
FORBIDDEN403A chave de API não tem o scope necessário
NOT_FOUND404O registo não existe
VALIDATION_FAILED422Os dados do pedido falharam a validação
RATE_LIMITED429Demasiados pedidos
SERVER_ERROR500Erro inesperado do servidor

Health Check

Sem autenticação necessária.

GET /api/v1/health

Resposta:

{
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-03-28T09:15:00+00:00"
}

Use isto para verificar se a sua instância LeadHub está acessível antes de fazer outros pedidos.


Leads

Scope necessário: read:leads para recuperar, write:leads para criar/atualizar, delete:leads para eliminar.

Listar Leads

GET /api/v1/leads

Parâmetros de query para filtrar:

ParâmetroDescrição
sourceFiltrar por fonte (ex. facebook, website)
statusFiltrar por estado (ex. new, contacted, qualified)
pipeline_idFiltrar por ID de pipeline
stage_idFiltrar por ID de etapa do pipeline
assigned_user_idFiltrar por ID de utilizador atribuído
tagFiltrar por nome de etiqueta
searchPesquisar por nome, email ou telefone
created_afterData ISO 8601 — apenas leads criados após esta data
created_beforeData ISO 8601 — apenas leads criados antes desta data
starredtrue para mostrar apenas leads destacados
sortCampo para ordenar: created_at, updated_at, lead_score, first_name, last_name, email
directionasc ou desc (padrão: desc)

Obter um Lead

GET /api/v1/leads/{id}

Criar um Lead

POST /api/v1/leads

Corpo do pedido (JSON):

{
"first_name": "Sarah",
"last_name": "Johnson",
"email": "[email protected]",
"phone": "+14155551234",
"source": "website",
"status": "new",
"pipeline_id": 1,
"pipeline_stage_id": 2,
"assigned_user_id": 5,
"notes": "Interested in the enterprise plan.",
"custom_fields": {
"budget": "10000"
},
"tags": ["hot-lead", "enterprise"]
}

first_name é obrigatório. Todos os outros campos são opcionais.

Atualizar um Lead

PUT /api/v1/leads/{id}
PATCH /api/v1/leads/{id}

Envie apenas os campos que pretende atualizar. Mesmos campos que na criação.

Eliminar um Lead

DELETE /api/v1/leads/{id}

Adicionar uma Etiqueta a um Lead

POST /api/v1/leads/{id}/tags

Corpo: { "tag": "vip-client" }

Remover uma Etiqueta de um Lead

DELETE /api/v1/leads/{id}/tags/{tag}

Pipelines

Scope necessário: read:pipelines ou write:pipelines

GET    /api/v1/pipelines
POST /api/v1/pipelines
GET /api/v1/pipelines/{id}
PUT /api/v1/pipelines/{id}
PATCH /api/v1/pipelines/{id}
DELETE /api/v1/pipelines/{id}

Etapas do Pipeline

GET    /api/v1/pipelines/{pipeline_id}/stages
POST /api/v1/pipelines/{pipeline_id}/stages
GET /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
PUT /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
PATCH /api/v1/pipelines/{pipeline_id}/stages/{stage_id}
DELETE /api/v1/pipelines/{pipeline_id}/stages/{stage_id}

Etiquetas

Scope necessário: read:tags ou write:tags

GET    /api/v1/tags
POST /api/v1/tags
GET /api/v1/tags/{id}
PUT /api/v1/tags/{id}
PATCH /api/v1/tags/{id}
DELETE /api/v1/tags/{id}

Utilizadores

Scope necessário: read:users, write:users ou delete:users

GET    /api/v1/users
POST /api/v1/users
GET /api/v1/users/{id}
PUT /api/v1/users/{id}
PATCH /api/v1/users/{id}
DELETE /api/v1/users/{id}

Formulários

Scope necessário: read:forms, write:forms ou delete:forms

GET    /api/v1/forms
POST /api/v1/forms
GET /api/v1/forms/{id}
PUT /api/v1/forms/{id}
PATCH /api/v1/forms/{id}
DELETE /api/v1/forms/{id}

Submeter um Formulário

POST /api/v1/forms/{id}/submissions

Corpo: os valores dos campos do formulário como pares chave-valor.


Automatizações

Scope necessário: read:automations, write:automations ou delete:automations

GET    /api/v1/automations
POST /api/v1/automations
GET /api/v1/automations/{id}
PUT /api/v1/automations/{id}
PATCH /api/v1/automations/{id}
DELETE /api/v1/automations/{id}

Integrações

Scope necessário: read:integrations ou write:integrations

GET    /api/v1/integrations/types
GET /api/v1/integrations
POST /api/v1/integrations
GET /api/v1/integrations/{id}
PUT /api/v1/integrations/{id}
PATCH /api/v1/integrations/{id}
DELETE /api/v1/integrations/{id}

GET /api/v1/integrations/types devolve a lista de tipos de integração disponíveis (Facebook, Google Ads, Mailgun, etc.).


Ingestão de Leads Recebidos

Um endpoint simplificado para criar leads a partir de fontes externas, webhooks ou ferramentas no-code como Zapier e Make.

POST /api/inbound/leads?tenant={workspace-slug}

Autentique com Authorization: Bearer {api_key} e passe o slug do workspace como parâmetro de query.

Corpo do pedido:

{
"email": "[email protected]",
"first_name": "Sarah",
"last_name": "Johnson",
"phone": "+14155551234",
"company": "Tech Corp",
"source": "zapier",
"notes": "Came from newsletter signup",
"tags": ["newsletter"],
"custom_fields": {
"utm_campaign": "spring-promo"
}
}

email é obrigatório. Todos os outros campos são opcionais.

Resposta de sucesso (201):

{
"status": "created",
"lead_id": 1842,
"is_duplicate": false
}

Se o lead já existe (identificado por email ou telefone), is_duplicate é true e o ID do lead existente é devolvido.


Exemplos de Código

cURL

curl -X GET "https://yourdomain.com/api/v1/leads?status=new&per_page=25" \
-H "Authorization: Bearer lh_your_api_key_here" \
-H "Accept: application/json"
curl -X POST "https://yourdomain.com/api/v1/leads" \
-H "Authorization: Bearer lh_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"first_name":"Sarah","email":"[email protected]","source":"api"}'

PHP

$apiKey = 'lh_your_api_key_here';
$baseUrl = 'https://yourdomain.com/api/v1';

// List leads
$response = file_get_contents($baseUrl . '/leads', false, stream_context_create([
'http' => [
'header' => "Authorization: Bearer {$apiKey}\r\nAccept: application/json\r\n",
],
]));
$leads = json_decode($response, true);

// Create a lead
$ch = curl_init($baseUrl . '/leads');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer {$apiKey}",
"Content-Type: application/json",
"Accept: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'first_name' => 'Sarah',
'email' => '[email protected]',
'source' => 'api',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

JavaScript (fetch)

const apiKey = 'lh_your_api_key_here';
const baseUrl = 'https://yourdomain.com/api/v1';

// List leads
const response = await fetch(`${baseUrl}/leads?status=new`, {
headers: {
'Authorization': `Bearer ${apiKey}`,
'Accept': 'application/json',
},
});
const { data, meta } = await response.json();

// Create a lead
const createResponse = await fetch(`${baseUrl}/leads`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
first_name: 'Sarah',
email: '[email protected]',
source: 'website',
}),
});
const newLead = await createResponse.json();