Referencia de la API pública

La API pública de Workify360 Focus permite que tus propios scripts y herramientas lean informes y datos de tiempo y hagan cambios con las mismas reglas que el panel. La API pública, las claves de API y los webhooks forman parte del plan Premium.

Las operaciones de esta página mantienen la compatibilidad con versiones anteriores. El documento OpenAPI legible por máquina de las mismas operaciones:

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

Generado a partir de la versión 0.1.0 del contrato de la API (c95fb97bb49a).

Autenticación

Envía una clave de API personal en el encabezado Authorization de cada solicitud. Una clave pertenece a la persona que la creó, actúa como esa persona y nunca hace más de lo que permite su rol actual. Una solicitud con una clave ausente, incorrecta, caducada o revocada recibe 401 con el código unauthorized.

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

Cómo crear, limitar y revocar claves: Claves de API y API pública

Ámbitos

Cada operación necesita un ámbito, indicado junto a ella. Una clave puede usar una operación cuando tiene ese ámbito y el rol, los equipos y el plan actuales de su propietario permiten la solicitud, exactamente igual que en el panel.

ÁmbitoQué permite
meTu propio perfil y tu temporizador
reports:readLeer informes, entradas de tiempo, ausencias, turnos, equipos, proyectos, tareas y exportaciones
time:writeAñadir y modificar entradas de tiempo, ausencias, turnos, tareas y tiempo asignado a tareas, y resolver solicitudes
org:adminGestionar miembros, equipos, invitaciones y proyectos
webhooks:manageGestionar endpoints de webhooks

Límites de uso

Cada clave puede enviar 600 unidades por minuto, y una organización 1800 para todas sus claves juntas. Una solicitud que cambia algo (cualquiera distinta de GET y HEAD) cuenta como dos unidades, y cualquier otra como una. Una clave tampoco puede enviar más de 60 unidades de golpe, que se recargan a razón de 10 por segundo: más de 60 lecturas (o 30 cambios) en una ráfaga reciben 429 aunque no se superen las 600 por minuto.

EncabezadoSignificado
RateLimit: "key";r=598;t=2En cada respuesta contabilizada: las unidades que le quedan a la clave y los segundos hasta que vuelvan a estar completas
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60En cada respuesta contabilizada: los límites por minuto de la clave y de la organización
Retry-After: 12Con 429 (código rate_limited): los segundos que hay que esperar antes de la siguiente solicitud

Errores

Un error es un documento de problema RFC 9457 (Content-Type: application/problem+json). code es un código estable en snake_case con el que programar; title es un texto en inglés para los registros. type es la dirección de ayuda del código, https://workify360.com/help/errors/<code>/ con cada _ escrito como -, que abre el artículo de ayuda que explica el código cuando lo tiene.

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"
}

Algunos problemas incluyen más campos: errors (los errores de campo de 422 validation_failed), action (el permiso al que se refiere un 403 forbidden), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 y 503) y traceId (indícalo cuando te pongas en contacto con soporte).

EstadoCódigoCuándo
400 invalid_request Un parámetro tiene un formato incorrecto o falta
401 unauthorized La clave falta, es incorrecta, ha caducado o se ha revocado, o su propietario dejó la organización
402 feature_not_in_plan, subscription_read_only El plan no incluye la función, o la suscripción está en modo de solo lectura
403 forbidden, feature_not_enabled La clave no tiene el ámbito, o el rol, los equipos o la configuración actuales de su propietario no permiten la solicitud
412 version_conflict La versión de If-Match ya no es la actual; vuelve a leer el recurso
422 validation_failed El cuerpo no es válido; errors enumera los campos
428 precondition_required La operación necesita un encabezado If-Match con la versión que leíste
429 rate_limited Demasiadas solicitudes; espera los segundos indicados en Retry-After

Los códigos con artículo de ayuda son enlaces en la lista de operaciones.

Webhooks

En lugar de consultar la API una y otra vez, un endpoint tuyo puede recibir una solicitud HTTPS firmada cuando algo cambia. Los eventos, el formato de la solicitud, cómo verificar la firma en Node.js y Python, los reintentos y la rotación del secreto se explican en el artículo de ayuda: Webhooks

Operaciones

Agrupadas por área. Los resúmenes y las descripciones de los campos proceden del contrato de la API.

Ausencias

GET /v1/absences Ámbito: reports:read

List absences overlapping a range.

Parámetros
NombreUbicaciónTipoDescripción
from consulta string (date)
to consulta string (date) At most 366 days after from.
userId consulta string (uuid)
teamId consulta string (uuid)
status consulta string
typeId consulta string (uuid)
cursor consulta string
limit consulta integer (int32)
Respuestas
200 AbsencePage
Errores

POST /v1/absences Ámbito: time:write

Request (or record) an absence.

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Keyobligatorio encabezado string Required: the same key and body return the first answer
Cuerpo de la solicitud
AbsenceRequest
Respuestas
201 AbsenceDto
Errores

POST /v1/absences/{id}/decision Ámbito: time:write

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Id
If-Matchobligatorio encabezado string ETag of the resource ("v<n>"); missing: 428, stale: 412
Cuerpo de la solicitud
CalendarDecisionRequest
Respuestas
200 AbsenceDto
Errores

Actividad

GET /v1/activity/day Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
date consulta string (date) The user's local day (required).
userId consulta string (uuid) Default: the caller; another user must be visible (else 403).
Respuestas
200 ActivityDayDto
Errores

Asignaciones de tiempo

GET /v1/allocations Ámbito: 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
NombreUbicaciónTipoDescripción
userId consulta string (uuid) Default: the caller.
from consulta string (date) Local date, included.
to consulta string (date) Local date, included; at most 93 days after from.
projectId consulta string (uuid)
cursor consulta string
limit consulta integer (int32) 1–200 (default 200).
Respuestas
200 AllocationPage
Errores

POST /v1/allocations Ámbito: time:write

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

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Key encabezado string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Cuerpo de la solicitud
AllocationCreateRequest
Respuestas
201 AllocationCreatedDto
Errores

Exportaciones

POST /v1/exports Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Keyobligatorio encabezado string Required: the same key and body return the first answer
Cuerpo de la solicitud
CreateExportRequest
Respuestas
202 ExportJobDto
Errores

GET /v1/exports/{id} Ámbito: reports:read

One export job (poll every 2 s).

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Id
Respuestas
200 ExportJobDto
Errores

Mi cuenta

GET /v1/me Ámbito: me

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

Respuestas
200 MeDto
Errores

Miembros

GET /v1/members Ámbito: org:admin

List members.

Parámetros
NombreUbicaciónTipoDescripción
status consulta string Comma-separated statuses (default active,invited,suspended)
teamId consulta string (uuid) Primary team
role consulta string owner, admin, team_admin, manager or employee
q consulta string Part of the name or e-mail (Turkish case folding)
cursor consulta string Opaque cursor of the next page
limit consulta integer (int32) 1–200, default 50
Respuestas
200 MemberPage
Errores
  • 403 No right

GET /v1/members/{id} Ámbito: org:admin

One member.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Membership id
Respuestas
200 MemberDto
Errores
  • 404 member_not_found

PATCH /v1/members/{id} Ámbito: org:admin

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Membership id
If-Matchobligatorio encabezado string ETag of the member ("v<n>")
Cuerpo de la solicitud
PatchMember
Respuestas
200 MemberDto
Errores

POST /v1/members/{id}/reactivate Ámbito: org:admin

Reactivate a suspended member.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Membership id
Respuestas
200 MemberDto

POST /v1/members/{id}/suspend Ámbito: org:admin

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Membership id
Respuestas
200 MemberDto
Errores
  • 409 conflict (an invitation is revoked instead)

Proyectos

GET /v1/projects Ámbito: 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
NombreUbicaciónTipoDescripción
status consulta string active, on_hold or completed.
clientId consulta string (uuid)
q consulta string Name or code search (case-insensitive).
includeArchived consulta boolean
mine consulta boolean Only the projects the caller may track time on.
cursor consulta string
limit consulta integer (int32) 1–200 (default 50).
Respuestas
200 ProjectPage
Errores

POST /v1/projects Ámbito: org:admin

Add a project (Owners and Admins).

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Key encabezado string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Cuerpo de la solicitud
ProjectRequest
Respuestas
201 ProjectDto
Errores

PUT /v1/projects/{id} Ámbito: org:admin

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Project id
If-Matchobligatorio encabezado string The ETag the caller read (412 version_conflict when it changed)
Cuerpo de la solicitud
ProjectRequest
Respuestas
200 ProjectDto
Errores

Informes

GET /v1/reports/productivity Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
from consulta string (date)
to consulta string (date) day 93 days, week, month and range 366.
groupBy consulta string day, week, month or range.
teamId consulta string (uuid)
userId consulta string (uuid)
Respuestas
200 PeriodReportDto
Errores

GET /v1/reports/projects Ámbito: 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
NombreUbicaciónTipoDescripción
from consulta string (date) Local date, included.
to consulta string (date) Local date, included; at most 366 days after from.
groupBy consulta string One or two of project (default), task, user, client, day, comma separated.
projectIds consulta string Comma-separated project ids.
clientId consulta string (uuid)
userIds consulta string Comma-separated user ids (visible people only).
teamId consulta string (uuid)
billable consulta string all (default), billable or nonBillable.
includeProductive consulta boolean Also compute the productive time within the allocations (costly; default false).
Respuestas
200 ProjectReportDto
Errores

GET /v1/reports/summary Ámbito: reports:read

The summary of the visible users over a range.

Parámetros
NombreUbicaciónTipoDescripción
from consulta string (date)
to consulta string (date) At most 93 days after from.
teamId consulta string (uuid) Only the team's current members; the team must be visible (else 403).
Respuestas
200 SummaryDto
Errores

GET /v1/reports/targets Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
from consulta string (date)
to consulta string (date)
type consulta string app, domain or host.
teamId consulta string (uuid)
userId consulta string (uuid)
q consulta string Search in the key and the name (.NET search).
level consulta string productive, unproductive or neutral.
categoryKey consulta string
unclassified consulta boolean Only targets without a category.
cursor consulta string
limit consulta integer (int32) 1–200, default 50.
Respuestas
200 TargetListDto
Errores

GET /v1/reports/users/{userId}/daily Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
userIdobligatorio ruta string (uuid) User
from consulta string (date)
to consulta string (date) At most 93 days after from.
Respuestas
200 UserDailyDto
Errores

Turnos

GET /v1/shifts Ámbito: reports:read

List the shifts starting in a range.

Parámetros
NombreUbicaciónTipoDescripción
from consulta string (date)
to consulta string (date)
teamId consulta string (uuid)
userId consulta string (uuid)
includeOpen consulta boolean Also open shifts (default true).
Respuestas
200 ShiftListDto
Errores

POST /v1/shifts Ámbito: time:write

Create a shift (assigned or open).

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Keyobligatorio encabezado string Required: the same key and body return the first answer
Cuerpo de la solicitud
ShiftBody
Respuestas
201 ShiftDto
Errores

Tareas

GET /v1/projects/{id}/tasks Ámbito: reports:read

A visible project's tasks, by sort order.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Project id
status consulta string open, in_progress or done.
assigneeUserId consulta string (uuid)
includeArchived consulta boolean
cursor consulta string
limit consulta integer (int32) 1–500 (default 200).
Respuestas
200 TaskPage
Errores

POST /v1/projects/{id}/tasks Ámbito: time:write

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Project id
Idempotency-Key encabezado string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Cuerpo de la solicitud
TaskRequest
Respuestas
201 TaskDto
Errores

PUT /v1/tasks/{id} Ámbito: time:write

Change a task (the whole body).

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Task id
If-Matchobligatorio encabezado string The ETag the caller read (412 version_conflict when it changed)
Cuerpo de la solicitud
TaskRequest
Respuestas
200 TaskDto
Errores

Equipos

GET /v1/teams Ámbito: reports:read

List teams.

Parámetros
NombreUbicaciónTipoDescripción
includeArchived consulta boolean Also archived teams (default false)
cursor consulta string Opaque cursor of the next page
limit consulta integer (int32) 1–200, default 50
Respuestas
200 TeamPage

POST /v1/teams Ámbito: org:admin

Create a team (the G1 endpoint).

Cuerpo de la solicitud
CreateTeam
Respuestas
201 TeamDto
Errores
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

PATCH /v1/teams/{id} Ámbito: org:admin

Rename a team or change its description.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Team id
If-Matchobligatorio encabezado string ETag of the team
Cuerpo de la solicitud
PatchTeam
Respuestas
200 TeamDto
Errores
  • 409 team_name_taken

Entradas de tiempo

GET /v1/time-entries Ámbito: reports:read

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

Parámetros
NombreUbicaciónTipoDescripción
userId consulta string (uuid) Default: the caller.
from consulta string (date) The entry's local day, required.
to consulta string (date) At most 93 days after from.
kind consulta string offline or deletion.
status consulta string pending, approved or rejected.
cursor consulta string
limit consulta integer (int32) 1–500.
Respuestas
200 TimeEntryPage
Errores

POST /v1/time-entries Ámbito: time:write

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

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Keyobligatorio encabezado string Required: the same key and body return the first answer
Cuerpo de la solicitud
CreateTimeEntryRequest
Respuestas
201 TimeEntryDto
Errores

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

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Entry id
Respuestas
200 TimeEntryDto
Errores

PUT /v1/time-entries/{id} Ámbito: time:write

Replace an entry's editable fields.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Entry id
If-Matchobligatorio encabezado string ETag of the resource ("v<n>"); missing: 428, stale: 412
Cuerpo de la solicitud
UpdateTimeEntryRequest
Respuestas
200 TimeEntryDto
Errores

DELETE /v1/time-entries/{id} Ámbito: time:write

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Entry id
If-Matchobligatorio encabezado string ETag of the resource ("v<n>"); missing: 428, stale: 412
Respuestas
204 (sin cuerpo)
Errores

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

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) Entry id
If-Matchobligatorio encabezado string ETag of the resource ("v<n>"); missing: 428, stale: 412
Cuerpo de la solicitud
TimeEntryDecisionRequest
Respuestas
200 TimeEntryDto
Errores

Temporizador

GET /v1/me/timer Ámbito: me

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

Parámetros
NombreUbicaciónTipoDescripción
If-None-Match encabezado string | null The ETag the caller holds (304 when unchanged)
Respuestas
200 TimerDto · 304 (sin cuerpo)
Errores

POST /v1/me/timer/start Ámbito: me

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

Parámetros
NombreUbicaciónTipoDescripción
Idempotency-Key encabezado string | null The client's command id; a retry returns the first answer
Cuerpo de la solicitud
TimerStartRequest
Respuestas
200 TimerCommandResultDto
Errores

Webhooks

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

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) The endpoint
If-Matchobligatorio encabezado string The endpoint's ETag ("v<n>")
Cuerpo de la solicitud
UpdateWebhookEndpointRequest
Respuestas
200 WebhookEndpointDto
Errores

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

Delete an endpoint and its deliveries.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) The endpoint
Respuestas
204 (sin cuerpo)
Errores

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

The deliveries of an endpoint, newest first.

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) The endpoint
status consulta string pending, succeeded, failed, dead.
eventType consulta string
cursor consulta string Opaque cursor of the next page.
limit consulta integer (int32) 1–200, default 50.
Respuestas
200 WebhookDeliveryPage
Errores

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

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

Parámetros
NombreUbicaciónTipoDescripción
idobligatorio ruta string (uuid) The endpoint
deliveryIdobligatorio ruta string The delivery (a 64-bit integer)
Respuestas
202 AcceptedDto
Errores

Esquemas

Los cuerpos de solicitud y de respuesta que usan las operaciones. Los campos obligatorios están marcados.

AbsenceDto

An absence.

CampoTipoDescripción
createdAtobligatorio string (date-time)
createdByobligatorio CalendarUserRefDto
daysobligatorio 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
deductionByYearobligatorio object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endobligatorio string (date-time)
endDateobligatorio string (date)
endTime string | null
half string | null
idobligatorio string (uuid)
note string | null
permissionsobligatorio AbsencePermissionsDto
startobligatorio string (date-time) UTC coverage start.
startDateobligatorio string (date)
startTime string | null
statusobligatorio string
timeZoneobligatorio string
typeobligatorio AbsenceTypeRefDto
unitobligatorio string
updatedAtobligatorio string (date-time)
userobligatorio CalendarPersonDto
userIdobligatorio string (uuid)

AbsencePage

GET /v1/absences.

CampoTipoDescripción
itemsobligatorio AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

CampoTipoDescripción
canApproveobligatorio boolean
canCancelobligatorio boolean
canEditobligatorio boolean

AbsenceRequest

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

CampoTipoDescripción
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.

CampoTipoDescripción
colorobligatorio string
countsAsWorkedobligatorio boolean
deductsFromBalanceobligatorio boolean
idobligatorio string (uuid)
key string | null
nameobligatorio string
paidobligatorio boolean
timeEffectobligatorio string

AcceptedDto

202 Accepted of a queued job.

CampoTipoDescripción
acceptedobligatorio boolean Always true.

AccessDto

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

CampoTipoDescripción
assignableRolesobligatorio string[]
canManageCompanySettingsobligatorio boolean
canManageTeamsobligatorio boolean
canManageUsersobligatorio boolean
manageTeamIdsobligatorio string[]
scopeobligatorio string company, teams or self.
unassignedFallbackobligatorio boolean
viewTeamIdsobligatorio string[]

ActivityDayDto

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

CampoTipoDescripción
absenceCreditMsobligatorio integer (int64) A worked absence tops the worked time up to the expected work.
activeMsobligatorio integer (int64) Window time ∩ not AFK (computer time only).
afkCoverageobligatorio boolean False when no device reported AFK data (idle unknown).
appsobligatorio AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMsobligatorio integer (int64)
attendance DayAttendanceDto | null
categoriesobligatorio CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedobligatorio boolean False for a day written before the Phase 2 classification (all neutral).
dateobligatorio string (date)
dayEndobligatorio string (date-time)
dayStartobligatorio string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMsobligatorio integer (int64) Tracked time removed by approved deletions (part of idle).
domainsobligatorio DomainUsageDto[]
hostsobligatorio HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMsobligatorio integer (int64)
leftAt string (date-time) | null
meetingMsobligatorio integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMsobligatorio integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMsobligatorio integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalsobligatorio TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMsobligatorio integer (int64) Private time outside active and offline time.
productivityobligatorio DayProductivityDto
recomputingobligatorio boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotsobligatorio 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).
timeEntriesobligatorio TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZoneobligatorio string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdobligatorio string (uuid)
workedMsobligatorio integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

CampoTipoDescripción
activeMsobligatorio integer (int64)
appsobligatorio AppUsageDto[]
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
slotStartobligatorio string (date-time)
unproductiveMsobligatorio integer (int64)

AffectedAllocationDto

An allocation replace changed.

CampoTipoDescripción
changeobligatorio string trimmed, split or deleted.
idobligatorio string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

CampoTipoDescripción
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.

CampoTipoDescripción
affectedobligatorio AffectedAllocationDto[]
allocationobligatorio AllocationDto

AllocationDto

Time on a project.

CampoTipoDescripción
createdAtobligatorio string (date-time)
createdByobligatorio NamedRefDto
durationMsobligatorio integer (int64)
effectiveBillableobligatorio boolean
endedAtobligatorio string (date-time)
idobligatorio 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.
localDateobligatorio string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionsobligatorio AllocationPermissionsDto
projectobligatorio ProjectRefDto
sourceobligatorio string timer, manual or assignment.
startedAtobligatorio string (date-time)
task NamedRefDto | null
timeZoneobligatorio string
updatedAtobligatorio string (date-time)
userIdobligatorio string (uuid)
versionobligatorio integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

CampoTipoDescripción
itemsobligatorio AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

CampoTipoDescripción
deleteobligatorio boolean
editobligatorio boolean

AppTotalDto

CampoTipoDescripción
activeMsobligatorio integer (int64)
appKeyobligatorio string
categoryKey string | null
level string | null Level in the response's levelContext.
nameobligatorio string
percentageobligatorio 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".

CampoTipoDescripción
activeMsobligatorio integer (int64)
appKeyobligatorio string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
nameobligatorio string

BudgetDto

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

CampoTipoDescripción
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).

CampoTipoDescripción
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).

CampoTipoDescripción
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

CampoTipoDescripción
fullName string | null
idobligatorio string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

CampoTipoDescripción
fullName string | null
idobligatorio string (uuid)

CapabilitiesDto

Subscription capabilities.

CampoTipoDescripción
featuresobligatorio string[]
readOnlyobligatorio boolean

CategoryUsageDto

CampoTipoDescripción
activeMsobligatorio 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.

CampoTipoDescripción
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.

CampoTipoDescripción
emailobligatorio string
fullNameobligatorio string
locale string | null Language of the e-mail and the acceptance page (tr, en); the organization's default otherwise.
roleobligatorio string admin, team_admin, manager or employee.
teamId string (uuid) | null
timeZone string | null
viewerTeamIds string (uuid)[]

CreateTeam

POST /v1/teams.

CampoTipoDescripción
description string | null At most 500 characters.
nameobligatorio string 1–100 characters, unique among active teams (Turkish case folding).

CreateTimeEntryRequest

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

CampoTipoDescripción
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.

CampoTipoDescripción
description string | null ≤ 200 characters.
eventTypesobligatorio string[] 1–50 catalog event types of the tenant's plan.
urlobligatorio string https://… (≤ 2048; no user info, no fragment; every resolved address public).

CreatedWebhookEndpointDto

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

CampoTipoDescripción
endpointobligatorio WebhookEndpointDto
secretobligatorio string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

CampoTipoDescripción
half string | null
keyobligatorio string
nameobligatorio string English name; nameTr is the Turkish one.
nameTrobligatorio string

DayAbsenceDto

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

CampoTipoDescripción
colorobligatorio string
fractionobligatorio number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitobligatorio string

DayAttendanceDto

Attendance of the day on the day plan.

CampoTipoDescripción
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexibleobligatorio boolean
lateByMsobligatorio integer (int64)
lateToleranceMinutesobligatorio integer (int32)
leftEarlyobligatorio boolean
leftEarlyByMsobligatorio integer (int64)
statusobligatorio string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMsobligatorio integer (int64) The plan's target (the Effectiveness % denominator).
workdayobligatorio boolean

DayPlanDto

The day plan of one user's day.

CampoTipoDescripción
absencesobligatorio PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMsobligatorio integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindobligatorio string schedule, shift, dayOff or holiday.
leaveFractionobligatorio number (double) The approved absence coverage f (0–1).
shiftsobligatorio PlanShiftDto[] Shifts starting on the day, by start.
targetMsobligatorio integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayobligatorio boolean

DayProductivityDto

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

CampoTipoDescripción
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMsobligatorio integer (int64)
unproductiveMsobligatorio integer (int64)

DayTotalDto

One local day of a summary.

CampoTipoDescripción
activeMsobligatorio integer (int64)
activeUserCountobligatorio integer (int32)
atWorkMsobligatorio integer (int64)
dateobligatorio string (date)
idleMsobligatorio integer (int64)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
privateMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null
unproductiveMsobligatorio integer (int64)

DomainTotalDto

CampoTipoDescripción
activeMsobligatorio integer (int64)
categoryKey string | null
domainobligatorio string
level string | null
percentageobligatorio number (double)

DomainUsageDto

CampoTipoDescripción
activeMsobligatorio integer (int64)
categoryKey string | null
domainobligatorio 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).

CampoTipoDescripción
dueAt string (date-time) | null The deadline of an unverified account (Identity__EmailVerificationGraceHours after its creation).
stateobligatorio 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}]).

CampoTipoDescripción
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.

CampoTipoDescripción
includeInactiveUsers boolean
teamId string | null
userIds string | null[] | null

ExportJobDto

An export job as the panel lists and polls it.

CampoTipoDescripción
createdAtobligatorio string (date-time)
datasetobligatorio 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
formatobligatorio string
fromobligatorio string (date)
groupBy string | null
idobligatorio string (uuid)
localeobligatorio string
progressobligatorio integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statusobligatorio 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.
toobligatorio string (date)

ExportOptionsDto

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

CampoTipoDescripción
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.

CampoTipoDescripción
codeobligatorio string Stable snake_case code (required, too_long, invalid, ...).
fieldobligatorio 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).

CampoTipoDescripción
half string | null
keyobligatorio string Built-in key (republic_day, …) or custom.
nameobligatorio string
nameEnobligatorio string
nameTrobligatorio string
source string | null builtin or tenant.

HostUsageDto

CampoTipoDescripción
activeMsobligatorio integer (int64)
domain string | null
hostobligatorio string
levelobligatorio string
levelSourceobligatorio string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

CampoTipoDescripción
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).
statusobligatorio 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.

CampoTipoDescripción
expiresAtobligatorio string
idobligatorio string (uuid)

InvitationResult

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

CampoTipoDescripción
emailobligatorio InvitationEmail
invitationobligatorio InvitationRef
memberobligatorio MemberDto

LevelContextDto

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

CampoTipoDescripción
kindobligatorio string user (a userId filter: that user's current team), team (a teamId filter) or company.
teamId string (uuid) | null

MeDto

GET /v1/me.

CampoTipoDescripción
accessobligatorio AccessDto
capabilitiesobligatorio CapabilitiesDto
effectiveTimeZoneobligatorio string
membershipobligatorio MeMembership
organizationobligatorio MeOrganization
organizationsobligatorio OrganizationChoice[]
session MeSession | null
userobligatorio MeUser

MeMembership

The membership in the current organization.

CampoTipoDescripción
idobligatorio string (uuid)
isTrackedobligatorio boolean
joinedAt string | null
roleobligatorio string
statusobligatorio string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdsobligatorio string (uuid)[]

MeOrganization

The current organization.

CampoTipoDescripción
defaultLocaleobligatorio string
idobligatorio string (uuid)
nameobligatorio string
slugobligatorio string
statusobligatorio string
timeZoneobligatorio string

MeSession

The current session.

CampoTipoDescripción
absoluteExpiresAtobligatorio string
amrobligatorio string[]
authTimeobligatorio string
clientIdobligatorio string
idobligatorio string (uuid)
idleExpiresAtobligatorio string

MeUser

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

CampoTipoDescripción
emailobligatorio string
emailVerificationobligatorio EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedobligatorio boolean
fullName string | null
idobligatorio string (uuid)
localeobligatorio string

MemberDto

A membership with its person (MemberDto).

CampoTipoDescripción
createdAtobligatorio string
emailobligatorio string
emailVerifiedobligatorio boolean
fullName string | null
idobligatorio string (uuid)
invitation MemberInvitationDto | null
isTrackedobligatorio boolean
joinedAt string | null
localeobligatorio string
roleobligatorio string owner, admin, team_admin, manager, employee.
statusobligatorio string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerobligatorio boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdobligatorio string (uuid)
viewerTeamIdsobligatorio string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

CampoTipoDescripción
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.
expiresAtobligatorio string
idobligatorio string (uuid)
lastSentAtobligatorio string
sentCountobligatorio integer (int32)

MemberPage

A page of members (OpenAPI).

CampoTipoDescripción
itemsobligatorio MemberDto[]
nextCursor string | null

MemberRefDto

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

CampoTipoDescripción
activeobligatorio boolean The membership is active and (for an endpoint or a tenant connection) still an Owner or Admin.
name string | null
userIdobligatorio string (uuid)

NamedRefDto

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

CampoTipoDescripción
idobligatorio string (uuid)
nameobligatorio string

OrganizationChoice

One organization of the person (sec.user_memberships).

CampoTipoDescripción
currentobligatorio boolean
idobligatorio string (uuid)
nameobligatorio string
roleobligatorio string
selectableobligatorio boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

CampoTipoDescripción
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}.

CampoTipoDescripción
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

CampoTipoDescripción
fromobligatorio string (date)
groupByobligatorio string
levelContextobligatorio LevelContextDto
periodsobligatorio ReportPeriodDto[]
subjectobligatorio ReportSubjectDto
teamsobligatorio TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
toobligatorio string (date)
totalsobligatorio ReportFiguresDto

PlanAbsenceDto

CampoTipoDescripción
colorobligatorio string
countsAsWorkedobligatorio boolean timeEffect == worked.
endTime string | null
half string | null
idobligatorio string (uuid)
startTime string | null Local start and end of an hours absence.
statusobligatorio string approved or pending.
timeEffectobligatorio 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).
unitobligatorio string days, half_day or hours.

PlanShiftDto

CampoTipoDescripción
color string | null
endobligatorio string (date-time)
endTimeobligatorio string Local end; before the start for a night shift.
idobligatorio string (uuid)
locationobligatorio string
minMinutesobligatorio integer (int32)
startobligatorio string (date-time)
startTimeobligatorio string Local start (HH:mm, the shift's zone).

Problem

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

CampoTipoDescripción
action string | null Permission key of a 403 (teams.create).
codeobligatorio 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).
statusobligatorio integer (int32)
titleobligatorio string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typeobligatorio 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).

CampoTipoDescripción
billableMinorobligatorio integer (int64) The billable hours at their rate.
costMinorobligatorio integer (int64) Every allocated hour at its rate.
currencyobligatorio string

ProjectBudgetUsageDto

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

CampoTipoDescripción
budgetMinor integer (int64) | null null unless costsIncluded.
budgetMinutes integer (int64) | null
kindobligatorio string hours or amount.
projectIdobligatorio string (uuid)
usedMinor integer (int64) | null The cost in the project's currency; null unless costsIncluded.
usedMsobligatorio integer (int64)
usedRatio string | null Used / budget, 4 decimals (null for an amount budget without costsIncluded).

ProjectDto

A project.

CampoTipoDescripción
accessobligatorio string everyone or members.
archivedobligatorio boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtobligatorio string (date-time)
currencyobligatorio string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idobligatorio string (uuid)
isBillableobligatorio boolean
memberCountobligatorio integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
nameobligatorio string
permissionsobligatorio ProjectPermissionsDto
spentMsobligatorio integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statusobligatorio string active, on_hold or completed.
taskCountobligatorio integer (int64)
updatedAtobligatorio string (date-time)

ProjectPage

GET /v1/projects.

CampoTipoDescripción
itemsobligatorio ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

CampoTipoDescripción
archiveobligatorio boolean
deleteobligatorio boolean Only a project without time.
editobligatorio boolean The project's fields (Owners and Admins).
manageMembersobligatorio boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTasksobligatorio boolean Tasks (an Admin or the project's manager).
trackobligatorio boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

CampoTipoDescripción
color string | null #RRGGBB.
idobligatorio string (uuid)
nameobligatorio string

ProjectReportDto

GET /v1/reports/projects.

CampoTipoDescripción
budgetsobligatorio ProjectBudgetUsageDto[]
costsIncludedobligatorio boolean The caller sees rates and amounts (projects.costs.read).
fromobligatorio string (date)
groupByobligatorio string[]
rowsobligatorio ProjectReportRowDto[]
toobligatorio string (date)
totalsobligatorio ProjectReportTotalsDto

ProjectReportKeysDto

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

CampoTipoDescripción
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.

CampoTipoDescripción
allocatedMsobligatorio integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMsobligatorio integer (int64)
keysobligatorio ProjectReportKeysDto
nonBillableMsobligatorio integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMsobligatorio integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

CampoTipoDescripción
allocatedMsobligatorio integer (int64)
amounts ProjectAmountDto[] | null
billableMsobligatorio integer (int64)
nonBillableMsobligatorio integer (int64)
productiveMs integer (int64) | null
unratedMsobligatorio integer (int64)

ProjectRequest

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

CampoTipoDescripción
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).

CampoTipoDescripción
absenceCreditMsobligatorio integer (int64)
absentDaysobligatorio integer (int32)
activeMsobligatorio integer (int64)
activeUserCountobligatorio integer (int32)
effectivenessPct number (double) | null
idleMsobligatorio integer (int64)
lateDaysobligatorio integer (int32)
leaveDaysobligatorio number (double)
leftEarlyDaysobligatorio integer (int32)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
overtimeDaysobligatorio integer (int32)
overtimeMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null
targetMsobligatorio integer (int64)
unproductiveMsobligatorio integer (int64)
userCountobligatorio integer (int32)
workedMsobligatorio 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).

CampoTipoDescripción
kindobligatorio string company, teams or self.
teamIdsobligatorio string (uuid)[] The visible teams of a teams scope, sorted; empty otherwise (company = all).
unassignedFallbackobligatorio boolean A Manager without teams who sees the whole company until assigned.

ReportSubjectDto

Whom a report is about.

CampoTipoDescripción
id string (uuid) | null
kindobligatorio string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

