Referência da API pública

A API pública do Workify360 Focus permite que seus próprios scripts e ferramentas leiam relatórios e dados de tempo e façam alterações com as mesmas regras do painel. A API pública, as chaves de API e os webhooks fazem parte do plano Premium.

As operações desta página mantêm compatibilidade com versões anteriores. O documento OpenAPI legível por máquina com as mesmas operações:

https://api.focus.workify360.com/v1/openapi/public.json

Gerado a partir do contrato da API, versão 0.1.0 (c95fb97bb49a).

Autenticação

Envie uma chave de API pessoal no cabeçalho Authorization de cada requisição. Uma chave pertence à pessoa que a criou, age como essa pessoa e nunca faz mais do que a função atual dela permite. Uma requisição com chave ausente, incorreta, expirada ou revogada recebe 401 com o código unauthorized.

curl https://api.focus.workify360.com/v1/me \
  -H "Authorization: Bearer w360_pat_…"

Como criar chaves, definir o escopo delas e revogá-las: Chaves de API e a API pública

Escopos

Cada operação exige um escopo, indicado ao lado dela. Uma chave tem acesso a uma operação quando tem esse escopo e quando a função, as equipes e o plano atuais do proprietário dela permitem a requisição, exatamente como no painel.

EscopoO que permite
meSeu próprio perfil e seu cronômetro
reports:readLer relatórios, lançamentos de tempo, ausências, turnos, equipes, projetos, tarefas e exportações
time:writeAdicionar e alterar lançamentos de tempo, ausências, turnos, tarefas e tempo atribuído a tarefas, e aprovar ou recusar solicitações
org:adminGerenciar membros, equipes, convites e projetos
webhooks:manageGerenciar endpoints de webhook

Limites de requisições

Cada chave pode enviar 600 unidades por minuto, e uma organização 1.800 para todas as suas chaves juntas. Uma requisição que altera algo (qualquer uma que não seja GET ou HEAD) conta como duas unidades; as demais, como uma. Uma chave também pode enviar no máximo 60 unidades de uma vez, recarregadas a 10 por segundo: mais de 60 leituras (ou 30 alterações) em sequência recebem 429 mesmo abaixo de 600 por minuto.

CabeçalhoSignificado
RateLimit: "key";r=598;t=2Em toda resposta contabilizada: as unidades que restam à chave e os segundos até que sejam totalmente recarregadas
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60Em toda resposta contabilizada: os limites por minuto da chave e da organização
Retry-After: 12Com 429 (código rate_limited): os segundos de espera antes da próxima requisição

Erros

Um erro é um documento de problema RFC 9457 (Content-Type: application/problem+json). code é um código estável em snake_case no qual seu código pode se basear; title é um texto em inglês para logs. type é o endereço de ajuda do código, https://workify360.com/help/errors/<code>/ com cada _ escrito como -, que abre o artigo de ajuda que explica o código, quando o código tem um.

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json

{
  "type": "https://workify360.com/help/errors/forbidden/",
  "title": "Forbidden",
  "status": 403,
  "code": "forbidden",
  "action": "webhooks.manage",
  "traceId": "4bf92f3577b34da6a3ce929d0e0e4736"
}

Alguns problemas trazem mais campos: errors (os erros de campo de um 422 validation_failed), action (a permissão a que um 403 forbidden se refere), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 e 503) e traceId (informe-o ao entrar em contato com o suporte).

StatusCódigoQuando
400 invalid_request Um parâmetro está mal formatado ou ausente
401 unauthorized A chave está ausente, incorreta, expirada ou revogada, ou o proprietário dela saiu da organização
402 feature_not_in_plan, subscription_read_only O plano não inclui o recurso, ou a assinatura está em modo somente leitura
403 forbidden, feature_not_enabled A chave não tem o escopo, ou a função, as equipes ou as configurações atuais do proprietário não permitem a requisição
412 version_conflict A versão em If-Match não é mais a atual; leia o recurso novamente
422 validation_failed O corpo é inválido; errors lista os campos
428 precondition_required A operação exige um cabeçalho If-Match com a versão que você leu
429 rate_limited Requisições demais; aguarde os segundos indicados em Retry-After

Os códigos que têm artigo de ajuda aparecem como links na lista de operações.

Webhooks

Em vez de consultar a API repetidamente, um endpoint seu pode receber uma requisição HTTPS assinada quando algo muda. Os eventos, o formato da requisição, como verificar a assinatura em Node.js e Python, as novas tentativas e a rotação do segredo estão explicados no artigo de ajuda: Webhooks

Operações

Agrupadas por área. Os resumos e as descrições dos campos vêm do contrato da API.

Ausências

GET /v1/absences Escopo: reports:read

List absences overlapping a range.

Parâmetros
NomeEmTipoDescrição
from query string (date)
to query string (date) At most 366 days after from.
userId query string (uuid)
teamId query string (uuid)
status query string
typeId query string (uuid)
cursor query string
limit query integer (int32)
Respostas
200 AbsencePage
Erros

POST /v1/absences Escopo: time:write

Request (or record) an absence.

Parâmetros
NomeEmTipoDescrição
Idempotency-Keyobrigatório cabeçalho string Required: the same key and body return the first answer
Corpo da requisição
AbsenceRequest
Respostas
201 AbsenceDto
Erros

POST /v1/absences/{id}/decision Escopo: time:write

Approve or reject an absence (the G1 endpoint of the calendar).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Id
If-Matchobrigatório cabeçalho string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corpo da requisição
CalendarDecisionRequest
Respostas
200 AbsenceDto
Erros

Atividade

GET /v1/activity/day Escopo: reports:read

One user's local day (My Focus, the timeline): totals, productivity, attendance, day plan, slots, apps, time entries.

Parâmetros
NomeEmTipoDescrição
date query string (date) The user's local day (required).
userId query string (uuid) Default: the caller; another user must be visible (else 403).
Respostas
200 ActivityDayDto
Erros

Alocações de tempo

GET /v1/allocations Escopo: reports:read

A person's allocations of a range of local days (the caller's, the people they manage, and the time on the projects they manage).

Parâmetros
NomeEmTipoDescrição
userId query string (uuid) Default: the caller.
from query string (date) Local date, included.
to query string (date) Local date, included; at most 93 days after from.
projectId query string (uuid)
cursor query string
limit query integer (int32) 1–200 (default 200).
Respostas
200 AllocationPage
Erros

POST /v1/allocations Escopo: time:write

Put time on a project: entered (manual) or tracked time assigned afterwards (assignment); for another person with allocations.write.

Parâmetros
NomeEmTipoDescrição
Idempotency-Key cabeçalho string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corpo da requisição
AllocationCreateRequest
Respostas
201 AllocationCreatedDto
Erros

Exportações

POST /v1/exports Escopo: reports:read

Request an export: the file is produced by a worker job with the requester's current role.

Parâmetros
NomeEmTipoDescrição
Idempotency-Keyobrigatório cabeçalho string Required: the same key and body return the first answer
Corpo da requisição
CreateExportRequest
Respostas
202 ExportJobDto
Erros

GET /v1/exports/{id} Escopo: reports:read

One export job (poll every 2 s).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Id
Respostas
200 ExportJobDto
Erros

Eu

GET /v1/me Escopo: me

The signed-in person, their membership, organization, rights and session.

Respostas
200 MeDto
Erros

Membros

GET /v1/members Escopo: org:admin

List members.

Parâmetros
NomeEmTipoDescrição
status query string Comma-separated statuses (default active,invited,suspended)
teamId query string (uuid) Primary team
role query string owner, admin, team_admin, manager or employee
q query string Part of the name or e-mail (Turkish case folding)
cursor query string Opaque cursor of the next page
limit query integer (int32) 1–200, default 50
Respostas
200 MemberPage
Erros
  • 403 No right

GET /v1/members/{id} Escopo: org:admin

One member.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Membership id
Respostas
200 MemberDto
Erros
  • 404 member_not_found

PATCH /v1/members/{id} Escopo: org:admin

Change a member's role, team, viewer teams, zone or tracking.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Membership id
If-Matchobrigatório cabeçalho string ETag of the member ("v<n>")
Corpo da requisição
PatchMember
Respostas
200 MemberDto
Erros

POST /v1/members/{id}/reactivate Escopo: org:admin

Reactivate a suspended member.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Membership id
Respostas
200 MemberDto

POST /v1/members/{id}/suspend Escopo: org:admin

Suspend a member: the membership is suspended and every session of it in this organization ends.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Membership id
Respostas
200 MemberDto
Erros
  • 409 conflict (an invitation is revoked instead)

Projetos

GET /v1/projects Escopo: reports:read

The projects the caller sees (Owners and Admins: all; others: open ones, their teams and, read only, the projects of the people they manage).

Parâmetros
NomeEmTipoDescrição
status query string active, on_hold or completed.
clientId query string (uuid)
q query string Name or code search (case-insensitive).
includeArchived query boolean
mine query boolean Only the projects the caller may track time on.
cursor query string
limit query integer (int32) 1–200 (default 50).
Respostas
200 ProjectPage
Erros

POST /v1/projects Escopo: org:admin

Add a project (Owners and Admins).

Parâmetros
NomeEmTipoDescrição
Idempotency-Key cabeçalho string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corpo da requisição
ProjectRequest
Respostas
201 ProjectDto
Erros

PUT /v1/projects/{id} Escopo: org:admin

Change a project (Owners and Admins; the whole body).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Project id
If-Matchobrigatório cabeçalho string The ETag the caller read (412 version_conflict when it changed)
Corpo da requisição
ProjectRequest
Respostas
200 ProjectDto
Erros

Relatórios

GET /v1/reports/productivity Escopo: reports:read

Productivity by day, week, month or range for the company, a team or a user.

Parâmetros
NomeEmTipoDescrição
from query string (date)
to query string (date) day 93 days, week, month and range 366.
groupBy query string day, week, month or range.
teamId query string (uuid)
userId query string (uuid)
Respostas
200 PeriodReportDto
Erros

GET /v1/reports/projects Escopo: reports:read

Allocated time, billable time and the rate-layered amounts (Owners and Admins) of projects in a range, grouped by one or two of project, task, user, client and day, with the projects' budget use.

Parâmetros
NomeEmTipoDescrição
from query string (date) Local date, included.
to query string (date) Local date, included; at most 366 days after from.
groupBy query string One or two of project (default), task, user, client, day, comma separated.
projectIds query string Comma-separated project ids.
clientId query string (uuid)
userIds query string Comma-separated user ids (visible people only).
teamId query string (uuid)
billable query string all (default), billable or nonBillable.
includeProductive query boolean Also compute the productive time within the allocations (costly; default false).
Respostas
200 ProjectReportDto
Erros

GET /v1/reports/summary Escopo: reports:read

The summary of the visible users over a range.

Parâmetros
NomeEmTipoDescrição
from query string (date)
to query string (date) At most 93 days after from.
teamId query string (uuid) Only the team's current members; the team must be visible (else 403).
Respostas
200 SummaryDto
Erros

GET /v1/reports/targets Escopo: reports:read

The apps, domains or hosts of the visible users over a range (Apps & URLs).

Parâmetros
NomeEmTipoDescrição
from query string (date)
to query string (date)
type query string app, domain or host.
teamId query string (uuid)
userId query string (uuid)
q query string Search in the key and the name (.NET search).
level query string productive, unproductive or neutral.
categoryKey query string
unclassified query boolean Only targets without a category.
cursor query string
limit query integer (int32) 1–200, default 50.
Respostas
200 TargetListDto
Erros

GET /v1/reports/users/{userId}/daily Escopo: reports:read

A user's days of a range (computed days and the workdays without activity).

Parâmetros
NomeEmTipoDescrição
userIdobrigatório caminho string (uuid) User
from query string (date)
to query string (date) At most 93 days after from.
Respostas
200 UserDailyDto
Erros

Turnos

GET /v1/shifts Escopo: reports:read

List the shifts starting in a range.

Parâmetros
NomeEmTipoDescrição
from query string (date)
to query string (date)
teamId query string (uuid)
userId query string (uuid)
includeOpen query boolean Also open shifts (default true).
Respostas
200 ShiftListDto
Erros

POST /v1/shifts Escopo: time:write

Create a shift (assigned or open).

Parâmetros
NomeEmTipoDescrição
Idempotency-Keyobrigatório cabeçalho string Required: the same key and body return the first answer
Corpo da requisição
ShiftBody
Respostas
201 ShiftDto
Erros

Tarefas

GET /v1/projects/{id}/tasks Escopo: reports:read

A visible project's tasks, by sort order.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Project id
status query string open, in_progress or done.
assigneeUserId query string (uuid)
includeArchived query boolean
cursor query string
limit query integer (int32) 1–500 (default 200).
Respostas
200 TaskPage
Erros

POST /v1/projects/{id}/tasks Escopo: time:write

Add a task (an Admin or the project's manager).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Project id
Idempotency-Key cabeçalho string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corpo da requisição
TaskRequest
Respostas
201 TaskDto
Erros

PUT /v1/tasks/{id} Escopo: time:write

Change a task (the whole body).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Task id
If-Matchobrigatório cabeçalho string The ETag the caller read (412 version_conflict when it changed)
Corpo da requisição
TaskRequest
Respostas
200 TaskDto
Erros

Equipes

GET /v1/teams Escopo: reports:read

List teams.

Parâmetros
NomeEmTipoDescrição
includeArchived query boolean Also archived teams (default false)
cursor query string Opaque cursor of the next page
limit query integer (int32) 1–200, default 50
Respostas
200 TeamPage

POST /v1/teams Escopo: org:admin

Create a team (the G1 endpoint).

Corpo da requisição
CreateTeam
Respostas
201 TeamDto
Erros
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

PATCH /v1/teams/{id} Escopo: org:admin

Rename a team or change its description.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Team id
If-Matchobrigatório cabeçalho string ETag of the team
Corpo da requisição
PatchTeam
Respostas
200 TeamDto
Erros
  • 409 team_name_taken

Lançamentos de tempo

GET /v1/time-entries Escopo: reports:read

List a user's time entries of a range (by start).

Parâmetros
NomeEmTipoDescrição
userId query string (uuid) Default: the caller.
from query string (date) The entry's local day, required.
to query string (date) At most 93 days after from.
kind query string offline or deletion.
status query string pending, approved or rejected.
cursor query string
limit query integer (int32) 1–500.
Respostas
200 TimeEntryPage
Erros

POST /v1/time-entries Escopo: time:write

Add offline time or a deletion (for oneself, or for a user one manages: TimeEntryPolicy in the handler).

Parâmetros
NomeEmTipoDescrição
Idempotency-Keyobrigatório cabeçalho string Required: the same key and body return the first answer
Corpo da requisição
CreateTimeEntryRequest
Respostas
201 TimeEntryDto
Erros

GET /v1/time-entries/{id} Escopo: reports:read

One time entry (invisible, missing and other tenants' entries are all 404).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Entry id
Respostas
200 TimeEntryDto
Erros

PUT /v1/time-entries/{id} Escopo: time:write

Replace an entry's editable fields.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Entry id
If-Matchobrigatório cabeçalho string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corpo da requisição
UpdateTimeEntryRequest
Respostas
200 TimeEntryDto
Erros

DELETE /v1/time-entries/{id} Escopo: time:write

Delete an entry (deleting a deletion restores the tracked time).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Entry id
If-Matchobrigatório cabeçalho string ETag of the resource ("v<n>"); missing: 428, stale: 412
Respostas
204 (sem corpo)
Erros

POST /v1/time-entries/{id}/decision Escopo: time:write

Approve or reject a pending offline entry (the G1 endpoint of the time module).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) Entry id
If-Matchobrigatório cabeçalho string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corpo da requisição
TimeEntryDecisionRequest
Respostas
200 TimeEntryDto
Erros

Cronômetro

GET /v1/me/timer Escopo: me

The caller's timer (a segment due after 24 hours is stopped first).

Parâmetros
NomeEmTipoDescrição
If-None-Match cabeçalho string | null The ETag the caller holds (304 when unchanged)
Respostas
200 TimerDto · 304 (sem corpo)
Erros

POST /v1/me/timer/start Escopo: me

Start the timer, or switch the running one to another project or task, at at (the client's clock).

Parâmetros
NomeEmTipoDescrição
Idempotency-Key cabeçalho string | null The client's command id; a retry returns the first answer
Corpo da requisição
TimerStartRequest
Respostas
200 TimerCommandResultDto
Erros

Webhooks

PATCH /v1/webhook-endpoints/{id} Escopo: webhooks:manage

Change an endpoint: URL, description, events, pause or resume (active also opens a disabled endpoint), take it over.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) The endpoint
If-Matchobrigatório cabeçalho string The endpoint's ETag ("v<n>")
Corpo da requisição
UpdateWebhookEndpointRequest
Respostas
200 WebhookEndpointDto
Erros

DELETE /v1/webhook-endpoints/{id} Escopo: webhooks:manage

Delete an endpoint and its deliveries.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) The endpoint
Respostas
204 (sem corpo)
Erros

GET /v1/webhook-endpoints/{id}/deliveries Escopo: webhooks:manage

The deliveries of an endpoint, newest first.

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) The endpoint
status query string pending, succeeded, failed, dead.
eventType query string
cursor query string Opaque cursor of the next page.
limit query integer (int32) 1–200, default 50.
Respostas
200 WebhookDeliveryPage
Erros

POST /v1/webhook-endpoints/{id}/deliveries/{deliveryId}/retry Escopo: webhooks:manage

Queue a failed or dead delivery again (attempts start over).

Parâmetros
NomeEmTipoDescrição
idobrigatório caminho string (uuid) The endpoint
deliveryIdobrigatório caminho string The delivery (a 64-bit integer)
Respostas
202 AcceptedDto
Erros

Esquemas

Os corpos de requisição e de resposta que as operações usam. Os campos obrigatórios estão marcados.

AbsenceDto

An absence.

CampoTipoDescrição
createdAtobrigatório string (date-time)
createdByobrigatório CalendarUserRefDto
daysobrigatório number (double) Σ deductionByYear; for types that do not deduct, the planned workdays (information only).
decidedAt string (date-time) | null
decidedBy CalendarUserRefDto | null
decisionNote string | null
deductionByYearobrigatório object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endobrigatório string (date-time)
endDateobrigatório string (date)
endTime string | null
half string | null
idobrigatório string (uuid)
note string | null
permissionsobrigatório AbsencePermissionsDto
startobrigatório string (date-time) UTC coverage start.
startDateobrigatório string (date)
startTime string | null
statusobrigatório string
timeZoneobrigatório string
typeobrigatório AbsenceTypeRefDto
unitobrigatório string
updatedAtobrigatório string (date-time)
userobrigatório CalendarPersonDto
userIdobrigatório string (uuid)

AbsencePage

GET /v1/absences.

CampoTipoDescrição
itemsobrigatório AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

CampoTipoDescrição
canApproveobrigatório boolean
canCancelobrigatório boolean
canEditobrigatório boolean

AbsenceRequest

POST /v1/absences, PUT /v1/absences/{id} (the user never changes).

CampoTipoDescrição
endDate string (date) | null
endTime string | null
half string | null am or pm for a half day.
note string | null
startDate string (date) | null
startTime string | null Local HH:mm for hours.
typeId string (uuid) | null
unit string | null days, half_day or hours.
userId string (uuid) | null null = the caller.

AbsenceTypeRefDto

The absence's type as the absence shows it; name translated for a built-in type that was not renamed.

CampoTipoDescrição
colorobrigatório string
countsAsWorkedobrigatório boolean
deductsFromBalanceobrigatório boolean
idobrigatório string (uuid)
key string | null
nameobrigatório string
paidobrigatório boolean
timeEffectobrigatório string

AcceptedDto

202 Accepted of a queued job.

CampoTipoDescrição
acceptedobrigatório boolean Always true.

AccessDto

What the person may see and manage (FAZ1 AccessDto; focus_contracts::access::policy).

CampoTipoDescrição
assignableRolesobrigatório string[]
canManageCompanySettingsobrigatório boolean
canManageTeamsobrigatório boolean
canManageUsersobrigatório boolean
manageTeamIdsobrigatório string[]
scopeobrigatório string company, teams or self.
unassignedFallbackobrigatório boolean
viewTeamIdsobrigatório string[]

ActivityDayDto

One user's local day. A day without activity is a 200 with zero totals, null arrival/leave and empty lists.

CampoTipoDescrição
absenceCreditMsobrigatório integer (int64) A worked absence tops the worked time up to the expected work.
activeMsobrigatório integer (int64) Window time ∩ not AFK (computer time only).
afkCoverageobrigatório boolean False when no device reported AFK data (idle unknown).
appsobrigatório AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMsobrigatório integer (int64)
attendance DayAttendanceDto | null
categoriesobrigatório CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedobrigatório boolean False for a day written before the Phase 2 classification (all neutral).
dateobrigatório string (date)
dayEndobrigatório string (date-time)
dayStartobrigatório string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMsobrigatório integer (int64) Tracked time removed by approved deletions (part of idle).
domainsobrigatório DomainUsageDto[]
hostsobrigatório HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMsobrigatório integer (int64)
leftAt string (date-time) | null
meetingMsobrigatório integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMsobrigatório integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMsobrigatório integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalsobrigatório TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMsobrigatório integer (int64) Private time outside active and offline time.
productivityobrigatório DayProductivityDto
recomputingobrigatório boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotsobrigatório ActivitySlotDto[] One entry per 5-minute UTC slot with activity, by time.
teamId string (uuid) | null The user's current primary team (its rules classify the day).
timeEntriesobrigatório TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZoneobrigatório string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdobrigatório string (uuid)
workedMsobrigatório integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

Time in one 5-minute slot; activeMs includes approved offline time (offlineMs).

CampoTipoDescrição
activeMsobrigatório integer (int64)
appsobrigatório AppUsageDto[]
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
slotStartobrigatório string (date-time)
unproductiveMsobrigatório integer (int64)

