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

BASE URL
https://control.alfasolucoes.cloud

Dois grupos de endpoints

GrupoPrefixoAutenticaçãoUso
Parceiro/api/v1/integracao/**Header X-Api-KeyConsultar acessos (sistemas parceiros, ERP, etc.)
Admin/api/integracoes/**Bearer JWTCriar/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.

EXEMPLO — HEADER
curl https://control.alfasolucoes.cloud/api/v1/integracao/acessos \
  -H "X-Api-Key: SUA_CHAVE_AQUI"
Segurança: A API key nunca é armazenada em plaintext. O servidor guarda apenas o SHA-256 da chave. Se suspeitar de vazamento, regenere imediatamente no painel.

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.

1 — OBTER TOKEN
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')
2 — USAR 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.

1

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
curl -s -X POST \
  https://control.alfasolucoes.cloud/api/integracoes \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"nome":"Meu Sistema"}' | jq .
2

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.

ENV
ALFACONTROL_API_KEY=sua_chave_aqui
3

Consulte os acessos

Use o endpoint de listagem com os filtros que precisar:

CURL
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

A página de Integrações exige um dos seguintes perfis: Gestor de Cliente, Admin Revenda (com um cliente selecionado) ou Super Admin (com um cliente selecionado). Porteiros, recepcionistas e operadores não têm acesso.

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

1

Clique em "Nova Integração"

O botão fica no canto superior direito da página. Um formulário modal abrirá.

2

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.

3

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.

Ação obrigatória: Copie a API key antes de fechar o modal e guarde-a em uma variável de ambiente ou cofre de segredos (secrets vault). Se perdê-la, será necessário regenerar — o que invalida a chave anterior imediatamente.

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:

  1. No painel, clique em Configurações (grupo SISTEMA na barra lateral).
  2. No cartão Meu Perfil, localize a linha "ID do Cliente".
  3. Clique no ícone de copiar ao lado do número.
EXEMPLO — MAPEAMENTO
// 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çãoComoO 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.
Quando regenerar a chave: Se suspeitar que a chave foi exposta (ex: commitada acidentalmente em um repositório), regenere imediatamente pelo painel. Atualize a variável de ambiente no seu sistema antes que a nova chave entre em vigor.

Referência de endpoints

GET /api/v1/integracao/acessos Consulta paginada de acessos
X-Api-Key

Retorna lista paginada de acessos do cliente associado à API key. Suporta filtros por data e tipo de resultado.

Query Parameters
ParâmetroTipoObrigatórioDefaultDescrição
pageintopcional0Número da página (0-indexed)
sizeintopcional50Itens por página (máximo: 500)
dataIniciostringopcionalData/hora início. Formato ISO 8601: YYYY-MM-DDTHH:mm:ss
dataFimstringopcionalData/hora fim. Mesmo formato.
resultadostringopcionalFiltro por tipo. Múltiplos separados por vírgula: ENTRADA,SAIDA
Resposta — 200 OK
JSON
{
  "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
}
Exemplo
CURL
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
POST /api/integracoes Cria nova integração
JWT (GESTOR_CLIENTE ou superior)

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).

Request Body
CampoTipoObrigatórioDescrição
nomestringobrigatórioNome identificador. Máximo 100 caracteres.
webhookUrlstringopcionalURL HTTPS para receber eventos. Máximo 500 chars. Deve ser HTTPS.
eventosHabilitadosstring[]opcionalLista de eventos. Default: todos os 6. Máximo 20 itens.
CURL
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 .
Resposta — 201 Created
JSON
{
  "id": 42,
  "revendaId": 10,
  "clienteId": 789,
  "nome": "Minha Integração",
  "apiKey": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
  "webhookUrl": "https://meusite.com/webhooks/acesso",
  "eventosHabilitados": ["ENTRADA", "SAIDA"],
  "ativo": true
}
Atenção: Salve o campo apiKey imediatamente. Após fechar esta resposta, a chave não poderá ser recuperada — apenas regenerada (o que invalida a anterior).
GET /api/integracoes Lista integrações do cliente
JWT (GESTOR_CLIENTE ou superior)

Retorna todas as integrações ativas do cliente. A apiKey é sempre mascarada como ••••••••.

CURL
curl -s https://control.alfasolucoes.cloud/api/integracoes \
  -H "Authorization: Bearer $TOKEN" | jq .
PUT /api/integracoes/{id} Atualiza integração
JWT (GESTOR_CLIENTE ou superior)

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
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 .
DELETE /api/integracoes/{id} Desativa integração
JWT (GESTOR_CLIENTE ou superior)

Desativa a integração (soft-delete). A API key para de funcionar imediatamente. Retorna 204 No Content.

CURL
curl -s -X DELETE \
  https://control.alfasolucoes.cloud/api/integracoes/42 \
  -H "Authorization: Bearer $TOKEN"
# Resposta: 204 No Content (sem body)
POST /api/integracoes/{id}/regenerar-chave Gera nova API key
JWT (GESTOR_CLIENTE ou superior)

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
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

POST → sua webhookUrl
{
  "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"
}
CampoTipoDescrição
eventostringTipo fixo: "ACESSO"
idnumberID único do registro de acesso
clienteIdnumberID do cliente
matriculastring|nullMatrícula da pessoa (pode ser null se não cadastrada)
pessoaNomestringNome completo
pessoaDocumentostringCPF ou documento cadastrado
resultadostringTipo do evento. Ver Tipos de evento
dataHorastringISO 8601: YYYY-MM-DDTHH:mm:ss (fuso horário de Brasília)
dispositivoNomestringNome do equipamento (catraca, leitor de acesso, etc.)
dispositivoSentidostringSentido/zona configurada no dispositivo
tipoIdentificacaostringFACIAL, CARTAO, BIOMETRIA, PIN, etc.
Dica de teste: Use webhook.site para inspecionar payloads em tempo real durante o desenvolvimento. Crie uma URL temporária e configure-a como webhookUrl na integração.

Exemplo de receptor (Node.js)

JavaScript (Express)
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).

EventoDescriçãoQuando 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
Configuração por integração: Você pode habilitar apenas os eventos que interessam ao seu sistema. Por exemplo, um sistema de ponto eletrônico pode habilitar apenas ENTRADA e SAIDA.

Códigos de erro

StatusQuando ocorreExemplo 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"}
Erros 400: A mensagem do campo 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

RecursoLimite
Itens por página (size)Máximo 500. Valores maiores são truncados automaticamente.
Número de páginasMáximo 10.000 páginas por consulta.
Rate limiting300 requisições/minuto por IP para /api/v1/integracao/**.
Timeout webhook10 segundos para resposta. Retenta até 3x com backoff linear.
URL webhookDeve ser HTTPS. Máximo 500 caracteres.
Eventos habilitadosMáximo 20 itens por integração.
Nome da integraçãoMáximo 100 caracteres.

Boas práticas

  • Use paginação incremental: sincronize com dataInicio do ú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 id pode 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 eventosHabilitados que seu sistema consome para reduzir volume de webhooks e dados na consulta.