Dokumentacja publicznego API

Publiczne API Workify360 Focus pozwala twoim własnym skryptom i narzędziom odczytywać raporty i dane o czasie pracy oraz wprowadzać zmiany według tych samych zasad co w panelu. Publiczne API, klucze API i webhooki są częścią planu Premium.

Operacje opisane na tej stronie zachowują zgodność wsteczną. Dokument OpenAPI tych samych operacji w formacie do odczytu maszynowego:

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

Wygenerowano z kontraktu API w wersji 0.1.0 (c95fb97bb49a).

Uwierzytelnianie

Wysyłaj osobisty klucz API w nagłówku Authorization każdego żądania. Klucz należy do osoby, która go utworzyła, działa w jej imieniu i nigdy nie może więcej, niż pozwala jej bieżąca rola. Żądanie z brakującym, błędnym, wygasłym lub unieważnionym kluczem otrzymuje 401 z kodem unauthorized.

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

Jak tworzyć klucze, nadawać im zakresy i je unieważniać: Klucze API i publiczne API

Zakresy

Każda operacja wymaga jednego zakresu, podanego obok niej. Klucz ma dostęp do operacji, gdy posiada ten zakres, a bieżąca rola, zespoły i plan jego właściciela pozwalają na żądanie – dokładnie tak jak w panelu.

ZakresNa co pozwala
meTwój własny profil i twój timer
reports:readOdczyt raportów, wpisów czasu, nieobecności, zmian, zespołów, projektów, zadań i eksportów
time:writeDodawanie i zmienianie wpisów czasu, nieobecności, zmian, zadań i czasu przypisanego do zadań oraz rozpatrywanie wniosków
org:adminZarządzanie członkami, zespołami, zaproszeniami i projektami
webhooks:manageZarządzanie endpointami webhooków

Limity zapytań

Każdy klucz może wysłać 600 jednostek na minutę, a organizacja łącznie 1800 dla wszystkich swoich kluczy. Żądanie, które coś zmienia (każde inne niż GET i HEAD), liczy się jako dwie jednostki, każde pozostałe jako jedna. Klucz może też wysłać naraz najwyżej 60 jednostek, uzupełnianych w tempie 10 na sekundę: ponad 60 odczytów (lub 30 zmian) wysłanych jednocześnie otrzyma 429, nawet poniżej 600 na minutę.

NagłówekZnaczenie
RateLimit: "key";r=598;t=2W każdej zliczanej odpowiedzi: jednostki, które zostały kluczowi, i liczba sekund do ich pełnego uzupełnienia
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60W każdej zliczanej odpowiedzi: limity na minutę dla klucza i dla organizacji
Retry-After: 12Przy 429 (kod rate_limited): liczba sekund, którą trzeba odczekać przed kolejnym żądaniem

Błędy

Błąd jest dokumentem problemu zgodnym z RFC 9457 (Content-Type: application/problem+json). code to stały kod w formacie snake_case, na którym można opierać logikę programu; title to angielski tekst do logów. type to adres pomocy dla danego kodu, https://workify360.com/help/errors/<code>/, w którym każdy znak _ zapisany jest jako -; otwiera on artykuł pomocy wyjaśniający kod, jeśli taki artykuł istnieje.

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

Niektóre problemy zawierają dodatkowe pola: errors (błędy pól przy 422 validation_failed), action (uprawnienie, którego dotyczy 403 forbidden), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 i 503) oraz traceId (podaj go, kontaktując się z pomocą techniczną).

StatusKodKiedy
400 invalid_request Parametr ma nieprawidłowy format lub go brakuje
401 unauthorized Brak klucza, klucz jest błędny, wygasł lub został unieważniony albo jego właściciel opuścił organizację
402 feature_not_in_plan, subscription_read_only Plan nie obejmuje tej funkcji lub subskrypcja jest w trybie tylko do odczytu
403 forbidden, feature_not_enabled Klucz nie ma wymaganego zakresu lub bieżąca rola, zespoły bądź ustawienia jego właściciela nie pozwalają na żądanie
412 version_conflict Wersja z If-Match nie jest już aktualna; odczytaj zasób ponownie
422 validation_failed Treść żądania jest nieprawidłowa; errors wymienia pola
428 precondition_required Operacja wymaga nagłówka If-Match z odczytaną wersją
429 rate_limited Zbyt wiele żądań; odczekaj liczbę sekund podaną w Retry-After

Kody, które mają artykuł pomocy, są linkami na liście operacji.

Webhooki

Zamiast raz po raz odpytywać API, twój endpoint może otrzymywać podpisane żądanie HTTPS, gdy coś się zmieni. Zdarzenia, format żądania, weryfikację podpisu w Node.js i Pythonie, ponawianie prób oraz rotację sekretu opisuje artykuł pomocy: Webhooki

Operacje

Pogrupowane według obszarów. Podsumowania i opisy pól pochodzą z kontraktu API.

Nieobecności

GET /v1/absences Zakres: reports:read

List absences overlapping a range.

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date)
to zapytanie string (date) At most 366 days after from.
userId zapytanie string (uuid)
teamId zapytanie string (uuid)
status zapytanie string
typeId zapytanie string (uuid)
cursor zapytanie string
limit zapytanie integer (int32)
Odpowiedzi
200 AbsencePage
Błędy

POST /v1/absences Zakres: time:write

Request (or record) an absence.

Parametry
NazwaMiejsceTypOpis
Idempotency-Keywymagany nagłówek string Required: the same key and body return the first answer
Treść żądania
AbsenceRequest
Odpowiedzi
201 AbsenceDto
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Id
If-Matchwymagany nagłówek string ETag of the resource ("v<n>"); missing: 428, stale: 412
Treść żądania
CalendarDecisionRequest
Odpowiedzi
200 AbsenceDto
Błędy

Aktywność

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

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

Parametry
NazwaMiejsceTypOpis
date zapytanie string (date) The user's local day (required).
userId zapytanie string (uuid) Default: the caller; another user must be visible (else 403).
Odpowiedzi
200 ActivityDayDto
Błędy

Przydziały czasu

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

Parametry
NazwaMiejsceTypOpis
userId zapytanie string (uuid) Default: the caller.
from zapytanie string (date) Local date, included.
to zapytanie string (date) Local date, included; at most 93 days after from.
projectId zapytanie string (uuid)
cursor zapytanie string
limit zapytanie integer (int32) 1–200 (default 200).
Odpowiedzi
200 AllocationPage
Błędy

POST /v1/allocations Zakres: time:write

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

Parametry
NazwaMiejsceTypOpis
Idempotency-Key nagłówek string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Treść żądania
AllocationCreateRequest
Odpowiedzi
201 AllocationCreatedDto
Błędy

Eksporty

POST /v1/exports Zakres: reports:read

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

Parametry
NazwaMiejsceTypOpis
Idempotency-Keywymagany nagłówek string Required: the same key and body return the first answer
Treść żądania
CreateExportRequest
Odpowiedzi
202 ExportJobDto
Błędy

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

One export job (poll every 2 s).

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Id
Odpowiedzi
200 ExportJobDto
Błędy

Mój profil

GET /v1/me Zakres: me

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

Odpowiedzi
200 MeDto
Błędy

Członkowie

GET /v1/members Zakres: org:admin

List members.

Parametry
NazwaMiejsceTypOpis
status zapytanie string Comma-separated statuses (default active,invited,suspended)
teamId zapytanie string (uuid) Primary team
role zapytanie string owner, admin, team_admin, manager or employee
q zapytanie string Part of the name or e-mail (Turkish case folding)
cursor zapytanie string Opaque cursor of the next page
limit zapytanie integer (int32) 1–200, default 50
Odpowiedzi
200 MemberPage
Błędy
  • 403 No right

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

One member.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Membership id
Odpowiedzi
200 MemberDto
Błędy
  • 404 member_not_found

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Membership id
If-Matchwymagany nagłówek string ETag of the member ("v<n>")
Treść żądania
PatchMember
Odpowiedzi
200 MemberDto
Błędy

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

Reactivate a suspended member.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Membership id
Odpowiedzi
200 MemberDto

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Membership id
Odpowiedzi
200 MemberDto
Błędy
  • 409 conflict (an invitation is revoked instead)

Projekty

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

Parametry
NazwaMiejsceTypOpis
status zapytanie string active, on_hold or completed.
clientId zapytanie string (uuid)
q zapytanie string Name or code search (case-insensitive).
includeArchived zapytanie boolean
mine zapytanie boolean Only the projects the caller may track time on.
cursor zapytanie string
limit zapytanie integer (int32) 1–200 (default 50).
Odpowiedzi
200 ProjectPage
Błędy

POST /v1/projects Zakres: org:admin

Add a project (Owners and Admins).

Parametry
NazwaMiejsceTypOpis
Idempotency-Key nagłówek string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Treść żądania
ProjectRequest
Odpowiedzi
201 ProjectDto
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Project id
If-Matchwymagany nagłówek string The ETag the caller read (412 version_conflict when it changed)
Treść żądania
ProjectRequest
Odpowiedzi
200 ProjectDto
Błędy

Raporty

GET /v1/reports/productivity Zakres: reports:read

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

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date)
to zapytanie string (date) day 93 days, week, month and range 366.
groupBy zapytanie string day, week, month or range.
teamId zapytanie string (uuid)
userId zapytanie string (uuid)
Odpowiedzi
200 PeriodReportDto
Błędy

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

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date) Local date, included.
to zapytanie string (date) Local date, included; at most 366 days after from.
groupBy zapytanie string One or two of project (default), task, user, client, day, comma separated.
projectIds zapytanie string Comma-separated project ids.
clientId zapytanie string (uuid)
userIds zapytanie string Comma-separated user ids (visible people only).
teamId zapytanie string (uuid)
billable zapytanie string all (default), billable or nonBillable.
includeProductive zapytanie boolean Also compute the productive time within the allocations (costly; default false).
Odpowiedzi
200 ProjectReportDto
Błędy

GET /v1/reports/summary Zakres: reports:read

The summary of the visible users over a range.

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date)
to zapytanie string (date) At most 93 days after from.
teamId zapytanie string (uuid) Only the team's current members; the team must be visible (else 403).
Odpowiedzi
200 SummaryDto
Błędy

GET /v1/reports/targets Zakres: reports:read

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

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date)
to zapytanie string (date)
type zapytanie string app, domain or host.
teamId zapytanie string (uuid)
userId zapytanie string (uuid)
q zapytanie string Search in the key and the name (.NET search).
level zapytanie string productive, unproductive or neutral.
categoryKey zapytanie string
unclassified zapytanie boolean Only targets without a category.
cursor zapytanie string
limit zapytanie integer (int32) 1–200, default 50.
Odpowiedzi
200 TargetListDto
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
userIdwymagany ścieżka string (uuid) User
from zapytanie string (date)
to zapytanie string (date) At most 93 days after from.
Odpowiedzi
200 UserDailyDto
Błędy

Zmiany

GET /v1/shifts Zakres: reports:read

List the shifts starting in a range.

Parametry
NazwaMiejsceTypOpis
from zapytanie string (date)
to zapytanie string (date)
teamId zapytanie string (uuid)
userId zapytanie string (uuid)
includeOpen zapytanie boolean Also open shifts (default true).
Odpowiedzi
200 ShiftListDto
Błędy

POST /v1/shifts Zakres: time:write

Create a shift (assigned or open).

Parametry
NazwaMiejsceTypOpis
Idempotency-Keywymagany nagłówek string Required: the same key and body return the first answer
Treść żądania
ShiftBody
Odpowiedzi
201 ShiftDto
Błędy

Zadania

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

A visible project's tasks, by sort order.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Project id
status zapytanie string open, in_progress or done.
assigneeUserId zapytanie string (uuid)
includeArchived zapytanie boolean
cursor zapytanie string
limit zapytanie integer (int32) 1–500 (default 200).
Odpowiedzi
200 TaskPage
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Project id
Idempotency-Key nagłówek string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Treść żądania
TaskRequest
Odpowiedzi
201 TaskDto
Błędy

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

Change a task (the whole body).

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Task id
If-Matchwymagany nagłówek string The ETag the caller read (412 version_conflict when it changed)
Treść żądania
TaskRequest
Odpowiedzi
200 TaskDto
Błędy

Zespoły

GET /v1/teams Zakres: reports:read

List teams.

Parametry
NazwaMiejsceTypOpis
includeArchived zapytanie boolean Also archived teams (default false)
cursor zapytanie string Opaque cursor of the next page
limit zapytanie integer (int32) 1–200, default 50
Odpowiedzi
200 TeamPage

POST /v1/teams Zakres: org:admin

Create a team (the G1 endpoint).

Treść żądania
CreateTeam
Odpowiedzi
201 TeamDto
Błędy
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

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

Rename a team or change its description.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Team id
If-Matchwymagany nagłówek string ETag of the team
Treść żądania
PatchTeam
Odpowiedzi
200 TeamDto
Błędy
  • 409 team_name_taken

Wpisy czasu

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

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

Parametry
NazwaMiejsceTypOpis
userId zapytanie string (uuid) Default: the caller.
from zapytanie string (date) The entry's local day, required.
to zapytanie string (date) At most 93 days after from.
kind zapytanie string offline or deletion.
status zapytanie string pending, approved or rejected.
cursor zapytanie string
limit zapytanie integer (int32) 1–500.
Odpowiedzi
200 TimeEntryPage
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
Idempotency-Keywymagany nagłówek string Required: the same key and body return the first answer
Treść żądania
CreateTimeEntryRequest
Odpowiedzi
201 TimeEntryDto
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Entry id
Odpowiedzi
200 TimeEntryDto
Błędy

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

Replace an entry's editable fields.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Entry id
If-Matchwymagany nagłówek string ETag of the resource ("v<n>"); missing: 428, stale: 412
Treść żądania
UpdateTimeEntryRequest
Odpowiedzi
200 TimeEntryDto
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Entry id
If-Matchwymagany nagłówek string ETag of the resource ("v<n>"); missing: 428, stale: 412
Odpowiedzi
204 (bez treści)
Błędy

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) Entry id
If-Matchwymagany nagłówek string ETag of the resource ("v<n>"); missing: 428, stale: 412
Treść żądania
TimeEntryDecisionRequest
Odpowiedzi
200 TimeEntryDto
Błędy

Timer

GET /v1/me/timer Zakres: me

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

Parametry
NazwaMiejsceTypOpis
If-None-Match nagłówek string | null The ETag the caller holds (304 when unchanged)
Odpowiedzi
200 TimerDto · 304 (bez treści)
Błędy

POST /v1/me/timer/start Zakres: me

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

Parametry
NazwaMiejsceTypOpis
Idempotency-Key nagłówek string | null The client's command id; a retry returns the first answer
Treść żądania
TimerStartRequest
Odpowiedzi
200 TimerCommandResultDto
Błędy

Webhooki

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

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

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) The endpoint
If-Matchwymagany nagłówek string The endpoint's ETag ("v<n>")
Treść żądania
UpdateWebhookEndpointRequest
Odpowiedzi
200 WebhookEndpointDto
Błędy

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

Delete an endpoint and its deliveries.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) The endpoint
Odpowiedzi
204 (bez treści)
Błędy

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

The deliveries of an endpoint, newest first.

Parametry
NazwaMiejsceTypOpis
idwymagany ścieżka string (uuid) The endpoint
status zapytanie string pending, succeeded, failed, dead.
eventType zapytanie string
cursor zapytanie string Opaque cursor of the next page.
limit zapytanie integer (int32) 1–200, default 50.
Odpowiedzi
200 WebhookDeliveryPage
Błędy

Schematy

Treści żądań i odpowiedzi używane przez operacje. Pola wymagane są oznaczone.

AbsenceDto

An absence.

PoleTypOpis
createdAtwymagany string (date-time)
createdBywymagany CalendarUserRefDto
dayswymagany 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
deductionByYearwymagany object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endwymagany string (date-time)
endDatewymagany string (date)
endTime string | null
half string | null
idwymagany string (uuid)
note string | null
permissionswymagany AbsencePermissionsDto
startwymagany string (date-time) UTC coverage start.
startDatewymagany string (date)
startTime string | null
statuswymagany string
timeZonewymagany string
typewymagany AbsenceTypeRefDto
unitwymagany string
updatedAtwymagany string (date-time)
userwymagany CalendarPersonDto
userIdwymagany string (uuid)

AbsencePage

GET /v1/absences.

PoleTypOpis
itemswymagany AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

PoleTypOpis
canApprovewymagany boolean
canCancelwymagany boolean
canEditwymagany boolean

AbsenceRequest

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

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

PoleTypOpis
colorwymagany string
countsAsWorkedwymagany boolean
deductsFromBalancewymagany boolean
idwymagany string (uuid)
key string | null
namewymagany string
paidwymagany boolean
timeEffectwymagany string

AcceptedDto

202 Accepted of a queued job.

PoleTypOpis
acceptedwymagany boolean Always true.

AccessDto

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

PoleTypOpis
assignableRoleswymagany string[]
canManageCompanySettingswymagany boolean
canManageTeamswymagany boolean
canManageUserswymagany boolean
manageTeamIdswymagany string[]
scopewymagany string company, teams or self.
unassignedFallbackwymagany boolean
viewTeamIdswymagany string[]

ActivityDayDto

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

PoleTypOpis
absenceCreditMswymagany integer (int64) A worked absence tops the worked time up to the expected work.
activeMswymagany integer (int64) Window time ∩ not AFK (computer time only).
afkCoveragewymagany boolean False when no device reported AFK data (idle unknown).
appswymagany AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMswymagany integer (int64)
attendance DayAttendanceDto | null
categorieswymagany CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedwymagany boolean False for a day written before the Phase 2 classification (all neutral).
datewymagany string (date)
dayEndwymagany string (date-time)
dayStartwymagany string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMswymagany integer (int64) Tracked time removed by approved deletions (part of idle).
domainswymagany DomainUsageDto[]
hostswymagany HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMswymagany integer (int64)
leftAt string (date-time) | null
meetingMswymagany integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMswymagany integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMswymagany integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalswymagany TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMswymagany integer (int64) Private time outside active and offline time.
productivitywymagany DayProductivityDto
recomputingwymagany boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotswymagany 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).
timeEntrieswymagany TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZonewymagany string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdwymagany string (uuid)
workedMswymagany integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

PoleTypOpis
activeMswymagany integer (int64)
appswymagany AppUsageDto[]
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
productiveMswymagany integer (int64)
slotStartwymagany string (date-time)
unproductiveMswymagany integer (int64)

AffectedAllocationDto

An allocation replace changed.

PoleTypOpis
changewymagany string trimmed, split or deleted.
idwymagany string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

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

PoleTypOpis
affectedwymagany AffectedAllocationDto[]
allocationwymagany AllocationDto

AllocationDto

Time on a project.

PoleTypOpis
createdAtwymagany string (date-time)
createdBywymagany NamedRefDto
durationMswymagany integer (int64)
effectiveBillablewymagany boolean
endedAtwymagany string (date-time)
idwymagany 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.
localDatewymagany string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionswymagany AllocationPermissionsDto
projectwymagany ProjectRefDto
sourcewymagany string timer, manual or assignment.
startedAtwymagany string (date-time)
task NamedRefDto | null
timeZonewymagany string
updatedAtwymagany string (date-time)
userIdwymagany string (uuid)
versionwymagany integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

PoleTypOpis
itemswymagany AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

PoleTypOpis
deletewymagany boolean
editwymagany boolean

AppTotalDto

PoleTypOpis
activeMswymagany integer (int64)
appKeywymagany string
categoryKey string | null
level string | null Level in the response's levelContext.
namewymagany string
percentagewymagany 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".

PoleTypOpis
activeMswymagany integer (int64)
appKeywymagany string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
namewymagany string

BudgetDto

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

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

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

PoleTypOpis
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

PoleTypOpis
fullName string | null
idwymagany string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

PoleTypOpis
fullName string | null
idwymagany string (uuid)

CapabilitiesDto

Subscription capabilities.

PoleTypOpis
featureswymagany string[]
readOnlywymagany boolean

CategoryUsageDto

PoleTypOpis
activeMswymagany 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.

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

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

CreateTeam

POST /v1/teams.

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

CreateTimeEntryRequest

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

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

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

CreatedWebhookEndpointDto

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

PoleTypOpis
endpointwymagany WebhookEndpointDto
secretwymagany string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

PoleTypOpis
half string | null
keywymagany string
namewymagany string English name; nameTr is the Turkish one.
nameTrwymagany string

DayAbsenceDto

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

PoleTypOpis
colorwymagany string
fractionwymagany number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitwymagany string

DayAttendanceDto

Attendance of the day on the day plan.

PoleTypOpis
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexiblewymagany boolean
lateByMswymagany integer (int64)
lateToleranceMinuteswymagany integer (int32)
leftEarlywymagany boolean
leftEarlyByMswymagany integer (int64)
statuswymagany string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMswymagany integer (int64) The plan's target (the Effectiveness % denominator).
workdaywymagany boolean

DayPlanDto

The day plan of one user's day.

PoleTypOpis
absenceswymagany PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMswymagany integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindwymagany string schedule, shift, dayOff or holiday.
leaveFractionwymagany number (double) The approved absence coverage f (0–1).
shiftswymagany PlanShiftDto[] Shifts starting on the day, by start.
targetMswymagany integer (int64) Effectiveness % denominator (base × (1 − f)).
workdaywymagany boolean

DayProductivityDto

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

PoleTypOpis
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMswymagany integer (int64)
unproductiveMswymagany integer (int64)

DayTotalDto

One local day of a summary.

PoleTypOpis
activeMswymagany integer (int64)
activeUserCountwymagany integer (int32)
atWorkMswymagany integer (int64)
datewymagany string (date)
idleMswymagany integer (int64)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
privateMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null
unproductiveMswymagany integer (int64)

DomainTotalDto

PoleTypOpis
activeMswymagany integer (int64)
categoryKey string | null
domainwymagany string
level string | null
percentagewymagany number (double)

DomainUsageDto

PoleTypOpis
activeMswymagany integer (int64)
categoryKey string | null
domainwymagany 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).

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

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

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

ExportJobDto

An export job as the panel lists and polls it.

PoleTypOpis
createdAtwymagany string (date-time)
datasetwymagany 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
formatwymagany string
fromwymagany string (date)
groupBy string | null
idwymagany string (uuid)
localewymagany string
progresswymagany integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statuswymagany 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.
towymagany string (date)

ExportOptionsDto

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

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

PoleTypOpis
codewymagany string Stable snake_case code (required, too_long, invalid, ...).
fieldwymagany 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).

PoleTypOpis
half string | null
keywymagany string Built-in key (republic_day, …) or custom.
namewymagany string
nameEnwymagany string
nameTrwymagany string
source string | null builtin or tenant.

HostUsageDto

PoleTypOpis
activeMswymagany integer (int64)
domain string | null
hostwymagany string
levelwymagany string
levelSourcewymagany string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

PoleTypOpis
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).
statuswymagany 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.

PoleTypOpis
expiresAtwymagany string
idwymagany string (uuid)

InvitationResult

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

PoleTypOpis
emailwymagany InvitationEmail
invitationwymagany InvitationRef
memberwymagany MemberDto

LevelContextDto

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

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

MeDto

GET /v1/me.

PoleTypOpis
accesswymagany AccessDto
capabilitieswymagany CapabilitiesDto
effectiveTimeZonewymagany string
membershipwymagany MeMembership
organizationwymagany MeOrganization
organizationswymagany OrganizationChoice[]
session MeSession | null
userwymagany MeUser

MeMembership

The membership in the current organization.

PoleTypOpis
idwymagany string (uuid)
isTrackedwymagany boolean
joinedAt string | null
rolewymagany string
statuswymagany string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdswymagany string (uuid)[]

MeOrganization

The current organization.

PoleTypOpis
defaultLocalewymagany string
idwymagany string (uuid)
namewymagany string
slugwymagany string
statuswymagany string
timeZonewymagany string

MeSession

The current session.

PoleTypOpis
absoluteExpiresAtwymagany string
amrwymagany string[]
authTimewymagany string
clientIdwymagany string
idwymagany string (uuid)
idleExpiresAtwymagany string

MeUser

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

PoleTypOpis
emailwymagany string
emailVerificationwymagany EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedwymagany boolean
fullName string | null
idwymagany string (uuid)
localewymagany string

MemberDto

A membership with its person (MemberDto).

PoleTypOpis
createdAtwymagany string
emailwymagany string
emailVerifiedwymagany boolean
fullName string | null
idwymagany string (uuid)
invitation MemberInvitationDto | null
isTrackedwymagany boolean
joinedAt string | null
localewymagany string
rolewymagany string owner, admin, team_admin, manager, employee.
statuswymagany string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerwymagany boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdwymagany string (uuid)
viewerTeamIdswymagany string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

PoleTypOpis
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.
expiresAtwymagany string
idwymagany string (uuid)
lastSentAtwymagany string
sentCountwymagany integer (int32)

MemberPage

A page of members (OpenAPI).

PoleTypOpis
itemswymagany MemberDto[]
nextCursor string | null

MemberRefDto

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

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

NamedRefDto

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

PoleTypOpis
idwymagany string (uuid)
namewymagany string

OrganizationChoice

One organization of the person (sec.user_memberships).

PoleTypOpis
currentwymagany boolean
idwymagany string (uuid)
namewymagany string
rolewymagany string
selectablewymagany boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

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

PoleTypOpis
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

PoleTypOpis
fromwymagany string (date)
groupBywymagany string
levelContextwymagany LevelContextDto
periodswymagany ReportPeriodDto[]
subjectwymagany ReportSubjectDto
teamswymagany TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
towymagany string (date)
totalswymagany ReportFiguresDto

PlanAbsenceDto

PoleTypOpis
colorwymagany string
countsAsWorkedwymagany boolean timeEffect == worked.
endTime string | null
half string | null
idwymagany string (uuid)
startTime string | null Local start and end of an hours absence.
statuswymagany string approved or pending.
timeEffectwymagany 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).
unitwymagany string days, half_day or hours.

PlanShiftDto

PoleTypOpis
color string | null
endwymagany string (date-time)
endTimewymagany string Local end; before the start for a night shift.
idwymagany string (uuid)
locationwymagany string
minMinuteswymagany integer (int32)
startwymagany string (date-time)
startTimewymagany string Local start (HH:mm, the shift's zone).

Problem

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

PoleTypOpis
action string | null Permission key of a 403 (teams.create).
codewymagany 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).
statuswymagany integer (int32)
titlewymagany string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typewymagany 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).

PoleTypOpis
billableMinorwymagany integer (int64) The billable hours at their rate.
costMinorwymagany integer (int64) Every allocated hour at its rate.
currencywymagany string

ProjectBudgetUsageDto

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

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

ProjectDto

A project.

PoleTypOpis
accesswymagany string everyone or members.
archivedwymagany boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtwymagany string (date-time)
currencywymagany string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idwymagany string (uuid)
isBillablewymagany boolean
memberCountwymagany integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
namewymagany string
permissionswymagany ProjectPermissionsDto
spentMswymagany integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statuswymagany string active, on_hold or completed.
taskCountwymagany integer (int64)
updatedAtwymagany string (date-time)

ProjectPage

GET /v1/projects.

PoleTypOpis
itemswymagany ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

PoleTypOpis
archivewymagany boolean
deletewymagany boolean Only a project without time.
editwymagany boolean The project's fields (Owners and Admins).
manageMemberswymagany boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTaskswymagany boolean Tasks (an Admin or the project's manager).
trackwymagany boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

PoleTypOpis
color string | null #RRGGBB.
idwymagany string (uuid)
namewymagany string

ProjectReportDto

GET /v1/reports/projects.

PoleTypOpis
budgetswymagany ProjectBudgetUsageDto[]
costsIncludedwymagany boolean The caller sees rates and amounts (projects.costs.read).
fromwymagany string (date)
groupBywymagany string[]
rowswymagany ProjectReportRowDto[]
towymagany string (date)
totalswymagany ProjectReportTotalsDto

ProjectReportKeysDto

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

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

PoleTypOpis
allocatedMswymagany integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMswymagany integer (int64)
keyswymagany ProjectReportKeysDto
nonBillableMswymagany integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMswymagany integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

PoleTypOpis
allocatedMswymagany integer (int64)
amounts ProjectAmountDto[] | null
billableMswymagany integer (int64)
nonBillableMswymagany integer (int64)
productiveMs integer (int64) | null
unratedMswymagany integer (int64)

ProjectRequest

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

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

PoleTypOpis
absenceCreditMswymagany integer (int64)
absentDayswymagany integer (int32)
activeMswymagany integer (int64)
activeUserCountwymagany integer (int32)
effectivenessPct number (double) | null
idleMswymagany integer (int64)
lateDayswymagany integer (int32)
leaveDayswymagany number (double)
leftEarlyDayswymagany integer (int32)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
overtimeDayswymagany integer (int32)
overtimeMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null
targetMswymagany integer (int64)
unproductiveMswymagany integer (int64)
userCountwymagany integer (int32)
workedMswymagany 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).

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

ReportSubjectDto

Whom a report is about.

PoleTypOpis
id string (uuid) | null
kindwymagany string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

PoleTypOpis
previousSecretExpiresAtwymagany string Until then deliveries carry both signatures.
secretwymagany 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.

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

PoleTypOpis
breakMinuteswymagany integer (int32)
color string | null
createdAtwymagany string (date-time)
createdBywymagany CalendarUserRefDto
crossesMidnightwymagany boolean
datewymagany string (date)
durationMinuteswymagany integer (int32)
endwymagany string (date-time)
endTimewymagany string
idwymagany string (uuid)
locationwymagany string
minMinuteswymagany integer (int32)
note string | null
openwymagany boolean No user assigned.
permissionswymagany ShiftPermissionsDto
sourcewymagany string manual, template, copy or request.
startwymagany string (date-time)
startTimewymagany 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
timeZonewymagany string
updatedAtwymagany 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).

PoleTypOpis
itemswymagany ShiftDto[]

ShiftPermissionsDto

PoleTypOpis
canDeletewymagany boolean
canEditwymagany boolean
canPickUpwymagany boolean
canRequestSwapwymagany boolean

SummaryDto

The summary of the visible users over a range.

PoleTypOpis
absenceCreditMswymagany integer (int64)
absentDayswymagany integer (int32)
activeMswymagany integer (int64)
activeUserCountwymagany integer (int32)
atWorkMswymagany integer (int64)
dayswymagany DayTotalDto[]
deletedMswymagany integer (int64)
domainswymagany DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromwymagany string (date)
holidayDayswymagany number (double)
idleMswymagany integer (int64)
inactiveUserswymagany UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDayswymagany integer (int32)
leaveDayswymagany number (double)
leftEarlyDayswymagany integer (int32)
levelContextwymagany LevelContextDto
meetingMswymagany integer (int64)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
overtimeMswymagany integer (int64)
privateMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopewymagany ReportScopeDto
shiftDayswymagany integer (int32)
teamswymagany TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
towymagany string (date)
topAppswymagany AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMswymagany integer (int64)
userswymagany UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMswymagany integer (int64)

TargetItemDto

PoleTypOpis
activeMswymagany integer (int64)
categoryKey string | null
categorySourcewymagany string tenant, builtin or none.
domain string | null
levelwymagany string
levelSourcewymagany string team, company or default.
matchedKey string | null
namewymagany string
percentagewymagany number (double)
targetKeywymagany string
targetTypewymagany string app for apps, domain for domains and hosts.
userCountwymagany integer (int32)

TargetListDto

The "Apps & URLs" list.

PoleTypOpis
fromwymagany string (date)
itemswymagany TargetItemDto[] By active time descending, then key.
levelContextwymagany LevelContextDto
nextCursor string | null
towymagany string (date)
totalwymagany integer (int32) Targets matching the filters (before paging).
totalActiveMswymagany integer (int64) Active time over every target of the type before the filters (the percentage base).
typewymagany string app, domain or host.

TaskDto

A task.

PoleTypOpis
archivedwymagany boolean
assignee NamedRefDto | null
createdAtwymagany string (date-time)
description string | null
dueDate string (date) | null
effectiveBillablewymagany boolean
estimateMinutes integer (int64) | null
idwymagany string (uuid)
isBillable boolean | null null takes the project's value.
namewymagany string
permissionswymagany TaskPermissionsDto
projectIdwymagany string (uuid)
sortOrderwymagany integer (int64)
spentMswymagany integer (int64)
statuswymagany string open, in_progress or done.
updatedAtwymagany string (date-time)

TaskPage

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

PoleTypOpis
itemswymagany TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

PoleTypOpis
deletewymagany boolean Only a task without time.
editwymagany boolean

TaskRequest

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

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

PoleTypOpis
archivedAt string | null
createdAtwymagany string
description string | null
idwymagany string (uuid)
leadswymagany object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountwymagany integer (int64) Members whose primary team this is (left members excluded).
namewymagany string
updatedAtwymagany string

TeamPage

A page of teams (OpenAPI).

PoleTypOpis
itemswymagany TeamDto[]
nextCursor string | null

TeamPeriodsDto

PoleTypOpis
periodswymagany ReportPeriodDto[]
teamIdwymagany string (uuid)
teamName string | null
totalswymagany ReportFiguresDto

TeamTotalDto

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