AffectedAllocationDto

An allocation replace changed.

CampoTipoDescrição
changeobrigatório string trimmed, split or deleted.
idobrigatório string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

CampoTipoDescrição
endedAt string (date-time) | null At most 24 hours after startedAt, at most 5 minutes in the future.
isBillable boolean | null
note string | null
projectId string (uuid) | null
replace boolean | null Trim, split or delete the person's (unbilled) allocations it overlaps; otherwise an overlap is 409 allocation_overlaps.
source string | null manual or assignment (timer only through the timer).
startedAt string (date-time) | null
taskId string (uuid) | null
userId string (uuid) | null null = the caller; another person needs allocations.write and to be managed by the caller.

AllocationCreatedDto

POST /v1/allocations → 201.

CampoTipoDescrição
affectedobrigatório AffectedAllocationDto[]
allocationobrigatório AllocationDto

AllocationDto

Time on a project.

CampoTipoDescrição
createdAtobrigatório string (date-time)
createdByobrigatório NamedRefDto
durationMsobrigatório integer (int64)
effectiveBillableobrigatório boolean
endedAtobrigatório string (date-time)
idobrigatório string (uuid)
invoiceId string (uuid) | null Set once the time is on an invoice.
isBillable boolean | null null takes the task's, then the project's value.
localDateobrigatório string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionsobrigatório AllocationPermissionsDto
projectobrigatório ProjectRefDto
sourceobrigatório string timer, manual or assignment.
startedAtobrigatório string (date-time)
task NamedRefDto | null
timeZoneobrigatório string
updatedAtobrigatório string (date-time)
userIdobrigatório string (uuid)
versionobrigatório integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

CampoTipoDescrição
itemsobrigatório AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

What the caller may do with an allocation (a billed one is locked).

CampoTipoDescrição
deleteobrigatório boolean
editobrigatório boolean

AppTotalDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
appKeyobrigatório string
categoryKey string | null
level string | null Level in the response's levelContext.
nameobrigatório string
percentageobrigatório number (double) Share of the range's worked time (0–100, one decimal).

AppUsageDto

An app's time; offline rows use the reserved keys _offline_<level> with name: "Offline time" and levelSource: "offline".

CampoTipoDescrição
activeMsobrigatório integer (int64)
appKeyobrigatório string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
nameobrigatório string

BudgetDto

A project's budget: hours (minutes) or an amount in the project's currency (amountMinor).

CampoTipoDescrição
amountMinor integer (int64) | null
kind string | null hours or amount.
minutes integer (int64) | null

BudgetRequest

The budget of a project request (kind hours with minutes, or amount with amountMinor).

CampoTipoDescrição
amountMinor integer (int64) | null
kind string | null
minutes integer (int64) | null

CalendarDecisionRequest

{decision, note?} of the decision endpoints (approve or reject; the note at most 500 characters).

CampoTipoDescrição
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

CampoTipoDescrição
fullName string | null
idobrigatório string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

A user reference (names from the directory; null when unknown).

CampoTipoDescrição
fullName string | null
idobrigatório string (uuid)

CapabilitiesDto

Subscription capabilities.

CampoTipoDescrição
featuresobrigatório string[]
readOnlyobrigatório boolean

CategoryUsageDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
categoryKey string | null null = uncategorized.

CreateExportRequest

POST /v1/exports: definition is the full definition the dialog shows; without it the saved template (templateId) or the built-in one (templateKey) gives it.

CampoTipoDescrição
definition ExportDefinitionDto | null
from string (date) | null
locale string | null tr or en.
templateId string (uuid) | null
templateKey string | null
to string (date) | null

CreateInvitation

POST /v1/invitations.

CampoTipoDescrição
emailobrigatório string
fullNameobrigatório string
locale string | null Language of the e-mail and the acceptance page (tr, en); the organization's default otherwise.
roleobrigatório string admin, team_admin, manager or employee.
teamId string (uuid) | null
timeZone string | null
viewerTeamIds string (uuid)[]

CreateTeam

POST /v1/teams.

CampoTipoDescrição
description string | null At most 500 characters.
nameobrigatório string 1–100 characters, unique among active teams (Turkish case folding).

CreateTimeEntryRequest

POST /v1/time-entries (the .NET CreateTimeEntryRequest).

CampoTipoDescrição
description string | null Offline: 1–500 characters; deletion: optional reason (at most 500).
end string (date-time) | null
kind string | null offline or deletion.
level string | null Offline only (default productive).
projectId string (uuid) | null Must be null (400 project_not_supported).
start string (date-time) | null
userId string (uuid) | null null = the caller; a manager may add time for a user it manages.

CreateWebhookEndpointRequest

POST /v1/webhook-endpoints.

CampoTipoDescrição
description string | null ≤ 200 characters.
eventTypesobrigatório string[] 1–50 catalog event types of the tenant's plan.
urlobrigatório string https://… (≤ 2048; no user info, no fragment; every resolved address public).

CreatedWebhookEndpointDto

CreatedWebhookEndpointDto: the endpoint and its signing secret, shown once.

CampoTipoDescrição
endpointobrigatório WebhookEndpointDto
secretobrigatório string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

CampoTipoDescrição
half string | null
keyobrigatório string
nameobrigatório string English name; nameTr is the Turkish one.
nameTrobrigatório string

DayAbsenceDto

The dominant absence of a day (/v1/reports/users/{userId}/daily days[].absence).

CampoTipoDescrição
colorobrigatório string
fractionobrigatório number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitobrigatório string

DayAttendanceDto

Attendance of the day on the day plan.

CampoTipoDescrição
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexibleobrigatório boolean
lateByMsobrigatório integer (int64)
lateToleranceMinutesobrigatório integer (int32)
leftEarlyobrigatório boolean
leftEarlyByMsobrigatório integer (int64)
statusobrigatório string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMsobrigatório integer (int64) The plan's target (the Effectiveness % denominator).
workdayobrigatório boolean

DayPlanDto

The day plan of one user's day.

CampoTipoDescrição
absencesobrigatório PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMsobrigatório integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindobrigatório string schedule, shift, dayOff or holiday.
leaveFractionobrigatório number (double) The approved absence coverage f (0–1).
shiftsobrigatório PlanShiftDto[] Shifts starting on the day, by start.
targetMsobrigatório integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayobrigatório boolean

DayProductivityDto

A day's time by productivity level (productive + unproductive + neutral = workedMs).

CampoTipoDescrição
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMsobrigatório integer (int64)
unproductiveMsobrigatório integer (int64)

DayTotalDto

One local day of a summary.

CampoTipoDescrição
activeMsobrigatório integer (int64)
activeUserCountobrigatório integer (int32)
atWorkMsobrigatório integer (int64)
dateobrigatório string (date)
idleMsobrigatório integer (int64)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
privateMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null
unproductiveMsobrigatório integer (int64)

DomainTotalDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
categoryKey string | null
domainobrigatório string
level string | null
percentageobrigatório number (double)

DomainUsageDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
categoryKey string | null
domainobrigatório string
level string | null
levelSource string | null

EmailVerificationDto

Where the person stands with the e-mail verification (owner decision 3 Oct 2026, focus_auth::email_gate).

