Public API reference

The Workify360 Focus public API lets your own scripts and tools read reports and time data and make changes with the same rules as the dashboard. The public API, API keys and webhooks are part of the Premium plan.

The operations on this page are kept backward compatible. The machine-readable OpenAPI document of the same operations:

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

Generated from the API contract version 0.1.0 (c95fb97bb49a).

Authentication

Send a personal API key in the Authorization header of every request. A key belongs to the person who created it, acts as that person and never does more than their current role allows. A request with a missing, wrong, expired or revoked key gets 401 with the code unauthorized.

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

How to create, scope and revoke keys: API keys and the public API

Scopes

Each operation needs one scope, shown next to it. A key reaches an operation when it holds that scope and its owner's current role, teams and plan allow the request, exactly as in the dashboard.

ScopeWhat it allows
meYour own profile and your timer
reports:readReading reports, time entries, absences, shifts, teams, projects, tasks and exports
time:writeAdding and changing time entries, absences, shifts, tasks and time assigned to tasks, and deciding requests
org:adminManaging members, teams, invitations and projects
webhooks:manageManaging webhook endpoints

Rate limits

Each key may send 600 units per minute and an organization 1,800 for all its keys together. A request that changes something (anything other than GET and HEAD) counts as two units, any other request as one. A key can also send at most 60 units at once, refilled at 10 per second: more than 60 reads (or 30 changes) in a burst get 429 even under 600 a minute.

HeaderMeaning
RateLimit: "key";r=598;t=2On every counted answer: the units the key has left and the seconds until they are full again
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60On every counted answer: the per-minute limits of the key and of the organization
Retry-After: 12With 429 (code rate_limited): the seconds to wait before the next request

Errors

An error is an RFC 9457 problem document (Content-Type: application/problem+json). code is a stable snake_case code to program against; title is an English text for logs. type is the help address of the code, https://workify360.com/help/errors/<code>/ with each _ written as -, which opens the help article that explains the code when the code has one.

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

Some problems carry more fields: errors (the field errors of 422 validation_failed), action (the permission a 403 forbidden refers to), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 and 503) and traceId (quote it when you contact support).

StatusCodeWhen
400 invalid_request A parameter is malformed or missing
401 unauthorized The key is missing, wrong, expired or revoked, or its owner left the organization
402 feature_not_in_plan, subscription_read_only The plan does not include the feature, or the subscription is read-only
403 forbidden, feature_not_enabled The key lacks the scope, or its owner's current role, teams or settings do not allow the request
412 version_conflict The If-Match version is no longer current; read the resource again
422 validation_failed The body is invalid; errors lists the fields
428 precondition_required The operation needs an If-Match header with the version you read
429 rate_limited Too many requests; wait the seconds in Retry-After

Codes with a help article are links in the operation list.

Webhooks

Instead of asking the API again and again, an endpoint of yours can receive a signed HTTPS request when something changes. The events, the request format, how to verify the signature in Node.js and Python, retries and secret rotation are explained in the help article: Webhooks

Operations

Grouped by area. The summaries and field descriptions come from the API contract.

Absences

GET /v1/absences Scope: reports:read

List absences overlapping a range.

Parameters
NameInTypeDescription
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)
Responses
200 AbsencePage
Errors

POST /v1/absences Scope: time:write

Request (or record) an absence.

Parameters
NameInTypeDescription
Idempotency-Keyrequired header string Required: the same key and body return the first answer
Request body
AbsenceRequest
Responses
201 AbsenceDto
Errors

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Id
If-Matchrequired header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request body
CalendarDecisionRequest
Responses
200 AbsenceDto
Errors

Activity

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.

Parameters
NameInTypeDescription
date query string (date) The user's local day (required).
userId query string (uuid) Default: the caller; another user must be visible (else 403).
Responses
200 ActivityDayDto
Errors

Time allocations

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

Parameters
NameInTypeDescription
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).
Responses
200 AllocationPage
Errors

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.

Parameters
NameInTypeDescription
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Request body
AllocationCreateRequest
Responses
201 AllocationCreatedDto
Errors

Exports

POST /v1/exports Scope: reports:read

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

Parameters
NameInTypeDescription
Idempotency-Keyrequired header string Required: the same key and body return the first answer
Request body
CreateExportRequest
Responses
202 ExportJobDto
Errors

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

One export job (poll every 2 s).

Parameters
NameInTypeDescription
idrequired path string (uuid) Id
Responses
200 ExportJobDto
Errors

Me

GET /v1/me Scope: me

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

Responses
200 MeDto
Errors

Members

GET /v1/members Scope: org:admin

List members.

Parameters
NameInTypeDescription
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
Responses
200 MemberPage
Errors
  • 403 No right

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

One member.

Parameters
NameInTypeDescription
idrequired path string (uuid) Membership id
Responses
200 MemberDto
Errors
  • 404 member_not_found

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Membership id
If-Matchrequired header string ETag of the member ("v<n>")
Request body
PatchMember
Responses
200 MemberDto
Errors

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

Reactivate a suspended member.

Parameters
NameInTypeDescription
idrequired path string (uuid) Membership id
Responses
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.

Parameters
NameInTypeDescription
idrequired path string (uuid) Membership id
Responses
200 MemberDto
Errors
  • 409 conflict (an invitation is revoked instead)

Projects

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

Parameters
NameInTypeDescription
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).
Responses
200 ProjectPage
Errors

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Project id
If-Matchrequired header string The ETag the caller read (412 version_conflict when it changed)
Request body
ProjectRequest
Responses
200 ProjectDto
Errors

Reports

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

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

Parameters
NameInTypeDescription
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)
Responses
200 PeriodReportDto
Errors

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.

Parameters
NameInTypeDescription
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).
Responses
200 ProjectReportDto
Errors

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

The summary of the visible users over a range.

Parameters
NameInTypeDescription
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).
Responses
200 SummaryDto
Errors

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

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

Parameters
NameInTypeDescription
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.
Responses
200 TargetListDto
Errors

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

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

Parameters
NameInTypeDescription
userIdrequired path string (uuid) User
from query string (date)
to query string (date) At most 93 days after from.
Responses
200 UserDailyDto
Errors

Shifts

GET /v1/shifts Scope: reports:read

List the shifts starting in a range.

Parameters
NameInTypeDescription
from query string (date)
to query string (date)
teamId query string (uuid)
userId query string (uuid)
includeOpen query boolean Also open shifts (default true).
Responses
200 ShiftListDto
Errors

POST /v1/shifts Scope: time:write

Create a shift (assigned or open).

Parameters
NameInTypeDescription
Idempotency-Keyrequired header string Required: the same key and body return the first answer
Request body
ShiftBody
Responses
201 ShiftDto
Errors

Tasks

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

A visible project's tasks, by sort order.

Parameters
NameInTypeDescription
idrequired path string (uuid) Project id
status query string open, in_progress or done.
assigneeUserId query string (uuid)
includeArchived query boolean
cursor query string
limit query integer (int32) 1–500 (default 200).
Responses
200 TaskPage
Errors

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Project id
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Request body
TaskRequest
Responses
201 TaskDto
Errors

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

Change a task (the whole body).

Parameters
NameInTypeDescription
idrequired path string (uuid) Task id
If-Matchrequired header string The ETag the caller read (412 version_conflict when it changed)
Request body
TaskRequest
Responses
200 TaskDto
Errors

Teams

GET /v1/teams Scope: reports:read

List teams.

Parameters
NameInTypeDescription
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
Responses
200 TeamPage

POST /v1/teams Scope: org:admin

Create a team (the G1 endpoint).

Request body
CreateTeam
Responses
201 TeamDto
Errors
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

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

Rename a team or change its description.

Parameters
NameInTypeDescription
idrequired path string (uuid) Team id
If-Matchrequired header string ETag of the team
Request body
PatchTeam
Responses
200 TeamDto
Errors
  • 409 team_name_taken

Time entries

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

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

Parameters
NameInTypeDescription
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.
Responses
200 TimeEntryPage
Errors

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

Parameters
NameInTypeDescription
Idempotency-Keyrequired header string Required: the same key and body return the first answer
Request body
CreateTimeEntryRequest
Responses
201 TimeEntryDto
Errors

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Entry id
Responses
200 TimeEntryDto
Errors

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

Replace an entry's editable fields.

Parameters
NameInTypeDescription
idrequired path string (uuid) Entry id
If-Matchrequired header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request body
UpdateTimeEntryRequest
Responses
200 TimeEntryDto
Errors

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

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

Parameters
NameInTypeDescription
idrequired path string (uuid) Entry id
If-Matchrequired header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Request body
TimeEntryDecisionRequest
Responses
200 TimeEntryDto
Errors

Timer

GET /v1/me/timer Scope: me

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

Parameters
NameInTypeDescription
If-None-Match header string | null The ETag the caller holds (304 when unchanged)
Responses
200 TimerDto · 304 (no body)
Errors

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

Parameters
NameInTypeDescription
Idempotency-Key header string | null The client's command id; a retry returns the first answer
Request body
TimerStartRequest
Responses
200 TimerCommandResultDto
Errors

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.

Parameters
NameInTypeDescription
idrequired path string (uuid) The endpoint
If-Matchrequired header string The endpoint's ETag ("v<n>")
Request body
UpdateWebhookEndpointRequest
Responses
200 WebhookEndpointDto
Errors

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

Delete an endpoint and its deliveries.

Parameters
NameInTypeDescription
idrequired path string (uuid) The endpoint
Responses
204 (no body)
Errors

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

The deliveries of an endpoint, newest first.

Parameters
NameInTypeDescription
idrequired path string (uuid) The endpoint
status query string pending, succeeded, failed, dead.
eventType query string
cursor query string Opaque cursor of the next page.
limit query integer (int32) 1–200, default 50.
Responses
200 WebhookDeliveryPage
Errors

Schemas

The request and response bodies the operations use. Required fields are marked.

AbsenceDto

An absence.

FieldTypeDescription
createdAtrequired string (date-time)
createdByrequired CalendarUserRefDto
daysrequired 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
deductionByYearrequired object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endrequired string (date-time)
endDaterequired string (date)
endTime string | null
half string | null
idrequired string (uuid)
note string | null
permissionsrequired AbsencePermissionsDto
startrequired string (date-time) UTC coverage start.
startDaterequired string (date)
startTime string | null
statusrequired string
timeZonerequired string
typerequired AbsenceTypeRefDto
unitrequired string
updatedAtrequired string (date-time)
userrequired CalendarPersonDto
userIdrequired string (uuid)

AbsencePage

GET /v1/absences.

FieldTypeDescription
itemsrequired AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

FieldTypeDescription
canApproverequired boolean
canCancelrequired boolean
canEditrequired boolean

AbsenceRequest

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

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

FieldTypeDescription
colorrequired string
countsAsWorkedrequired boolean
deductsFromBalancerequired boolean
idrequired string (uuid)
key string | null
namerequired string
paidrequired boolean
timeEffectrequired string

AcceptedDto

202 Accepted of a queued job.

FieldTypeDescription
acceptedrequired boolean Always true.

AccessDto

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

FieldTypeDescription
assignableRolesrequired string[]
canManageCompanySettingsrequired boolean
canManageTeamsrequired boolean
canManageUsersrequired boolean
manageTeamIdsrequired string[]
scoperequired string company, teams or self.
unassignedFallbackrequired boolean
viewTeamIdsrequired string[]

ActivityDayDto

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

FieldTypeDescription
absenceCreditMsrequired integer (int64) A worked absence tops the worked time up to the expected work.
activeMsrequired integer (int64) Window time ∩ not AFK (computer time only).
afkCoveragerequired boolean False when no device reported AFK data (idle unknown).
appsrequired AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMsrequired integer (int64)
attendance DayAttendanceDto | null
categoriesrequired CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedrequired boolean False for a day written before the Phase 2 classification (all neutral).
daterequired string (date)
dayEndrequired string (date-time)
dayStartrequired string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMsrequired integer (int64) Tracked time removed by approved deletions (part of idle).
domainsrequired DomainUsageDto[]
hostsrequired HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMsrequired integer (int64)
leftAt string (date-time) | null
meetingMsrequired integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMsrequired integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMsrequired integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalsrequired TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMsrequired integer (int64) Private time outside active and offline time.
productivityrequired DayProductivityDto
recomputingrequired boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotsrequired 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).
timeEntriesrequired TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZonerequired string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdrequired string (uuid)
workedMsrequired integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

FieldTypeDescription
activeMsrequired integer (int64)
appsrequired AppUsageDto[]
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
productiveMsrequired integer (int64)
slotStartrequired string (date-time)
unproductiveMsrequired integer (int64)

AffectedAllocationDto

An allocation replace changed.

FieldTypeDescription
changerequired string trimmed, split or deleted.
idrequired string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

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

FieldTypeDescription
affectedrequired AffectedAllocationDto[]
allocationrequired AllocationDto

AllocationDto

Time on a project.

FieldTypeDescription
createdAtrequired string (date-time)
createdByrequired NamedRefDto
durationMsrequired integer (int64)
effectiveBillablerequired boolean
endedAtrequired string (date-time)
idrequired 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.
localDaterequired string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionsrequired AllocationPermissionsDto
projectrequired ProjectRefDto
sourcerequired string timer, manual or assignment.
startedAtrequired string (date-time)
task NamedRefDto | null
timeZonerequired string
updatedAtrequired string (date-time)
userIdrequired string (uuid)
versionrequired integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

FieldTypeDescription
itemsrequired AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

FieldTypeDescription
deleterequired boolean
editrequired boolean

AppTotalDto

FieldTypeDescription
activeMsrequired integer (int64)
appKeyrequired string
categoryKey string | null
level string | null Level in the response's levelContext.
namerequired string
percentagerequired 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".

FieldTypeDescription
activeMsrequired integer (int64)
appKeyrequired string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
namerequired string

BudgetDto

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

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

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

FieldTypeDescription
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

FieldTypeDescription
fullName string | null
idrequired string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

FieldTypeDescription
fullName string | null
idrequired string (uuid)

CapabilitiesDto

Subscription capabilities.

FieldTypeDescription
featuresrequired string[]
readOnlyrequired boolean

CategoryUsageDto

FieldTypeDescription
activeMsrequired 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.

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

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

CreateTeam

POST /v1/teams.

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

CreateTimeEntryRequest

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

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

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

CreatedWebhookEndpointDto

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

FieldTypeDescription
endpointrequired WebhookEndpointDto
secretrequired string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

FieldTypeDescription
half string | null
keyrequired string
namerequired string English name; nameTr is the Turkish one.
nameTrrequired string

DayAbsenceDto

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

FieldTypeDescription
colorrequired string
fractionrequired number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitrequired string

DayAttendanceDto

Attendance of the day on the day plan.

FieldTypeDescription
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexiblerequired boolean
lateByMsrequired integer (int64)
lateToleranceMinutesrequired integer (int32)
leftEarlyrequired boolean
leftEarlyByMsrequired integer (int64)
statusrequired string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMsrequired integer (int64) The plan's target (the Effectiveness % denominator).
workdayrequired boolean

DayPlanDto

The day plan of one user's day.

FieldTypeDescription
absencesrequired PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMsrequired integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindrequired string schedule, shift, dayOff or holiday.
leaveFractionrequired number (double) The approved absence coverage f (0–1).
shiftsrequired PlanShiftDto[] Shifts starting on the day, by start.
targetMsrequired integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayrequired boolean

DayProductivityDto

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

FieldTypeDescription
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMsrequired integer (int64)
unproductiveMsrequired integer (int64)

DayTotalDto

One local day of a summary.

FieldTypeDescription
activeMsrequired integer (int64)
activeUserCountrequired integer (int32)
atWorkMsrequired integer (int64)
daterequired string (date)
idleMsrequired integer (int64)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
privateMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null
unproductiveMsrequired integer (int64)

DomainTotalDto

FieldTypeDescription
activeMsrequired integer (int64)
categoryKey string | null
domainrequired string
level string | null
percentagerequired number (double)

DomainUsageDto

FieldTypeDescription
activeMsrequired integer (int64)
categoryKey string | null
domainrequired 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).

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

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

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

ExportJobDto

An export job as the panel lists and polls it.

FieldTypeDescription
createdAtrequired string (date-time)
datasetrequired 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
formatrequired string
fromrequired string (date)
groupBy string | null
idrequired string (uuid)
localerequired string
progressrequired integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statusrequired 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.
torequired string (date)

ExportOptionsDto

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

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

FieldTypeDescription
coderequired string Stable snake_case code (required, too_long, invalid, ...).
fieldrequired 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).

FieldTypeDescription
half string | null
keyrequired string Built-in key (republic_day, …) or custom.
namerequired string
nameEnrequired string
nameTrrequired string
source string | null builtin or tenant.

HostUsageDto

FieldTypeDescription
activeMsrequired integer (int64)
domain string | null
hostrequired string
levelrequired string
levelSourcerequired string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

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

FieldTypeDescription
expiresAtrequired string
idrequired string (uuid)

InvitationResult

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

FieldTypeDescription
emailrequired InvitationEmail
invitationrequired InvitationRef
memberrequired MemberDto

LevelContextDto

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

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

MeDto

GET /v1/me.

FieldTypeDescription
accessrequired AccessDto
capabilitiesrequired CapabilitiesDto
effectiveTimeZonerequired string
membershiprequired MeMembership
organizationrequired MeOrganization
organizationsrequired OrganizationChoice[]
session MeSession | null
userrequired MeUser

MeMembership

The membership in the current organization.

FieldTypeDescription
idrequired string (uuid)
isTrackedrequired boolean
joinedAt string | null
rolerequired string
statusrequired string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdsrequired string (uuid)[]

MeOrganization

The current organization.

FieldTypeDescription
defaultLocalerequired string
idrequired string (uuid)
namerequired string
slugrequired string
statusrequired string
timeZonerequired string

MeSession

The current session.

FieldTypeDescription
absoluteExpiresAtrequired string
amrrequired string[]
authTimerequired string
clientIdrequired string
idrequired string (uuid)
idleExpiresAtrequired string

MeUser

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

FieldTypeDescription
emailrequired string
emailVerificationrequired EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedrequired boolean
fullName string | null
idrequired string (uuid)
localerequired string

MemberDto

A membership with its person (MemberDto).

FieldTypeDescription
createdAtrequired string
emailrequired string
emailVerifiedrequired boolean
fullName string | null
idrequired string (uuid)
invitation MemberInvitationDto | null
isTrackedrequired boolean
joinedAt string | null
localerequired string
rolerequired string owner, admin, team_admin, manager, employee.
statusrequired string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerrequired boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdrequired string (uuid)
viewerTeamIdsrequired string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

FieldTypeDescription
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.
expiresAtrequired string
idrequired string (uuid)
lastSentAtrequired string
sentCountrequired integer (int32)

MemberPage

A page of members (OpenAPI).

FieldTypeDescription
itemsrequired MemberDto[]
nextCursor string | null

MemberRefDto

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

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

NamedRefDto

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

FieldTypeDescription
idrequired string (uuid)
namerequired string

OrganizationChoice

One organization of the person (sec.user_memberships).

FieldTypeDescription
currentrequired boolean
idrequired string (uuid)
namerequired string
rolerequired string
selectablerequired boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

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

FieldTypeDescription
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

FieldTypeDescription
fromrequired string (date)
groupByrequired string
levelContextrequired LevelContextDto
periodsrequired ReportPeriodDto[]
subjectrequired ReportSubjectDto
teamsrequired TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
torequired string (date)
totalsrequired ReportFiguresDto

PlanAbsenceDto

FieldTypeDescription
colorrequired string
countsAsWorkedrequired boolean timeEffect == worked.
endTime string | null
half string | null
idrequired string (uuid)
startTime string | null Local start and end of an hours absence.
statusrequired string approved or pending.
timeEffectrequired 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).
unitrequired string days, half_day or hours.

PlanShiftDto

FieldTypeDescription
color string | null
endrequired string (date-time)
endTimerequired string Local end; before the start for a night shift.
idrequired string (uuid)
locationrequired string
minMinutesrequired integer (int32)
startrequired string (date-time)
startTimerequired string Local start (HH:mm, the shift's zone).

Problem

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

FieldTypeDescription
action string | null Permission key of a 403 (teams.create).
coderequired 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).
statusrequired integer (int32)
titlerequired string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typerequired 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).

FieldTypeDescription
billableMinorrequired integer (int64) The billable hours at their rate.
costMinorrequired integer (int64) Every allocated hour at its rate.
currencyrequired string

ProjectBudgetUsageDto

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

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

ProjectDto

A project.

FieldTypeDescription
accessrequired string everyone or members.
archivedrequired boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtrequired string (date-time)
currencyrequired string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idrequired string (uuid)
isBillablerequired boolean
memberCountrequired integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
namerequired string
permissionsrequired ProjectPermissionsDto
spentMsrequired integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statusrequired string active, on_hold or completed.
taskCountrequired integer (int64)
updatedAtrequired string (date-time)

ProjectPage

GET /v1/projects.

FieldTypeDescription
itemsrequired ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

FieldTypeDescription
archiverequired boolean
deleterequired boolean Only a project without time.
editrequired boolean The project's fields (Owners and Admins).
manageMembersrequired boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTasksrequired boolean Tasks (an Admin or the project's manager).
trackrequired boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

FieldTypeDescription
color string | null #RRGGBB.
idrequired string (uuid)
namerequired string

ProjectReportDto

GET /v1/reports/projects.

FieldTypeDescription
budgetsrequired ProjectBudgetUsageDto[]
costsIncludedrequired boolean The caller sees rates and amounts (projects.costs.read).
fromrequired string (date)
groupByrequired string[]
rowsrequired ProjectReportRowDto[]
torequired string (date)
totalsrequired ProjectReportTotalsDto

ProjectReportKeysDto

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

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

FieldTypeDescription
allocatedMsrequired integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMsrequired integer (int64)
keysrequired ProjectReportKeysDto
nonBillableMsrequired integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMsrequired integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

FieldTypeDescription
allocatedMsrequired integer (int64)
amounts ProjectAmountDto[] | null
billableMsrequired integer (int64)
nonBillableMsrequired integer (int64)
productiveMs integer (int64) | null
unratedMsrequired integer (int64)

ProjectRequest

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

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

FieldTypeDescription
absenceCreditMsrequired integer (int64)
absentDaysrequired integer (int32)
activeMsrequired integer (int64)
activeUserCountrequired integer (int32)
effectivenessPct number (double) | null
idleMsrequired integer (int64)
lateDaysrequired integer (int32)
leaveDaysrequired number (double)
leftEarlyDaysrequired integer (int32)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
overtimeDaysrequired integer (int32)
overtimeMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null
targetMsrequired integer (int64)
unproductiveMsrequired integer (int64)
userCountrequired integer (int32)
workedMsrequired 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).

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

ReportSubjectDto

Whom a report is about.

FieldTypeDescription
id string (uuid) | null
kindrequired string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

FieldTypeDescription
previousSecretExpiresAtrequired string Until then deliveries carry both signatures.
secretrequired 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.

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

FieldTypeDescription
breakMinutesrequired integer (int32)
color string | null
createdAtrequired string (date-time)
createdByrequired CalendarUserRefDto
crossesMidnightrequired boolean
daterequired string (date)
durationMinutesrequired integer (int32)
endrequired string (date-time)
endTimerequired string
idrequired string (uuid)
locationrequired string
minMinutesrequired integer (int32)
note string | null
openrequired boolean No user assigned.
permissionsrequired ShiftPermissionsDto
sourcerequired string manual, template, copy or request.
startrequired string (date-time)
startTimerequired 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
timeZonerequired string
updatedAtrequired 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).

FieldTypeDescription
itemsrequired ShiftDto[]

ShiftPermissionsDto

FieldTypeDescription
canDeleterequired boolean
canEditrequired boolean
canPickUprequired boolean
canRequestSwaprequired boolean

SummaryDto

The summary of the visible users over a range.

FieldTypeDescription
absenceCreditMsrequired integer (int64)
absentDaysrequired integer (int32)
activeMsrequired integer (int64)
activeUserCountrequired integer (int32)
atWorkMsrequired integer (int64)
daysrequired DayTotalDto[]
deletedMsrequired integer (int64)
domainsrequired DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromrequired string (date)
holidayDaysrequired number (double)
idleMsrequired integer (int64)
inactiveUsersrequired UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDaysrequired integer (int32)
leaveDaysrequired number (double)
leftEarlyDaysrequired integer (int32)
levelContextrequired LevelContextDto
meetingMsrequired integer (int64)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
overtimeMsrequired integer (int64)
privateMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scoperequired ReportScopeDto
shiftDaysrequired integer (int32)
teamsrequired TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
torequired string (date)
topAppsrequired AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMsrequired integer (int64)
usersrequired UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMsrequired integer (int64)

TargetItemDto

FieldTypeDescription
activeMsrequired integer (int64)
categoryKey string | null
categorySourcerequired string tenant, builtin or none.
domain string | null
levelrequired string
levelSourcerequired string team, company or default.
matchedKey string | null
namerequired string
percentagerequired number (double)
targetKeyrequired string
targetTyperequired string app for apps, domain for domains and hosts.
userCountrequired integer (int32)

TargetListDto

The "Apps & URLs" list.

FieldTypeDescription
fromrequired string (date)
itemsrequired TargetItemDto[] By active time descending, then key.
levelContextrequired LevelContextDto
nextCursor string | null
torequired string (date)
totalrequired integer (int32) Targets matching the filters (before paging).
totalActiveMsrequired integer (int64) Active time over every target of the type before the filters (the percentage base).
typerequired string app, domain or host.

TaskDto

A task.

FieldTypeDescription
archivedrequired boolean
assignee NamedRefDto | null
createdAtrequired string (date-time)
description string | null
dueDate string (date) | null
effectiveBillablerequired boolean
estimateMinutes integer (int64) | null
idrequired string (uuid)
isBillable boolean | null null takes the project's value.
namerequired string
permissionsrequired TaskPermissionsDto
projectIdrequired string (uuid)
sortOrderrequired integer (int64)
spentMsrequired integer (int64)
statusrequired string open, in_progress or done.
updatedAtrequired string (date-time)

TaskPage

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

FieldTypeDescription
itemsrequired TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

FieldTypeDescription
deleterequired boolean Only a task without time.
editrequired boolean

TaskRequest

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

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

FieldTypeDescription
archivedAt string | null
createdAtrequired string
description string | null
idrequired string (uuid)
leadsrequired object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountrequired integer (int64) Members whose primary team this is (left members excluded).
namerequired string
updatedAtrequired string

TeamPage

A page of teams (OpenAPI).

FieldTypeDescription
itemsrequired TeamDto[]
nextCursor string | null

TeamPeriodsDto

FieldTypeDescription
periodsrequired ReportPeriodDto[]
teamIdrequired string (uuid)
teamName string | null
totalsrequired ReportFiguresDto

TeamTotalDto

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

FieldTypeDescription
absenceCreditMsrequired integer (int64)
absentDaysrequired integer (int32)
activeMsrequired integer (int64)
activeUserCountrequired integer (int32)
effectivenessPct number (double) | null
holidayDaysrequired number (double)
idleMsrequired integer (int64)
lateDaysrequired integer (int32)
leaveDaysrequired number (double)
leftEarlyDaysrequired integer (int32)
memberCountrequired integer (int32)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
overtimeMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null
shiftDaysrequired integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMsrequired integer (int64)
workedMsrequired integer (int64)

TimeEntryDecisionRequest

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

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

TimeEntryDto

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

FieldTypeDescription
createdAtrequired string (date-time)
createdByrequired TimeEntryUserRefDto
daterequired 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
durationMsrequired integer (int64)
endrequired string (date-time)
idrequired string (uuid)
kindrequired string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionsrequired TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourcerequired string manual (Phase 8 adds calendar).
startrequired string (date-time)
statusrequired string pending, approved or rejected.
timeZonerequired string
updatedAtrequired string (date-time)
userIdrequired string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

