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

FormatoFormat: JSON. Envie sempre 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

CampoFieldTipoTypeDescriçãoDescription
emailstringopcional*optional*E-mail do usuárioUser e-mail address
cpfstring (11)opcional*optional*CPF sem pontuaçãoCPF without punctuation
passwordstringobrigatóriorequiredSenha (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/logoutInvalida o token.Invalidates the token.

POST/auth/refreshRenova o JWT antes de expirar.Renews the JWT before it expires.

GET/auth/meDados do usuário autenticado.Authenticated user data.

PUT/auth/change-passwordAltera senha. Campos: current_password, password, password_confirmation.Change password. Fields: current_password, password, password_confirmation.

POST/auth/forgot-passwordEnvia 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-passwordRedefine 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/tokensLista tokens.Lists tokens. admin

POST/tokensCria token. O plaintext é exibido uma única vez.Creates token. The plaintext is shown only once. admin

CampoFieldTipoType
namestringobrigatóriorequired Nome descritivoDescriptive name
abilitiesarrayopcionaloptional Permissões. Default: ["*"]Permissions. Default: ["*"]
expires_in_daysintegeropcionaloptional Dias até expirarDays until expiry

DELETE/tokens/{id}Revoga token.Revokes token. admin

Erros e LimitesErrors & Rate Limits

HTTPCódigoCodeCausaCause
401unauthenticatedToken ausente ou inválidoMissing or invalid token
401token_expiredJWT expirado — use /auth/refreshJWT expired — use /auth/refresh
403insufficient_permissionsSem a permissão necessáriaMissing required permission
403no_subscriptionEmpresa sem assinatura ativaCompany has no active subscription
403payment_overduePagamento pendente há mais de 7 diasPayment overdue for more than 7 days
403employee_limit_reachedLimite de funcionários do plano atingidoPlan employee limit reached
422validation_errorCampos inválidos — errors detalha cada campoInvalid fields — errors details each field
429Rate limit excedidoRate limit exceeded
Rate limit: 60 req/min padrão. Login: 10/min. Registros de ponto: 30/min. Uploads de foto: 10/min.60 req/min default. Login: 10/min. Time records: 30/min. Photo uploads: 10/min.

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.

CampoFieldTipoTypeDescriçãoDescription
namestringobrigatóriorequiredNome completoFull name
emailemailobrigatóriorequiredÚnico na empresaUnique within the company
cpfstring (11)obrigatóriorequiredSó dígitos, único na empresaDigits only, unique within the company
password + password_confirmationstringobrigatóriorequiredMín. 8 charsMin. 8 chars
rolestringobrigatóriorequiredadmin / manager / employee
phonestringopcionaloptionalMax 20 charsMax 20 chars
addressstringopcionaloptionalEndereço completoFull address
citystringopcionaloptional
statestring (2)opcionaloptionalUF (ex: SP)State code (e.g. SP)
zip_codestringopcionaloptionalCEPZip Code
registration_numberstringopcionaloptionalMatrículaRegistration Number
departmentstringopcionaloptionalSetorDepartment
positionstringopcionaloptionalCargoPosition
admission_datedateopcionaloptionalData de admissão (YYYY-MM-DD)Admission date (YYYY-MM-DD)
statusstringopcionaloptionalactive (padrão) / inactiveactive (default) / inactive
latitude, longitudefloatopcionaloptionalLocalização atual do funcionárioEmployee's current location

GET/employees/{id} admin/managerDetalhe.Detail.

PUT/employees/{id} admin/managerAtualiza. Senha é opcional na edição.Updates. Password is optional when editing.

DELETE/employees/{id} admin/managerInativa 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/managerBusca rápida. Query: q.Quick search. Query: q.

GET/employees/export admin/managerExporta lista em Excel.Exports list as Excel.

POST/employees/{id}/face-photo admin/managerCadastra 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/managerRemove foto facial cadastrada.Remove registered face photo.

GET/employees/{id}/webauthn-credentials adminLista 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} adminRevoga 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 adminLista regras da empresa.Lists the company's journey rules.

POST/journey-rules admin

CampoFieldTipoTypeDescriçãoDescription
namestringobrigatóriorequiredEx: "CLT Comercial"E.g. "Commercial CLT"
weekdaysobjectobrigatóriorequiredChaves 0 (Dom) a 6 (Sáb)Keys 0 (Sun) to 6 (Sat)
weekdays.{n}.activebooleanobrigatóriorequiredSe o dia é trabalhadoWhether the day is a workday
weekdays.{n}.startHH:mmopcionaloptionalHora de entradaStart time
weekdays.{n}.endHH:mmopcionaloptionalHora de saídaEnd time
location_idintegeropcionaloptionalLocal de trabalho vinculadoLinked work location
entry_toleranceintegeropcionaloptionalTolerância de entrada em minutos (padrão 10, máx 120)Entry tolerance in minutes (default 10, max 120)
exit_toleranceintegeropcionaloptionalTolerância de saída em minutos (padrão 10, máx 120)Exit tolerance in minutes (default 10, max 120)
lunch_durationintegeropcionaloptionalDuração mínima do almoço em minutos (padrão 60, máx 240)Minimum lunch duration in minutes (default 60, max 240)
require_locationbooleanopcionaloptionalExige GPS no check-in. Requer location_id.Requires GPS for check-in. Needs location_id.
require_facial_recognitionbooleanopcionaloptionalExige reconhecimento facial no check-inRequires facial recognition for check-in
require_biometricbooleanopcionaloptionalExige 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_overtimebooleanopcionaloptionalCalcular banco de horas automaticamenteAutomatically calculate overtime bank
flexible_startbooleanopcionaloptionalHorá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} adminAtualiza.Updates.

DELETE/journey-rules/{id} adminRemove.Removes.

POST/journey-rules/{id}/assign adminAtribui 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 adminLista funcionários da regra.Lists employees assigned to this rule.

DELETE/journey-rules/{id}/employees/{employeeId} adminRemove 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/managerVisã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/managerLista escalas.Lists schedules.

POST/schedules admin/manager

CampoFieldTipoTypeDescriçãoDescription
namestringobrigatóriorequiredNome da escalaSchedule name
journey_rule_idintegerobrigatóriorequiredRegra de jornada vinculadaLinked journey rule
start_datedateobrigatóriorequiredData de inícioStart date
end_datedateobrigatóriorequiredData de fim (≥ start_date)End date (≥ start_date)
max_employeesintegeropcionaloptionalLimite de funcionários na escalaMaximum employees in the schedule
requires_confirmationbooleanopcionaloptionalFuncionário precisa confirmarEmployee must confirm participation
notesstringopcionaloptionalObservações (max 2000 chars)Notes (max 2000 chars)
statusstringopcionaloptionaldraft / active / completed / cancelled

GET/schedules/{id}/details admin/managerDetalhes + regra + funcionários + contagem de registros.Details + rule + employees + record count.

POST/schedules/{id}/employees admin/managerAdiciona funcionários. Body: {"employee_ids":[1,2]}.Adds employees. Body: {"employee_ids":[1,2]}.

DELETE/schedules/{id}/employees/{employeeId} admin/managerRemove funcionário da escala.Removes employee from schedule.

GET/schedules/my todosallMinhas escalas.My schedules.

POST/schedules/{id}/confirm todosallConfirmar participação na escala.Confirm participation in schedule.

POST/schedules/{id}/reject todosallRecusar 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/managerLista locais.Lists locations.

POST/locations admin/manager

CampoFieldTipoType
namestringobrigatóriorequired
addressstringobrigatóriorequired
latitude, longitudefloatobrigatóriorequired
radiusintegeropcionaloptional Raio em metros (padrão 200)Radius in meters (default 200)

POST/locations/geocode admin/managerConverte 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 todosallLista feriados. Query: year.Lists holidays. Query: year.

POST/holidays adminCria feriado.Creates holiday.

CampoFieldTipoTypeDescriçãoDescription
namestringobrigatóriorequiredEx: "Natal"E.g. "Christmas"
datedateobrigatóriorequiredYYYY-MM-DD
typestringopcionaloptionalnational / state / municipal / company
optionalbooleanopcionaloptionalFeriado facultativoOptional holiday
recurringbooleanopcionaloptionalRepete todo ano na mesma dataRepeats every year on the same date

PUT/holidays/{id} · DELETE/holidays/{id} admin

POST/holidays/import-national adminImporta 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 todosallMinhas férias e licenças.My vacations and leaves.

POST/leaves/request todosallSolicitar férias ou licença.Request vacation or leave.

CampoFieldTipoTypeDescriçãoDescription
typestringobrigatóriorequiredvacation / sick_leave / maternity_leave / paternity_leave / other
start_datedateobrigatóriorequiredData de inícioStart date
end_datedateobrigatóriorequiredData de fimEnd date
reasonstringopcionaloptionalMotivoReason

POST/leaves/{id}/cancel todosallCancelar solicitação pendente.Cancel pending request.

Gestão (Admin/Manager)Management (Admin/Manager)

GET/leavesLista 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/leavesLançar diretamente (sem solicitação). Mesmos campos + user_id.Create directly (without a request). Same fields + user_id.

POST/leaves/{id}/approveAprovar. Body opcional: {"notes":"..."}.Approve. Optional body: {"notes":"..."}.

POST/leaves/{id}/rejectRejeitar. Body: {"notes":"Motivo da recusa"}.Reject. Body: {"notes":"Reason for rejection"}.

DELETE/leaves/{id}Excluir registro.Delete record.

Status possíveisPossible statuses: pendingapproved / rejected / cancelled

Configuração de PontoCheck-in Configuration

GET/check-in/config todosallRetorna 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 todosallRegistrar ponto.Clock in/out.

CampoFieldTipoTypeDescriçãoDescription
typestringobrigatóriorequiredentry / lunch_out / lunch_in / exit
timestampISO 8601obrigatóriorequiredHorário do registroRecord timestamp
latitude, longitudefloatcondicionalconditionalNecessário se regra exige GPSRequired if rule requires GPS
accuracyfloatopcionaloptionalPrecisão do GPS em metrosGPS accuracy in meters
face_imagebase64condicionalconditionalNecessário se regra exige facialRequired if rule requires facial recognition
HTTPstatusAçãoAction
201approvedAprovado diretamente — sem GPS/facialApproved immediately — no GPS/facial required
202pendingNa fila — faça polling em /records/status/{id} a cada 2sQueued — poll /records/status/{id} every 2s
422Validação falhou (sequência, tolerância, duplicata)Validation failed (sequence, tolerance, duplicate)

GET/records/status/{id} todosallPolling do status. Retorna pending / processing / approved / rejected + motivo.Status polling. Returns pending / processing / approved / rejected + reason.

GET/records/my todosallMeus registros. Filtros: date, date_from, date_to.My records. Filters: date, date_from, date_to.

GET/records/day/{date} todosallRegistros do dia (YYYY-MM-DD).Records for the day (YYYY-MM-DD).

GET/records admin/managerTodos 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/managerEstatísticas de registros.Record statistics.

GET/records/{id}/detail admin/managerDetalhe com localização, status facial, IP.Detail with location, facial status, IP.

PUT/records/{id}/adjust admin/managerAjuste 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.

rpId: controle.lpatech.com.brdeve 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 todosallInicia 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 todosallFinaliza cadastro. Envia o resultado de navigator.credentials.create().Finishes registration. Sends the result of navigator.credentials.create().

CampoFieldTipoTypeDescriçãoDescription
idstring (base64url)obrigatóriorequiredID da credencialCredential ID
rawIdstring (base64url)obrigatóriorequiredID binário da credencialBinary credential ID
response.attestationObjectstring (base64url)obrigatóriorequiredObjeto de atestaçãoAttestation object
response.clientDataJSONstring (base64url)obrigatóriorequiredDados do clienteClient data
device_namestringopcionaloptionalNome amigável (ex: "Notebook Dell")Friendly name (e.g. "Dell Laptop")

GET/webauthn/credentials todosallLista 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} todosallRevoga 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 todosallInicia o check-in biométrico. Retorna challenge para navigator.credentials.get().Starts biometric check-in. Returns challenge for navigator.credentials.get().

CampoFieldTipoTypeDescriçãoDescription
typestringobrigatóriorequiredentry / lunch_out / lunch_in / exit
datedate (YYYY-MM-DD)opcionaloptionalData 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 todosallFinaliza o check-in biométrico com o resultado de navigator.credentials.get().Finishes biometric check-in with the result of navigator.credentials.get().

CampoFieldTipoType
id, rawIdstring (base64url)obrigatóriorequired
response.authenticatorDatastring (base64url)obrigatóriorequired
response.clientDataJSONstring (base64url)obrigatóriorequired
response.signaturestring (base64url)obrigatóriorequired
typestringobrigatóriorequired entry/lunch_out/lunch_in/exit
HTTPerrorCodeCausaCause
403biometric_requiredRegra exige biometria, use /check-in/biometric/*Rule requires biometrics, use /check-in/biometric/*
422no_biometric_credentialUsuário sem credencial cadastrada — redirecionar para PerfilUser has no registered credential — redirect to Profile
422no_credentialsNenhuma 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 todosallSolicitar ponto manual.Request manual record.

CampoFieldTipoType
typestringobrigatóriorequired entry/lunch_out/lunch_in/exit
timestampISO 8601obrigatóriorequired
reasonstringobrigatóriorequired JustificativaReason / justification

Gestão (Admin/Manager)Management (Admin/Manager)

GET/records/manual/pending admin/managerLista 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/managerAprovar solicitação pendente.Approve pending request.

POST/records/manual/{id}/reject admin/managerRejeitar. 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.

Diferença do check-in normalDifference from standard check-in: No modo normal, o usuário logado registra para si mesmo. No modo compartilhado, o sistema identifica o rosto e registra para o funcionário correto, independentemente de quem está "logado" no dispositivo.In standard mode, the logged-in user records for themselves. In shared mode, the system identifies the face and records for the correct employee, regardless of who is "logged in" on the device.

GET/shared-checkin/config todosallConfigurações do modo compartilhado para o dispositivo.Shared mode settings for the device.

POST/shared-checkin todosallRegistrar ponto em modo compartilhado.Record time entry in shared mode.

CampoFieldTipoTypeDescriçãoDescription
typestringobrigatóriorequiredentry/lunch_out/lunch_in/exit
timestampISO 8601obrigatóriorequiredHorário do registroRecord timestamp
face_imagebase64obrigatóriorequiredFoto para identificação do funcionárioPhoto for employee identification
latitude, longitudefloatopcionaloptionalCoordenadas do dispositivoDevice coordinates
FluxoFlow: O sistema busca o funcionário com maior similaridade facial, verifica se a confiança é suficiente, e registra o ponto no nome do funcionário identificado. Se ninguém for identificado com confiança mínima, retorna erro.The system finds the employee with the highest facial similarity, checks whether the confidence is sufficient, and records the time entry under the identified employee's name. If no one is identified with minimum confidence, an error is returned.

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 todosallMinhas justificativas.My absence justifications.

POST/absences todosallEnviar justificativa. Use multipart/form-data se houver anexo.Submit justification. Use multipart/form-data when including an attachment.

CampoFieldTipoTypeDescriçãoDescription
datedateobrigatóriorequiredData da ausênciaAbsence date
reasonstringobrigatóriorequiredJustificativaJustification
attachmentfileopcionaloptionalPDF ou imagem (max 5 MB)PDF or image (max 5 MB)

GET/absences/{id}/attachment todosallDownload do anexo.Download attachment.

Gestão (Admin/Manager)Management (Admin/Manager)

GET/absences admin/managerLista todas. Filtros: user_id, status, date_from, date_to.Lists all. Filters: user_id, status, date_from, date_to.

GET/absences/{id} admin/managerDetalhe.Detail.

POST/absences/{id}/approve admin/managerAprovar.Approve.

POST/absences/{id}/reject admin/managerRejeitar. 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 todosallMeu espelho do mês.My monthly timesheet.

GET/timesheet/my/pdf todosallDownload PDF pessoal.Personal PDF download.

GET/timesheet/my/excel todosallDownload Excel pessoal.Personal Excel download.

GET/timesheet admin/managerEspelho da empresa.Company-wide timesheet.

GET/timesheet/{employeeId} admin/managerEspelho individual.Individual timesheet.

GET/timesheet/pdf · GET/timesheet/excel admin/managerDownload geral.Full download.

Query params: month (1–12), year (ex: 2026).Query params: month (1–12), year (e.g. 2026).

CálculoCalculation: Horas trabalhadas = (saída − entrada) − (retorno almoço − saída almoço). Banco de horas = trabalhadas − esperadas (quando 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/managerEstatísticas do dia: presentes, ausentes, de licença, registros pendentes.Day statistics: present, absent, on leave, pending records.

GET/dashboard/today-records admin/managerFeed ao vivo dos registros de hoje.Live feed of today's records.

GET/dashboard/alerts admin/managerAlertas: 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/managerResumo 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/managerBanco 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/managerRanking 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/managerRanking 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/managerGrá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/managerTop 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/managerTop 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/managerResumo 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/managerLista 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/managerContagem 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/managerResumo 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 todosallLista notificações.Lists notifications.

GET/notifications/unread-count todosallQuantidade não lidas.Unread count.

PATCH/notifications/{id}/read todosallMarcar como lida.Mark as read.

POST/notifications/read-all todosallMarcar todas como lidas.Mark all as read.

GET/notification-settings adminVer configurações de notificação da empresa.View company notification settings.

PUT/notification-settings adminAtualizar configurações (som, vibração, eventos específicos).Update settings (sound, vibration, specific events).

PerfilProfile

GET/profile todosallVer dados do próprio perfil.View own profile data.

PUT/profile todosallAtualizar nome, telefone, endereço.Update name, phone, address.

POST/profile/photo todosallAtualizar 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 adminLista roles da empresa.Lists the company's roles.

GET/roles/permissions adminLista todas as permissões disponíveis.Lists all available permissions.

POST/roles adminCriar 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).

Como integrarHow to integrate: Crie um Token de API em 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

ERPFormatoFormatTipo de ArquivoFile TypeParâmetroParameter format
TOTVS ProtheusTXT posicional (H|D|T)Positional TXT (H|D|T).txttotvs
Senior SistemasTXT pipe-separated (|)Pipe-separated TXT (|).txtsenior
SAP SuccessFactorsCSV padrão Employee Central (Wage Types)Standard Employee Central CSV (Wage Types).csvsap
ADP Expert / CeleridadeCSV com EMPRESA/FILIAL/COMPETENCIACSV with EMPRESA/FILIAL/COMPETENCIA.csvadp
LG Lugar de GenteTXT posicional (0|1|9)Positional TXT (0|1|9).txtlg
GenéricoGenericCSV ponto-e-vírgula (compatível com qualquer sistema)Semicolon CSV (compatible with any system).csvgeneric

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âmetroParameterTipoTypeDescriçãoDescription
monthintegerobrigatóriorequired Mês (1-12)Month (1-12)
yearintegerobrigatóriorequired Ano (2020-2099)Year (2020-2099)
formatstringopcionaloptional 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âmetroParameterTipoTypeDescriçãoDescription
monthintegerobrigatóriorequired Mês (1-12)Month (1-12)
yearintegerobrigató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âmetroParameterTipoTypeDescriçãoDescription
monthintegerobrigatóriorequired Mês (1-12)Month (1-12)
yearintegerobrigató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 V1PermissãoPermissionDescriçãoDescription
GET /api/v1/integrations/payrollrecords:readExportar folha de pagamentoExport payroll
GET /api/v1/integrations/esocialrecords:readEventos eSocialeSocial events
GET /api/v1/integrations/bank-hoursrecords:readBanco de horasOvertime bank
GET /api/v1/integrations/formatsrecords:readListar formatosList formats
GET /api/v1/employeesemployees:readListar funcionáriosList employees
GET /api/v1/recordsrecords:readRegistros de pontoTime records
GET /api/v1/timesheettimesheet:readEspelho 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

TipoTypeQuando é exigidoWhen requiredRecusável?Refusable?
termsSempre — Termos de UsoAlways — Terms of ServiceNãoNo
data_processingSempre — Tratamento de dados pessoaisAlways — Personal data processingNãoNo
third_partySempre — Compartilhamento com terceirosAlways — Third-party data sharingNãoNo
biometricQuando require_facial_recognition: trueWhen require_facial_recognition: trueSimYes
locationQuando require_location: trueWhen require_location: trueSimYes
digitalQuando require_biometric: true (WebAuthn)When require_biometric: true (WebAuthn)SimYes

GET/lgpd/consents todosallLista os consentimentos ativos do usuário.Lists the user's active consents.

GET/lgpd/consents/pending todosallLista 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 todosallRegistrar consentimento.Record consent.

CampoFieldTipoTypeDescriçãoDescription
consent_typestringobrigatóriorequiredterms / data_processing / third_party / biometric / location / digital
grantedbooleanobrigatóriorequiredtrue = aceito, false = recusadotrue = granted, false = refused

POST/lgpd/consents/{type}/revoke todosallRevogar consentimento. Onde {type} é o tipo (ex: location).Revoke a consent. Where {type} is the consent type (e.g. location).

Atenção: Consentimentos do tipo 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/webhooksLista webhooks configurados.Lists configured webhooks. admin

POST/webhooksCriar webhook.Create webhook. admin

CampoFieldTipoTypeDescriçãoDescription
urlstringobrigatóriorequired URL que receberá os eventos (HTTPS recomendado)URL that will receive events (HTTPS recommended)
secretstringobrigatóriorequired Chave HMAC-SHA256 (mín 16 caracteres)HMAC-SHA256 key (min 16 characters)
eventsarrayobrigatóriorequired Lista de eventos a escutar (ou ["*"] para todos)List of events to subscribe to (or ["*"] for all)

Eventos disponíveisAvailable events

EventoEventQuando é disparadoWhen triggered
record.createdPonto registrado (entrada, saída, almoço)Time record created (entry, exit, lunch)
employee.createdNovo funcionário cadastradoNew employee registered
leave.requestedFérias/licença solicitadaVacation/leave requested
leave.approvedFérias/licença aprovadaVacation/leave approved
absence.createdJustificativa de ausência registradaAbsence justification submitted
manual_record.createdRegistro 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}/testEnvia 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

Auto-desativaçãoAuto-disable: Webhooks são desativados automaticamente após 10 falhas consecutivas. Verifique o status no painel em Integrações.Webhooks are automatically disabled after 10 consecutive failures. Check the status in the Integrations panel.

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ãoPermissionDescriçãoDescription
*Acesso totalFull access
employees:readListar e visualizar funcionáriosList and view employees
employees:writeCriar, editar, excluir e cadastrar fotos faciaisCreate, edit, delete, and register face photos
employees:write_belowEditar apenas subordinates (implícito em write)Edit only subordinates (implicit in write)
records:readVer registros de todos os funcionáriosView records for all employees
records:read_ownVer apenas próprios registros (implícito em read)View own records only (implicit in read)
records:write_ownCriar próprios registros de pontoCreate own time records
records:adjustAjustar registros de outrosAdjust other employees' records
records:adjust_emptyCriar registros em dias sem pontoCreate records on days with no time entry
schedules:readVer escalasView schedules
schedules:read_ownVer apenas próprias escalasView own schedules only
schedules:writeCriar e gerenciar escalasCreate and manage schedules
locations:readVer locais de trabalhoView work locations
locations:writeCriar e editar locaisCreate and edit locations
journey-rules:readVer regras de jornadaView journey rules
journey-rules:writeCriar, editar e atribuir regrasCreate, edit, and assign rules
timesheet:readVer espelho de ponto de todosView timesheets for all employees
timesheet:read_ownVer apenas próprio espelhoView own timesheet only
leaves:readVer férias e licenças de todosView vacations and leaves for all employees
leaves:writeCriar, aprovar e rejeitar férias/licençasCreate, approve, and reject vacations/leaves
absences:readVer justificativas de ausênciaView absence justifications
absences:writeAprovar e rejeitar justificativasApprove and reject justifications
holidays:writeGerenciar feriados da empresaManage company holidays
kpis:readAcessar KPIs e relatóriosAccess KPIs and reports
notifications:readVer notificaçõesView notifications
notifications:writeConfigurar notificaçõesConfigure notifications
api-tokens:manageCriar e revogar tokens de APICreate and revoke API tokens
roles:manageGerenciar 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
SuporteSupport: [email protected]