CampoTipoDescrição
dueAt string (date-time) | null The deadline of an unverified account (Identity__EmailVerificationGraceHours after its creation).
stateobrigatório string verified, not_required (an account that never has to verify: invited, imported, SCIM, IdP-verified), pending (unverified, before dueAt) or overdue (after dueAt: every request but a few answers 403 email_verification_required).

ExportDefinitionDto

What an export contains (FAZ4 §6.1; focus_contracts::reports::export::ExportDefinition on the wire); a saved template stores it without the date range. Every field is optional so that the validator reports what is wrong (422 validation_failed with errors[{field, code}]).

CampoTipoDescrição
columns string[] | null Column keys of the dataset in file order (1–40; a PDF at most 12).
csvDialect string | null standard (default) or excel-tr (csv only).
dataset string | null
durationFormat string | null hms (default), hours or minutes.
filters ExportFiltersDto | null
format string | null xlsx, csv or pdf.
groupBy string | null day, week, month, range or none (the dataset decides).
options ExportOptionsDto | null

ExportFiltersDto

Who is exported: a team, some users, or (neither) everyone the requester can see.

CampoTipoDescrição
includeInactiveUsers boolean
teamId string | null
userIds string | null[] | null

ExportJobDto

An export job as the panel lists and polls it.

CampoTipoDescrição
createdAtobrigatório string (date-time)
datasetobrigatório string
errorCode string | null too_many_rows, too_many_rows_for_pdf, access_lost, feature_not_in_plan, canceled, internal_error.
expiresAt string (date-time) | null
fileName string | null
fileSize integer (int64) | null
finishedAt string (date-time) | null
formatobrigatório string
fromobrigatório string (date)
groupBy string | null
idobrigatório string (uuid)
localeobrigatório string
progressobrigatório integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statusobrigatório string queued, running, succeeded, failed, canceled, expired.
templateId string (uuid) | null
templateKey string | null
templateName string | null The saved template's name, while it still exists.
toobrigatório string (date)

ExportOptionsDto

Dataset options; each applies to one dataset and is ignored by the others.

CampoTipoDescrição
include string | null titles: titles, urls or both (default).
includeCosts boolean | null projects (Faz 6): fill the rate, amount and currency columns (needs projects.costs.read, else 403).
includeOpen boolean | null shifts: also open shifts.
splitByUser boolean | null applications: one row per user and target.
statuses string | null[] | null offline_time / absence: status filter (default approved).
targetType string | null applications: app (default), domain or host.

FieldError

One field error of a 400/422 body.

CampoTipoDescrição
codeobrigatório string Stable snake_case code (required, too_long, invalid, ...).
fieldobrigatório string JSON path of the field in camelCase (name, items[2].start), or the parameter/header name.
message string | null

HolidayRefDto

A holiday of a day (both names; name is the English one).

CampoTipoDescrição
half string | null
keyobrigatório string Built-in key (republic_day, …) or custom.
nameobrigatório string
nameEnobrigatório string
nameTrobrigatório string
source string | null builtin or tenant.

HostUsageDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
domain string | null
hostobrigatório string
levelobrigatório string
levelSourceobrigatório string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

CampoTipoDescrição
acceptUrl string | null The acceptance link, only when no e-mail is sent (not_configured, suppressed_reserved) and only in the fresh answer (share it by hand).
statusobrigatório string queued; not_configured when no e-mail provider is set up; suppressed_reserved when the address is an RFC 2606 / RFC 6761 reserved name (example.com, *.test, …) that is never e-mailed. Clients treat suppressed_reserved like not_configured: nothing arrives, share acceptUrl by hand.

InvitationRef

{"id","expiresAt"} of a created or re-sent invitation.

CampoTipoDescrição
expiresAtobrigatório string
idobrigatório string (uuid)

InvitationResult

The answer of POST /v1/invitations and POST /v1/invitations/{id}/resend.

CampoTipoDescrição
emailobrigatório InvitationEmail
invitationobrigatório InvitationRef
memberobrigatório MemberDto

LevelContextDto

Which rules the single level of an aggregate list follows (FAZ2 §5 "Listelerde hangi kural").

CampoTipoDescrição
kindobrigatório string user (a userId filter: that user's current team), team (a teamId filter) or company.
teamId string (uuid) | null

MeDto

GET /v1/me.

CampoTipoDescrição
accessobrigatório AccessDto
capabilitiesobrigatório CapabilitiesDto
effectiveTimeZoneobrigatório string
membershipobrigatório MeMembership
organizationobrigatório MeOrganization
organizationsobrigatório OrganizationChoice[]
session MeSession | null
userobrigatório MeUser

MeMembership

The membership in the current organization.

CampoTipoDescrição
idobrigatório string (uuid)
isTrackedobrigatório boolean
joinedAt string | null
roleobrigatório string
statusobrigatório string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdsobrigatório string (uuid)[]

MeOrganization

The current organization.

CampoTipoDescrição
defaultLocaleobrigatório string
idobrigatório string (uuid)
nameobrigatório string
slugobrigatório string
statusobrigatório string
timeZoneobrigatório string

MeSession

The current session.

CampoTipoDescrição
absoluteExpiresAtobrigatório string
amrobrigatório string[]
authTimeobrigatório string
clientIdobrigatório string
idobrigatório string (uuid)
idleExpiresAtobrigatório string

MeUser

The person (GET /v1/me → user).

CampoTipoDescrição
emailobrigatório string
emailVerificationobrigatório EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedobrigatório boolean
fullName string | null
idobrigatório string (uuid)
localeobrigatório string

MemberDto

A membership with its person (MemberDto).

CampoTipoDescrição
createdAtobrigatório string
emailobrigatório string
emailVerifiedobrigatório boolean
fullName string | null
idobrigatório string (uuid)
invitation MemberInvitationDto | null
isTrackedobrigatório boolean
joinedAt string | null
localeobrigatório string
roleobrigatório string owner, admin, team_admin, manager, employee.
statusobrigatório string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerobrigatório boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdobrigatório string (uuid)
viewerTeamIdsobrigatório string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

CampoTipoDescrição
emailStatus string | null queued, sending, sent, failed, suppressed, not_configured, suppressed_reserved (an RFC 2606 / RFC 6761 reserved domain, never e-mailed), or null before the first e-mail.
expiresAtobrigatório string
idobrigatório string (uuid)
lastSentAtobrigatório string
sentCountobrigatório integer (int32)

MemberPage

A page of members (OpenAPI).

CampoTipoDescrição
itemsobrigatório MemberDto[]
nextCursor string | null

MemberRefDto

A member as a reference (current row): the connecting Admin of a connection, the owner of a webhook endpoint.

CampoTipoDescrição
activeobrigatório boolean The membership is active and (for an endpoint or a tenant connection) still an Owner or Admin.
name string | null
userIdobrigatório string (uuid)

NamedRefDto

A reference by id and display name (a client, a person, a task).

CampoTipoDescrição
idobrigatório string (uuid)
nameobrigatório string

OrganizationChoice

One organization of the person (sec.user_memberships).

CampoTipoDescrição
currentobrigatório boolean
idobrigatório string (uuid)
nameobrigatório string
roleobrigatório string
selectableobrigatório boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

CampoTipoDescrição
isTracked boolean | null
role string | null admin, team_admin, manager or employee (the Owner is only transferred).
teamId string (uuid) | null Primary team; null removes it.
timeZone string | null IANA zone of the membership; null follows the organization.
viewerTeamIds string (uuid)[] | null Extra read-only teams (Manager and TeamAdmin only).

PatchTeam

PATCH /v1/teams/{id}.

CampoTipoDescrição
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

CampoTipoDescrição
fromobrigatório string (date)
groupByobrigatório string
levelContextobrigatório LevelContextDto
periodsobrigatório ReportPeriodDto[]
subjectobrigatório ReportSubjectDto
teamsobrigatório TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
toobrigatório string (date)
totalsobrigatório ReportFiguresDto

PlanAbsenceDto

CampoTipoDescrição
colorobrigatório string
countsAsWorkedobrigatório boolean timeEffect == worked.
endTime string | null
half string | null
idobrigatório string (uuid)
startTime string | null Local start and end of an hours absence.
statusobrigatório string approved or pending.
timeEffectobrigatório string leave, worked or none.
typeKey string | null
typeName string | null null for a built-in type that was not renamed (the UI translates typeKey).
unitobrigatório string days, half_day or hours.

PlanShiftDto

CampoTipoDescrição
color string | null
endobrigatório string (date-time)
endTimeobrigatório string Local end; before the start for a night shift.
idobrigatório string (uuid)
locationobrigatório string
minMinutesobrigatório integer (int32)
startobrigatório string (date-time)
startTimeobrigatório string Local start (HH:mm, the shift's zone).

Problem

RFC 9457 problem details (application/problem+json).

CampoTipoDescrição
action string | null Permission key of a 403 (teams.create).
codeobrigatório string Stable snake_case error code (catalog error-codes.json).
detail string | null
errors FieldError[] | null
requiredPlan string | null Lowest plan that includes the feature (402 feature_not_in_plan).
retryAfterSeconds integer (int32) | null Seconds to wait (429, 503; also the Retry-After header).
statusobrigatório integer (int32)
titleobrigatório string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typeobrigatório string Help page of the error code: https://workify360.com/help/errors/<code>/.

ProjectAmountDto

The amounts of one currency (rates are applied per allocation day and layer).

CampoTipoDescrição
billableMinorobrigatório integer (int64) The billable hours at their rate.
costMinorobrigatório integer (int64) Every allocated hour at its rate.
currencyobrigatório string

ProjectBudgetUsageDto

The use of a project's budget, all time.

CampoTipoDescrição
budgetMinor integer (int64) | null null unless costsIncluded.
budgetMinutes integer (int64) | null
kindobrigatório string hours or amount.
projectIdobrigatório string (uuid)
usedMinor integer (int64) | null The cost in the project's currency; null unless costsIncluded.
usedMsobrigatório integer (int64)
usedRatio string | null Used / budget, 4 decimals (null for an amount budget without costsIncluded).

ProjectDto

A project.

CampoTipoDescrição
accessobrigatório string everyone or members.
archivedobrigatório boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtobrigatório string (date-time)
currencyobrigatório string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idobrigatório string (uuid)
isBillableobrigatório boolean
memberCountobrigatório integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
nameobrigatório string
permissionsobrigatório ProjectPermissionsDto
spentMsobrigatório integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statusobrigatório string active, on_hold or completed.
taskCountobrigatório integer (int64)
updatedAtobrigatório string (date-time)

ProjectPage

GET /v1/projects.

CampoTipoDescrição
itemsobrigatório ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

What the caller may do with a project (decided from the current rows, §5.3).

CampoTipoDescrição
archiveobrigatório boolean
deleteobrigatório boolean Only a project without time.
editobrigatório boolean The project's fields (Owners and Admins).
manageMembersobrigatório boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTasksobrigatório boolean Tasks (an Admin or the project's manager).
trackobrigatório boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

CampoTipoDescrição
color string | null #RRGGBB.
idobrigatório string (uuid)
nameobrigatório string

ProjectReportDto

GET /v1/reports/projects.

CampoTipoDescrição
budgetsobrigatório ProjectBudgetUsageDto[]
costsIncludedobrigatório boolean The caller sees rates and amounts (projects.costs.read).
fromobrigatório string (date)
groupByobrigatório string[]
rowsobrigatório ProjectReportRowDto[]
toobrigatório string (date)
totalsobrigatório ProjectReportTotalsDto

ProjectReportKeysDto

The dimensions of a row (the ones not grouped by are null).

CampoTipoDescrição
clientId string (uuid) | null
clientName string | null
date string (date) | null The allocation's local day (groupBy day).
projectId string (uuid) | null
projectName string | null
taskId string (uuid) | null
taskName string | null
userId string (uuid) | null
userName string | null

ProjectReportRowDto

One row of the project report.

CampoTipoDescrição
allocatedMsobrigatório integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMsobrigatório integer (int64)
keysobrigatório ProjectReportKeysDto
nonBillableMsobrigatório integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMsobrigatório integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

CampoTipoDescrição
allocatedMsobrigatório integer (int64)
amounts ProjectAmountDto[] | null
billableMsobrigatório integer (int64)
nonBillableMsobrigatório integer (int64)
productiveMs integer (int64) | null
unratedMsobrigatório integer (int64)

ProjectRequest

POST /v1/projects; PUT /v1/projects/{id} sends the whole body.

CampoTipoDescrição
access string | null everyone (default) or members.
budget BudgetRequest | null
clientId string (uuid) | null
code string | null [A-Za-z0-9._-]{1,32}, unique among active projects.
color string | null #RRGGBB.
currency string | null TRY, USD or EUR; locked once the project has rates or invoice lines (409 project_currency_locked).
description string | null
endDate string (date) | null
isBillable boolean | null Default true.
name string | null
startDate string (date) | null
status string | null active (default), on_hold or completed.

ReportFiguresDto

Figures of a group of users over a period (sums raw, percentages the users' average, counters user-days).

CampoTipoDescrição
absenceCreditMsobrigatório integer (int64)
absentDaysobrigatório integer (int32)
activeMsobrigatório integer (int64)
activeUserCountobrigatório integer (int32)
effectivenessPct number (double) | null
idleMsobrigatório integer (int64)
lateDaysobrigatório integer (int32)
leaveDaysobrigatório number (double)
leftEarlyDaysobrigatório integer (int32)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
overtimeDaysobrigatório integer (int32)
overtimeMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null
targetMsobrigatório integer (int64)
unproductiveMsobrigatório integer (int64)
userCountobrigatório integer (int32)
workedMsobrigatório integer (int64)

ReportPeriodDto

One period of a grouped report: its key and bounds, then the figures.

ReportScopeDto

What the caller can see (FAZ1 AccessPolicy.ScopeOf).

CampoTipoDescrição
kindobrigatório string company, teams or self.
teamIdsobrigatório string (uuid)[] The visible teams of a teams scope, sorted; empty otherwise (company = all).
unassignedFallbackobrigatório boolean A Manager without teams who sees the whole company until assigned.

ReportSubjectDto

Whom a report is about.

CampoTipoDescrição
id string (uuid) | null
kindobrigatório string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

CampoTipoDescrição
previousSecretExpiresAtobrigatório string Until then deliveries carry both signatures.
secretobrigatório string whsec_<base64>: shown once, never again.

ShiftBody

ShiftBody of POST /v1/shifts, the bulk items and PUT /v1/shifts/{id} (the whole body). Fields left null are filled from templateId.

CampoTipoDescrição
breakMinutes integer (int32) | null
color string | null
date string (date) | null
endTime string | null
location string | null
minMinutes integer (int32) | null null = the template's, else duration − break.
note string | null
startTime string | null
teamId string (uuid) | null Required for an open shift; ignored for an assigned one (the user's current team is written).
templateId string (uuid) | null
userId string (uuid) | null null = an open shift.

ShiftDto

A shift: local fields, UTC instants, the caller's permissions.

CampoTipoDescrição
breakMinutesobrigatório integer (int32)
color string | null
createdAtobrigatório string (date-time)
createdByobrigatório CalendarUserRefDto
crossesMidnightobrigatório boolean
dateobrigatório string (date)
durationMinutesobrigatório integer (int32)
endobrigatório string (date-time)
endTimeobrigatório string
idobrigatório string (uuid)
locationobrigatório string
minMinutesobrigatório integer (int32)
note string | null
openobrigatório boolean No user assigned.
permissionsobrigatório ShiftPermissionsDto
sourceobrigatório string manual, template, copy or request.
startobrigatório string (date-time)
startTimeobrigatório string
teamId string (uuid) | null Open shift: its team; assigned: the user's team when it was written.
teamName string | null
templateId string (uuid) | null
templateName string | null
timeZoneobrigatório string
updatedAtobrigatório string (date-time)
user CalendarUserRefDto | null
userId string (uuid) | null null for an open shift.

ShiftListDto

GET /v1/shifts (the shifts **starting** in the range).

CampoTipoDescrição
itemsobrigatório ShiftDto[]

ShiftPermissionsDto

CampoTipoDescrição
canDeleteobrigatório boolean
canEditobrigatório boolean
canPickUpobrigatório boolean
canRequestSwapobrigatório boolean

SummaryDto

The summary of the visible users over a range.

CampoTipoDescrição
absenceCreditMsobrigatório integer (int64)
absentDaysobrigatório integer (int32)
activeMsobrigatório integer (int64)
activeUserCountobrigatório integer (int32)
atWorkMsobrigatório integer (int64)
daysobrigatório DayTotalDto[]
deletedMsobrigatório integer (int64)
domainsobrigatório DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromobrigatório string (date)
holidayDaysobrigatório number (double)
idleMsobrigatório integer (int64)
inactiveUsersobrigatório UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDaysobrigatório integer (int32)
leaveDaysobrigatório number (double)
leftEarlyDaysobrigatório integer (int32)
levelContextobrigatório LevelContextDto
meetingMsobrigatório integer (int64)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
overtimeMsobrigatório integer (int64)
privateMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopeobrigatório ReportScopeDto
shiftDaysobrigatório integer (int32)
teamsobrigatório TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
toobrigatório string (date)
topAppsobrigatório AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMsobrigatório integer (int64)
usersobrigatório UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMsobrigatório integer (int64)

TargetItemDto

CampoTipoDescrição
activeMsobrigatório integer (int64)
categoryKey string | null
categorySourceobrigatório string tenant, builtin or none.
domain string | null
levelobrigatório string
levelSourceobrigatório string team, company or default.
matchedKey string | null
nameobrigatório string
percentageobrigatório number (double)
targetKeyobrigatório string
targetTypeobrigatório string app for apps, domain for domains and hosts.
userCountobrigatório integer (int32)

TargetListDto

The "Apps & URLs" list.

CampoTipoDescrição
fromobrigatório string (date)
itemsobrigatório TargetItemDto[] By active time descending, then key.
levelContextobrigatório LevelContextDto
nextCursor string | null
toobrigatório string (date)
totalobrigatório integer (int32) Targets matching the filters (before paging).
totalActiveMsobrigatório integer (int64) Active time over every target of the type before the filters (the percentage base).
typeobrigatório string app, domain or host.

TaskDto

A task.

CampoTipoDescrição
archivedobrigatório boolean
assignee NamedRefDto | null
createdAtobrigatório string (date-time)
description string | null
dueDate string (date) | null
effectiveBillableobrigatório boolean
estimateMinutes integer (int64) | null
idobrigatório string (uuid)
isBillable boolean | null null takes the project's value.
nameobrigatório string
permissionsobrigatório TaskPermissionsDto
projectIdobrigatório string (uuid)
sortOrderobrigatório integer (int64)
spentMsobrigatório integer (int64)
statusobrigatório string open, in_progress or done.
updatedAtobrigatório string (date-time)

TaskPage

GET /v1/projects/{id}/tasks.

CampoTipoDescrição
itemsobrigatório TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

CampoTipoDescrição
deleteobrigatório boolean Only a task without time.
editobrigatório boolean

TaskRequest

POST /v1/projects/{id}/tasks; PUT /v1/tasks/{id} sends the whole body.

CampoTipoDescrição
assigneeUserId string (uuid) | null Must be able to track time on the project (422 project_not_trackable).
description string | null
dueDate string (date) | null
estimateMinutes integer (int64) | null 1–1 000 000.
isBillable boolean | null null takes the project's value.
name string | null
sortOrder integer (int64) | null
status string | null open (default), in_progress or done.

TeamDto

A team with its size and leads (TeamDto).

CampoTipoDescrição
archivedAt string | null
createdAtobrigatório string
description string | null
idobrigatório string (uuid)
leadsobrigatório object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountobrigatório integer (int64) Members whose primary team this is (left members excluded).
nameobrigatório string
updatedAtobrigatório string

TeamPage

A page of teams (OpenAPI).

CampoTipoDescrição
itemsobrigatório TeamDto[]
nextCursor string | null

TeamPeriodsDto

CampoTipoDescrição
periodsobrigatório ReportPeriodDto[]
teamIdobrigatório string (uuid)
teamName string | null
totalsobrigatório ReportFiguresDto

TeamTotalDto

One team row of a summary (current teams; percentages the members' average).

CampoTipoDescrição
absenceCreditMsobrigatório integer (int64)
absentDaysobrigatório integer (int32)
activeMsobrigatório integer (int64)
activeUserCountobrigatório integer (int32)
effectivenessPct number (double) | null
holidayDaysobrigatório number (double)
idleMsobrigatório integer (int64)
lateDaysobrigatório integer (int32)
leaveDaysobrigatório number (double)
leftEarlyDaysobrigatório integer (int32)
memberCountobrigatório integer (int32)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
overtimeMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null
shiftDaysobrigatório integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMsobrigatório integer (int64)
workedMsobrigatório integer (int64)

TimeEntryDecisionRequest

POST /v1/time-entries/{id}/decision.

CampoTipoDescrição
decision string | null approve or reject.
note string | null At most 500 characters.

TimeEntryDto

An offline entry or a deletion (design §8.2).

CampoTipoDescrição
createdAtobrigatório string (date-time)
createdByobrigatório TimeEntryUserRefDto
dateobrigatório string (date) The user's local day of the entry, in the zone effective when it was written.
decidedAt string (date-time) | null
decidedBy TimeEntryUserRefDto | null
decisionNote string | null
description string | null
durationMsobrigatório integer (int64)
endobrigatório string (date-time)
idobrigatório string (uuid)
kindobrigatório string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionsobrigatório TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourceobrigatório string manual (Phase 8 adds calendar).
startobrigatório string (date-time)
statusobrigatório string pending, approved or rejected.
timeZoneobrigatório string
updatedAtobrigatório string (date-time)
userIdobrigatório string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

CampoTipoDescrição
itemsobrigatório TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

What the caller may do with the entry (TimeEntryPolicy.PermissionsFor), the same on every endpoint.

CampoTipoDescrição
canApproveobrigatório boolean
canDeleteobrigatório boolean
canEditobrigatório boolean

TimeEntryUserRefDto

A user reference of an entry (fullName from the directory; null when unknown).

CampoTipoDescrição
fullName string | null
idobrigatório string (uuid)

TimeIntervalDto

A UTC interval without any detail (e.g. a private interval).

CampoTipoDescrição
endobrigatório string (date-time)
startobrigatório string (date-time)

TimerAtRequest

POST /v1/me/timer/stop and /discard.

CampoTipoDescrição
at string (date-time) | null

TimerCommandResultDto

The result of a command (200 also when it did not apply).

CampoTipoDescrição
appliedobrigatório boolean
closedobrigatório AllocationDto[] The allocations written from the segment this command closed (may be empty).
reason string | null stale, not_running or unchanged; null when applied.
timerobrigatório TimerDto

TimerDto

GET /v1/me/timer (ETag: "v<rowVersion>", "v0" before the first command).

CampoTipoDescrição
autoStopAt string (date-time) | null startedAt + 24 hours.
effectiveBillable boolean | null
isBillable boolean | null
last TimerLastDto | null
note string | null
project TimerProjectDto | null
segmentId string (uuid) | null
serverTimeobrigatório string (date-time) The server's clock (clients compute the elapsed time against it).
source string | null web, desktop or api.
startedAt string (date-time) | null
stateobrigatório string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

CampoTipoDescrição
endReasonobrigatório string stop, switch, autostop or discard.
endedAtobrigatório string (date-time)
segmentIdobrigatório string (uuid)
startedAtobrigatório string (date-time)

TimerProjectDto

The project of the running segment.

CampoTipoDescrição
clientName string | null
color string | null
idobrigatório string (uuid)
nameobrigatório string

TimerStartRequest

POST /v1/me/timer/start (Idempotency-Key: the client's command id): start, or switch while running.

CampoTipoDescrição
at string (date-time) | null The client's clock when the command was given (default: the server's now; at most 5 minutes ahead, at most 7 days back).
isBillable boolean | null
note string | null
projectId string (uuid) | null
source string | null web (default), desktop or api.
taskId string (uuid) | null

UpdateTimeEntryRequest

PUT /v1/time-entries/{id}: the whole editable body (kind and user never change; If-Match instead of version).

CampoTipoDescrição
description string | null
end string (date-time) | null
level string | null
projectId string (uuid) | null
start string (date-time) | null

UpdateWebhookEndpointRequest

PATCH /v1/webhook-endpoints/{id} (If-Match).

CampoTipoDescrição
description string | null null clears it.
eventTypes string[] | null
status string | null active (also opens a disabled endpoint and resets its failure counters) or paused.
takeOver boolean | null true: the caller becomes the endpoint's owner (lifts an owner_inactive pause).
url string | null

UserDailyDto

A user's days: computed days plus the workdays without activity up to the user's today.

CampoTipoDescrição
daysobrigatório UserDayDto[]
fromobrigatório string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZoneobrigatório string
toobrigatório string (date)
userIdobrigatório string (uuid)

UserDayDto

CampoTipoDescrição
absence DayAbsenceDto | null
absenceCreditMsobrigatório integer (int64)
activeMsobrigatório integer (int64)
afkCoverageobrigatório boolean
arrivalAt string (date-time) | null
atWorkMsobrigatório integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedobrigatório boolean
dateobrigatório string (date)
dayOffWorkedMsobrigatório integer (int64)
deletedMsobrigatório integer (int64)
effectivenessPct number (double) | null
eventCountobrigatório integer (int64)
expectedWorkMsobrigatório integer (int64)
holiday DailyHolidayDto | null
idleMsobrigatório integer (int64)
lateByMsobrigatório integer (int64)
leftAt string (date-time) | null
leftEarlyobrigatório boolean
leftEarlyByMsobrigatório integer (int64)
meetingMsobrigatório integer (int64)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
overtimeMsobrigatório integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null
shiftCountobrigatório integer (int32)
targetMsobrigatório integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMsobrigatório integer (int64)
workday boolean | null
workedMsobrigatório integer (int64)

UserTotalDto

One user of a summary.

CampoTipoDescrição
absenceCreditMsobrigatório integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDaysobrigatório integer (int32) Local days with active time.
activeMsobrigatório integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMsobrigatório integer (int64)
classifiedDaysobrigatório integer (int32)
dayOffWorkedMsobrigatório integer (int64)
deletedMsobrigatório integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountobrigatório integer (int64)
fullName string | null
holidayDaysobrigatório number (double)
idleMsobrigatório integer (int64)
lateDays integer (int32) | null
leaveDaysobrigatório number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMsobrigatório integer (int64)
neutralMsobrigatório integer (int64)
offlineMsobrigatório integer (int64)
overtimeDaysobrigatório integer (int32)
overtimeMsobrigatório integer (int64)
privateMsobrigatório integer (int64)
productiveMsobrigatório integer (int64)
productivityPct number (double) | null
shiftDaysobrigatório integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZoneobrigatório string
unproductiveMsobrigatório integer (int64)
userIdobrigatório string (uuid)
workdays integer (int32) | null
workedMsobrigatório integer (int64)

WebhookDeliveryDetailDto

GET /v1/webhook-endpoints/{id}/deliveries/{deliveryId}: the delivery and the body that was (or is) sent.

WebhookDeliveryDto

WebhookDeliveryDto.

CampoTipoDescrição
attemptsobrigatório integer (int32)
createdAtobrigatório string
deliveredAt string | null
eventIdobrigatório string (uuid) The webhook-id header.
eventTypeobrigatório string
idobrigatório string A 64-bit integer as a string.
lastDurationMs integer (int32) | null
lastError string | null timeout, connect, tls, not_allowed, http_<code>, not_in_plan, owner_inactive.
lastStatusCode integer (int32) | null
nextAttemptAt string | null
statusobrigatório string pending, succeeded, failed, dead.

WebhookDeliveryPage

GET /v1/webhook-endpoints/{id}/deliveries (newest first).

CampoTipoDescrição
itemsobrigatório WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

CampoTipoDescrição
createdAtobrigatório string
description string | null
eventTypesobrigatório string[]
idobrigatório string (uuid)
ownerobrigatório MemberRefDto The member who owns the endpoint (G1: a delivery needs an active Owner or Admin owner).
previousSecretExpiresAt string | null After a rotation the previous secret still signs until then (24 hours).
secretPrefixobrigatório string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statsobrigatório WebhookEndpointStatsDto
statusobrigatório string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtobrigatório string
urlobrigatório string
versionobrigatório integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

CampoTipoDescrição
itemsobrigatório WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

CampoTipoDescrição
consecutiveFailuresobrigatório integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

One event type of GET /v1/webhook-events.

CampoTipoDescrição
availableobrigatório boolean The tenant's plan has the feature: an endpoint may subscribe.
descriptionobrigatório string One English sentence (the panel translates by type).
feature string | null The plan feature the event needs (null: every plan with api_access).
objectobrigatório string The data.object of the delivery body.
typeobrigatório string <object>.<verb>, e.g. time_entry.approved.

WebhookEventsDto

GET /v1/webhook-events.

CampoTipoDescrição
itemsobrigatório WebhookEventDto[]

WebhookTestDto

202 of POST /v1/webhook-endpoints/{id}/test.

CampoTipoDescrição
deliveryIdobrigatório string The delivery of the test event (a string: the deliveries' id is a 64-bit integer).