FieldTypeDescription
itemsrequired TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

FieldTypeDescription
canApproverequired boolean
canDeleterequired boolean
canEditrequired boolean

TimeEntryUserRefDto

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

FieldTypeDescription
fullName string | null
idrequired string (uuid)

TimeIntervalDto

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

FieldTypeDescription
endrequired string (date-time)
startrequired string (date-time)

TimerAtRequest

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

FieldTypeDescription
at string (date-time) | null

TimerCommandResultDto

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

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

TimerDto

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

FieldTypeDescription
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
serverTimerequired 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
staterequired string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

FieldTypeDescription
endReasonrequired string stop, switch, autostop or discard.
endedAtrequired string (date-time)
segmentIdrequired string (uuid)
startedAtrequired string (date-time)

TimerProjectDto

The project of the running segment.

FieldTypeDescription
clientName string | null
color string | null
idrequired string (uuid)
namerequired string

TimerStartRequest

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

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

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

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

FieldTypeDescription
daysrequired UserDayDto[]
fromrequired string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZonerequired string
torequired string (date)
userIdrequired string (uuid)

UserDayDto

FieldTypeDescription
absence DayAbsenceDto | null
absenceCreditMsrequired integer (int64)
activeMsrequired integer (int64)
afkCoveragerequired boolean
arrivalAt string (date-time) | null
atWorkMsrequired integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedrequired boolean
daterequired string (date)
dayOffWorkedMsrequired integer (int64)
deletedMsrequired integer (int64)
effectivenessPct number (double) | null
eventCountrequired integer (int64)
expectedWorkMsrequired integer (int64)
holiday DailyHolidayDto | null
idleMsrequired integer (int64)
lateByMsrequired integer (int64)
leftAt string (date-time) | null
leftEarlyrequired boolean
leftEarlyByMsrequired integer (int64)
meetingMsrequired integer (int64)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
overtimeMsrequired integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null
shiftCountrequired integer (int32)
targetMsrequired integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMsrequired integer (int64)
workday boolean | null
workedMsrequired integer (int64)

UserTotalDto

One user of a summary.

FieldTypeDescription
absenceCreditMsrequired integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDaysrequired integer (int32) Local days with active time.
activeMsrequired integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMsrequired integer (int64)
classifiedDaysrequired integer (int32)
dayOffWorkedMsrequired integer (int64)
deletedMsrequired integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountrequired integer (int64)
fullName string | null
holidayDaysrequired number (double)
idleMsrequired integer (int64)
lateDays integer (int32) | null
leaveDaysrequired number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMsrequired integer (int64)
neutralMsrequired integer (int64)
offlineMsrequired integer (int64)
overtimeDaysrequired integer (int32)
overtimeMsrequired integer (int64)
privateMsrequired integer (int64)
productiveMsrequired integer (int64)
productivityPct number (double) | null
shiftDaysrequired integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZonerequired string
unproductiveMsrequired integer (int64)
userIdrequired string (uuid)
workdays integer (int32) | null
workedMsrequired integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

FieldTypeDescription
attemptsrequired integer (int32)
createdAtrequired string
deliveredAt string | null
eventIdrequired string (uuid) The webhook-id header.
eventTyperequired string
idrequired 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
statusrequired string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

FieldTypeDescription
itemsrequired WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

FieldTypeDescription
createdAtrequired string
description string | null
eventTypesrequired string[]
idrequired string (uuid)
ownerrequired 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).
secretPrefixrequired string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statsrequired WebhookEndpointStatsDto
statusrequired string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtrequired string
urlrequired string
versionrequired integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

FieldTypeDescription
itemsrequired WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

FieldTypeDescription
consecutiveFailuresrequired integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

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

WebhookEventsDto

GET /v1/webhook-events.

FieldTypeDescription
itemsrequired WebhookEventDto[]

WebhookTestDto

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

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