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ódigo | Significado | O que fazer |
|---|---|---|
| 401 | Chave ausente, inválida, revogada ou expirada | Emita outra em Integrações |
| 403 | Chave somente leitura tentando escrever | Emita uma chave de escrita |
| 404 | Recurso inexistente ou fora do escopo da chave | Confira o UUID e a empresa |
| 422 | Regra de negócio recusou (ex.: marcação no futuro) | Leia codigo e mensagem |
| 429 | Cota horária estourada | Aguarde 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: