Kronus Kronus

Documentação

Guia da API Kronus

Como integrar seu ERP, sistema de folha ou BI ao Kronus. A referência completa, endpoint por endpoint, está no Swagger e no ReDoc. Esta página explica o que a referência não conta: como pensar a integração.

Autenticação

Toda chamada leva a chave no header X-API-Key. A chave é emitida em Configurações › Integrações e o texto pleno aparece uma única vez — o banco guarda só o hash.

curl https://kronus.online/api/v1/conta/ \
  -H "X-API-Key: kr_12_xxxxxxxxxxxxxxxxxxxxxxxx"

Chave de Empresa

Emitida pelo RH. Alcança uma empresa. É a que você quer na maioria dos casos.

Chave de Conta

Emitida pela KS TEC. Alcança todas as empresas do cliente — útil para grupos com vários CNPJs.

Comece sempre por GET /api/v1/conta/: ele diz o que a chave alcança e qual é a sua cota horária. Descobrir a cota estourando o limite em produção é o caminho caro.

Sincronizando marcações

Use o NSR, não a data. O NSR é sequencial e imutável por empresa. Guarde o último que você recebeu e peça os seguintes:

GET /api/v1/pontos/?nsr_maior_que=48213

Paginar por data parece equivalente, mas não é: quando o RH lança um ajuste retroativo, a marcação nova recebe uma data antiga e um NSR novo. Quem sincroniza por data já passou daquele dia e nunca mais volta — a marcação some da integração. Quem sincroniza por NSR a recebe na próxima chamada.

Marcações canceladas continuam na lista, com cancelado: true. A Portaria 671 anula, não apaga — e omiti-las abriria um buraco na sequência de NSR que pareceria adulteração. Trate o cancelamento como estorno, não como ausência.

Conferindo integridade

Cada marcação carrega hash_registro e hash_anterior, formando uma cadeia. Para conferir uma marcação sem acesso ao banco:

GET /api/v1/pontos/{uuid}/verificar/

{
  "nsr": 48214,
  "hash_gravado":     "a3f2…",
  "hash_recalculado": "a3f2…",
  "integro": true
}

É o que sustenta a apresentação a uma fiscalização: o hash prova que o conteúdo do registro não mudou depois de gravado.

Levando para a folha

GET /api/v1/banco-horas/resumo/ entrega os totais do período por colaborador. Cada total vem em minutos (para calcular) e em HH:MM (para exibir).

GET /api/v1/banco-horas/resumo/?data_inicio=2026-07-01&data_fim=2026-07-31

[{
  "colaborador_nome": "João da Silva Souza",
  "minutos_trabalhados": 10230,
  "minutos_extras": 420,
  "saldo_anterior": -120,
  "saldo_periodo":   300,
  "saldo_final":     180,
  "saldo_final_formatado": "+03:00",
  "dias_falta": 1
}]

saldo_anterior e saldo_final vêm juntos de propósito: a folha precisa saber quanto o mês movimentou, não só onde o banco parou. Ao converter para horas decimais, lembre que 1h30 = 1,50, não 1,30.

Recebendo eventos

Em vez de perguntar de minuto em minuto, deixe o Kronus avisar. Cadastre um webhook HTTPS em Configurações › Webhooks e trate o POST:

POST https://seu-erp.com/kronus/
X-Kronus-Event: ponto.registrado
X-Kronus-Delivery: 8f3a…            # deduplique por este id
X-Kronus-Timestamp: 1787000000
X-Kronus-Signature: sha256=abc123…

{"evento": "...", "empresa": {...}, "dados": {...}}

Validando a assinatura

import hmac, hashlib, time

def confere(corpo: bytes, segredo: str, ts: str, assinatura: str) -> bool:
    # Recuse o que for velho demais — protege contra reenvio.
    if abs(time.time() - int(ts)) > 300:
        return False
    esperada = "sha256=" + hmac.new(
        segredo.encode(), f"{ts}.".encode() + corpo, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(esperada, assinatura)

Responda 2xx rápido. Enfileire do seu lado e processe depois; esperamos no máximo 10 segundos.

Deduplique por X-Kronus-Delivery. Se você processar e cair antes de responder, reenviamos — o id é estável entre as tentativas.

Falhas são retentadas em 1 min, 5 min, 25 min, 2 h e 10 h. Depois de 5 falhas consecutivas o webhook é desativado e o RH avisado.

Limites e erros

CódigoSignificadoO que fazer
401Chave ausente, inválida, revogada ou expiradaEmita outra em Integrações
403Chave somente leitura tentando escreverEmita uma chave de escrita
404Recurso inexistente ou fora do escopo da chaveConfira o UUID e a empresa
422Regra de negócio recusou (ex.: marcação no futuro)Leia codigo e mensagem
429Cota horária estouradaAguarde a janela ou reveja o plano

O 404 é deliberadamente ambíguo entre "não existe" e "existe em outra conta": distinguir permitiria descobrir UUIDs válidos de terceiros.

O que a API nunca devolve

  • Embedding facial. Dado biométrico é sensível (LGPD, Art. 11) e nenhuma integração tem finalidade que o justifique. Você recebe apenas face_registrada: true/false.
  • CID do atestado. Dado de saúde (Art. 5º, II). O que a folha precisa — período, dias e status — vem completo.

Referência completa dos endpoints, com schema e exemplos: