Visão geral
A API de integração do AlfaControl permite que sistemas externos consultem registros de acesso e recebam eventos em tempo real via webhook. É voltada para parceiros como sistemas de gestão escolar, ERPs e plataformas de RH que precisam sincronizar dados de entrada e saída de pessoas.
Cada cliente do AlfaControl pode criar múltiplas configurações de integração, cada uma com sua própria API key e lista de eventos habilitados.
URL base
https://control.alfasolucoes.cloud
Dois grupos de endpoints
| Grupo | Prefixo | Autenticação | Uso |
|---|---|---|---|
| Parceiro | /api/v1/integracao/** | Header X-Api-Key | Consultar acessos (sistemas parceiros, ERP, etc.) |
| Admin | /api/integracoes/** | Bearer JWT | Criar/editar integrações no painel |
Autenticação
API Key (parceiros externos)
Utilize o header X-Api-Key em todas as requisições ao endpoint /api/v1/integracao/**. A chave identifica automaticamente o cliente (tenant) — não é necessário passar IDs adicionais.
curl https://control.alfasolucoes.cloud/api/v1/integracao/acessos \
-H "X-Api-Key: SUA_CHAVE_AQUI"
JWT Bearer Token (admin)
Os endpoints /api/integracoes/** são usados pelo painel de administração e requerem autenticação via JWT. Obtenha o token via login.
TOKEN=$(curl -s -X POST \
https://control.alfasolucoes.cloud/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"seu@email.com","senha":"suasenha"}' \
| jq -r '.token')
curl https://control.alfasolucoes.cloud/api/integracoes \
-H "Authorization: Bearer $TOKEN"
Início rápido
Siga estes 3 passos para começar a consultar acessos em menos de 5 minutos.
Crie uma integração no painel
No painel do AlfaControl, acesse o grupo SISTEMA → Integrações na barra lateral e clique em Nova Integração. Preencha o nome, configure o webhook (opcional) e escolha os eventos. Ao salvar, um modal exibirá a API key completa — guarde-a imediatamente, ela não será exibida novamente. Veja o passo a passo detalhado.
Ou via API (requer login de gestor):
curl -s -X POST \
https://control.alfasolucoes.cloud/api/integracoes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"nome":"Meu Sistema"}' | jq .
Configure a API key no seu sistema
Armazene a chave como variável de ambiente ou em um cofre de segredos. Nunca a versione em código-fonte.
ALFACONTROL_API_KEY=sua_chave_aqui
Consulte os acessos
Use o endpoint de listagem com os filtros que precisar:
curl -s \
"https://control.alfasolucoes.cloud/api/v1/integracao/acessos\
?resultado=ENTRADA,SAIDA\
&dataInicio=2026-05-01T00:00:00\
&dataFim=2026-05-31T23:59:59\
&page=0&size=50" \
-H "X-Api-Key: $ALFACONTROL_API_KEY" | jq .
Configuração no painel
Esta seção detalha como criar e gerenciar integrações diretamente pelo painel do AlfaControl, sem precisar usar a API.
Quem pode configurar
Acessando a página
No painel, localize o grupo SISTEMA na barra lateral esquerda e clique em Integrações. A página exibe todas as integrações ativas do cliente com as colunas Nome, Webhook, Eventos, Data de criação e Ações.
Criando uma integração
Clique em "Nova Integração"
O botão fica no canto superior direito da página. Um formulário modal abrirá.
Preencha o formulário
Nome (obrigatório) — identifica a integração na listagem. Use um nome descritivo, ex: ERP, Ponto Eletrônico, Sistema Escolar.
Webhook URL (opcional) — URL HTTPS para onde o AlfaControl enviará um POST a cada evento de acesso em tempo real. Deixe em branco se quiser apenas consultar acessos via API.
Eventos habilitados — 6 checkboxes (ENTRADA, SAÍDA, NEGADO, NÃO IDENTIFICADO, LIBERAÇÃO MANUAL, BLOCKLIST), todos marcados por padrão. Desmarque os eventos que seu sistema não precisa processar para reduzir o volume de dados.
Salve e copie a API key
Após clicar em Salvar, um modal exibirá a API key completa. Essa é a única oportunidade de visualizá-la — ela não pode ser recuperada depois.
Encontrando o ID do Cliente
O campo clienteId aparece nos payloads de webhook e nas respostas da API. Para localizar o ID do seu cliente:
- No painel, clique em Configurações (grupo SISTEMA na barra lateral).
- No cartão Meu Perfil, localize a linha "ID do Cliente".
- Clique no ícone de copiar ao lado do número.
// Configurações → Meu Perfil → ID do Cliente: 789
// Esse mesmo valor aparece nos payloads:
{
"clienteId": 789,
"pessoaNome": "João Silva",
"resultado": "ENTRADA"
// ...
}
Gerenciando integrações existentes
| Ação | Como | O que acontece |
|---|---|---|
| Editar | Botão "Editar" na linha da integração | Altera nome, webhook URL e/ou eventos. A API key não muda. |
| Regenerar chave | Botão "Chave" → confirmar | Gera nova API key. A chave anterior é invalidada imediatamente. Nova chave exibida uma única vez. |
| Desativar | Ícone de lixeira → confirmar | Remove a integração. A chave para de funcionar imediatamente. Ação irreversível. |
Referência de endpoints
Retorna lista paginada de acessos do cliente associado à API key. Suporta filtros por data e tipo de resultado.
| Parâmetro | Tipo | Obrigatório | Default | Descrição |
|---|---|---|---|---|
page | int | opcional | 0 | Número da página (0-indexed) |
size | int | opcional | 50 | Itens por página (máximo: 500) |
dataInicio | string | opcional | — | Data/hora início. Formato ISO 8601: YYYY-MM-DDTHH:mm:ss |
dataFim | string | opcional | — | Data/hora fim. Mesmo formato. |
resultado | string | opcional | — | Filtro por tipo. Múltiplos separados por vírgula: ENTRADA,SAIDA |
{
"content": [
{
"id": 12345,
"clienteId": 789,
"matricula": "2024001",
"pessoaNome": "João Silva",
"pessoaDocumento": "123.456.789-00",
"resultado": "ENTRADA",
"dataHora": "2026-05-27T09:30:00",
"dispositivoNome": "Catraca Principal",
"dispositivoSentido": "Entrada",
"tipoIdentificacao": "FACIAL"
}
],
"totalElements": 1250,
"totalPages": 25,
"number": 0,
"size": 50,
"first": true,
"last": false
}
curl -s \
"https://control.alfasolucoes.cloud/api/v1/integracao/acessos\
?resultado=ENTRADA&dataInicio=2026-05-01T00:00:00&size=100" \
-H "X-Api-Key: SUA_CHAVE_AQUI" | jq .content
Cria uma nova integração para o cliente autenticado. A API key é retornada completa somente nesta resposta — não há como recuperá-la depois (apenas regenerar).
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome | string | obrigatório | Nome identificador. Máximo 100 caracteres. |
webhookUrl | string | opcional | URL HTTPS para receber eventos. Máximo 500 chars. Deve ser HTTPS. |
eventosHabilitados | string[] | opcional | Lista de eventos. Default: todos os 6. Máximo 20 itens. |
curl -s -X POST \
https://control.alfasolucoes.cloud/api/integracoes \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"nome": "Minha Integração",
"webhookUrl": "https://meusite.com/webhooks/acesso",
"eventosHabilitados": ["ENTRADA", "SAIDA"]
}' | jq .
{
"id": 42,
"revendaId": 10,
"clienteId": 789,
"nome": "Minha Integração",
"apiKey": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
"webhookUrl": "https://meusite.com/webhooks/acesso",
"eventosHabilitados": ["ENTRADA", "SAIDA"],
"ativo": true
}
apiKey imediatamente. Após fechar esta resposta, a chave não poderá ser recuperada — apenas regenerada (o que invalida a anterior).
Retorna todas as integrações ativas do cliente. A apiKey é sempre mascarada como ••••••••.
curl -s https://control.alfasolucoes.cloud/api/integracoes \
-H "Authorization: Bearer $TOKEN" | jq .
Atualiza nome, webhook URL e/ou eventos habilitados. A API key não é alterada nesta operação.
Todos os campos são opcionais. Enviar null mantém o valor atual; enviar string em branco em webhookUrl remove a URL.
curl -s -X PUT \
https://control.alfasolucoes.cloud/api/integracoes/42 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"nome": "Integração v2",
"webhookUrl": "https://meusite.com/webhooks/v2",
"eventosHabilitados": ["ENTRADA", "SAIDA", "NEGADO"]
}' | jq .
Desativa a integração (soft-delete). A API key para de funcionar imediatamente. Retorna 204 No Content.
curl -s -X DELETE \
https://control.alfasolucoes.cloud/api/integracoes/42 \
-H "Authorization: Bearer $TOKEN"
# Resposta: 204 No Content (sem body)
Gera uma nova API key para a integração. A chave anterior para de funcionar imediatamente. A nova chave é retornada completa — somente nesta resposta.
curl -s -X POST \
https://control.alfasolucoes.cloud/api/integracoes/42/regenerar-chave \
-H "Authorization: Bearer $TOKEN" | jq .apiKey
Webhooks
Configure uma webhookUrl HTTPS na sua integração e o AlfaControl enviará um POST com o payload do acesso em tempo real, cada vez que um dos eventos habilitados ocorrer.
Como funciona
- O AlfaControl faz um POST para sua URL com
Content-Type: application/json. - Seu endpoint deve responder com qualquer status 2xx em até 10 segundos.
- Em caso de falha ou timeout, o sistema retenta até 3 vezes com backoff linear (1s, 2s).
- Respostas 4xx (404, 401, etc.) são tratadas como erro permanente — sem retry.
- A URL deve ser HTTPS. URLs HTTP são rejeitadas no cadastro.
Payload enviado
{
"evento": "ACESSO",
"id": 12345,
"clienteId": 789,
"matricula": "2024001",
"pessoaNome": "João Silva",
"pessoaDocumento": "123.456.789-00",
"resultado": "ENTRADA",
"dataHora": "2026-05-27T09:30:00",
"dispositivoNome": "Catraca Principal",
"dispositivoSentido": "Entrada",
"tipoIdentificacao": "FACIAL"
}
| Campo | Tipo | Descrição |
|---|---|---|
evento | string | Tipo fixo: "ACESSO" |
id | number | ID único do registro de acesso |
clienteId | number | ID do cliente |
matricula | string|null | Matrícula da pessoa (pode ser null se não cadastrada) |
pessoaNome | string | Nome completo |
pessoaDocumento | string | CPF ou documento cadastrado |
resultado | string | Tipo do evento. Ver Tipos de evento |
dataHora | string | ISO 8601: YYYY-MM-DDTHH:mm:ss (fuso horário de Brasília) |
dispositivoNome | string | Nome do equipamento (catraca, leitor de acesso, etc.) |
dispositivoSentido | string | Sentido/zona configurada no dispositivo |
tipoIdentificacao | string | FACIAL, CARTAO, BIOMETRIA, PIN, etc. |
webhookUrl na integração.
Exemplo de receptor (Node.js)
app.post('/webhooks/acesso', express.json(), (req, res) => {
const { evento, resultado, pessoaNome, matricula, dataHora } = req.body;
if (evento !== 'ACESSO') return res.sendStatus(400);
console.log(`[${dataHora}] ${resultado} — ${pessoaNome} (${matricula})`);
// processe o evento aqui...
res.sendStatus(200); // sempre responda 2xx em até 10s
});
Tipos de evento
Estes são os valores possíveis para o campo resultado (tanto na consulta de acessos quanto no payload do webhook).
| Evento | Descrição | Quando ocorre |
|---|---|---|
| ENTRADA | Acesso de entrada autorizado | Pessoa identificada e com permissão para entrar |
| SAIDA | Acesso de saída autorizado | Pessoa identificada e com permissão para sair |
| NEGADO | Acesso negado | Pessoa identificada mas sem permissão (fora do horário, bloqueada, etc.) |
| NAO_IDENTIFICADO | Não identificado | Equipamento não reconheceu a pessoa (biometria/facial sem match) |
| LIBERACAO_MANUAL | Liberação manual | Porteiro ou admin liberou o acesso manualmente pelo painel |
| BLOCKLIST | Blocklist | Pessoa na lista de bloqueio — acesso registrado e negado |
ENTRADA e SAIDA.
Códigos de erro
| Status | Quando ocorre | Exemplo de body |
|---|---|---|
| 200 / 201 / 204 | Sucesso | — |
| 400 | Parâmetro inválido, campo obrigatório ausente, URL de webhook inválida, evento desconhecido | {"error":"URL de webhook deve usar https://"} |
| 401 | API key ausente ou inválida (/api/v1/integracao/**) |
{"error":"Não autenticado","details":"Credenciais inválidas"} |
| 403 | Token JWT sem a role necessária (/api/integracoes/**) |
{"error":"Acesso negado"} |
| 404 | Integração não encontrada ou pertence a outro cliente | {"error":"Integração não encontrada"} |
| 409 | Conflito de concorrência (edição simultânea) — tente novamente | {"error":"Integração foi modificada concorrentemente. Recarregue e tente novamente."} |
| 500 | Erro interno. Inclui errorId para diagnóstico. |
{"error":"Erro interno do servidor","errorId":"a1b2c3d4"} |
error descreve o motivo exato (ex: "URL de webhook deve usar https://", "Valor inválido para 'resultado': 'FOO'"). Use-a para diagnóstico.
Limites e boas práticas
| Recurso | Limite |
|---|---|
Itens por página (size) | Máximo 500. Valores maiores são truncados automaticamente. |
| Número de páginas | Máximo 10.000 páginas por consulta. |
| Rate limiting | 300 requisições/minuto por IP para /api/v1/integracao/**. |
| Timeout webhook | 10 segundos para resposta. Retenta até 3x com backoff linear. |
| URL webhook | Deve ser HTTPS. Máximo 500 caracteres. |
| Eventos habilitados | Máximo 20 itens por integração. |
| Nome da integração | Máximo 100 caracteres. |
Boas práticas
- Use paginação incremental: sincronize com
dataIniciodo último registro processado. - Prefira webhooks à polling para eventos em tempo real — reduz latência e carga na API.
- Seu endpoint webhook deve ser idempotente: o mesmo
idpode chegar mais de uma vez em caso de retry. - Armazene a API key em variável de ambiente ou cofre de segredos, nunca em código-fonte.
- Se suspeitar de vazamento da chave, regenere imediatamente pelo painel — a chave anterior é invalidada no instante da regeneração.
- Filtre apenas os
eventosHabilitadosque seu sistema consome para reduzir volume de webhooks e dados na consulta.