Referenz der öffentlichen API

Mit der öffentlichen API von Workify360 Focus können Ihre eigenen Skripte und Tools Berichte und Zeitdaten lesen und Änderungen nach denselben Regeln wie im Dashboard vornehmen. Die öffentliche API, API-Schlüssel und Webhooks sind Teil des Premium-Tarifs.

Die Operationen auf dieser Seite bleiben abwärtskompatibel. Das maschinenlesbare OpenAPI-Dokument derselben Operationen:

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

Erzeugt aus Version 0.1.0 des API-Vertrags (c95fb97bb49a).

Authentifizierung

Senden Sie bei jeder Anfrage einen persönlichen API-Schlüssel im Header Authorization. Ein Schlüssel gehört der Person, die ihn erstellt hat, handelt als diese Person und darf nie mehr, als ihre aktuelle Rolle erlaubt. Eine Anfrage mit fehlendem, falschem, abgelaufenem oder widerrufenem Schlüssel erhält 401 mit dem Code unauthorized.

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

So erstellen Sie Schlüssel, legen ihre Scopes fest und widerrufen sie: API-Schlüssel und die öffentliche API

Scopes

Jede Operation benötigt einen Scope, der neben ihr angezeigt wird. Ein Schlüssel darf eine Operation aufrufen, wenn er diesen Scope besitzt und die aktuelle Rolle, die Teams und der Tarif seines Inhabers die Anfrage zulassen – genau wie im Dashboard.

ScopeWas er erlaubt
meIhr eigenes Profil und Ihr Timer
reports:readLesen von Berichten, Zeiteinträgen, Abwesenheiten, Schichten, Teams, Projekten, Aufgaben und Exporten
time:writeHinzufügen und Ändern von Zeiteinträgen, Abwesenheiten, Schichten, Aufgaben und der Zeit, die Aufgaben zugewiesen ist, sowie Entscheiden über Anträge
org:adminVerwalten von Mitgliedern, Teams, Einladungen und Projekten
webhooks:manageVerwalten von Webhook-Endpunkten

Rate-Limits

Jeder Schlüssel darf 600 Einheiten pro Minute senden, eine Organisation 1.800 für alle ihre Schlüssel zusammen. Eine Anfrage, die etwas ändert (alles außer GET und HEAD), zählt als zwei Einheiten, jede andere als eine. Ein Schlüssel kann außerdem höchstens 60 Einheiten auf einmal senden; aufgefüllt wird mit 10 pro Sekunde. Mehr als 60 Lesezugriffe (oder 30 Änderungen) in kurzer Folge werden daher mit 429 beantwortet, auch wenn 600 pro Minute nicht erreicht sind.

HeaderBedeutung
RateLimit: "key";r=598;t=2Bei jeder gezählten Antwort: die verbleibenden Einheiten des Schlüssels und die Sekunden, bis sie wieder voll sind
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60Bei jeder gezählten Antwort: die Limits pro Minute für den Schlüssel und für die Organisation
Retry-After: 12Bei 429 (Code rate_limited): die Sekunden, die vor der nächsten Anfrage zu warten sind

Fehler

Ein Fehler ist ein Problem-Dokument nach RFC 9457 (Content-Type: application/problem+json). code ist ein stabiler Code in snake_case, gegen den Sie programmieren können; title ist ein englischer Text für Logs. type ist die Hilfe-Adresse des Codes, https://workify360.com/help/errors/<code>/, wobei jedes _ als - geschrieben wird; sie öffnet den Hilfeartikel, der den Code erklärt, sofern es einen gibt.

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

Manche Probleme enthalten weitere Felder: errors (die Feldfehler bei 422 validation_failed), action (die Berechtigung, auf die sich ein 403 forbidden bezieht), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 und 503) und traceId (geben Sie sie an, wenn Sie den Support kontaktieren).

StatusCodeWann
400 invalid_request Ein Parameter ist fehlerhaft oder fehlt
401 unauthorized Der Schlüssel fehlt, ist falsch, abgelaufen oder widerrufen, oder sein Inhaber hat die Organisation verlassen
402 feature_not_in_plan, subscription_read_only Der Tarif enthält die Funktion nicht, oder das Abonnement ist schreibgeschützt
403 forbidden, feature_not_enabled Dem Schlüssel fehlt der Scope, oder die aktuelle Rolle, die Teams oder die Einstellungen seines Inhabers lassen die Anfrage nicht zu
412 version_conflict Die Version in If-Match ist nicht mehr aktuell; lesen Sie die Ressource erneut
422 validation_failed Der Body ist ungültig; errors listet die Felder auf
428 precondition_required Die Operation benötigt einen If-Match-Header mit der Version, die Sie gelesen haben
429 rate_limited Zu viele Anfragen; warten Sie die Sekunden aus Retry-After ab

Codes mit Hilfeartikel sind in der Liste der Operationen verlinkt.

Webhooks

Statt die API immer wieder abzufragen, kann ein eigener Endpunkt eine signierte HTTPS-Anfrage erhalten, wenn sich etwas ändert. Die Ereignisse, das Anfrageformat, die Prüfung der Signatur in Node.js und Python, Wiederholungsversuche und die Rotation des Secrets erklärt der Hilfeartikel: Webhooks

Operationen

Nach Bereich gruppiert. Die Zusammenfassungen und Feldbeschreibungen stammen aus dem API-Vertrag.

Abwesenheiten

GET /v1/absences Scope: reports:read

List absences overlapping a range.

Parameter
NameInTypBeschreibung
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)
Antworten
200 AbsencePage
Fehler

POST /v1/absences Scope: time:write

Request (or record) an absence.

Parameter
NameInTypBeschreibung
Idempotency-Keyerforderlich Header string Required: the same key and body return the first answer
Request-Body
AbsenceRequest
Antworten
201 AbsenceDto
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Id
If-Matcherforderlich Header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request-Body
CalendarDecisionRequest
Antworten
200 AbsenceDto
Fehler

Aktivität

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.

Parameter
NameInTypBeschreibung
date Query string (date) The user's local day (required).
userId Query string (uuid) Default: the caller; another user must be visible (else 403).
Antworten
200 ActivityDayDto
Fehler

Zeitzuweisungen

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

Parameter
NameInTypBeschreibung
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).
Antworten
200 AllocationPage
Fehler

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.

Parameter
NameInTypBeschreibung
Idempotency-Key Header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Request-Body
AllocationCreateRequest
Antworten
201 AllocationCreatedDto
Fehler

Exporte

POST /v1/exports Scope: reports:read

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

Parameter
NameInTypBeschreibung
Idempotency-Keyerforderlich Header string Required: the same key and body return the first answer
Request-Body
CreateExportRequest
Antworten
202 ExportJobDto
Fehler

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

One export job (poll every 2 s).

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Id
Antworten
200 ExportJobDto
Fehler

Eigenes Profil

GET /v1/me Scope: me

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

Antworten
200 MeDto
Fehler

Mitglieder

GET /v1/members Scope: org:admin

List members.

Parameter
NameInTypBeschreibung
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
Antworten
200 MemberPage
Fehler
  • 403 No right

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

One member.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Membership id
Antworten
200 MemberDto
Fehler
  • 404 member_not_found

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Membership id
If-Matcherforderlich Header string ETag of the member ("v<n>")
Request-Body
PatchMember
Antworten
200 MemberDto
Fehler

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

Reactivate a suspended member.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Membership id
Antworten
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.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Membership id
Antworten
200 MemberDto
Fehler
  • 409 conflict (an invitation is revoked instead)

Projekte

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

Parameter
NameInTypBeschreibung
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).
Antworten
200 ProjectPage
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Project id
If-Matcherforderlich Header string The ETag the caller read (412 version_conflict when it changed)
Request-Body
ProjectRequest
Antworten
200 ProjectDto
Fehler

Berichte

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

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

Parameter
NameInTypBeschreibung
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)
Antworten
200 PeriodReportDto
Fehler

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.

Parameter
NameInTypBeschreibung
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).
Antworten
200 ProjectReportDto
Fehler

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

The summary of the visible users over a range.

Parameter
NameInTypBeschreibung
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).
Antworten
200 SummaryDto
Fehler

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

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

Parameter
NameInTypBeschreibung
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.
Antworten
200 TargetListDto
Fehler

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

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

Parameter
NameInTypBeschreibung
userIderforderlich Pfad string (uuid) User
from Query string (date)
to Query string (date) At most 93 days after from.
Antworten
200 UserDailyDto
Fehler

Schichten

GET /v1/shifts Scope: reports:read

List the shifts starting in a range.

Parameter
NameInTypBeschreibung
from Query string (date)
to Query string (date)
teamId Query string (uuid)
userId Query string (uuid)
includeOpen Query boolean Also open shifts (default true).
Antworten
200 ShiftListDto
Fehler

POST /v1/shifts Scope: time:write

Create a shift (assigned or open).

Parameter
NameInTypBeschreibung
Idempotency-Keyerforderlich Header string Required: the same key and body return the first answer
Request-Body
ShiftBody
Antworten
201 ShiftDto
Fehler

Aufgaben

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

A visible project's tasks, by sort order.

Parameter
NameInTypBeschreibung
iderforderlich Pfad 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).
Antworten
200 TaskPage
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad 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)
Request-Body
TaskRequest
Antworten
201 TaskDto
Fehler

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

Change a task (the whole body).

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Task id
If-Matcherforderlich Header string The ETag the caller read (412 version_conflict when it changed)
Request-Body
TaskRequest
Antworten
200 TaskDto
Fehler

Teams

GET /v1/teams Scope: reports:read

List teams.

Parameter
NameInTypBeschreibung
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
Antworten
200 TeamPage

POST /v1/teams Scope: org:admin

Create a team (the G1 endpoint).

Request-Body
CreateTeam
Antworten
201 TeamDto
Fehler
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

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

Rename a team or change its description.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Team id
If-Matcherforderlich Header string ETag of the team
Request-Body
PatchTeam
Antworten
200 TeamDto
Fehler
  • 409 team_name_taken

Zeiteinträge

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

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

Parameter
NameInTypBeschreibung
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.
Antworten
200 TimeEntryPage
Fehler

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

Parameter
NameInTypBeschreibung
Idempotency-Keyerforderlich Header string Required: the same key and body return the first answer
Request-Body
CreateTimeEntryRequest
Antworten
201 TimeEntryDto
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Entry id
Antworten
200 TimeEntryDto
Fehler

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

Replace an entry's editable fields.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Entry id
If-Matcherforderlich Header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request-Body
UpdateTimeEntryRequest
Antworten
200 TimeEntryDto
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Entry id
If-Matcherforderlich Header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Antworten
204 (kein Body)
Fehler

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

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

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) Entry id
If-Matcherforderlich Header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request-Body
TimeEntryDecisionRequest
Antworten
200 TimeEntryDto
Fehler

Timer

GET /v1/me/timer Scope: me

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

Parameter
NameInTypBeschreibung
If-None-Match Header string | null The ETag the caller holds (304 when unchanged)
Antworten
200 TimerDto · 304 (kein Body)
Fehler

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

Parameter
NameInTypBeschreibung
Idempotency-Key Header string | null The client's command id; a retry returns the first answer
Request-Body
TimerStartRequest
Antworten
200 TimerCommandResultDto
Fehler

Webhooks

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.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) The endpoint
If-Matcherforderlich Header string The endpoint's ETag ("v<n>")
Request-Body
UpdateWebhookEndpointRequest
Antworten
200 WebhookEndpointDto
Fehler

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

Delete an endpoint and its deliveries.

Parameter
NameInTypBeschreibung
iderforderlich Pfad string (uuid) The endpoint
Antworten
204 (kein Body)
Fehler

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

The deliveries of an endpoint, newest first.

Parameter
NameInTypBeschreibung
iderforderlich Pfad 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.
Antworten
200 WebhookDeliveryPage
Fehler

Schemas

Die Request- und Response-Bodys, die die Operationen verwenden. Pflichtfelder sind gekennzeichnet.

AbsenceDto

An absence.

FeldTypBeschreibung
createdAterforderlich string (date-time)
createdByerforderlich CalendarUserRefDto
dayserforderlich 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
deductionByYearerforderlich object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
enderforderlich string (date-time)
endDateerforderlich string (date)
endTime string | null
half string | null
iderforderlich string (uuid)
note string | null
permissionserforderlich AbsencePermissionsDto
starterforderlich string (date-time) UTC coverage start.
startDateerforderlich string (date)
startTime string | null
statuserforderlich string
timeZoneerforderlich string
typeerforderlich AbsenceTypeRefDto
uniterforderlich string
updatedAterforderlich string (date-time)
usererforderlich CalendarPersonDto
userIderforderlich string (uuid)

AbsencePage

GET /v1/absences.

FeldTypBeschreibung
itemserforderlich AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

FeldTypBeschreibung
canApproveerforderlich boolean
canCancelerforderlich boolean
canEditerforderlich boolean

AbsenceRequest

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

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

FeldTypBeschreibung
colorerforderlich string
countsAsWorkederforderlich boolean
deductsFromBalanceerforderlich boolean
iderforderlich string (uuid)
key string | null
nameerforderlich string
paiderforderlich boolean
timeEffecterforderlich string

AcceptedDto

202 Accepted of a queued job.

FeldTypBeschreibung
acceptederforderlich boolean Always true.

AccessDto

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

FeldTypBeschreibung
assignableRoleserforderlich string[]
canManageCompanySettingserforderlich boolean
canManageTeamserforderlich boolean
canManageUserserforderlich boolean
manageTeamIdserforderlich string[]
scopeerforderlich string company, teams or self.
unassignedFallbackerforderlich boolean
viewTeamIdserforderlich string[]

ActivityDayDto

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

FeldTypBeschreibung
absenceCreditMserforderlich integer (int64) A worked absence tops the worked time up to the expected work.
activeMserforderlich integer (int64) Window time ∩ not AFK (computer time only).
afkCoverageerforderlich boolean False when no device reported AFK data (idle unknown).
appserforderlich AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMserforderlich integer (int64)
attendance DayAttendanceDto | null
categorieserforderlich CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiederforderlich boolean False for a day written before the Phase 2 classification (all neutral).
dateerforderlich string (date)
dayEnderforderlich string (date-time)
dayStarterforderlich string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMserforderlich integer (int64) Tracked time removed by approved deletions (part of idle).
domainserforderlich DomainUsageDto[]
hostserforderlich HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMserforderlich integer (int64)
leftAt string (date-time) | null
meetingMserforderlich integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMserforderlich integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMserforderlich integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalserforderlich TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMserforderlich integer (int64) Private time outside active and offline time.
productivityerforderlich DayProductivityDto
recomputingerforderlich boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotserforderlich 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).
timeEntrieserforderlich TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZoneerforderlich string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIderforderlich string (uuid)
workedMserforderlich integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

FeldTypBeschreibung
activeMserforderlich integer (int64)
appserforderlich AppUsageDto[]
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
productiveMserforderlich integer (int64)
slotStarterforderlich string (date-time)
unproductiveMserforderlich integer (int64)

AffectedAllocationDto

An allocation replace changed.

FeldTypBeschreibung
changeerforderlich string trimmed, split or deleted.
iderforderlich string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

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

FeldTypBeschreibung
affectederforderlich AffectedAllocationDto[]
allocationerforderlich AllocationDto

AllocationDto

Time on a project.

FeldTypBeschreibung
createdAterforderlich string (date-time)
createdByerforderlich NamedRefDto
durationMserforderlich integer (int64)
effectiveBillableerforderlich boolean
endedAterforderlich string (date-time)
iderforderlich 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.
localDateerforderlich string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionserforderlich AllocationPermissionsDto
projecterforderlich ProjectRefDto
sourceerforderlich string timer, manual or assignment.
startedAterforderlich string (date-time)
task NamedRefDto | null
timeZoneerforderlich string
updatedAterforderlich string (date-time)
userIderforderlich string (uuid)
versionerforderlich integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

FeldTypBeschreibung
itemserforderlich AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

FeldTypBeschreibung
deleteerforderlich boolean
editerforderlich boolean

AppTotalDto

FeldTypBeschreibung
activeMserforderlich integer (int64)
appKeyerforderlich string
categoryKey string | null
level string | null Level in the response's levelContext.
nameerforderlich string
percentageerforderlich 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".

FeldTypBeschreibung
activeMserforderlich integer (int64)
appKeyerforderlich string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
nameerforderlich string

BudgetDto

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

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

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

FeldTypBeschreibung
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

FeldTypBeschreibung
fullName string | null
iderforderlich string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

FeldTypBeschreibung
fullName string | null
iderforderlich string (uuid)

CapabilitiesDto

Subscription capabilities.

FeldTypBeschreibung
featureserforderlich string[]
readOnlyerforderlich boolean

CategoryUsageDto

FeldTypBeschreibung
activeMserforderlich 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.

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

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

CreateTeam

POST /v1/teams.

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

CreateTimeEntryRequest

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

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

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

CreatedWebhookEndpointDto

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

FeldTypBeschreibung
endpointerforderlich WebhookEndpointDto
secreterforderlich string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

FeldTypBeschreibung
half string | null
keyerforderlich string
nameerforderlich string English name; nameTr is the Turkish one.
nameTrerforderlich string

DayAbsenceDto

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

FeldTypBeschreibung
colorerforderlich string
fractionerforderlich number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
uniterforderlich string

DayAttendanceDto

Attendance of the day on the day plan.

FeldTypBeschreibung
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexibleerforderlich boolean
lateByMserforderlich integer (int64)
lateToleranceMinuteserforderlich integer (int32)
leftEarlyerforderlich boolean
leftEarlyByMserforderlich integer (int64)
statuserforderlich string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMserforderlich integer (int64) The plan's target (the Effectiveness % denominator).
workdayerforderlich boolean

DayPlanDto

The day plan of one user's day.

FeldTypBeschreibung
absenceserforderlich PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMserforderlich integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kinderforderlich string schedule, shift, dayOff or holiday.
leaveFractionerforderlich number (double) The approved absence coverage f (0–1).
shiftserforderlich PlanShiftDto[] Shifts starting on the day, by start.
targetMserforderlich integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayerforderlich boolean

DayProductivityDto

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

FeldTypBeschreibung
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMserforderlich integer (int64)
unproductiveMserforderlich integer (int64)

DayTotalDto

One local day of a summary.

FeldTypBeschreibung
activeMserforderlich integer (int64)
activeUserCounterforderlich integer (int32)
atWorkMserforderlich integer (int64)
dateerforderlich string (date)
idleMserforderlich integer (int64)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
privateMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null
unproductiveMserforderlich integer (int64)

DomainTotalDto

FeldTypBeschreibung
activeMserforderlich integer (int64)
categoryKey string | null
domainerforderlich string
level string | null
percentageerforderlich number (double)

DomainUsageDto

FeldTypBeschreibung
activeMserforderlich integer (int64)
categoryKey string | null
domainerforderlich 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).

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

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

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

ExportJobDto

An export job as the panel lists and polls it.

FeldTypBeschreibung
createdAterforderlich string (date-time)
dataseterforderlich 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
formaterforderlich string
fromerforderlich string (date)
groupBy string | null
iderforderlich string (uuid)
localeerforderlich string
progresserforderlich integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statuserforderlich 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.
toerforderlich string (date)

ExportOptionsDto

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

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

FeldTypBeschreibung
codeerforderlich string Stable snake_case code (required, too_long, invalid, ...).
fielderforderlich 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).

FeldTypBeschreibung
half string | null
keyerforderlich string Built-in key (republic_day, …) or custom.
nameerforderlich string
nameEnerforderlich string
nameTrerforderlich string
source string | null builtin or tenant.

HostUsageDto

FeldTypBeschreibung
activeMserforderlich integer (int64)
domain string | null
hosterforderlich string
levelerforderlich string
levelSourceerforderlich string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

FeldTypBeschreibung
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).
statuserforderlich 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.

FeldTypBeschreibung
expiresAterforderlich string
iderforderlich string (uuid)

InvitationResult

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

FeldTypBeschreibung
emailerforderlich InvitationEmail
invitationerforderlich InvitationRef
membererforderlich MemberDto

LevelContextDto

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

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

MeDto

GET /v1/me.

FeldTypBeschreibung
accesserforderlich AccessDto
capabilitieserforderlich CapabilitiesDto
effectiveTimeZoneerforderlich string
membershiperforderlich MeMembership
organizationerforderlich MeOrganization
organizationserforderlich OrganizationChoice[]
session MeSession | null
usererforderlich MeUser

MeMembership

The membership in the current organization.

FeldTypBeschreibung
iderforderlich string (uuid)
isTrackederforderlich boolean
joinedAt string | null
roleerforderlich string
statuserforderlich string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdserforderlich string (uuid)[]

MeOrganization

The current organization.

FeldTypBeschreibung
defaultLocaleerforderlich string
iderforderlich string (uuid)
nameerforderlich string
slugerforderlich string
statuserforderlich string
timeZoneerforderlich string

MeSession

The current session.

FeldTypBeschreibung
absoluteExpiresAterforderlich string
amrerforderlich string[]
authTimeerforderlich string
clientIderforderlich string
iderforderlich string (uuid)
idleExpiresAterforderlich string

MeUser

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

FeldTypBeschreibung
emailerforderlich string
emailVerificationerforderlich EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiederforderlich boolean
fullName string | null
iderforderlich string (uuid)
localeerforderlich string

MemberDto

A membership with its person (MemberDto).

FeldTypBeschreibung
createdAterforderlich string
emailerforderlich string
emailVerifiederforderlich boolean
fullName string | null
iderforderlich string (uuid)
invitation MemberInvitationDto | null
isTrackederforderlich boolean
joinedAt string | null
localeerforderlich string
roleerforderlich string owner, admin, team_admin, manager, employee.
statuserforderlich string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagererforderlich boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIderforderlich string (uuid)
viewerTeamIdserforderlich string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

FeldTypBeschreibung
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.
expiresAterforderlich string
iderforderlich string (uuid)
lastSentAterforderlich string
sentCounterforderlich integer (int32)

MemberPage

A page of members (OpenAPI).

FeldTypBeschreibung
itemserforderlich MemberDto[]
nextCursor string | null

MemberRefDto

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

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

NamedRefDto

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

FeldTypBeschreibung
iderforderlich string (uuid)
nameerforderlich string

OrganizationChoice

One organization of the person (sec.user_memberships).

FeldTypBeschreibung
currenterforderlich boolean
iderforderlich string (uuid)
nameerforderlich string
roleerforderlich string
selectableerforderlich boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

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

FeldTypBeschreibung
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

FeldTypBeschreibung
fromerforderlich string (date)
groupByerforderlich string
levelContexterforderlich LevelContextDto
periodserforderlich ReportPeriodDto[]
subjecterforderlich ReportSubjectDto
teamserforderlich TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
toerforderlich string (date)
totalserforderlich ReportFiguresDto

PlanAbsenceDto

FeldTypBeschreibung
colorerforderlich string
countsAsWorkederforderlich boolean timeEffect == worked.
endTime string | null
half string | null
iderforderlich string (uuid)
startTime string | null Local start and end of an hours absence.
statuserforderlich string approved or pending.
timeEffecterforderlich 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).
uniterforderlich string days, half_day or hours.

PlanShiftDto

FeldTypBeschreibung
color string | null
enderforderlich string (date-time)
endTimeerforderlich string Local end; before the start for a night shift.
iderforderlich string (uuid)
locationerforderlich string
minMinuteserforderlich integer (int32)
starterforderlich string (date-time)
startTimeerforderlich string Local start (HH:mm, the shift's zone).

Problem

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

FeldTypBeschreibung
action string | null Permission key of a 403 (teams.create).
codeerforderlich 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).
statuserforderlich integer (int32)
titleerforderlich string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typeerforderlich 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).

FeldTypBeschreibung
billableMinorerforderlich integer (int64) The billable hours at their rate.
costMinorerforderlich integer (int64) Every allocated hour at its rate.
currencyerforderlich string

ProjectBudgetUsageDto

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

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

ProjectDto

A project.

FeldTypBeschreibung
accesserforderlich string everyone or members.
archivederforderlich boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAterforderlich string (date-time)
currencyerforderlich string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
iderforderlich string (uuid)
isBillableerforderlich boolean
memberCounterforderlich integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
nameerforderlich string
permissionserforderlich ProjectPermissionsDto
spentMserforderlich integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statuserforderlich string active, on_hold or completed.
taskCounterforderlich integer (int64)
updatedAterforderlich string (date-time)

ProjectPage

GET /v1/projects.

FeldTypBeschreibung
itemserforderlich ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

FeldTypBeschreibung
archiveerforderlich boolean
deleteerforderlich boolean Only a project without time.
editerforderlich boolean The project's fields (Owners and Admins).
manageMemberserforderlich boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTaskserforderlich boolean Tasks (an Admin or the project's manager).
trackerforderlich boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

FeldTypBeschreibung
color string | null #RRGGBB.
iderforderlich string (uuid)
nameerforderlich string

ProjectReportDto

GET /v1/reports/projects.

FeldTypBeschreibung
budgetserforderlich ProjectBudgetUsageDto[]
costsIncludederforderlich boolean The caller sees rates and amounts (projects.costs.read).
fromerforderlich string (date)
groupByerforderlich string[]
rowserforderlich ProjectReportRowDto[]
toerforderlich string (date)
totalserforderlich ProjectReportTotalsDto

ProjectReportKeysDto

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

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

FeldTypBeschreibung
allocatedMserforderlich integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMserforderlich integer (int64)
keyserforderlich ProjectReportKeysDto
nonBillableMserforderlich integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMserforderlich integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

FeldTypBeschreibung
allocatedMserforderlich integer (int64)
amounts ProjectAmountDto[] | null
billableMserforderlich integer (int64)
nonBillableMserforderlich integer (int64)
productiveMs integer (int64) | null
unratedMserforderlich integer (int64)

ProjectRequest

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

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

FeldTypBeschreibung
absenceCreditMserforderlich integer (int64)
absentDayserforderlich integer (int32)
activeMserforderlich integer (int64)
activeUserCounterforderlich integer (int32)
effectivenessPct number (double) | null
idleMserforderlich integer (int64)
lateDayserforderlich integer (int32)
leaveDayserforderlich number (double)
leftEarlyDayserforderlich integer (int32)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
overtimeDayserforderlich integer (int32)
overtimeMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null
targetMserforderlich integer (int64)
unproductiveMserforderlich integer (int64)
userCounterforderlich integer (int32)
workedMserforderlich 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).

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

ReportSubjectDto

Whom a report is about.

FeldTypBeschreibung
id string (uuid) | null
kinderforderlich string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

FeldTypBeschreibung
previousSecretExpiresAterforderlich string Until then deliveries carry both signatures.
secreterforderlich 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.

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

FeldTypBeschreibung
breakMinuteserforderlich integer (int32)
color string | null
createdAterforderlich string (date-time)
createdByerforderlich CalendarUserRefDto
crossesMidnighterforderlich boolean
dateerforderlich string (date)
durationMinuteserforderlich integer (int32)
enderforderlich string (date-time)
endTimeerforderlich string
iderforderlich string (uuid)
locationerforderlich string
minMinuteserforderlich integer (int32)
note string | null
openerforderlich boolean No user assigned.
permissionserforderlich ShiftPermissionsDto
sourceerforderlich string manual, template, copy or request.
starterforderlich string (date-time)
startTimeerforderlich 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
timeZoneerforderlich string
updatedAterforderlich 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).

FeldTypBeschreibung
itemserforderlich ShiftDto[]

ShiftPermissionsDto

FeldTypBeschreibung
canDeleteerforderlich boolean
canEditerforderlich boolean
canPickUperforderlich boolean
canRequestSwaperforderlich boolean

SummaryDto

The summary of the visible users over a range.

FeldTypBeschreibung
absenceCreditMserforderlich integer (int64)
absentDayserforderlich integer (int32)
activeMserforderlich integer (int64)
activeUserCounterforderlich integer (int32)
atWorkMserforderlich integer (int64)
dayserforderlich DayTotalDto[]
deletedMserforderlich integer (int64)
domainserforderlich DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromerforderlich string (date)
holidayDayserforderlich number (double)
idleMserforderlich integer (int64)
inactiveUserserforderlich UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDayserforderlich integer (int32)
leaveDayserforderlich number (double)
leftEarlyDayserforderlich integer (int32)
levelContexterforderlich LevelContextDto
meetingMserforderlich integer (int64)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
overtimeMserforderlich integer (int64)
privateMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopeerforderlich ReportScopeDto
shiftDayserforderlich integer (int32)
teamserforderlich TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
toerforderlich string (date)
topAppserforderlich AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMserforderlich integer (int64)
userserforderlich UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMserforderlich integer (int64)

TargetItemDto

FeldTypBeschreibung
activeMserforderlich integer (int64)
categoryKey string | null
categorySourceerforderlich string tenant, builtin or none.
domain string | null
levelerforderlich string
levelSourceerforderlich string team, company or default.
matchedKey string | null
nameerforderlich string
percentageerforderlich number (double)
targetKeyerforderlich string
targetTypeerforderlich string app for apps, domain for domains and hosts.
userCounterforderlich integer (int32)

TargetListDto

The "Apps & URLs" list.

FeldTypBeschreibung
fromerforderlich string (date)
itemserforderlich TargetItemDto[] By active time descending, then key.
levelContexterforderlich LevelContextDto
nextCursor string | null
toerforderlich string (date)
totalerforderlich integer (int32) Targets matching the filters (before paging).
totalActiveMserforderlich integer (int64) Active time over every target of the type before the filters (the percentage base).
typeerforderlich string app, domain or host.

TaskDto

A task.

FeldTypBeschreibung
archivederforderlich boolean
assignee NamedRefDto | null
createdAterforderlich string (date-time)
description string | null
dueDate string (date) | null
effectiveBillableerforderlich boolean
estimateMinutes integer (int64) | null
iderforderlich string (uuid)
isBillable boolean | null null takes the project's value.
nameerforderlich string
permissionserforderlich TaskPermissionsDto
projectIderforderlich string (uuid)
sortOrdererforderlich integer (int64)
spentMserforderlich integer (int64)
statuserforderlich string open, in_progress or done.
updatedAterforderlich string (date-time)

TaskPage

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

FeldTypBeschreibung
itemserforderlich TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

FeldTypBeschreibung
deleteerforderlich boolean Only a task without time.
editerforderlich boolean

TaskRequest

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

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

FeldTypBeschreibung
archivedAt string | null
createdAterforderlich string
description string | null
iderforderlich string (uuid)
leadserforderlich object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCounterforderlich integer (int64) Members whose primary team this is (left members excluded).
nameerforderlich string
updatedAterforderlich string

TeamPage

A page of teams (OpenAPI).

FeldTypBeschreibung
itemserforderlich TeamDto[]
nextCursor string | null

TeamPeriodsDto

FeldTypBeschreibung
periodserforderlich ReportPeriodDto[]
teamIderforderlich string (uuid)
teamName string | null
totalserforderlich ReportFiguresDto

TeamTotalDto

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

FeldTypBeschreibung
absenceCreditMserforderlich integer (int64)
absentDayserforderlich integer (int32)
activeMserforderlich integer (int64)
activeUserCounterforderlich integer (int32)
effectivenessPct number (double) | null
holidayDayserforderlich number (double)
idleMserforderlich integer (int64)
lateDayserforderlich integer (int32)
leaveDayserforderlich number (double)
leftEarlyDayserforderlich integer (int32)
memberCounterforderlich integer (int32)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
overtimeMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null
shiftDayserforderlich integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMserforderlich integer (int64)
workedMserforderlich integer (int64)

TimeEntryDecisionRequest

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

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

TimeEntryDto

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

