API v1 — Jornada Control
API REST para integrar o sistema de controle de ponto com ERPs, folha de pagamento, aplicativos próprios e dispositivos de ponto.
REST API to integrate the time tracking system with ERPs, payroll systems, custom apps, and time clock devices.
Base URL: https://seu-dominio.com.br/api
Content-Type: application/json e Accept: application/json em todas as requisições.Always send Content-Type: application/json and Accept: application/json in all requests.Autenticação e LoginAuthentication & Login
A API suporta dois tipos de autenticação: JWT (para usuários do app) e Bearer Token (para integrações externas). Ambos usam o header:
The API supports two authentication types: JWT (for app users) and Bearer Token (for external integrations). Both use the header:
Authorization: Bearer SEU_TOKEN
Login (JWT)Login (JWT)
POST/auth/login
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
email | string | opcional*optional* | E-mail do usuárioUser e-mail address |
cpf | string (11) | opcional*optional* | CPF sem pontuaçãoCPF without punctuation |
password | string | obrigatóriorequired | Senha (mín. 6 chars)Password (min. 6 chars) |
* Informe email ou cpf. Retorna access_token + expires_in.
* Provide email or cpf. Returns access_token + expires_in.
Outras rotas de autenticaçãoOther authentication routes
POST/auth/logout — Invalida o token.Invalidates the token.
POST/auth/refresh — Renova o JWT antes de expirar.Renews the JWT before it expires.
GET/auth/me — Dados do usuário autenticado.Authenticated user data.
PUT/auth/change-password — Altera senha. Campos: current_password, password, password_confirmation.Change password. Fields: current_password, password, password_confirmation.
POST/auth/forgot-password — Envia token de 6 dígitos por e-mail (válido 60 min). Campo: email.Sends a 6-digit token via e-mail (valid 60 min). Field: email.
POST/auth/reset-password — Redefine senha. Campos: email, token, password, password_confirmation.Resets password. Fields: email, token, password, password_confirmation.
Tokens de API (para integrações)API Tokens (for integrations)
GET/tokens — Lista tokens.Lists tokens. admin
POST/tokens — Cria token. O plaintext é exibido uma única vez.Creates token. The plaintext is shown only once. admin
| CampoField | TipoType | |
|---|---|---|
name | string | obrigatóriorequired Nome descritivoDescriptive name |
abilities | array | opcionaloptional Permissões. Default: ["*"]Permissions. Default: ["*"] |
expires_in_days | integer | opcionaloptional Dias até expirarDays until expiry |
DELETE/tokens/{id} — Revoga token.Revokes token. admin
Erros e LimitesErrors & Rate Limits
| HTTP | CódigoCode | CausaCause |
|---|---|---|
| 401 | unauthenticated | Token ausente ou inválidoMissing or invalid token |
| 401 | token_expired | JWT expirado — use /auth/refreshJWT expired — use /auth/refresh |
| 403 | insufficient_permissions | Sem a permissão necessáriaMissing required permission |
| 403 | no_subscription | Empresa sem assinatura ativaCompany has no active subscription |
| 403 | payment_overdue | Pagamento pendente há mais de 7 diasPayment overdue for more than 7 days |
| 403 | employee_limit_reached | Limite de funcionários do plano atingidoPlan employee limit reached |
| 422 | validation_error | Campos inválidos — errors detalha cada campoInvalid fields — errors details each field |
| 429 | — | Rate limit excedidoRate limit exceeded |
FuncionáriosEmployees
Gerenciamento completo do quadro de funcionários da empresa.
Complete management of the company's employee roster.
GET/employees admin/manager
Lista paginada. Query: search (nome/email/CPF), status (active/inactive), department, page, per_page.Paginated list. Query: search (name/email/CPF), status (active/inactive), department, page, per_page.
POST/employees admin/manager
Cria funcionário. Verifica limite do plano. CPF e e-mail devem ser únicos dentro da empresa.Creates employee. Checks plan limit. CPF and e-mail must be unique within the company.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
name | string | obrigatóriorequired | Nome completoFull name |
email | obrigatóriorequired | Único na empresaUnique within the company | |
cpf | string (11) | obrigatóriorequired | Só dígitos, único na empresaDigits only, unique within the company |
password + password_confirmation | string | obrigatóriorequired | Mín. 8 charsMin. 8 chars |
role | string | obrigatóriorequired | admin / manager / employee |
phone | string | opcionaloptional | Max 20 charsMax 20 chars |
address | string | opcionaloptional | Endereço completoFull address |
city | string | opcionaloptional | |
state | string (2) | opcionaloptional | UF (ex: SP)State code (e.g. SP) |
zip_code | string | opcionaloptional | CEPZip Code |
registration_number | string | opcionaloptional | MatrículaRegistration Number |
department | string | opcionaloptional | SetorDepartment |
position | string | opcionaloptional | CargoPosition |
admission_date | date | opcionaloptional | Data de admissão (YYYY-MM-DD)Admission date (YYYY-MM-DD) |
status | string | opcionaloptional | active (padrão) / inactiveactive (default) / inactive |
latitude, longitude | float | opcionaloptional | Localização atual do funcionárioEmployee's current location |
GET/employees/{id} admin/manager — Detalhe.Detail.
PUT/employees/{id} admin/manager — Atualiza. Senha é opcional na edição.Updates. Password is optional when editing.
DELETE/employees/{id} admin/manager — Inativa o funcionário (não apaga). Não é possível excluir a própria conta.Deactivates the employee (does not delete). You cannot delete your own account.
GET/employees/search admin/manager — Busca rápida. Query: q.Quick search. Query: q.
GET/employees/export admin/manager — Exporta lista em Excel.Exports list as Excel.
POST/employees/{id}/face-photo admin/manager — Cadastra foto facial. multipart/form-data, campo face_photo, max 10 MB. A imagem é validada por AWS Rekognition e redimensionada para 250×250px.Registers face photo. multipart/form-data, field face_photo, max 10 MB. Image is validated by AWS Rekognition and resized to 250×250px.
DELETE/employees/{id}/face-photo admin/manager — Remove foto facial cadastrada.Remove registered face photo.
GET/employees/{id}/webauthn-credentials admin — Lista credenciais de biometria digital (WebAuthn) do funcionário. Requer employees:read_all.Lists the employee's digital biometric (WebAuthn) credentials. Requires employees:read_all.
DELETE/employees/{id}/webauthn-credentials/{credId} admin — Revoga credencial de biometria digital. Requer employees:edit_all.Revokes a digital biometric credential. Requires employees:edit_all.
Regras de JornadaJourney Rules
Definem tudo sobre a jornada: dias trabalhados, horários, tolerâncias, requisitos de localização e facial, banco de horas. São vinculadas a escalas.
Define everything about the work schedule: working days, hours, tolerances, location and biometric requirements, overtime tracking. Linked to schedules.
GET/journey-rules admin — Lista regras da empresa.Lists the company's journey rules.
POST/journey-rules admin
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
name | string | obrigatóriorequired | Ex: "CLT Comercial"E.g. "Commercial CLT" |
weekdays | object | obrigatóriorequired | Chaves 0 (Dom) a 6 (Sáb)Keys 0 (Sun) to 6 (Sat) |
weekdays.{n}.active | boolean | obrigatóriorequired | Se o dia é trabalhadoWhether the day is a workday |
weekdays.{n}.start | HH:mm | opcionaloptional | Hora de entradaStart time |
weekdays.{n}.end | HH:mm | opcionaloptional | Hora de saídaEnd time |
location_id | integer | opcionaloptional | Local de trabalho vinculadoLinked work location |
entry_tolerance | integer | opcionaloptional | Tolerância de entrada em minutos (padrão 10, máx 120)Entry tolerance in minutes (default 10, max 120) |
exit_tolerance | integer | opcionaloptional | Tolerância de saída em minutos (padrão 10, máx 120)Exit tolerance in minutes (default 10, max 120) |
lunch_duration | integer | opcionaloptional | Duração mínima do almoço em minutos (padrão 60, máx 240)Minimum lunch duration in minutes (default 60, max 240) |
require_location | boolean | opcionaloptional | Exige GPS no check-in. Requer location_id.Requires GPS for check-in. Needs location_id. |
require_facial_recognition | boolean | opcionaloptional | Exige reconhecimento facial no check-inRequires facial recognition for check-in |
require_biometric | boolean | opcionaloptional | Exige biometria digital (WebAuthn/impressão digital) no check-in. Funcionário deve ter credencial cadastrada.Requires digital biometrics (WebAuthn/fingerprint) for check-in. Employee must have a registered credential. |
auto_overtime | boolean | opcionaloptional | Calcular banco de horas automaticamenteAutomatically calculate overtime bank |
flexible_start | boolean | opcionaloptional | Horário de entrada flexívelFlexible start time |
{
"name": "Comercial 8h",
"weekdays": {
"1": {"active": true, "start": "08:00", "end": "18:00"},
"2": {"active": true, "start": "08:00", "end": "18:00"},
"3": {"active": true, "start": "08:00", "end": "18:00"},
"4": {"active": true, "start": "08:00", "end": "18:00"},
"5": {"active": true, "start": "08:00", "end": "18:00"}
},
"location_id": 1,
"require_location": true,
"require_facial_recognition": true,
"lunch_duration": 60,
"entry_tolerance": 10,
"auto_overtime": true
}
PUT/journey-rules/{id} admin — Atualiza.Updates.
DELETE/journey-rules/{id} admin — Remove.Removes.
POST/journey-rules/{id}/assign admin — Atribui funcionários. Body: {"employee_ids":[1,2,3]}. Verifica conflitos de horário e período mínimo de descanso.Assigns employees. Body: {"employee_ids":[1,2,3]}. Validates schedule conflicts and minimum rest periods.
GET/journey-rules/{id}/employees admin — Lista funcionários da regra.Lists employees assigned to this rule.
DELETE/journey-rules/{id}/employees/{employeeId} admin — Remove funcionário da regra.Removes employee from rule.
EscalasSchedules
Vinculam grupos de funcionários a um período e uma regra de jornada. Suportam fluxo de confirmação.
Link groups of employees to a period and a journey rule. Support a confirmation workflow.
GET/schedules/calendar admin/manager — Visão de calendário mensal. Query: month, year, journey_rule_id, status, employee_id.Monthly calendar view. Query: month, year, journey_rule_id, status, employee_id.
GET/schedules admin/manager — Lista escalas.Lists schedules.
POST/schedules admin/manager
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
name | string | obrigatóriorequired | Nome da escalaSchedule name |
journey_rule_id | integer | obrigatóriorequired | Regra de jornada vinculadaLinked journey rule |
start_date | date | obrigatóriorequired | Data de inícioStart date |
end_date | date | obrigatóriorequired | Data de fim (≥ start_date)End date (≥ start_date) |
max_employees | integer | opcionaloptional | Limite de funcionários na escalaMaximum employees in the schedule |
requires_confirmation | boolean | opcionaloptional | Funcionário precisa confirmarEmployee must confirm participation |
notes | string | opcionaloptional | Observações (max 2000 chars)Notes (max 2000 chars) |
status | string | opcionaloptional | draft / active / completed / cancelled |
GET/schedules/{id}/details admin/manager — Detalhes + regra + funcionários + contagem de registros.Details + rule + employees + record count.
POST/schedules/{id}/employees admin/manager — Adiciona funcionários. Body: {"employee_ids":[1,2]}.Adds employees. Body: {"employee_ids":[1,2]}.
DELETE/schedules/{id}/employees/{employeeId} admin/manager — Remove funcionário da escala.Removes employee from schedule.
GET/schedules/my todosall — Minhas escalas.My schedules.
POST/schedules/{id}/confirm todosall — Confirmar participação na escala.Confirm participation in schedule.
POST/schedules/{id}/reject todosall — Recusar escala. Body: {"reason":"Motivo"}.Decline schedule. Body: {"reason":"Reason"}.
Locais de TrabalhoWork Locations
Definem o perímetro (geofencing) para validação de check-in por localização.
Define the perimeter (geofencing) for location-based check-in validation.
GET/locations admin/manager — Lista locais.Lists locations.
POST/locations admin/manager
| CampoField | TipoType | |
|---|---|---|
name | string | obrigatóriorequired |
address | string | obrigatóriorequired |
latitude, longitude | float | obrigatóriorequired |
radius | integer | opcionaloptional Raio em metros (padrão 200)Radius in meters (default 200) |
POST/locations/geocode admin/manager — Converte endereço em coordenadas. Body: {"address":"Rua..."}.Converts address to coordinates. Body: {"address":"Street..."}.
PUT/locations/{id} · DELETE/locations/{id} admin/manager
FeriadosHolidays
Calendário de feriados da empresa. Feriados são descontados dos dias úteis nos cálculos de KPIs e relatórios de presença.
Company holiday calendar. Holidays are discounted from working days in KPI calculations and attendance reports.
GET/holidays todosall — Lista feriados. Query: year.Lists holidays. Query: year.
POST/holidays admin — Cria feriado.Creates holiday.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
name | string | obrigatóriorequired | Ex: "Natal"E.g. "Christmas" |
date | date | obrigatóriorequired | YYYY-MM-DD |
type | string | opcionaloptional | national / state / municipal / company |
optional | boolean | opcionaloptional | Feriado facultativoOptional holiday |
recurring | boolean | opcionaloptional | Repete todo ano na mesma dataRepeats every year on the same date |
PUT/holidays/{id} · DELETE/holidays/{id} admin
POST/holidays/import-national admin — Importa feriados nacionais do ano. Body: {"year":2026}.Imports national holidays for the year. Body: {"year":2026}.
Férias e LicençasVacations & Leaves
Gestão de ausências programadas. Funcionários em férias/licença são excluídos da contagem de ausentes nos KPIs e relatórios.
Management of planned absences. Employees on vacation/leave are excluded from absence counts in KPIs and reports.
FuncionárioEmployee
GET/leaves/my todosall — Minhas férias e licenças.My vacations and leaves.
POST/leaves/request todosall — Solicitar férias ou licença.Request vacation or leave.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
type | string | obrigatóriorequired | vacation / sick_leave / maternity_leave / paternity_leave / other |
start_date | date | obrigatóriorequired | Data de inícioStart date |
end_date | date | obrigatóriorequired | Data de fimEnd date |
reason | string | opcionaloptional | MotivoReason |
POST/leaves/{id}/cancel todosall — Cancelar solicitação pendente.Cancel pending request.
Gestão (Admin/Manager)Management (Admin/Manager)
GET/leaves — Lista todas. Filtros: user_id, type, status, date_from, date_to.Lists all. Filters: user_id, type, status, date_from, date_to.
GET/leaves/{id} — Detalhe.Detail.
POST/leaves — Lançar diretamente (sem solicitação). Mesmos campos + user_id.Create directly (without a request). Same fields + user_id.
POST/leaves/{id}/approve — Aprovar. Body opcional: {"notes":"..."}.Approve. Optional body: {"notes":"..."}.
POST/leaves/{id}/reject — Rejeitar. Body: {"notes":"Motivo da recusa"}.Reject. Body: {"notes":"Reason for rejection"}.
DELETE/leaves/{id} — Excluir registro.Delete record.
pending → approved / rejected / cancelledConfiguração de PontoCheck-in Configuration
GET/check-in/config todosall — Retorna as configurações de ponto do usuário logado para hoje. Use antes de abrir a tela de check-in. Inclui consentimentos pendentes que devem ser apresentados ao usuário antes de registrar ponto.Returns the check-in settings for the logged-in user for today. Call before opening the check-in screen. Includes pending consents that must be shown to the user before recording.
{
"require_location": true,
"require_facial_recognition": true,
"require_biometric": false,
"face_photo_registered": true,
"location": { "lat": -23.5, "lng": -46.6, "radius": 200, "name": "Sede SP" },
"today_schedule": { "start": "08:00", "end": "18:00" },
"entry_tolerance": 10,
"exit_tolerance": 10,
"lunch_duration": 60,
"journey_rule": { "id": 1, "name": "CLT Comercial", "is_clt": true },
"pending_consents": [
{
"type": "location",
"label": "Localização GPS",
"description": "Permite capturar sua localização ao registrar ponto.",
"required": true,
"refusable": true
}
]
}
Registros de PontoTime Records
Check-in com validação de sequência, tolerâncias, geolocalização e reconhecimento facial.
Time clock with sequence validation, tolerances, geolocation, and facial recognition.
POST/records todosall — Registrar ponto.Clock in/out.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
type | string | obrigatóriorequired | entry / lunch_out / lunch_in / exit |
timestamp | ISO 8601 | obrigatóriorequired | Horário do registroRecord timestamp |
latitude, longitude | float | condicionalconditional | Necessário se regra exige GPSRequired if rule requires GPS |
accuracy | float | opcionaloptional | Precisão do GPS em metrosGPS accuracy in meters |
face_image | base64 | condicionalconditional | Necessário se regra exige facialRequired if rule requires facial recognition |
| HTTP | status | AçãoAction |
|---|---|---|
| 201 | approved | Aprovado diretamente — sem GPS/facialApproved immediately — no GPS/facial required |
| 202 | pending | Na fila — faça polling em /records/status/{id} a cada 2sQueued — poll /records/status/{id} every 2s |
| 422 | — | Validação falhou (sequência, tolerância, duplicata)Validation failed (sequence, tolerance, duplicate) |
GET/records/status/{id} todosall — Polling do status. Retorna pending / processing / approved / rejected + motivo.Status polling. Returns pending / processing / approved / rejected + reason.
GET/records/my todosall — Meus registros. Filtros: date, date_from, date_to.My records. Filters: date, date_from, date_to.
GET/records/day/{date} todosall — Registros do dia (YYYY-MM-DD).Records for the day (YYYY-MM-DD).
GET/records admin/manager — Todos os registros da empresa. Filtros: date, date_from, date_to, employee_id, type, status.All company records. Filters: date, date_from, date_to, employee_id, type, status.
GET/records/stats admin/manager — Estatísticas de registros.Record statistics.
GET/records/{id}/detail admin/manager — Detalhe com localização, status facial, IP.Detail with location, facial status, IP.
PUT/records/{id}/adjust admin/manager — Ajuste manual de horário. Campos: time (HH:mm), reason (motivo).Manual time adjustment. Fields: time (HH:mm), reason (reason).
Biometria Digital (WebAuthn)Digital Biometrics (WebAuthn)
Registro de ponto por biometria digital usando o padrão WebAuthn/FIDO2 — impressão digital, Face ID, Windows Hello ou chave USB FIDO2. Nenhuma imagem é armazenada no servidor: apenas a chave criptográfica pública gerada pelo dispositivo do usuário.
Time clock via digital biometrics using the WebAuthn/FIDO2 standard — fingerprint, Face ID, Windows Hello, or USB FIDO2 key. No images are stored on the server: only the cryptographic public key generated by the user's device.
controle.lpatech.com.br — deve coincidir com o domínio onde o browser executa a cerimônia. Não é o domínio da API.must match the domain where the browser runs the ceremony. This is NOT the API domain.Cadastro de Credencial (Perfil → Digital)Credential Registration (Profile → Digital)
Fluxo de 2 etapas: obter challenge → browser cria credencial → confirmar no servidor.
2-step flow: get challenge → browser creates credential → confirm on server.
POST/webauthn/register/begin todosall — Inicia cadastro. Retorna challenge e opções para navigator.credentials.create().Starts registration. Returns challenge and options for navigator.credentials.create().
// RespostaResponse
{
"challenge": "base64url...",
"rp": { "name": "Jornada Control", "id": "controle.lpatech.com.br" },
"user": { "id": "base64url_user_id", "name": "[email protected]", "displayName": "Ana Silva" },
"pubKeyCredParams": [{ "type": "public-key", "alg": -7 }],
"timeout": 60000,
"attestation": "none"
}
POST/webauthn/register/finish todosall — Finaliza cadastro. Envia o resultado de navigator.credentials.create().Finishes registration. Sends the result of navigator.credentials.create().
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
id | string (base64url) | obrigatóriorequired | ID da credencialCredential ID |
rawId | string (base64url) | obrigatóriorequired | ID binário da credencialBinary credential ID |
response.attestationObject | string (base64url) | obrigatóriorequired | Objeto de atestaçãoAttestation object |
response.clientDataJSON | string (base64url) | obrigatóriorequired | Dados do clienteClient data |
device_name | string | opcionaloptional | Nome amigável (ex: "Notebook Dell")Friendly name (e.g. "Dell Laptop") |
GET/webauthn/credentials todosall — Lista as próprias credenciais cadastradas.Lists the user's own registered credentials.
{
"data": [
{
"id": 3,
"device_name": "iPhone XR - Face ID",
"attachment": "platform",
"created_at": "2026-05-29T10:00:00Z",
"last_used_at": "2026-05-29T14:32:00Z"
}
]
}
DELETE/webauthn/credentials/{id} todosall — Revoga credencial própria.Revokes own credential.
Check-in BiométricoBiometric Check-in
Usado quando a regra de jornada exige require_biometric: true. Substitui ou complementa o check-in padrão.
Used when the journey rule requires require_biometric: true. Replaces or complements the standard check-in.
POST/check-in/biometric/begin todosall — Inicia o check-in biométrico. Retorna challenge para navigator.credentials.get().Starts biometric check-in. Returns challenge for navigator.credentials.get().
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
type | string | obrigatóriorequired | entry / lunch_out / lunch_in / exit |
date | date (YYYY-MM-DD) | opcionaloptional | Data do registro (padrão: hoje)Record date (default: today) |
// RespostaResponse
{
"challenge": "base64url...",
"rpId": "controle.lpatech.com.br",
"allowCredentials": [{ "type": "public-key", "id": "base64url..." }],
"timeout": 60000,
"userVerification": "preferred"
}
POST/check-in/biometric/finish todosall — Finaliza o check-in biométrico com o resultado de navigator.credentials.get().Finishes biometric check-in with the result of navigator.credentials.get().
| CampoField | TipoType | |
|---|---|---|
id, rawId | string (base64url) | obrigatóriorequired |
response.authenticatorData | string (base64url) | obrigatóriorequired |
response.clientDataJSON | string (base64url) | obrigatóriorequired |
response.signature | string (base64url) | obrigatóriorequired |
type | string | obrigatóriorequired entry/lunch_out/lunch_in/exit |
| HTTP | errorCode | CausaCause |
|---|---|---|
| 403 | biometric_required | Regra exige biometria, use /check-in/biometric/*Rule requires biometrics, use /check-in/biometric/* |
| 422 | no_biometric_credential | Usuário sem credencial cadastrada — redirecionar para PerfilUser has no registered credential — redirect to Profile |
| 422 | no_credentials | Nenhuma credencial encontrada para o challengeNo credentials found for the challenge |
Ponto ManualManual Records
Permite ao funcionário solicitar um registro fora das condições normais (sem GPS, fora do horário, etc.). O gestor aprova ou rejeita.
Allows the employee to request a record outside normal conditions (no GPS, outside work hours, etc.). The manager approves or rejects.
FuncionárioEmployee
POST/records/manual todosall — Solicitar ponto manual.Request manual record.
| CampoField | TipoType | |
|---|---|---|
type | string | obrigatóriorequired entry/lunch_out/lunch_in/exit |
timestamp | ISO 8601 | obrigatóriorequired |
reason | string | obrigatóriorequired JustificativaReason / justification |
Gestão (Admin/Manager)Management (Admin/Manager)
GET/records/manual/pending admin/manager — Lista registros manuais. Query: status (pending padrão / approved / rejected / vazio = todos), search (nome ou e-mail), page, per_page.Lists manual records. Query: status (pending default / approved / rejected / empty = all), search (name or e-mail), page, per_page.
POST/records/manual/{id}/approve admin/manager — Aprovar solicitação pendente.Approve pending request.
POST/records/manual/{id}/reject admin/manager — Rejeitar. Body: {"reason":"Motivo da recusa"}.Reject. Body: {"reason":"Reason for rejection"}.
Modo CompartilhadoShared Mode
Para uso em tablets ou totens fixos na empresa. O dispositivo fica logado com uma conta de serviço e qualquer funcionário pode registrar o ponto: a API identifica automaticamente quem é o funcionário pela foto enviada (busca entre todos os funcionários cadastrados com foto facial) e registra no nome correto.
For use on fixed tablets or kiosk devices in the company. The device stays logged in with a service account and any employee can clock in: the API automatically identifies who the employee is from the submitted photo (searches among all employees with a registered face photo) and records under the correct name.
GET/shared-checkin/config todosall — Configurações do modo compartilhado para o dispositivo.Shared mode settings for the device.
POST/shared-checkin todosall — Registrar ponto em modo compartilhado.Record time entry in shared mode.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
type | string | obrigatóriorequired | entry/lunch_out/lunch_in/exit |
timestamp | ISO 8601 | obrigatóriorequired | Horário do registroRecord timestamp |
face_image | base64 | obrigatóriorequired | Foto para identificação do funcionárioPhoto for employee identification |
latitude, longitude | float | opcionaloptional | Coordenadas do dispositivoDevice coordinates |
Justificativa de AusênciaAbsence Justification
Permite ao funcionário justificar uma ausência, com ou sem anexo (PDF, imagem). Justificativas aprovadas são separadas das faltas injustificadas nos relatórios.
Allows the employee to justify an absence, with or without an attachment (PDF, image). Approved justifications are separated from unjustified absences in reports.
FuncionárioEmployee
GET/absences/my todosall — Minhas justificativas.My absence justifications.
POST/absences todosall — Enviar justificativa. Use multipart/form-data se houver anexo.Submit justification. Use multipart/form-data when including an attachment.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
date | date | obrigatóriorequired | Data da ausênciaAbsence date |
reason | string | obrigatóriorequired | JustificativaJustification |
attachment | file | opcionaloptional | PDF ou imagem (max 5 MB)PDF or image (max 5 MB) |
GET/absences/{id}/attachment todosall — Download do anexo.Download attachment.
Gestão (Admin/Manager)Management (Admin/Manager)
GET/absences admin/manager — Lista todas. Filtros: user_id, status, date_from, date_to.Lists all. Filters: user_id, status, date_from, date_to.
GET/absences/{id} admin/manager — Detalhe.Detail.
POST/absences/{id}/approve admin/manager — Aprovar.Approve.
POST/absences/{id}/reject admin/manager — Rejeitar. Body: {"notes":"Motivo"}.Reject. Body: {"notes":"Reason"}.
Espelho de PontoTimesheet
Resumo mensal de horas trabalhadas, almoço e banco de horas. Disponível em JSON, PDF e Excel.
Monthly summary of worked hours, lunch breaks, and overtime bank. Available as JSON, PDF, and Excel.
GET/timesheet/my todosall — Meu espelho do mês.My monthly timesheet.
GET/timesheet/my/pdf todosall — Download PDF pessoal.Personal PDF download.
GET/timesheet/my/excel todosall — Download Excel pessoal.Personal Excel download.
GET/timesheet admin/manager — Espelho da empresa.Company-wide timesheet.
GET/timesheet/{employeeId} admin/manager — Espelho individual.Individual timesheet.
GET/timesheet/pdf · GET/timesheet/excel admin/manager — Download geral.Full download.
Query params: month (1–12), year (ex: 2026).Query params: month (1–12), year (e.g. 2026).
auto_overtime = true na regra).Worked hours = (exit − entry) − (lunch_in − lunch_out). Overtime bank = worked − expected (when auto_overtime = true in the rule).Dashboard
Visão em tempo real do dia para gestores.
Real-time daily view for managers.
GET/dashboard/stats admin/manager — Estatísticas do dia: presentes, ausentes, de licença, registros pendentes.Day statistics: present, absent, on leave, pending records.
GET/dashboard/today-records admin/manager — Feed ao vivo dos registros de hoje.Live feed of today's records.
GET/dashboard/alerts admin/manager — Alertas: ausências após 9h, escalas pendentes de confirmação.Alerts: absences after 9am, schedules pending confirmation.
KPIs
Indicadores chave para gestão de pessoas. Todos os endpoints aceitam date_from e date_to.
Key indicators for people management. All endpoints accept date_from and date_to.
GET/kpis/overview admin/manager — Resumo do dia.Day summary.
GET /kpis/overview?date=2026-03-28
{
"date": "2026-03-28",
"is_holiday": null,
"total_employees": 50,
"present": 42,
"absent": 5,
"on_leave": 3,
"late": 7,
"pending_manual": 2,
"presence_rate": 84.0
}
GET/kpis/overtime admin/manager — Banco de horas por funcionário no período.Overtime bank per employee for the period.
GET /kpis/overtime?date_from=2026-03-01&date_to=2026-03-28
{
"data": [
{
"id": 5, "name": "Ana Silva", "department": "TI",
"days_worked": 20,
"worked_hours": "168h30",
"expected_hours": "160h00",
"balance_hours": "+8h30",
"balance_minutes": 510
}
],
"total_balance_hours": "+12h15"
}
GET/kpis/punctuality admin/manager — Ranking de pontualidade. Query: limit (padrão 20).Punctuality ranking. Query: limit (default 20).
{
"data": [
{
"id": 3, "name": "Carlos Lima",
"total_days": 20, "on_time": 19, "late_days": 1,
"avg_late_minutes": 8.0,
"punctuality_rate": 95.0
}
]
}
GET/kpis/attendance admin/manager — Ranking de presença. Query: limit.Attendance ranking. Query: limit.
{
"data": [
{
"id": 7, "name": "Maria Souza",
"days_present": 22, "days_leave": 0,
"expected_days": 22, "absences": 0,
"attendance_rate": 100.0
}
]
}
GET/kpis/daily-presence admin/manager — Gráfico de presença diária (últimos 30 dias por padrão).Daily attendance chart (last 30 days by default).
{
"data": [
{ "date": "2026-03-01", "present": 45, "absent": 5, "rate": 94.0 },
{ "date": "2026-03-04", "present": 48, "absent": 2, "rate": 96.0 }
],
"total_employees": 50
}
RelatóriosReports
Relatórios detalhados por funcionário para o período informado. Query: date_from, date_to, limit (padrão 50).
Detailed reports per employee for the specified period. Query: date_from, date_to, limit (default 50).
GET/reports/punctuality admin/manager — Top Pontualidade. Lista funcionários ordenados por taxa de pontualidade, com detalhamento por dia (on_time, late, early).Punctuality Ranking. Lists employees ordered by punctuality rate, with daily breakdown (on_time, late, early).
GET/reports/overtime admin/manager — Top Horas Excedentes. Lista funcionários com maior banco de horas positivo, com detalhamento diário.Overtime Ranking. Lists employees with the highest positive overtime bank, with daily breakdown.
GET /reports/overtime?date_from=2026-03-01&date_to=2026-03-28&limit=10
{
"data": [
{
"id": 5, "name": "Ana Silva", "cpf": "12345678901",
"days_worked": 20, "overtime_days": 15,
"worked": "168h30", "expected": "160h00", "balance": "+8h30",
"daily": [
{
"date": "2026-03-03",
"entry": "07:55", "exit": "18:10",
"worked": "9h15", "expected": "8h00", "balance": "+1h15"
}
]
}
]
}
GET/reports/attendance admin/manager — Resumo de presença com separação de faltas justificadas e injustificadas.Attendance summary with breakdown of justified and unjustified absences.
{
"data": [
{
"id": 8, "name": "João Pedro",
"days_present": 18, "days_leave": 2,
"justified_absences": 1, "unjustified_absences": 1,
"expected_days": 22, "attendance_rate": 94.0
}
],
"work_days": 22,
"holidays": 1
}
Usuários OnlineOnline Users
Mostra quem está com o app aberto agora. Um usuário é considerado online se fez alguma requisição nos últimos 5 minutos.
Shows who currently has the app open. A user is considered online if they made any request in the last 5 minutes.
GET/users/online admin/manager — Lista usuários online.Lists online users.
{
"data": [
{
"user_id": 12, "name": "Pedro Rocha", "role": "employee",
"position": "Analista", "department": "TI",
"last_activity_at": "2026-03-28T14:32:00Z",
"minutes_ago": 1
}
],
"total": 8
}
GET/users/online/count admin/manager — Contagem rápida:Quick count: {"online":8,"offline":42,"total":50}.
Logs de AtividadeActivity Logs
Auditoria completa de todas as ações dos usuários. Todo acesso autenticado é registrado automaticamente.
Complete audit of all user actions. Every authenticated access is recorded automatically.
GET/activity-logs admin/manager
Filtros: user_id, action, date_from, date_to, search (busca em ação, descrição e nome), per_page (padrão 30).Filters: user_id, action, date_from, date_to, search (searches action, description and name), per_page (default 30).
{
"data": [
{
"id": 1001,
"user": { "id": 5, "name": "Ana Silva", "role": "manager" },
"action": "records.adjust",
"description": "Ajustou o registro #302 de 08:15 para 08:00",
"created_at": "2026-03-28T09:14:00Z"
}
],
"current_page": 1,
"total": 245
}
GET/activity-logs/summary admin/manager — Resumo por tipo de ação e logins por dia. Query: days (padrão 7).Summary by action type and logins per day. Query: days (default 7).
{
"actions_summary": [
{ "action": "records.store", "count": 320 },
{ "action": "auth.login", "count": 95 }
],
"logins_by_day": [
{ "date": "2026-03-27", "count": 18 }
]
}
NotificaçõesNotifications
GET/notifications todosall — Lista notificações.Lists notifications.
GET/notifications/unread-count todosall — Quantidade não lidas.Unread count.
PATCH/notifications/{id}/read todosall — Marcar como lida.Mark as read.
POST/notifications/read-all todosall — Marcar todas como lidas.Mark all as read.
GET/notification-settings admin — Ver configurações de notificação da empresa.View company notification settings.
PUT/notification-settings admin — Atualizar configurações (som, vibração, eventos específicos).Update settings (sound, vibration, specific events).
PerfilProfile
GET/profile todosall — Ver dados do próprio perfil.View own profile data.
PUT/profile todosall — Atualizar nome, telefone, endereço.Update name, phone, address.
POST/profile/photo todosall — Atualizar foto de perfil. multipart/form-data, campo photo.Update profile photo. multipart/form-data, field photo.
Roles e PermissõesRoles & Permissions
Crie roles customizadas com conjuntos específicos de permissões para funcionários e gestores.
Create custom roles with specific sets of permissions for employees and managers.
GET/roles admin — Lista roles da empresa.Lists the company's roles.
GET/roles/permissions admin — Lista todas as permissões disponíveis.Lists all available permissions.
POST/roles admin — Criar role. Campos: name, permissions (array).Create role. Fields: name, permissions (array).
PUT/roles/{id} · DELETE/roles/{id} admin
Integrações ERPERP Integrations
Exporte dados de ponto e folha de pagamento em formatos nativos dos 5 maiores ERPs de RH do Brasil. Disponível via painel (admin) e via API V1 (token).
Export time tracking and payroll data in native formats of the 5 largest HR ERPs in Brazil. Available via the admin panel and via API V1 (token).
POST /api/tokens com permissão records:read. Depois, configure seu ERP para fazer chamadas GET periódicas com Authorization: Bearer {token}.Create an API Token at POST /api/tokens with records:read permission. Then configure your ERP to make periodic GET calls with Authorization: Bearer {token}.ERPs SuportadosSupported ERPs
| ERP | FormatoFormat | Tipo de ArquivoFile Type | ParâmetroParameter format |
|---|---|---|---|
| TOTVS Protheus | TXT posicional (H|D|T)Positional TXT (H|D|T) | .txt | totvs |
| Senior Sistemas | TXT pipe-separated (|)Pipe-separated TXT (|) | .txt | senior |
| SAP SuccessFactors | CSV padrão Employee Central (Wage Types)Standard Employee Central CSV (Wage Types) | .csv | sap |
| ADP Expert / Celeridade | CSV com EMPRESA/FILIAL/COMPETENCIACSV with EMPRESA/FILIAL/COMPETENCIA | .csv | adp |
| LG Lugar de Gente | TXT posicional (0|1|9)Positional TXT (0|1|9) | .txt | lg |
| GenéricoGeneric | CSV ponto-e-vírgula (compatível com qualquer sistema)Semicolon CSV (compatible with any system) | .csv | generic |
Folha de PagamentoPayroll
GET/integrations/payroll admin
Retorna arquivo com dados de horas normais, extras, atrasos, faltas e licenças de todos os funcionários no período.
Returns a file with normal hours, overtime, lateness, absences, and leave data for all employees in the period.
| ParâmetroParameter | TipoType | DescriçãoDescription |
|---|---|---|
month | integer | obrigatóriorequired Mês (1-12)Month (1-12) |
year | integer | obrigatóriorequired Ano (2020-2099)Year (2020-2099) |
format | string | opcionaloptional totvs | senior | sap | adp | lg | generic (padrão: totvsdefault: totvs) |
# Exemplo: exportar folha no formato TOTVS via API V1Example: export payroll in TOTVS format via API V1
curl -H "Authorization: Bearer {token}" \
"https://api.controle.lpatech.com.br/api/v1/integrations/payroll?month=3&year=2026&format=totvs"
# Exemplo: exportar para SAP SuccessFactorsExample: export for SAP SuccessFactors
curl -H "Authorization: Bearer {token}" \
"https://api.controle.lpatech.com.br/api/v1/integrations/payroll?month=3&year=2026&format=sap"
eSocial
GET/integrations/esocial admin
Retorna eventos S-1200 (Remuneração) e S-2299 (Desligamento) em formato JSON prontos para envio ao governo federal.
Returns S-1200 (Remuneration) and S-2299 (Termination) events in JSON format ready for submission to the federal government.
| ParâmetroParameter | TipoType | DescriçãoDescription |
|---|---|---|
month | integer | obrigatóriorequired Mês (1-12)Month (1-12) |
year | integer | obrigatóriorequired Ano (2020-2099)Year (2020-2099) |
curl -H "Authorization: Bearer {token}" \
"https://api.controle.lpatech.com.br/api/v1/integrations/esocial?month=3&year=2026"
Banco de HorasOvertime Bank
GET/integrations/bank-hours admin
CSV com resumo e detalhamento diário do banco de horas por funcionário (esperado vs trabalhado).
CSV with summary and daily breakdown of the overtime bank per employee (expected vs worked).
| ParâmetroParameter | TipoType | DescriçãoDescription |
|---|---|---|
month | integer | obrigatóriorequired Mês (1-12)Month (1-12) |
year | integer | obrigatóriorequired Ano (2020-2099)Year (2020-2099) |
Listar Formatos DisponíveisList Available Formats
GET/integrations/formats admin
Retorna metadados de todos os formatos de exportação suportados.
Returns metadata for all supported export formats.
Endpoints disponíveis na API V1 (via token)Endpoints available in API V1 (via token)
Os mesmos endpoints estão disponíveis para consumo automatizado por ERPs via /api/v1/integrations/:
The same endpoints are available for automated ERP consumption via /api/v1/integrations/:
| Endpoint V1 | PermissãoPermission | DescriçãoDescription |
|---|---|---|
GET /api/v1/integrations/payroll | records:read | Exportar folha de pagamentoExport payroll |
GET /api/v1/integrations/esocial | records:read | Eventos eSocialeSocial events |
GET /api/v1/integrations/bank-hours | records:read | Banco de horasOvertime bank |
GET /api/v1/integrations/formats | records:read | Listar formatosList formats |
GET /api/v1/employees | employees:read | Listar funcionáriosList employees |
GET /api/v1/records | records:read | Registros de pontoTime records |
GET /api/v1/timesheet | timesheet:read | Espelho de pontoTimesheet |
LGPD / ConsentimentosConsents
Gerenciamento dos consentimentos do usuário conforme a LGPD (Lei Geral de Proteção de Dados). Antes de registrar ponto, o app deve verificar se há consentimentos pendentes via GET /check-in/config e apresentá-los ao usuário.
Manages user consents under Brazil's LGPD (General Data Protection Law). Before recording a time entry, the app must check for pending consents via GET /check-in/config and present them to the user.
Tipos de ConsentimentoConsent Types
| TipoType | Quando é exigidoWhen required | Recusável?Refusable? |
|---|---|---|
terms | Sempre — Termos de UsoAlways — Terms of Service | NãoNo |
data_processing | Sempre — Tratamento de dados pessoaisAlways — Personal data processing | NãoNo |
third_party | Sempre — Compartilhamento com terceirosAlways — Third-party data sharing | NãoNo |
biometric | Quando require_facial_recognition: trueWhen require_facial_recognition: true | SimYes |
location | Quando require_location: trueWhen require_location: true | SimYes |
digital | Quando require_biometric: true (WebAuthn)When require_biometric: true (WebAuthn) | SimYes |
GET/lgpd/consents todosall — Lista os consentimentos ativos do usuário.Lists the user's active consents.
GET/lgpd/consents/pending todosall — Lista consentimentos pendentes do usuário para a jornada configurada. Equivalente ao campo pending_consents em GET /check-in/config.Lists pending consents for the user's configured journey. Equivalent to the pending_consents field in GET /check-in/config.
POST/lgpd/consents todosall — Registrar consentimento.Record consent.
| CampoField | TipoType | DescriçãoDescription | |
|---|---|---|---|
consent_type | string | obrigatóriorequired | terms / data_processing / third_party / biometric / location / digital |
granted | boolean | obrigatóriorequired | true = aceito, false = recusadotrue = granted, false = refused |
POST/lgpd/consents/{type}/revoke todosall — Revogar consentimento. Onde {type} é o tipo (ex: location).Revoke a consent. Where {type} is the consent type (e.g. location).
terms, data_processing e third_party são obrigatórios. Registrar granted: false nesses tipos impede o uso do sistema.Important: Consents of type terms, data_processing, and third_party are mandatory. Setting granted: false for these prevents system use.Webhooks
Receba notificações em tempo real quando eventos acontecem no sistema. Configure uma URL do seu ERP e o Jornada Control enviará um POST com os dados do evento.
Receive real-time notifications when events occur in the system. Configure a URL in your ERP and Jornada Control will send a POST with the event data.
GET/webhooks — Lista webhooks configurados.Lists configured webhooks. admin
POST/webhooks — Criar webhook.Create webhook. admin
| CampoField | TipoType | DescriçãoDescription |
|---|---|---|
url | string | obrigatóriorequired URL que receberá os eventos (HTTPS recomendado)URL that will receive events (HTTPS recommended) |
secret | string | obrigatóriorequired Chave HMAC-SHA256 (mín 16 caracteres)HMAC-SHA256 key (min 16 characters) |
events | array | obrigatóriorequired Lista de eventos a escutar (ou ["*"] para todos)List of events to subscribe to (or ["*"] for all) |
Eventos disponíveisAvailable events
| EventoEvent | Quando é disparadoWhen triggered |
|---|---|
record.created | Ponto registrado (entrada, saída, almoço)Time record created (entry, exit, lunch) |
employee.created | Novo funcionário cadastradoNew employee registered |
leave.requested | Férias/licença solicitadaVacation/leave requested |
leave.approved | Férias/licença aprovadaVacation/leave approved |
absence.created | Justificativa de ausência registradaAbsence justification submitted |
manual_record.created | Registro manual criado pelo adminManual record created by admin |
Payload enviadoPayload sent
POST https://seu-erp.com/webhook
Content-Type: application/json
X-Webhook-Signature: sha256=HMAC_HASH
{
"event": "record.created",
"timestamp": "2026-04-07T08:00:01-03:00",
"data": {
"record_id": 1234,
"employee_id": 56,
"employee_name": "João Silva",
"type": "entry",
"date": "2026-04-07",
"time": "08:00:01"
}
}
Verificação de assinaturaSignature verification
Para garantir que o webhook é legítimo, verifique o header X-Webhook-Signature:
To ensure the webhook is legitimate, verify the X-Webhook-Signature header:
# PHP
$expected = 'sha256=' . hash_hmac('sha256', $requestBody, $secret);
$valid = hash_equals($expected, $request->header('X-Webhook-Signature'));
# Node.js
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(body).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));
POST/webhooks/{id}/test — Envia evento de teste.Sends a test event. admin
PUT/webhooks/{id} — Atualizar configuração.Update configuration. admin
DELETE/webhooks/{id} — Remover webhook.Remove webhook. admin
Tabela de PermissõesPermissions Table
Use estas permissões ao criar tokens de API ou roles customizadas.
Use these permissions when creating API tokens or custom roles.
| PermissãoPermission | DescriçãoDescription |
|---|---|
* | Acesso totalFull access |
employees:read | Listar e visualizar funcionáriosList and view employees |
employees:write | Criar, editar, excluir e cadastrar fotos faciaisCreate, edit, delete, and register face photos |
employees:write_below | Editar apenas subordinates (implícito em write)Edit only subordinates (implicit in write) |
records:read | Ver registros de todos os funcionáriosView records for all employees |
records:read_own | Ver apenas próprios registros (implícito em read)View own records only (implicit in read) |
records:write_own | Criar próprios registros de pontoCreate own time records |
records:adjust | Ajustar registros de outrosAdjust other employees' records |
records:adjust_empty | Criar registros em dias sem pontoCreate records on days with no time entry |
schedules:read | Ver escalasView schedules |
schedules:read_own | Ver apenas próprias escalasView own schedules only |
schedules:write | Criar e gerenciar escalasCreate and manage schedules |
locations:read | Ver locais de trabalhoView work locations |
locations:write | Criar e editar locaisCreate and edit locations |
journey-rules:read | Ver regras de jornadaView journey rules |
journey-rules:write | Criar, editar e atribuir regrasCreate, edit, and assign rules |
timesheet:read | Ver espelho de ponto de todosView timesheets for all employees |
timesheet:read_own | Ver apenas próprio espelhoView own timesheet only |
leaves:read | Ver férias e licenças de todosView vacations and leaves for all employees |
leaves:write | Criar, aprovar e rejeitar férias/licençasCreate, approve, and reject vacations/leaves |
absences:read | Ver justificativas de ausênciaView absence justifications |
absences:write | Aprovar e rejeitar justificativasApprove and reject justifications |
holidays:write | Gerenciar feriados da empresaManage company holidays |
kpis:read | Acessar KPIs e relatóriosAccess KPIs and reports |
notifications:read | Ver notificaçõesView notifications |
notifications:write | Configurar notificaçõesConfigure notifications |
api-tokens:manage | Criar e revogar tokens de APICreate and revoke API tokens |
roles:manage | Gerenciar roles e permissõesManage roles and permissions |
Fluxo CompletoComplete Flow
── CONFIGURAÇÃO INICIALINITIAL SETUP ─────────────────────────────
1. POST /locations → Cadastrar local com lat/lng e raioRegister location with lat/lng and radius
2. POST /journey-rules → Criar regra (dias, horários, GPS, facial, biométrico)Create rule (days, hours, GPS, facial, biometric)
3. POST /schedules → Criar escala (regra + período)Create schedule (rule + period)
4. POST /employees → Cadastrar funcionáriosRegister employees
5. POST /employees/{id}/face-photo → Cadastrar foto facialRegister face photo
6. POST /journey-rules/{id}/assign → Atribuir funcionários à regraAssign employees to rule
7. POST /schedules/{id}/employees → Adicionar à escalaAdd to schedule
8. POST /holidays → Cadastrar feriados do anoRegister yearly holidays
── CONSENTIMENTOS LGPD (1ª VEZ)LGPD CONSENTS (FIRST TIME) ────────────────
1. GET /check-in/config → Verifica pending_consentsCheck pending_consents
2. App exibe modal com os consentimentos pendentesApp shows modal with pending consents
3. POST /lgpd/consents → Registrar cada consentimento (granted: true/false)Record each consent (granted: true/false)
── CHECK-IN (PADRÃO)STANDARD CHECK-IN ─────────────────────────────
1. GET /check-in/config → App carrega configurações do diaApp loads today's settings
2. POST /records → Funcionário bate o pontoEmployee clocks in/out
→ 201: aprovado diretoapproved immediately
→ 202: fila (GPS/facial)queued (GPS/facial) → polling GET /records/status/{id}
3. App exibe resultado ao funcionárioApp shows result to employee
── CHECK-IN BIOMÉTRICO (WebAuthn)BIOMETRIC CHECK-IN (WebAuthn) ─────────────
1. GET /check-in/config → Verifica require_biometric + pending_consentsCheck require_biometric + pending_consents
2. POST /check-in/biometric/begin → Obtém challengeGet challenge
3. navigator.credentials.get() → Browser solicita biometria ao usuárioBrowser requests biometrics from user
4. POST /check-in/biometric/finish → Registra ponto + valida assinaturaClock in/out + validate signature
→ 201: aprovadoapproved
── CADASTRO DE DIGITAL (Perfil → Digital)FINGERPRINT SETUP (Profile → Digital) ──
1. POST /lgpd/consents → consent_type: "digital" (granted: true)
2. POST /webauthn/register/begin → Obtém challenge de cadastroGet registration challenge
3. navigator.credentials.create() → Browser cria credencialBrowser creates credential
4. POST /webauthn/register/finish → Salva credencial no servidorSave credential on server
── MODO COMPARTILHADO (TOTEM)SHARED MODE (KIOSK) ─────────────────────
1. Dispositivo fixo logado com conta de serviçoFixed device logged in with service account
2. Funcionário se aproxima → captura fotoEmployee approaches → face captured
3. POST /shared-checkin → Sistema identifica o rostoSystem identifies the face
4. Ponto registrado no nome do funcionário identificadoClock entry recorded under identified employee
── GESTÃO DIÁRIADAILY MANAGEMENT ─────────────────────────────────
GET /dashboard/stats → Resumo do diaDay summary
GET /kpis/overview → Presentes, ausentes, de licençaPresent, absent, on leave
GET /users/online → Quem está com o app abertoWho has the app open
GET /dashboard/alerts → Alertas de ausência e pendênciasAbsence alerts and pending items
── RELATÓRIOS MENSAISMONTHLY REPORTS ─────────────────────────────
GET /timesheet/{employeeId} → Espelho individualIndividual timesheet
GET /kpis/overtime → Banco de horasOvertime bank
GET /reports/punctuality → Top pontualidadePunctuality ranking
GET /reports/attendance → Faltas justificadas/injustificadasJustified/unjustified absences
GET /timesheet/excel → Download planilha geralDownload full spreadsheet
── INTEGRAÇÃO COM ERPERP INTEGRATION ──────────────────────────────
1. POST /tokens → Cria token de API (admin)Create API token (admin)
2. Configura ERP para chamar com Bearer token:Configure ERP to call with Bearer token:
GET /v1/integrations/payroll?format=totvs&month=3&year=2026
GET /v1/integrations/esocial?month=3&year=2026
GET /v1/integrations/bank-hours?month=3&year=2026
3. Formatos: totvs | senior | sap | adp | lg | generic
4. POST /webhooks → ERP recebe eventos em tempo realERP receives real-time events