Riferimento dell'API pubblica

L'API pubblica di Workify360 Focus consente ai tuoi script e strumenti di leggere report e dati sul tempo e di apportare modifiche con le stesse regole della dashboard. L'API pubblica, le chiavi API e i webhook fanno parte del piano Premium.

Le operazioni di questa pagina restano retrocompatibili. Il documento OpenAPI delle stesse operazioni, in formato leggibile dalle macchine:

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

Generato dalla versione 0.1.0 del contratto dell'API (c95fb97bb49a).

Autenticazione

Invia una chiave API personale nell'header Authorization di ogni richiesta. Una chiave appartiene alla persona che l'ha creata, agisce come quella persona e non fa mai più di quanto consenta il suo ruolo attuale. Una richiesta con una chiave mancante, errata, scaduta o revocata riceve 401 con il codice unauthorized.

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

Come creare chiavi, assegnare loro gli scope e revocarle: Chiavi API e API pubblica

Scope

Ogni operazione richiede uno scope, indicato accanto a ciascuna. Una chiave può usare un'operazione quando possiede quello scope e il ruolo, i team e il piano attuali del suo titolare consentono la richiesta, esattamente come nella dashboard.

ScopeCosa consente
meIl tuo profilo e il tuo timer
reports:readLettura di report, voci di tempo, assenze, turni, team, progetti, task ed esportazioni
time:writeAggiunta e modifica di voci di tempo, assenze, turni, task e tempo assegnato ai task, e approvazione o rifiuto delle richieste
org:adminGestione di membri, team, inviti e progetti
webhooks:manageGestione degli endpoint webhook

Limiti di frequenza

Ogni chiave può inviare 600 unità al minuto e un'organizzazione 1.800 per tutte le sue chiavi insieme. Una richiesta che modifica qualcosa (qualsiasi metodo diverso da GET e HEAD) conta come due unità, qualsiasi altra richiesta come una. Una chiave può inoltre inviare al massimo 60 unità in una volta, ricaricate a 10 al secondo: più di 60 letture (o 30 modifiche) inviate a raffica ricevono 429 anche restando sotto le 600 al minuto.

HeaderSignificato
RateLimit: "key";r=598;t=2In ogni risposta conteggiata: le unità rimaste alla chiave e i secondi che mancano al ripristino completo
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60In ogni risposta conteggiata: i limiti al minuto della chiave e dell'organizzazione
Retry-After: 12Con 429 (codice rate_limited): i secondi da attendere prima della richiesta successiva

Errori

Un errore è un problem document RFC 9457 (Content-Type: application/problem+json). code è un codice snake_case stabile, da usare nella logica del tuo programma; title è un testo in inglese per i log. type è l'indirizzo della guida del codice, https://workify360.com/help/errors/<code>/ con ogni _ scritto come -, che apre l'articolo della guida che spiega il codice, quando esiste.

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

Alcuni problemi contengono campi aggiuntivi: errors (gli errori sui campi di 422 validation_failed), action (il permesso a cui si riferisce un 403 forbidden), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 e 503) e traceId (indicalo quando contatti l'assistenza).

StatoCodiceQuando
400 invalid_request Un parametro è malformato o mancante
401 unauthorized La chiave è mancante, errata, scaduta o revocata, oppure il suo titolare ha lasciato l'organizzazione
402 feature_not_in_plan, subscription_read_only Il piano non include la funzionalità, oppure l'abbonamento è in sola lettura
403 forbidden, feature_not_enabled Alla chiave manca lo scope, oppure il ruolo, i team o le impostazioni attuali del suo titolare non consentono la richiesta
412 version_conflict La versione in If-Match non è più quella attuale; rileggi la risorsa
422 validation_failed Il body non è valido; errors elenca i campi
428 precondition_required L'operazione richiede un header If-Match con la versione che hai letto
429 rate_limited Troppe richieste; attendi i secondi indicati in Retry-After

I codici che hanno un articolo nella guida sono link nell'elenco delle operazioni.

Webhook

Invece di interrogare l'API più e più volte, un tuo endpoint può ricevere una richiesta HTTPS firmata quando qualcosa cambia. Gli eventi, il formato della richiesta, come verificare la firma in Node.js e Python, i tentativi ripetuti e la rotazione del segreto sono spiegati nell'articolo della guida: Webhook

Operazioni

Raggruppate per area. I riepiloghi e le descrizioni dei campi provengono dal contratto dell'API.

Assenze

GET /v1/absences Scope: reports:read

List absences overlapping a range.

Parametri
NomePosizioneTipoDescrizione
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)
Risposte
200 AbsencePage
Errori

POST /v1/absences Scope: time:write

Request (or record) an absence.

Parametri
NomePosizioneTipoDescrizione
Idempotency-Keyobbligatorio header string Required: the same key and body return the first answer
Body della richiesta
AbsenceRequest
Risposte
201 AbsenceDto
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Id
If-Matchobbligatorio header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body della richiesta
CalendarDecisionRequest
Risposte
200 AbsenceDto
Errori

Attività

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

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

Parametri
NomePosizioneTipoDescrizione
date query string (date) The user's local day (required).
userId query string (uuid) Default: the caller; another user must be visible (else 403).
Risposte
200 ActivityDayDto
Errori

Assegnazioni del tempo

GET /v1/allocations Scope: 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).

Parametri
NomePosizioneTipoDescrizione
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).
Risposte
200 AllocationPage
Errori

POST /v1/allocations Scope: time:write

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

Parametri
NomePosizioneTipoDescrizione
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Body della richiesta
AllocationCreateRequest
Risposte
201 AllocationCreatedDto
Errori

Esportazioni

POST /v1/exports Scope: reports:read

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

Parametri
NomePosizioneTipoDescrizione
Idempotency-Keyobbligatorio header string Required: the same key and body return the first answer
Body della richiesta
CreateExportRequest
Risposte
202 ExportJobDto
Errori

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

One export job (poll every 2 s).

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Id
Risposte
200 ExportJobDto
Errori

Il mio profilo

GET /v1/me Scope: me

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

Risposte
200 MeDto
Errori

Membri

GET /v1/members Scope: org:admin

List members.

Parametri
NomePosizioneTipoDescrizione
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
Risposte
200 MemberPage
Errori
  • 403 No right

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

One member.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Membership id
Risposte
200 MemberDto
Errori
  • 404 member_not_found

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Membership id
If-Matchobbligatorio header string ETag of the member ("v<n>")
Body della richiesta
PatchMember
Risposte
200 MemberDto
Errori

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

Reactivate a suspended member.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Membership id
Risposte
200 MemberDto

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Membership id
Risposte
200 MemberDto
Errori
  • 409 conflict (an invitation is revoked instead)

Progetti

GET /v1/projects Scope: 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).

Parametri
NomePosizioneTipoDescrizione
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).
Risposte
200 ProjectPage
Errori

POST /v1/projects Scope: org:admin

Add a project (Owners and Admins).

Parametri
NomePosizioneTipoDescrizione
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Body della richiesta
ProjectRequest
Risposte
201 ProjectDto
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Project id
If-Matchobbligatorio header string The ETag the caller read (412 version_conflict when it changed)
Body della richiesta
ProjectRequest
Risposte
200 ProjectDto
Errori

Report

GET /v1/reports/productivity Scope: reports:read

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

Parametri
NomePosizioneTipoDescrizione
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)
Risposte
200 PeriodReportDto
Errori

GET /v1/reports/projects Scope: 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.

Parametri
NomePosizioneTipoDescrizione
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).
Risposte
200 ProjectReportDto
Errori

GET /v1/reports/summary Scope: reports:read

The summary of the visible users over a range.

Parametri
NomePosizioneTipoDescrizione
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).
Risposte
200 SummaryDto
Errori

GET /v1/reports/targets Scope: reports:read

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

Parametri
NomePosizioneTipoDescrizione
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.
Risposte
200 TargetListDto
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
userIdobbligatorio path string (uuid) User
from query string (date)
to query string (date) At most 93 days after from.
Risposte
200 UserDailyDto
Errori

Turni

GET /v1/shifts Scope: reports:read

List the shifts starting in a range.

Parametri
NomePosizioneTipoDescrizione
from query string (date)
to query string (date)
teamId query string (uuid)
userId query string (uuid)
includeOpen query boolean Also open shifts (default true).
Risposte
200 ShiftListDto
Errori

POST /v1/shifts Scope: time:write

Create a shift (assigned or open).

Parametri
NomePosizioneTipoDescrizione
Idempotency-Keyobbligatorio header string Required: the same key and body return the first answer
Body della richiesta
ShiftBody
Risposte
201 ShiftDto
Errori

Task

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

A visible project's tasks, by sort order.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path 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).
Risposte
200 TaskPage
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Project id
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Body della richiesta
TaskRequest
Risposte
201 TaskDto
Errori

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

Change a task (the whole body).

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Task id
If-Matchobbligatorio header string The ETag the caller read (412 version_conflict when it changed)
Body della richiesta
TaskRequest
Risposte
200 TaskDto
Errori

Team

GET /v1/teams Scope: reports:read

List teams.

Parametri
NomePosizioneTipoDescrizione
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
Risposte
200 TeamPage

POST /v1/teams Scope: org:admin

Create a team (the G1 endpoint).

Body della richiesta
CreateTeam
Risposte
201 TeamDto
Errori
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

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

Rename a team or change its description.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Team id
If-Matchobbligatorio header string ETag of the team
Body della richiesta
PatchTeam
Risposte
200 TeamDto
Errori
  • 409 team_name_taken

Voci di tempo

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

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

Parametri
NomePosizioneTipoDescrizione
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.
Risposte
200 TimeEntryPage
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
Idempotency-Keyobbligatorio header string Required: the same key and body return the first answer
Body della richiesta
CreateTimeEntryRequest
Risposte
201 TimeEntryDto
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Entry id
Risposte
200 TimeEntryDto
Errori

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

Replace an entry's editable fields.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Entry id
If-Matchobbligatorio header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body della richiesta
UpdateTimeEntryRequest
Risposte
200 TimeEntryDto
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Entry id
If-Matchobbligatorio header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Risposte
204 (nessun body)
Errori

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) Entry id
If-Matchobbligatorio header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body della richiesta
TimeEntryDecisionRequest
Risposte
200 TimeEntryDto
Errori

Timer

GET /v1/me/timer Scope: me

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

Parametri
NomePosizioneTipoDescrizione
If-None-Match header string | null The ETag the caller holds (304 when unchanged)
Risposte
200 TimerDto · 304 (nessun body)
Errori

POST /v1/me/timer/start Scope: me

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

Parametri
NomePosizioneTipoDescrizione
Idempotency-Key header string | null The client's command id; a retry returns the first answer
Body della richiesta
TimerStartRequest
Risposte
200 TimerCommandResultDto
Errori

Webhook

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

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

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) The endpoint
If-Matchobbligatorio header string The endpoint's ETag ("v<n>")
Body della richiesta
UpdateWebhookEndpointRequest
Risposte
200 WebhookEndpointDto
Errori

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

Delete an endpoint and its deliveries.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path string (uuid) The endpoint
Risposte
204 (nessun body)
Errori

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

The deliveries of an endpoint, newest first.

Parametri
NomePosizioneTipoDescrizione
idobbligatorio path 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.
Risposte
200 WebhookDeliveryPage
Errori

Schemi

I body di richiesta e risposta usati dalle operazioni. I campi obbligatori sono contrassegnati.

AbsenceDto

An absence.

CampoTipoDescrizione
createdAtobbligatorio string (date-time)
createdByobbligatorio CalendarUserRefDto
daysobbligatorio 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
deductionByYearobbligatorio object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endobbligatorio string (date-time)
endDateobbligatorio string (date)
endTime string | null
half string | null
idobbligatorio string (uuid)
note string | null
permissionsobbligatorio AbsencePermissionsDto
startobbligatorio string (date-time) UTC coverage start.
startDateobbligatorio string (date)
startTime string | null
statusobbligatorio string
timeZoneobbligatorio string
typeobbligatorio AbsenceTypeRefDto
unitobbligatorio string
updatedAtobbligatorio string (date-time)
userobbligatorio CalendarPersonDto
userIdobbligatorio string (uuid)

AbsencePage

GET /v1/absences.

CampoTipoDescrizione
itemsobbligatorio AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

CampoTipoDescrizione
canApproveobbligatorio boolean
canCancelobbligatorio boolean
canEditobbligatorio boolean

AbsenceRequest

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

CampoTipoDescrizione
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.

CampoTipoDescrizione
colorobbligatorio string
countsAsWorkedobbligatorio boolean
deductsFromBalanceobbligatorio boolean
idobbligatorio string (uuid)
key string | null
nameobbligatorio string
paidobbligatorio boolean
timeEffectobbligatorio string

AcceptedDto

202 Accepted of a queued job.

CampoTipoDescrizione
acceptedobbligatorio boolean Always true.

AccessDto

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

CampoTipoDescrizione
assignableRolesobbligatorio string[]
canManageCompanySettingsobbligatorio boolean
canManageTeamsobbligatorio boolean
canManageUsersobbligatorio boolean
manageTeamIdsobbligatorio string[]
scopeobbligatorio string company, teams or self.
unassignedFallbackobbligatorio boolean
viewTeamIdsobbligatorio string[]

ActivityDayDto

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

CampoTipoDescrizione
absenceCreditMsobbligatorio integer (int64) A worked absence tops the worked time up to the expected work.
activeMsobbligatorio integer (int64) Window time ∩ not AFK (computer time only).
afkCoverageobbligatorio boolean False when no device reported AFK data (idle unknown).
appsobbligatorio AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMsobbligatorio integer (int64)
attendance DayAttendanceDto | null
categoriesobbligatorio CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedobbligatorio boolean False for a day written before the Phase 2 classification (all neutral).
dateobbligatorio string (date)
dayEndobbligatorio string (date-time)
dayStartobbligatorio string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMsobbligatorio integer (int64) Tracked time removed by approved deletions (part of idle).
domainsobbligatorio DomainUsageDto[]
hostsobbligatorio HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMsobbligatorio integer (int64)
leftAt string (date-time) | null
meetingMsobbligatorio integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMsobbligatorio integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMsobbligatorio integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalsobbligatorio TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMsobbligatorio integer (int64) Private time outside active and offline time.
productivityobbligatorio DayProductivityDto
recomputingobbligatorio boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotsobbligatorio 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).
timeEntriesobbligatorio TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZoneobbligatorio string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdobbligatorio string (uuid)
workedMsobbligatorio integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
appsobbligatorio AppUsageDto[]
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
slotStartobbligatorio string (date-time)
unproductiveMsobbligatorio integer (int64)

AffectedAllocationDto

An allocation replace changed.

CampoTipoDescrizione
changeobbligatorio string trimmed, split or deleted.
idobbligatorio string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

CampoTipoDescrizione
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.

CampoTipoDescrizione
affectedobbligatorio AffectedAllocationDto[]
allocationobbligatorio AllocationDto

AllocationDto

Time on a project.

CampoTipoDescrizione
createdAtobbligatorio string (date-time)
createdByobbligatorio NamedRefDto
durationMsobbligatorio integer (int64)
effectiveBillableobbligatorio boolean
endedAtobbligatorio string (date-time)
idobbligatorio 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.
localDateobbligatorio string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionsobbligatorio AllocationPermissionsDto
projectobbligatorio ProjectRefDto
sourceobbligatorio string timer, manual or assignment.
startedAtobbligatorio string (date-time)
task NamedRefDto | null
timeZoneobbligatorio string
updatedAtobbligatorio string (date-time)
userIdobbligatorio string (uuid)
versionobbligatorio integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

CampoTipoDescrizione
itemsobbligatorio AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

CampoTipoDescrizione
deleteobbligatorio boolean
editobbligatorio boolean

AppTotalDto

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
appKeyobbligatorio string
categoryKey string | null
level string | null Level in the response's levelContext.
nameobbligatorio string
percentageobbligatorio 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".

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
appKeyobbligatorio string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
nameobbligatorio string

BudgetDto

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

CampoTipoDescrizione
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).

CampoTipoDescrizione
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).

CampoTipoDescrizione
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

CampoTipoDescrizione
fullName string | null
idobbligatorio string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

CampoTipoDescrizione
fullName string | null
idobbligatorio string (uuid)

CapabilitiesDto

Subscription capabilities.

CampoTipoDescrizione
featuresobbligatorio string[]
readOnlyobbligatorio boolean

CategoryUsageDto

CampoTipoDescrizione
activeMsobbligatorio 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.

CampoTipoDescrizione
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.

CampoTipoDescrizione
emailobbligatorio string
fullNameobbligatorio string
locale string | null Language of the e-mail and the acceptance page (tr, en); the organization's default otherwise.
roleobbligatorio string admin, team_admin, manager or employee.
teamId string (uuid) | null
timeZone string | null
viewerTeamIds string (uuid)[]

CreateTeam

POST /v1/teams.

CampoTipoDescrizione
description string | null At most 500 characters.
nameobbligatorio string 1–100 characters, unique among active teams (Turkish case folding).

CreateTimeEntryRequest

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

CampoTipoDescrizione
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.

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

CreatedWebhookEndpointDto

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

CampoTipoDescrizione
endpointobbligatorio WebhookEndpointDto
secretobbligatorio string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

CampoTipoDescrizione
half string | null
keyobbligatorio string
nameobbligatorio string English name; nameTr is the Turkish one.
nameTrobbligatorio string

DayAbsenceDto

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

CampoTipoDescrizione
colorobbligatorio string
fractionobbligatorio number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitobbligatorio string

DayAttendanceDto

Attendance of the day on the day plan.

CampoTipoDescrizione
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexibleobbligatorio boolean
lateByMsobbligatorio integer (int64)
lateToleranceMinutesobbligatorio integer (int32)
leftEarlyobbligatorio boolean
leftEarlyByMsobbligatorio integer (int64)
statusobbligatorio string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMsobbligatorio integer (int64) The plan's target (the Effectiveness % denominator).
workdayobbligatorio boolean

DayPlanDto

The day plan of one user's day.

CampoTipoDescrizione
absencesobbligatorio PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMsobbligatorio integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindobbligatorio string schedule, shift, dayOff or holiday.
leaveFractionobbligatorio number (double) The approved absence coverage f (0–1).
shiftsobbligatorio PlanShiftDto[] Shifts starting on the day, by start.
targetMsobbligatorio integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayobbligatorio boolean

DayProductivityDto

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

CampoTipoDescrizione
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMsobbligatorio integer (int64)
unproductiveMsobbligatorio integer (int64)

DayTotalDto

One local day of a summary.

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
activeUserCountobbligatorio integer (int32)
atWorkMsobbligatorio integer (int64)
dateobbligatorio string (date)
idleMsobbligatorio integer (int64)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
privateMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null
unproductiveMsobbligatorio integer (int64)

DomainTotalDto

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
categoryKey string | null
domainobbligatorio string
level string | null
percentageobbligatorio number (double)

DomainUsageDto

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
categoryKey string | null
domainobbligatorio 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).

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

CampoTipoDescrizione
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.

CampoTipoDescrizione
includeInactiveUsers boolean
teamId string | null
userIds string | null[] | null

ExportJobDto

An export job as the panel lists and polls it.

CampoTipoDescrizione
createdAtobbligatorio string (date-time)
datasetobbligatorio 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
formatobbligatorio string
fromobbligatorio string (date)
groupBy string | null
idobbligatorio string (uuid)
localeobbligatorio string
progressobbligatorio integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statusobbligatorio 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.
toobbligatorio string (date)

ExportOptionsDto

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

CampoTipoDescrizione
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.

CampoTipoDescrizione
codeobbligatorio string Stable snake_case code (required, too_long, invalid, ...).
fieldobbligatorio 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).

CampoTipoDescrizione
half string | null
keyobbligatorio string Built-in key (republic_day, …) or custom.
nameobbligatorio string
nameEnobbligatorio string
nameTrobbligatorio string
source string | null builtin or tenant.

HostUsageDto

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
domain string | null
hostobbligatorio string
levelobbligatorio string
levelSourceobbligatorio string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

CampoTipoDescrizione
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).
statusobbligatorio 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.

CampoTipoDescrizione
expiresAtobbligatorio string
idobbligatorio string (uuid)

InvitationResult

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

CampoTipoDescrizione
emailobbligatorio InvitationEmail
invitationobbligatorio InvitationRef
memberobbligatorio MemberDto

LevelContextDto

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

CampoTipoDescrizione
kindobbligatorio string user (a userId filter: that user's current team), team (a teamId filter) or company.
teamId string (uuid) | null

MeDto

GET /v1/me.

CampoTipoDescrizione
accessobbligatorio AccessDto
capabilitiesobbligatorio CapabilitiesDto
effectiveTimeZoneobbligatorio string
membershipobbligatorio MeMembership
organizationobbligatorio MeOrganization
organizationsobbligatorio OrganizationChoice[]
session MeSession | null
userobbligatorio MeUser

MeMembership

The membership in the current organization.

CampoTipoDescrizione
idobbligatorio string (uuid)
isTrackedobbligatorio boolean
joinedAt string | null
roleobbligatorio string
statusobbligatorio string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdsobbligatorio string (uuid)[]

MeOrganization

The current organization.

CampoTipoDescrizione
defaultLocaleobbligatorio string
idobbligatorio string (uuid)
nameobbligatorio string
slugobbligatorio string
statusobbligatorio string
timeZoneobbligatorio string

MeSession

The current session.

CampoTipoDescrizione
absoluteExpiresAtobbligatorio string
amrobbligatorio string[]
authTimeobbligatorio string
clientIdobbligatorio string
idobbligatorio string (uuid)
idleExpiresAtobbligatorio string

MeUser

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

CampoTipoDescrizione
emailobbligatorio string
emailVerificationobbligatorio EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedobbligatorio boolean
fullName string | null
idobbligatorio string (uuid)
localeobbligatorio string

MemberDto

A membership with its person (MemberDto).

CampoTipoDescrizione
createdAtobbligatorio string
emailobbligatorio string
emailVerifiedobbligatorio boolean
fullName string | null
idobbligatorio string (uuid)
invitation MemberInvitationDto | null
isTrackedobbligatorio boolean
joinedAt string | null
localeobbligatorio string
roleobbligatorio string owner, admin, team_admin, manager, employee.
statusobbligatorio string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerobbligatorio boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdobbligatorio string (uuid)
viewerTeamIdsobbligatorio string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

CampoTipoDescrizione
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.
expiresAtobbligatorio string
idobbligatorio string (uuid)
lastSentAtobbligatorio string
sentCountobbligatorio integer (int32)

MemberPage

A page of members (OpenAPI).

CampoTipoDescrizione
itemsobbligatorio MemberDto[]
nextCursor string | null

MemberRefDto

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

CampoTipoDescrizione
activeobbligatorio boolean The membership is active and (for an endpoint or a tenant connection) still an Owner or Admin.
name string | null
userIdobbligatorio string (uuid)

NamedRefDto

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

CampoTipoDescrizione
idobbligatorio string (uuid)
nameobbligatorio string

OrganizationChoice

One organization of the person (sec.user_memberships).

CampoTipoDescrizione
currentobbligatorio boolean
idobbligatorio string (uuid)
nameobbligatorio string
roleobbligatorio string
selectableobbligatorio boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

CampoTipoDescrizione
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}.

CampoTipoDescrizione
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

CampoTipoDescrizione
fromobbligatorio string (date)
groupByobbligatorio string
levelContextobbligatorio LevelContextDto
periodsobbligatorio ReportPeriodDto[]
subjectobbligatorio ReportSubjectDto
teamsobbligatorio TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
toobbligatorio string (date)
totalsobbligatorio ReportFiguresDto

PlanAbsenceDto

CampoTipoDescrizione
colorobbligatorio string
countsAsWorkedobbligatorio boolean timeEffect == worked.
endTime string | null
half string | null
idobbligatorio string (uuid)
startTime string | null Local start and end of an hours absence.
statusobbligatorio string approved or pending.
timeEffectobbligatorio 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).
unitobbligatorio string days, half_day or hours.

PlanShiftDto

CampoTipoDescrizione
color string | null
endobbligatorio string (date-time)
endTimeobbligatorio string Local end; before the start for a night shift.
idobbligatorio string (uuid)
locationobbligatorio string
minMinutesobbligatorio integer (int32)
startobbligatorio string (date-time)
startTimeobbligatorio string Local start (HH:mm, the shift's zone).

Problem

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

CampoTipoDescrizione
action string | null Permission key of a 403 (teams.create).
codeobbligatorio 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).
statusobbligatorio integer (int32)
titleobbligatorio string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typeobbligatorio 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).

CampoTipoDescrizione
billableMinorobbligatorio integer (int64) The billable hours at their rate.
costMinorobbligatorio integer (int64) Every allocated hour at its rate.
currencyobbligatorio string

ProjectBudgetUsageDto

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

CampoTipoDescrizione
budgetMinor integer (int64) | null null unless costsIncluded.
budgetMinutes integer (int64) | null
kindobbligatorio string hours or amount.
projectIdobbligatorio string (uuid)
usedMinor integer (int64) | null The cost in the project's currency; null unless costsIncluded.
usedMsobbligatorio integer (int64)
usedRatio string | null Used / budget, 4 decimals (null for an amount budget without costsIncluded).

ProjectDto

A project.

CampoTipoDescrizione
accessobbligatorio string everyone or members.
archivedobbligatorio boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtobbligatorio string (date-time)
currencyobbligatorio string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idobbligatorio string (uuid)
isBillableobbligatorio boolean
memberCountobbligatorio integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
nameobbligatorio string
permissionsobbligatorio ProjectPermissionsDto
spentMsobbligatorio integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statusobbligatorio string active, on_hold or completed.
taskCountobbligatorio integer (int64)
updatedAtobbligatorio string (date-time)

ProjectPage

GET /v1/projects.

CampoTipoDescrizione
itemsobbligatorio ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

CampoTipoDescrizione
archiveobbligatorio boolean
deleteobbligatorio boolean Only a project without time.
editobbligatorio boolean The project's fields (Owners and Admins).
manageMembersobbligatorio boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTasksobbligatorio boolean Tasks (an Admin or the project's manager).
trackobbligatorio boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

CampoTipoDescrizione
color string | null #RRGGBB.
idobbligatorio string (uuid)
nameobbligatorio string

ProjectReportDto

GET /v1/reports/projects.

CampoTipoDescrizione
budgetsobbligatorio ProjectBudgetUsageDto[]
costsIncludedobbligatorio boolean The caller sees rates and amounts (projects.costs.read).
fromobbligatorio string (date)
groupByobbligatorio string[]
rowsobbligatorio ProjectReportRowDto[]
toobbligatorio string (date)
totalsobbligatorio ProjectReportTotalsDto

ProjectReportKeysDto

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

CampoTipoDescrizione
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.

CampoTipoDescrizione
allocatedMsobbligatorio integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMsobbligatorio integer (int64)
keysobbligatorio ProjectReportKeysDto
nonBillableMsobbligatorio integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMsobbligatorio integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

CampoTipoDescrizione
allocatedMsobbligatorio integer (int64)
amounts ProjectAmountDto[] | null
billableMsobbligatorio integer (int64)
nonBillableMsobbligatorio integer (int64)
productiveMs integer (int64) | null
unratedMsobbligatorio integer (int64)

ProjectRequest

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

CampoTipoDescrizione
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).

CampoTipoDescrizione
absenceCreditMsobbligatorio integer (int64)
absentDaysobbligatorio integer (int32)
activeMsobbligatorio integer (int64)
activeUserCountobbligatorio integer (int32)
effectivenessPct number (double) | null
idleMsobbligatorio integer (int64)
lateDaysobbligatorio integer (int32)
leaveDaysobbligatorio number (double)
leftEarlyDaysobbligatorio integer (int32)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
overtimeDaysobbligatorio integer (int32)
overtimeMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null
targetMsobbligatorio integer (int64)
unproductiveMsobbligatorio integer (int64)
userCountobbligatorio integer (int32)
workedMsobbligatorio 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).

CampoTipoDescrizione
kindobbligatorio string company, teams or self.
teamIdsobbligatorio string (uuid)[] The visible teams of a teams scope, sorted; empty otherwise (company = all).
unassignedFallbackobbligatorio boolean A Manager without teams who sees the whole company until assigned.

ReportSubjectDto

Whom a report is about.

CampoTipoDescrizione
id string (uuid) | null
kindobbligatorio string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

CampoTipoDescrizione
previousSecretExpiresAtobbligatorio string Until then deliveries carry both signatures.
secretobbligatorio 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.

CampoTipoDescrizione
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.

CampoTipoDescrizione
breakMinutesobbligatorio integer (int32)
color string | null
createdAtobbligatorio string (date-time)
createdByobbligatorio CalendarUserRefDto
crossesMidnightobbligatorio boolean
dateobbligatorio string (date)
durationMinutesobbligatorio integer (int32)
endobbligatorio string (date-time)
endTimeobbligatorio string
idobbligatorio string (uuid)
locationobbligatorio string
minMinutesobbligatorio integer (int32)
note string | null
openobbligatorio boolean No user assigned.
permissionsobbligatorio ShiftPermissionsDto
sourceobbligatorio string manual, template, copy or request.
startobbligatorio string (date-time)
startTimeobbligatorio 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
timeZoneobbligatorio string
updatedAtobbligatorio 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).

CampoTipoDescrizione
itemsobbligatorio ShiftDto[]

ShiftPermissionsDto

CampoTipoDescrizione
canDeleteobbligatorio boolean
canEditobbligatorio boolean
canPickUpobbligatorio boolean
canRequestSwapobbligatorio boolean

SummaryDto

The summary of the visible users over a range.

CampoTipoDescrizione
absenceCreditMsobbligatorio integer (int64)
absentDaysobbligatorio integer (int32)
activeMsobbligatorio integer (int64)
activeUserCountobbligatorio integer (int32)
atWorkMsobbligatorio integer (int64)
daysobbligatorio DayTotalDto[]
deletedMsobbligatorio integer (int64)
domainsobbligatorio DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromobbligatorio string (date)
holidayDaysobbligatorio number (double)
idleMsobbligatorio integer (int64)
inactiveUsersobbligatorio UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDaysobbligatorio integer (int32)
leaveDaysobbligatorio number (double)
leftEarlyDaysobbligatorio integer (int32)
levelContextobbligatorio LevelContextDto
meetingMsobbligatorio integer (int64)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
overtimeMsobbligatorio integer (int64)
privateMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopeobbligatorio ReportScopeDto
shiftDaysobbligatorio integer (int32)
teamsobbligatorio TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
toobbligatorio string (date)
topAppsobbligatorio AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMsobbligatorio integer (int64)
usersobbligatorio UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMsobbligatorio integer (int64)

TargetItemDto

CampoTipoDescrizione
activeMsobbligatorio integer (int64)
categoryKey string | null
categorySourceobbligatorio string tenant, builtin or none.
domain string | null
levelobbligatorio string
levelSourceobbligatorio string team, company or default.
matchedKey string | null
nameobbligatorio string
percentageobbligatorio number (double)
targetKeyobbligatorio string
targetTypeobbligatorio string app for apps, domain for domains and hosts.
userCountobbligatorio integer (int32)

TargetListDto

The "Apps & URLs" list.

CampoTipoDescrizione
fromobbligatorio string (date)
itemsobbligatorio TargetItemDto[] By active time descending, then key.
levelContextobbligatorio LevelContextDto
nextCursor string | null
toobbligatorio string (date)
totalobbligatorio integer (int32) Targets matching the filters (before paging).
totalActiveMsobbligatorio integer (int64) Active time over every target of the type before the filters (the percentage base).
typeobbligatorio string app, domain or host.

TaskDto

A task.

CampoTipoDescrizione
archivedobbligatorio boolean
assignee NamedRefDto | null
createdAtobbligatorio string (date-time)
description string | null
dueDate string (date) | null
effectiveBillableobbligatorio boolean
estimateMinutes integer (int64) | null
idobbligatorio string (uuid)
isBillable boolean | null null takes the project's value.
nameobbligatorio string
permissionsobbligatorio TaskPermissionsDto
projectIdobbligatorio string (uuid)
sortOrderobbligatorio integer (int64)
spentMsobbligatorio integer (int64)
statusobbligatorio string open, in_progress or done.
updatedAtobbligatorio string (date-time)

TaskPage

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

CampoTipoDescrizione
itemsobbligatorio TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

CampoTipoDescrizione
deleteobbligatorio boolean Only a task without time.
editobbligatorio boolean

TaskRequest

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

CampoTipoDescrizione
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).

CampoTipoDescrizione
archivedAt string | null
createdAtobbligatorio string
description string | null
idobbligatorio string (uuid)
leadsobbligatorio object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountobbligatorio integer (int64) Members whose primary team this is (left members excluded).
nameobbligatorio string
updatedAtobbligatorio string

TeamPage

A page of teams (OpenAPI).

CampoTipoDescrizione
itemsobbligatorio TeamDto[]
nextCursor string | null

TeamPeriodsDto

CampoTipoDescrizione
periodsobbligatorio ReportPeriodDto[]
teamIdobbligatorio string (uuid)
teamName string | null
totalsobbligatorio ReportFiguresDto

TeamTotalDto

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

CampoTipoDescrizione
absenceCreditMsobbligatorio integer (int64)
absentDaysobbligatorio integer (int32)
activeMsobbligatorio integer (int64)
activeUserCountobbligatorio integer (int32)
effectivenessPct number (double) | null
holidayDaysobbligatorio number (double)
idleMsobbligatorio integer (int64)
lateDaysobbligatorio integer (int32)
leaveDaysobbligatorio number (double)
leftEarlyDaysobbligatorio integer (int32)
memberCountobbligatorio integer (int32)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
overtimeMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null
shiftDaysobbligatorio integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMsobbligatorio integer (int64)
workedMsobbligatorio integer (int64)

TimeEntryDecisionRequest

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

CampoTipoDescrizione
decision string | null approve or reject.
note string | null At most 500 characters.

TimeEntryDto

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

CampoTipoDescrizione
createdAtobbligatorio string (date-time)
createdByobbligatorio TimeEntryUserRefDto
dateobbligatorio 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
durationMsobbligatorio integer (int64)
endobbligatorio string (date-time)
idobbligatorio string (uuid)
kindobbligatorio string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionsobbligatorio TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourceobbligatorio string manual (Phase 8 adds calendar).
startobbligatorio string (date-time)
statusobbligatorio string pending, approved or rejected.
timeZoneobbligatorio string
updatedAtobbligatorio string (date-time)
userIdobbligatorio string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

CampoTipoDescrizione
itemsobbligatorio TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

CampoTipoDescrizione
canApproveobbligatorio boolean
canDeleteobbligatorio boolean
canEditobbligatorio boolean

TimeEntryUserRefDto

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

CampoTipoDescrizione
fullName string | null
idobbligatorio string (uuid)

TimeIntervalDto

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

CampoTipoDescrizione
endobbligatorio string (date-time)
startobbligatorio string (date-time)

TimerAtRequest

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

CampoTipoDescrizione
at string (date-time) | null

TimerCommandResultDto

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

CampoTipoDescrizione
appliedobbligatorio boolean
closedobbligatorio AllocationDto[] The allocations written from the segment this command closed (may be empty).
reason string | null stale, not_running or unchanged; null when applied.
timerobbligatorio TimerDto

TimerDto

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

CampoTipoDescrizione
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
serverTimeobbligatorio 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
stateobbligatorio string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

CampoTipoDescrizione
endReasonobbligatorio string stop, switch, autostop or discard.
endedAtobbligatorio string (date-time)
segmentIdobbligatorio string (uuid)
startedAtobbligatorio string (date-time)

TimerProjectDto

The project of the running segment.

CampoTipoDescrizione
clientName string | null
color string | null
idobbligatorio string (uuid)
nameobbligatorio string

TimerStartRequest

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

CampoTipoDescrizione
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).

CampoTipoDescrizione
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).

CampoTipoDescrizione
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.

CampoTipoDescrizione
daysobbligatorio UserDayDto[]
fromobbligatorio string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZoneobbligatorio string
toobbligatorio string (date)
userIdobbligatorio string (uuid)

UserDayDto

CampoTipoDescrizione
absence DayAbsenceDto | null
absenceCreditMsobbligatorio integer (int64)
activeMsobbligatorio integer (int64)
afkCoverageobbligatorio boolean
arrivalAt string (date-time) | null
atWorkMsobbligatorio integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedobbligatorio boolean
dateobbligatorio string (date)
dayOffWorkedMsobbligatorio integer (int64)
deletedMsobbligatorio integer (int64)
effectivenessPct number (double) | null
eventCountobbligatorio integer (int64)
expectedWorkMsobbligatorio integer (int64)
holiday DailyHolidayDto | null
idleMsobbligatorio integer (int64)
lateByMsobbligatorio integer (int64)
leftAt string (date-time) | null
leftEarlyobbligatorio boolean
leftEarlyByMsobbligatorio integer (int64)
meetingMsobbligatorio integer (int64)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
overtimeMsobbligatorio integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null
shiftCountobbligatorio integer (int32)
targetMsobbligatorio integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMsobbligatorio integer (int64)
workday boolean | null
workedMsobbligatorio integer (int64)

UserTotalDto

One user of a summary.

CampoTipoDescrizione
absenceCreditMsobbligatorio integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDaysobbligatorio integer (int32) Local days with active time.
activeMsobbligatorio integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMsobbligatorio integer (int64)
classifiedDaysobbligatorio integer (int32)
dayOffWorkedMsobbligatorio integer (int64)
deletedMsobbligatorio integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountobbligatorio integer (int64)
fullName string | null
holidayDaysobbligatorio number (double)
idleMsobbligatorio integer (int64)
lateDays integer (int32) | null
leaveDaysobbligatorio number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMsobbligatorio integer (int64)
neutralMsobbligatorio integer (int64)
offlineMsobbligatorio integer (int64)
overtimeDaysobbligatorio integer (int32)
overtimeMsobbligatorio integer (int64)
privateMsobbligatorio integer (int64)
productiveMsobbligatorio integer (int64)
productivityPct number (double) | null
shiftDaysobbligatorio integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZoneobbligatorio string
unproductiveMsobbligatorio integer (int64)
userIdobbligatorio string (uuid)
workdays integer (int32) | null
workedMsobbligatorio integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

CampoTipoDescrizione
attemptsobbligatorio integer (int32)
createdAtobbligatorio string
deliveredAt string | null
eventIdobbligatorio string (uuid) The webhook-id header.
eventTypeobbligatorio string
idobbligatorio 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
statusobbligatorio string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

CampoTipoDescrizione
itemsobbligatorio WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

CampoTipoDescrizione
createdAtobbligatorio string
description string | null
eventTypesobbligatorio string[]
idobbligatorio string (uuid)
ownerobbligatorio 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).
secretPrefixobbligatorio string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statsobbligatorio WebhookEndpointStatsDto
statusobbligatorio string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtobbligatorio string
urlobbligatorio string
versionobbligatorio integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

CampoTipoDescrizione
itemsobbligatorio WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

CampoTipoDescrizione
consecutiveFailuresobbligatorio integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

CampoTipoDescrizione
availableobbligatorio boolean The tenant's plan has the feature: an endpoint may subscribe.
descriptionobbligatorio string One English sentence (the panel translates by type).
feature string | null The plan feature the event needs (null: every plan with api_access).
objectobbligatorio string The data.object of the delivery body.
typeobbligatorio string <object>.<verb>, e.g. time_entry.approved.

WebhookEventsDto

GET /v1/webhook-events.

CampoTipoDescrizione
itemsobbligatorio WebhookEventDto[]

WebhookTestDto

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

CampoTipoDescrizione
deliveryIdobbligatorio string The delivery of the test event (a string: the deliveries' id is a 64-bit integer).