FeldTypBeschreibung
createdAterforderlich string (date-time)
createdByerforderlich TimeEntryUserRefDto
dateerforderlich 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
durationMserforderlich integer (int64)
enderforderlich string (date-time)
iderforderlich string (uuid)
kinderforderlich string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionserforderlich TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourceerforderlich string manual (Phase 8 adds calendar).
starterforderlich string (date-time)
statuserforderlich string pending, approved or rejected.
timeZoneerforderlich string
updatedAterforderlich string (date-time)
userIderforderlich string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

FeldTypBeschreibung
itemserforderlich TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

FeldTypBeschreibung
canApproveerforderlich boolean
canDeleteerforderlich boolean
canEditerforderlich boolean

TimeEntryUserRefDto

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

FeldTypBeschreibung
fullName string | null
iderforderlich string (uuid)

TimeIntervalDto

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

FeldTypBeschreibung
enderforderlich string (date-time)
starterforderlich string (date-time)

TimerAtRequest

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

FeldTypBeschreibung
at string (date-time) | null

TimerCommandResultDto

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

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

TimerDto

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

FeldTypBeschreibung
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
serverTimeerforderlich 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
stateerforderlich string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

FeldTypBeschreibung
endReasonerforderlich string stop, switch, autostop or discard.
endedAterforderlich string (date-time)
segmentIderforderlich string (uuid)
startedAterforderlich string (date-time)

TimerProjectDto

The project of the running segment.

FeldTypBeschreibung
clientName string | null
color string | null
iderforderlich string (uuid)
nameerforderlich string

TimerStartRequest

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

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

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

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

FeldTypBeschreibung
dayserforderlich UserDayDto[]
fromerforderlich string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZoneerforderlich string
toerforderlich string (date)
userIderforderlich string (uuid)

UserDayDto

FeldTypBeschreibung
absence DayAbsenceDto | null
absenceCreditMserforderlich integer (int64)
activeMserforderlich integer (int64)
afkCoverageerforderlich boolean
arrivalAt string (date-time) | null
atWorkMserforderlich integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiederforderlich boolean
dateerforderlich string (date)
dayOffWorkedMserforderlich integer (int64)
deletedMserforderlich integer (int64)
effectivenessPct number (double) | null
eventCounterforderlich integer (int64)
expectedWorkMserforderlich integer (int64)
holiday DailyHolidayDto | null
idleMserforderlich integer (int64)
lateByMserforderlich integer (int64)
leftAt string (date-time) | null
leftEarlyerforderlich boolean
leftEarlyByMserforderlich integer (int64)
meetingMserforderlich integer (int64)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
overtimeMserforderlich integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null
shiftCounterforderlich integer (int32)
targetMserforderlich integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMserforderlich integer (int64)
workday boolean | null
workedMserforderlich integer (int64)

UserTotalDto

One user of a summary.

FeldTypBeschreibung
absenceCreditMserforderlich integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDayserforderlich integer (int32) Local days with active time.
activeMserforderlich integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMserforderlich integer (int64)
classifiedDayserforderlich integer (int32)
dayOffWorkedMserforderlich integer (int64)
deletedMserforderlich integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCounterforderlich integer (int64)
fullName string | null
holidayDayserforderlich number (double)
idleMserforderlich integer (int64)
lateDays integer (int32) | null
leaveDayserforderlich number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMserforderlich integer (int64)
neutralMserforderlich integer (int64)
offlineMserforderlich integer (int64)
overtimeDayserforderlich integer (int32)
overtimeMserforderlich integer (int64)
privateMserforderlich integer (int64)
productiveMserforderlich integer (int64)
productivityPct number (double) | null
shiftDayserforderlich integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZoneerforderlich string
unproductiveMserforderlich integer (int64)
userIderforderlich string (uuid)
workdays integer (int32) | null
workedMserforderlich integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

FeldTypBeschreibung
attemptserforderlich integer (int32)
createdAterforderlich string
deliveredAt string | null
eventIderforderlich string (uuid) The webhook-id header.
eventTypeerforderlich string
iderforderlich 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
statuserforderlich string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

FeldTypBeschreibung
itemserforderlich WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

FeldTypBeschreibung
createdAterforderlich string
description string | null
eventTypeserforderlich string[]
iderforderlich string (uuid)
ownererforderlich 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).
secretPrefixerforderlich string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statserforderlich WebhookEndpointStatsDto
statuserforderlich string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAterforderlich string
urlerforderlich string
versionerforderlich integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

FeldTypBeschreibung
itemserforderlich WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

FeldTypBeschreibung
consecutiveFailureserforderlich integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

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

WebhookEventsDto

GET /v1/webhook-events.

FeldTypBeschreibung
itemserforderlich WebhookEventDto[]

WebhookTestDto

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

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