PoleTypOpis
absenceCreditMswymagany integer (int64)
absentDayswymagany integer (int32)
activeMswymagany integer (int64)
activeUserCountwymagany integer (int32)
effectivenessPct number (double) | null
holidayDayswymagany number (double)
idleMswymagany integer (int64)
lateDayswymagany integer (int32)
leaveDayswymagany number (double)
leftEarlyDayswymagany integer (int32)
memberCountwymagany integer (int32)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
overtimeMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null
shiftDayswymagany integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMswymagany integer (int64)
workedMswymagany integer (int64)

TimeEntryDecisionRequest

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

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

TimeEntryDto

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

PoleTypOpis
createdAtwymagany string (date-time)
createdBywymagany TimeEntryUserRefDto
datewymagany 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
durationMswymagany integer (int64)
endwymagany string (date-time)
idwymagany string (uuid)
kindwymagany string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionswymagany TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourcewymagany string manual (Phase 8 adds calendar).
startwymagany string (date-time)
statuswymagany string pending, approved or rejected.
timeZonewymagany string
updatedAtwymagany string (date-time)
userIdwymagany string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

PoleTypOpis
itemswymagany TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

PoleTypOpis
canApprovewymagany boolean
canDeletewymagany boolean
canEditwymagany boolean

TimeEntryUserRefDto

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

PoleTypOpis
fullName string | null
idwymagany string (uuid)

TimeIntervalDto

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

PoleTypOpis
endwymagany string (date-time)
startwymagany string (date-time)

TimerAtRequest

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

PoleTypOpis
at string (date-time) | null

TimerCommandResultDto

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

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

TimerDto

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

PoleTypOpis
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
serverTimewymagany 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
statewymagany string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

PoleTypOpis
endReasonwymagany string stop, switch, autostop or discard.
endedAtwymagany string (date-time)
segmentIdwymagany string (uuid)
startedAtwymagany string (date-time)

TimerProjectDto

The project of the running segment.

PoleTypOpis
clientName string | null
color string | null
idwymagany string (uuid)
namewymagany string

TimerStartRequest

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

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

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

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

PoleTypOpis
dayswymagany UserDayDto[]
fromwymagany string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZonewymagany string
towymagany string (date)
userIdwymagany string (uuid)

UserDayDto

PoleTypOpis
absence DayAbsenceDto | null
absenceCreditMswymagany integer (int64)
activeMswymagany integer (int64)
afkCoveragewymagany boolean
arrivalAt string (date-time) | null
atWorkMswymagany integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedwymagany boolean
datewymagany string (date)
dayOffWorkedMswymagany integer (int64)
deletedMswymagany integer (int64)
effectivenessPct number (double) | null
eventCountwymagany integer (int64)
expectedWorkMswymagany integer (int64)
holiday DailyHolidayDto | null
idleMswymagany integer (int64)
lateByMswymagany integer (int64)
leftAt string (date-time) | null
leftEarlywymagany boolean
leftEarlyByMswymagany integer (int64)
meetingMswymagany integer (int64)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
overtimeMswymagany integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null
shiftCountwymagany integer (int32)
targetMswymagany integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMswymagany integer (int64)
workday boolean | null
workedMswymagany integer (int64)

UserTotalDto

One user of a summary.

PoleTypOpis
absenceCreditMswymagany integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDayswymagany integer (int32) Local days with active time.
activeMswymagany integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMswymagany integer (int64)
classifiedDayswymagany integer (int32)
dayOffWorkedMswymagany integer (int64)
deletedMswymagany integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountwymagany integer (int64)
fullName string | null
holidayDayswymagany number (double)
idleMswymagany integer (int64)
lateDays integer (int32) | null
leaveDayswymagany number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMswymagany integer (int64)
neutralMswymagany integer (int64)
offlineMswymagany integer (int64)
overtimeDayswymagany integer (int32)
overtimeMswymagany integer (int64)
privateMswymagany integer (int64)
productiveMswymagany integer (int64)
productivityPct number (double) | null
shiftDayswymagany integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZonewymagany string
unproductiveMswymagany integer (int64)
userIdwymagany string (uuid)
workdays integer (int32) | null
workedMswymagany integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

PoleTypOpis
attemptswymagany integer (int32)
createdAtwymagany string
deliveredAt string | null
eventIdwymagany string (uuid) The webhook-id header.
eventTypewymagany string
idwymagany 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
statuswymagany string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

PoleTypOpis
itemswymagany WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

PoleTypOpis
createdAtwymagany string
description string | null
eventTypeswymagany string[]
idwymagany string (uuid)
ownerwymagany 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).
secretPrefixwymagany string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statswymagany WebhookEndpointStatsDto
statuswymagany string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtwymagany string
urlwymagany string
versionwymagany integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

PoleTypOpis
itemswymagany WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

PoleTypOpis
consecutiveFailureswymagany integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

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

WebhookEventsDto

GET /v1/webhook-events.

PoleTypOpis
itemswymagany WebhookEventDto[]

WebhookTestDto

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

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