CampoTipoDescripción
previousSecretExpiresAtobligatorio string Until then deliveries carry both signatures.
secretobligatorio 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.

CampoTipoDescripción
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.

CampoTipoDescripción
breakMinutesobligatorio integer (int32)
color string | null
createdAtobligatorio string (date-time)
createdByobligatorio CalendarUserRefDto
crossesMidnightobligatorio boolean
dateobligatorio string (date)
durationMinutesobligatorio integer (int32)
endobligatorio string (date-time)
endTimeobligatorio string
idobligatorio string (uuid)
locationobligatorio string
minMinutesobligatorio integer (int32)
note string | null
openobligatorio boolean No user assigned.
permissionsobligatorio ShiftPermissionsDto
sourceobligatorio string manual, template, copy or request.
startobligatorio string (date-time)
startTimeobligatorio 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
timeZoneobligatorio string
updatedAtobligatorio 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).

CampoTipoDescripción
itemsobligatorio ShiftDto[]

ShiftPermissionsDto

CampoTipoDescripción
canDeleteobligatorio boolean
canEditobligatorio boolean
canPickUpobligatorio boolean
canRequestSwapobligatorio boolean

SummaryDto

The summary of the visible users over a range.

CampoTipoDescripción
absenceCreditMsobligatorio integer (int64)
absentDaysobligatorio integer (int32)
activeMsobligatorio integer (int64)
activeUserCountobligatorio integer (int32)
atWorkMsobligatorio integer (int64)
daysobligatorio DayTotalDto[]
deletedMsobligatorio integer (int64)
domainsobligatorio DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromobligatorio string (date)
holidayDaysobligatorio number (double)
idleMsobligatorio integer (int64)
inactiveUsersobligatorio UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDaysobligatorio integer (int32)
leaveDaysobligatorio number (double)
leftEarlyDaysobligatorio integer (int32)
levelContextobligatorio LevelContextDto
meetingMsobligatorio integer (int64)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
overtimeMsobligatorio integer (int64)
privateMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopeobligatorio ReportScopeDto
shiftDaysobligatorio integer (int32)
teamsobligatorio TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
toobligatorio string (date)
topAppsobligatorio AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMsobligatorio integer (int64)
usersobligatorio UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMsobligatorio integer (int64)

TargetItemDto

CampoTipoDescripción
activeMsobligatorio integer (int64)
categoryKey string | null
categorySourceobligatorio string tenant, builtin or none.
domain string | null
levelobligatorio string
levelSourceobligatorio string team, company or default.
matchedKey string | null
nameobligatorio string
percentageobligatorio number (double)
targetKeyobligatorio string
targetTypeobligatorio string app for apps, domain for domains and hosts.
userCountobligatorio integer (int32)

TargetListDto

The "Apps & URLs" list.

CampoTipoDescripción
fromobligatorio string (date)
itemsobligatorio TargetItemDto[] By active time descending, then key.
levelContextobligatorio LevelContextDto
nextCursor string | null
toobligatorio string (date)
totalobligatorio integer (int32) Targets matching the filters (before paging).
totalActiveMsobligatorio integer (int64) Active time over every target of the type before the filters (the percentage base).
typeobligatorio string app, domain or host.

TaskDto

A task.

CampoTipoDescripción
archivedobligatorio boolean
assignee NamedRefDto | null
createdAtobligatorio string (date-time)
description string | null
dueDate string (date) | null
effectiveBillableobligatorio boolean
estimateMinutes integer (int64) | null
idobligatorio string (uuid)
isBillable boolean | null null takes the project's value.
nameobligatorio string
permissionsobligatorio TaskPermissionsDto
projectIdobligatorio string (uuid)
sortOrderobligatorio integer (int64)
spentMsobligatorio integer (int64)
statusobligatorio string open, in_progress or done.
updatedAtobligatorio string (date-time)

TaskPage

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

CampoTipoDescripción
itemsobligatorio TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

CampoTipoDescripción
deleteobligatorio boolean Only a task without time.
editobligatorio boolean

TaskRequest

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

CampoTipoDescripción
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).

CampoTipoDescripción
archivedAt string | null
createdAtobligatorio string
description string | null
idobligatorio string (uuid)
leadsobligatorio object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountobligatorio integer (int64) Members whose primary team this is (left members excluded).
nameobligatorio string
updatedAtobligatorio string

TeamPage

A page of teams (OpenAPI).

CampoTipoDescripción
itemsobligatorio TeamDto[]
nextCursor string | null

TeamPeriodsDto

CampoTipoDescripción
periodsobligatorio ReportPeriodDto[]
teamIdobligatorio string (uuid)
teamName string | null
totalsobligatorio ReportFiguresDto

TeamTotalDto

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

CampoTipoDescripción
absenceCreditMsobligatorio integer (int64)
absentDaysobligatorio integer (int32)
activeMsobligatorio integer (int64)
activeUserCountobligatorio integer (int32)
effectivenessPct number (double) | null
holidayDaysobligatorio number (double)
idleMsobligatorio integer (int64)
lateDaysobligatorio integer (int32)
leaveDaysobligatorio number (double)
leftEarlyDaysobligatorio integer (int32)
memberCountobligatorio integer (int32)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
overtimeMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null
shiftDaysobligatorio integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMsobligatorio integer (int64)
workedMsobligatorio integer (int64)

TimeEntryDecisionRequest

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

CampoTipoDescripción
decision string | null approve or reject.
note string | null At most 500 characters.

TimeEntryDto

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

CampoTipoDescripción
createdAtobligatorio string (date-time)
createdByobligatorio TimeEntryUserRefDto
dateobligatorio 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
durationMsobligatorio integer (int64)
endobligatorio string (date-time)
idobligatorio string (uuid)
kindobligatorio string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionsobligatorio TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourceobligatorio string manual (Phase 8 adds calendar).
startobligatorio string (date-time)
statusobligatorio string pending, approved or rejected.
timeZoneobligatorio string
updatedAtobligatorio string (date-time)
userIdobligatorio string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

CampoTipoDescripción
itemsobligatorio TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

CampoTipoDescripción
canApproveobligatorio boolean
canDeleteobligatorio boolean
canEditobligatorio boolean

TimeEntryUserRefDto

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

CampoTipoDescripción
fullName string | null
idobligatorio string (uuid)

TimeIntervalDto

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

CampoTipoDescripción
endobligatorio string (date-time)
startobligatorio string (date-time)

TimerAtRequest

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

CampoTipoDescripción
at string (date-time) | null

TimerCommandResultDto

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

CampoTipoDescripción
appliedobligatorio boolean
closedobligatorio AllocationDto[] The allocations written from the segment this command closed (may be empty).
reason string | null stale, not_running or unchanged; null when applied.
timerobligatorio TimerDto

TimerDto

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

CampoTipoDescripción
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
serverTimeobligatorio 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
stateobligatorio string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

CampoTipoDescripción
endReasonobligatorio string stop, switch, autostop or discard.
endedAtobligatorio string (date-time)
segmentIdobligatorio string (uuid)
startedAtobligatorio string (date-time)

TimerProjectDto

The project of the running segment.

CampoTipoDescripción
clientName string | null
color string | null
idobligatorio string (uuid)
nameobligatorio string

TimerStartRequest

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

CampoTipoDescripción
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).

CampoTipoDescripción
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).

CampoTipoDescripción
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.

CampoTipoDescripción
daysobligatorio UserDayDto[]
fromobligatorio string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZoneobligatorio string
toobligatorio string (date)
userIdobligatorio string (uuid)

UserDayDto

CampoTipoDescripción
absence DayAbsenceDto | null
absenceCreditMsobligatorio integer (int64)
activeMsobligatorio integer (int64)
afkCoverageobligatorio boolean
arrivalAt string (date-time) | null
atWorkMsobligatorio integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedobligatorio boolean
dateobligatorio string (date)
dayOffWorkedMsobligatorio integer (int64)
deletedMsobligatorio integer (int64)
effectivenessPct number (double) | null
eventCountobligatorio integer (int64)
expectedWorkMsobligatorio integer (int64)
holiday DailyHolidayDto | null
idleMsobligatorio integer (int64)
lateByMsobligatorio integer (int64)
leftAt string (date-time) | null
leftEarlyobligatorio boolean
leftEarlyByMsobligatorio integer (int64)
meetingMsobligatorio integer (int64)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
overtimeMsobligatorio integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null
shiftCountobligatorio integer (int32)
targetMsobligatorio integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMsobligatorio integer (int64)
workday boolean | null
workedMsobligatorio integer (int64)

UserTotalDto

One user of a summary.

CampoTipoDescripción
absenceCreditMsobligatorio integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDaysobligatorio integer (int32) Local days with active time.
activeMsobligatorio integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMsobligatorio integer (int64)
classifiedDaysobligatorio integer (int32)
dayOffWorkedMsobligatorio integer (int64)
deletedMsobligatorio integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountobligatorio integer (int64)
fullName string | null
holidayDaysobligatorio number (double)
idleMsobligatorio integer (int64)
lateDays integer (int32) | null
leaveDaysobligatorio number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMsobligatorio integer (int64)
neutralMsobligatorio integer (int64)
offlineMsobligatorio integer (int64)
overtimeDaysobligatorio integer (int32)
overtimeMsobligatorio integer (int64)
privateMsobligatorio integer (int64)
productiveMsobligatorio integer (int64)
productivityPct number (double) | null
shiftDaysobligatorio integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZoneobligatorio string
unproductiveMsobligatorio integer (int64)
userIdobligatorio string (uuid)
workdays integer (int32) | null
workedMsobligatorio integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

CampoTipoDescripción
attemptsobligatorio integer (int32)
createdAtobligatorio string
deliveredAt string | null
eventIdobligatorio string (uuid) The webhook-id header.
eventTypeobligatorio string
idobligatorio 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
statusobligatorio string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

CampoTipoDescripción
itemsobligatorio WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

CampoTipoDescripción
createdAtobligatorio string
description string | null
eventTypesobligatorio string[]
idobligatorio string (uuid)
ownerobligatorio 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).
secretPrefixobligatorio string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statsobligatorio WebhookEndpointStatsDto
statusobligatorio string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtobligatorio string
urlobligatorio string
versionobligatorio integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

CampoTipoDescripción
itemsobligatorio WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

CampoTipoDescripción
consecutiveFailuresobligatorio integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

CampoTipoDescripción
availableobligatorio boolean The tenant's plan has the feature: an endpoint may subscribe.
descriptionobligatorio string One English sentence (the panel translates by type).
feature string | null The plan feature the event needs (null: every plan with api_access).
objectobligatorio string The data.object of the delivery body.
typeobligatorio string <object>.<verb>, e.g. time_entry.approved.

WebhookEventsDto

GET /v1/webhook-events.

CampoTipoDescripción
itemsobligatorio WebhookEventDto[]

WebhookTestDto

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

CampoTipoDescripción
deliveryIdobligatorio string The delivery of the test event (a string: the deliveries' id is a 64-bit integer).