Référence de l'API publique

L'API publique Workify360 Focus permet à vos propres scripts et outils de lire les rapports et les données de temps, et d'effectuer des modifications selon les mêmes règles que le tableau de bord. L'API publique, les clés d'API et les webhooks font partie de la formule Premium.

Les opérations de cette page restent rétrocompatibles. Le document OpenAPI lisible par machine des mêmes opérations :

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

Généré à partir de la version 0.1.0 du contrat d'API (c95fb97bb49a).

Authentification

Envoyez une clé d'API personnelle dans l'en-tête Authorization de chaque requête. Une clé appartient à la personne qui l'a créée, agit en son nom et ne fait jamais plus que ce que son rôle actuel autorise. Une requête dont la clé est absente, erronée, expirée ou révoquée reçoit 401 avec le code unauthorized.

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

Pour créer des clés, définir leur portée et les révoquer : Clés d'API et API publique

Portées

Chaque opération exige une portée, indiquée à côté d'elle. Une clé accède à une opération lorsqu'elle détient cette portée et que le rôle actuel, les équipes et la formule de son propriétaire autorisent la requête, exactement comme dans le tableau de bord.

PortéeCe qu'elle autorise
meVotre propre profil et votre minuteur
reports:readLire les rapports, les saisies de temps, les absences, les postes, les équipes, les projets, les tâches et les exports
time:writeAjouter et modifier les saisies de temps, les absences, les postes, les tâches et le temps affecté aux tâches, et statuer sur les demandes
org:adminGérer les membres, les équipes, les invitations et les projets
webhooks:manageGérer les points de terminaison de webhooks

Limites de débit

Chaque clé peut envoyer 600 unités par minute, et une organisation 1 800 pour l'ensemble de ses clés. Une requête qui modifie quelque chose (tout sauf GET et HEAD) compte pour deux unités, toute autre requête pour une. Une clé peut aussi envoyer au plus 60 unités d'un coup, rechargées à raison de 10 par seconde : au-delà de 60 lectures (ou 30 modifications) en rafale, la réponse est 429, même sous les 600 par minute.

En-têteSignification
RateLimit: "key";r=598;t=2Sur chaque réponse décomptée : les unités restantes de la clé et le nombre de secondes avant leur rechargement complet
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60Sur chaque réponse décomptée : les limites par minute de la clé et de l'organisation
Retry-After: 12Avec 429 (code rate_limited) : le nombre de secondes à attendre avant la requête suivante

Erreurs

Une erreur est un document de problème RFC 9457 (Content-Type: application/problem+json). code est un code snake_case stable sur lequel baser votre programme ; title est un texte en anglais destiné aux journaux. type est l'adresse d'aide du code, https://workify360.com/help/errors/<code>/ où chaque _ est remplacé par -, qui ouvre l'article d'aide expliquant le code lorsqu'il en existe un.

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

Certains problèmes comportent des champs supplémentaires : errors (les erreurs de champ d'un 422 validation_failed), action (l'autorisation à laquelle se rapporte un 403 forbidden), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 et 503) et traceId (à indiquer lorsque vous contactez le support).

StatutCodeQuand
400 invalid_request Un paramètre est mal formé ou manquant
401 unauthorized La clé est absente, erronée, expirée ou révoquée, ou son propriétaire a quitté l'organisation
402 feature_not_in_plan, subscription_read_only La formule n'inclut pas la fonctionnalité, ou l'abonnement est en lecture seule
403 forbidden, feature_not_enabled La clé n'a pas la portée requise, ou le rôle actuel, les équipes ou les paramètres de son propriétaire n'autorisent pas la requête
412 version_conflict La version If-Match n'est plus la version actuelle ; relisez la ressource
422 validation_failed Le corps de la requête est invalide ; errors liste les champs
428 precondition_required L'opération exige un en-tête If-Match avec la version que vous avez lue
429 rate_limited Trop de requêtes ; attendez le nombre de secondes indiqué dans Retry-After

Les codes associés à un article d'aide sont des liens dans la liste des opérations.

Webhooks

Au lieu d'interroger l'API encore et encore, l'un de vos points de terminaison peut recevoir une requête HTTPS signée lorsqu'un élément change. Les événements, le format de la requête, la vérification de la signature en Node.js et en Python, les nouvelles tentatives et la rotation du secret sont expliqués dans l'article d'aide : Webhooks

Opérations

Regroupées par domaine. Les résumés et les descriptions de champs proviennent du contrat d'API.

Absences

GET /v1/absences Portée: reports:read

List absences overlapping a range.

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date)
to chaîne de requête string (date) At most 366 days after from.
userId chaîne de requête string (uuid)
teamId chaîne de requête string (uuid)
status chaîne de requête string
typeId chaîne de requête string (uuid)
cursor chaîne de requête string
limit chaîne de requête integer (int32)
Réponses
200 AbsencePage
Erreurs

POST /v1/absences Portée: time:write

Request (or record) an absence.

Paramètres
NomEmplacementTypeDescription
Idempotency-Keyobligatoire en-tête string Required: the same key and body return the first answer
Corps de la requête
AbsenceRequest
Réponses
201 AbsenceDto
Erreurs

POST /v1/absences/{id}/decision Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Id
If-Matchobligatoire en-tête string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corps de la requête
CalendarDecisionRequest
Réponses
200 AbsenceDto
Erreurs

Activité

GET /v1/activity/day Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
date chaîne de requête string (date) The user's local day (required).
userId chaîne de requête string (uuid) Default: the caller; another user must be visible (else 403).
Réponses
200 ActivityDayDto
Erreurs

Affectations de temps

GET /v1/allocations Portée: 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).

Paramètres
NomEmplacementTypeDescription
userId chaîne de requête string (uuid) Default: the caller.
from chaîne de requête string (date) Local date, included.
to chaîne de requête string (date) Local date, included; at most 93 days after from.
projectId chaîne de requête string (uuid)
cursor chaîne de requête string
limit chaîne de requête integer (int32) 1–200 (default 200).
Réponses
200 AllocationPage
Erreurs

POST /v1/allocations Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
Idempotency-Key en-tête string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corps de la requête
AllocationCreateRequest
Réponses
201 AllocationCreatedDto
Erreurs

Exports

POST /v1/exports Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
Idempotency-Keyobligatoire en-tête string Required: the same key and body return the first answer
Corps de la requête
CreateExportRequest
Réponses
202 ExportJobDto
Erreurs

GET /v1/exports/{id} Portée: reports:read

One export job (poll every 2 s).

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Id
Réponses
200 ExportJobDto
Erreurs

Mon profil

GET /v1/me Portée: me

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

Réponses
200 MeDto
Erreurs

Membres

GET /v1/members Portée: org:admin

List members.

Paramètres
NomEmplacementTypeDescription
status chaîne de requête string Comma-separated statuses (default active,invited,suspended)
teamId chaîne de requête string (uuid) Primary team
role chaîne de requête string owner, admin, team_admin, manager or employee
q chaîne de requête string Part of the name or e-mail (Turkish case folding)
cursor chaîne de requête string Opaque cursor of the next page
limit chaîne de requête integer (int32) 1–200, default 50
Réponses
200 MemberPage
Erreurs
  • 403 No right

GET /v1/members/{id} Portée: org:admin

One member.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Membership id
Réponses
200 MemberDto
Erreurs
  • 404 member_not_found

PATCH /v1/members/{id} Portée: org:admin

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Membership id
If-Matchobligatoire en-tête string ETag of the member ("v<n>")
Corps de la requête
PatchMember
Réponses
200 MemberDto
Erreurs

POST /v1/members/{id}/reactivate Portée: org:admin

Reactivate a suspended member.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Membership id
Réponses
200 MemberDto

POST /v1/members/{id}/suspend Portée: org:admin

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Membership id
Réponses
200 MemberDto
Erreurs
  • 409 conflict (an invitation is revoked instead)

Projets

GET /v1/projects Portée: 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).

Paramètres
NomEmplacementTypeDescription
status chaîne de requête string active, on_hold or completed.
clientId chaîne de requête string (uuid)
q chaîne de requête string Name or code search (case-insensitive).
includeArchived chaîne de requête boolean
mine chaîne de requête boolean Only the projects the caller may track time on.
cursor chaîne de requête string
limit chaîne de requête integer (int32) 1–200 (default 50).
Réponses
200 ProjectPage
Erreurs

POST /v1/projects Portée: org:admin

Add a project (Owners and Admins).

Paramètres
NomEmplacementTypeDescription
Idempotency-Key en-tête string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corps de la requête
ProjectRequest
Réponses
201 ProjectDto
Erreurs

PUT /v1/projects/{id} Portée: org:admin

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Project id
If-Matchobligatoire en-tête string The ETag the caller read (412 version_conflict when it changed)
Corps de la requête
ProjectRequest
Réponses
200 ProjectDto
Erreurs

Rapports

GET /v1/reports/productivity Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date)
to chaîne de requête string (date) day 93 days, week, month and range 366.
groupBy chaîne de requête string day, week, month or range.
teamId chaîne de requête string (uuid)
userId chaîne de requête string (uuid)
Réponses
200 PeriodReportDto
Erreurs

GET /v1/reports/projects Portée: 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.

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date) Local date, included.
to chaîne de requête string (date) Local date, included; at most 366 days after from.
groupBy chaîne de requête string One or two of project (default), task, user, client, day, comma separated.
projectIds chaîne de requête string Comma-separated project ids.
clientId chaîne de requête string (uuid)
userIds chaîne de requête string Comma-separated user ids (visible people only).
teamId chaîne de requête string (uuid)
billable chaîne de requête string all (default), billable or nonBillable.
includeProductive chaîne de requête boolean Also compute the productive time within the allocations (costly; default false).
Réponses
200 ProjectReportDto
Erreurs

GET /v1/reports/summary Portée: reports:read

The summary of the visible users over a range.

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date)
to chaîne de requête string (date) At most 93 days after from.
teamId chaîne de requête string (uuid) Only the team's current members; the team must be visible (else 403).
Réponses
200 SummaryDto
Erreurs

GET /v1/reports/targets Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date)
to chaîne de requête string (date)
type chaîne de requête string app, domain or host.
teamId chaîne de requête string (uuid)
userId chaîne de requête string (uuid)
q chaîne de requête string Search in the key and the name (.NET search).
level chaîne de requête string productive, unproductive or neutral.
categoryKey chaîne de requête string
unclassified chaîne de requête boolean Only targets without a category.
cursor chaîne de requête string
limit chaîne de requête integer (int32) 1–200, default 50.
Réponses
200 TargetListDto
Erreurs

GET /v1/reports/users/{userId}/daily Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
userIdobligatoire chemin string (uuid) User
from chaîne de requête string (date)
to chaîne de requête string (date) At most 93 days after from.
Réponses
200 UserDailyDto
Erreurs

Postes

GET /v1/shifts Portée: reports:read

List the shifts starting in a range.

Paramètres
NomEmplacementTypeDescription
from chaîne de requête string (date)
to chaîne de requête string (date)
teamId chaîne de requête string (uuid)
userId chaîne de requête string (uuid)
includeOpen chaîne de requête boolean Also open shifts (default true).
Réponses
200 ShiftListDto
Erreurs

POST /v1/shifts Portée: time:write

Create a shift (assigned or open).

Paramètres
NomEmplacementTypeDescription
Idempotency-Keyobligatoire en-tête string Required: the same key and body return the first answer
Corps de la requête
ShiftBody
Réponses
201 ShiftDto
Erreurs

Tâches

GET /v1/projects/{id}/tasks Portée: reports:read

A visible project's tasks, by sort order.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Project id
status chaîne de requête string open, in_progress or done.
assigneeUserId chaîne de requête string (uuid)
includeArchived chaîne de requête boolean
cursor chaîne de requête string
limit chaîne de requête integer (int32) 1–500 (default 200).
Réponses
200 TaskPage
Erreurs

POST /v1/projects/{id}/tasks Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Project id
Idempotency-Key en-tête string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Corps de la requête
TaskRequest
Réponses
201 TaskDto
Erreurs

PUT /v1/tasks/{id} Portée: time:write

Change a task (the whole body).

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Task id
If-Matchobligatoire en-tête string The ETag the caller read (412 version_conflict when it changed)
Corps de la requête
TaskRequest
Réponses
200 TaskDto
Erreurs

Équipes

GET /v1/teams Portée: reports:read

List teams.

Paramètres
NomEmplacementTypeDescription
includeArchived chaîne de requête boolean Also archived teams (default false)
cursor chaîne de requête string Opaque cursor of the next page
limit chaîne de requête integer (int32) 1–200, default 50
Réponses
200 TeamPage

POST /v1/teams Portée: org:admin

Create a team (the G1 endpoint).

Corps de la requête
CreateTeam
Réponses
201 TeamDto
Erreurs
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

PATCH /v1/teams/{id} Portée: org:admin

Rename a team or change its description.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Team id
If-Matchobligatoire en-tête string ETag of the team
Corps de la requête
PatchTeam
Réponses
200 TeamDto
Erreurs
  • 409 team_name_taken

Saisies de temps

GET /v1/time-entries Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
userId chaîne de requête string (uuid) Default: the caller.
from chaîne de requête string (date) The entry's local day, required.
to chaîne de requête string (date) At most 93 days after from.
kind chaîne de requête string offline or deletion.
status chaîne de requête string pending, approved or rejected.
cursor chaîne de requête string
limit chaîne de requête integer (int32) 1–500.
Réponses
200 TimeEntryPage
Erreurs

POST /v1/time-entries Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
Idempotency-Keyobligatoire en-tête string Required: the same key and body return the first answer
Corps de la requête
CreateTimeEntryRequest
Réponses
201 TimeEntryDto
Erreurs

GET /v1/time-entries/{id} Portée: reports:read

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Entry id
Réponses
200 TimeEntryDto
Erreurs

PUT /v1/time-entries/{id} Portée: time:write

Replace an entry's editable fields.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Entry id
If-Matchobligatoire en-tête string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corps de la requête
UpdateTimeEntryRequest
Réponses
200 TimeEntryDto
Erreurs

DELETE /v1/time-entries/{id} Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Entry id
If-Matchobligatoire en-tête string ETag of the resource ("v<n>"); missing: 428, stale: 412
Réponses
204 (sans corps)
Erreurs

POST /v1/time-entries/{id}/decision Portée: time:write

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) Entry id
If-Matchobligatoire en-tête string ETag of the resource ("v<n>"); missing: 428, stale: 412
Corps de la requête
TimeEntryDecisionRequest
Réponses
200 TimeEntryDto
Erreurs

Minuteur

GET /v1/me/timer Portée: me

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

Paramètres
NomEmplacementTypeDescription
If-None-Match en-tête string | null The ETag the caller holds (304 when unchanged)
Réponses
200 TimerDto · 304 (sans corps)
Erreurs

POST /v1/me/timer/start Portée: me

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

Paramètres
NomEmplacementTypeDescription
Idempotency-Key en-tête string | null The client's command id; a retry returns the first answer
Corps de la requête
TimerStartRequest
Réponses
200 TimerCommandResultDto
Erreurs

Webhooks

PATCH /v1/webhook-endpoints/{id} Portée: webhooks:manage

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) The endpoint
If-Matchobligatoire en-tête string The endpoint's ETag ("v<n>")
Corps de la requête
UpdateWebhookEndpointRequest
Réponses
200 WebhookEndpointDto
Erreurs

DELETE /v1/webhook-endpoints/{id} Portée: webhooks:manage

Delete an endpoint and its deliveries.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) The endpoint
Réponses
204 (sans corps)
Erreurs

GET /v1/webhook-endpoints/{id}/deliveries Portée: webhooks:manage

The deliveries of an endpoint, newest first.

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) The endpoint
status chaîne de requête string pending, succeeded, failed, dead.
eventType chaîne de requête string
cursor chaîne de requête string Opaque cursor of the next page.
limit chaîne de requête integer (int32) 1–200, default 50.
Réponses
200 WebhookDeliveryPage
Erreurs

POST /v1/webhook-endpoints/{id}/deliveries/{deliveryId}/retry Portée: webhooks:manage

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

Paramètres
NomEmplacementTypeDescription
idobligatoire chemin string (uuid) The endpoint
deliveryIdobligatoire chemin string The delivery (a 64-bit integer)
Réponses
202 AcceptedDto
Erreurs

Schémas

Les corps de requête et de réponse utilisés par les opérations. Les champs obligatoires sont signalés.

AbsenceDto

An absence.

ChampTypeDescription
createdAtobligatoire string (date-time)
createdByobligatoire CalendarUserRefDto
daysobligatoire 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
deductionByYearobligatoire object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endobligatoire string (date-time)
endDateobligatoire string (date)
endTime string | null
half string | null
idobligatoire string (uuid)
note string | null
permissionsobligatoire AbsencePermissionsDto
startobligatoire string (date-time) UTC coverage start.
startDateobligatoire string (date)
startTime string | null
statusobligatoire string
timeZoneobligatoire string
typeobligatoire AbsenceTypeRefDto
unitobligatoire string
updatedAtobligatoire string (date-time)
userobligatoire CalendarPersonDto
userIdobligatoire string (uuid)

AbsencePage

GET /v1/absences.

ChampTypeDescription
itemsobligatoire AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

ChampTypeDescription
canApproveobligatoire boolean
canCancelobligatoire boolean
canEditobligatoire boolean

AbsenceRequest

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

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

ChampTypeDescription
colorobligatoire string
countsAsWorkedobligatoire boolean
deductsFromBalanceobligatoire boolean
idobligatoire string (uuid)
key string | null
nameobligatoire string
paidobligatoire boolean
timeEffectobligatoire string

AcceptedDto

202 Accepted of a queued job.

ChampTypeDescription
acceptedobligatoire boolean Always true.

AccessDto

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

ChampTypeDescription
assignableRolesobligatoire string[]
canManageCompanySettingsobligatoire boolean
canManageTeamsobligatoire boolean
canManageUsersobligatoire boolean
manageTeamIdsobligatoire string[]
scopeobligatoire string company, teams or self.
unassignedFallbackobligatoire boolean
viewTeamIdsobligatoire string[]

ActivityDayDto

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

ChampTypeDescription
absenceCreditMsobligatoire integer (int64) A worked absence tops the worked time up to the expected work.
activeMsobligatoire integer (int64) Window time ∩ not AFK (computer time only).
afkCoverageobligatoire boolean False when no device reported AFK data (idle unknown).
appsobligatoire AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMsobligatoire integer (int64)
attendance DayAttendanceDto | null
categoriesobligatoire CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedobligatoire boolean False for a day written before the Phase 2 classification (all neutral).
dateobligatoire string (date)
dayEndobligatoire string (date-time)
dayStartobligatoire string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMsobligatoire integer (int64) Tracked time removed by approved deletions (part of idle).
domainsobligatoire DomainUsageDto[]
hostsobligatoire HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMsobligatoire integer (int64)
leftAt string (date-time) | null
meetingMsobligatoire integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMsobligatoire integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMsobligatoire integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalsobligatoire TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMsobligatoire integer (int64) Private time outside active and offline time.
productivityobligatoire DayProductivityDto
recomputingobligatoire boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotsobligatoire 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).
timeEntriesobligatoire TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZoneobligatoire string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdobligatoire string (uuid)
workedMsobligatoire integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

ChampTypeDescription
activeMsobligatoire integer (int64)
appsobligatoire AppUsageDto[]
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
slotStartobligatoire string (date-time)
unproductiveMsobligatoire integer (int64)

AffectedAllocationDto

An allocation replace changed.

ChampTypeDescription
changeobligatoire string trimmed, split or deleted.
idobligatoire string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

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

ChampTypeDescription
affectedobligatoire AffectedAllocationDto[]
allocationobligatoire AllocationDto

AllocationDto

Time on a project.

ChampTypeDescription
createdAtobligatoire string (date-time)
createdByobligatoire NamedRefDto
durationMsobligatoire integer (int64)
effectiveBillableobligatoire boolean
endedAtobligatoire string (date-time)
idobligatoire 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.
localDateobligatoire string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionsobligatoire AllocationPermissionsDto
projectobligatoire ProjectRefDto
sourceobligatoire string timer, manual or assignment.
startedAtobligatoire string (date-time)
task NamedRefDto | null
timeZoneobligatoire string
updatedAtobligatoire string (date-time)
userIdobligatoire string (uuid)
versionobligatoire integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

ChampTypeDescription
itemsobligatoire AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

ChampTypeDescription
deleteobligatoire boolean
editobligatoire boolean

AppTotalDto

ChampTypeDescription
activeMsobligatoire integer (int64)
appKeyobligatoire string
categoryKey string | null
level string | null Level in the response's levelContext.
nameobligatoire string
percentageobligatoire 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".

ChampTypeDescription
activeMsobligatoire integer (int64)
appKeyobligatoire string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
nameobligatoire string

BudgetDto

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

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

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

ChampTypeDescription
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

ChampTypeDescription
fullName string | null
idobligatoire string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

ChampTypeDescription
fullName string | null
idobligatoire string (uuid)

CapabilitiesDto

Subscription capabilities.

ChampTypeDescription
featuresobligatoire string[]
readOnlyobligatoire boolean

CategoryUsageDto

ChampTypeDescription
activeMsobligatoire 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.

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

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

CreateTeam

POST /v1/teams.

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

CreateTimeEntryRequest

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

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

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

CreatedWebhookEndpointDto

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

ChampTypeDescription
endpointobligatoire WebhookEndpointDto
secretobligatoire string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

ChampTypeDescription
half string | null
keyobligatoire string
nameobligatoire string English name; nameTr is the Turkish one.
nameTrobligatoire string

DayAbsenceDto

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

ChampTypeDescription
colorobligatoire string
fractionobligatoire number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitobligatoire string

DayAttendanceDto

Attendance of the day on the day plan.

ChampTypeDescription
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexibleobligatoire boolean
lateByMsobligatoire integer (int64)
lateToleranceMinutesobligatoire integer (int32)
leftEarlyobligatoire boolean
leftEarlyByMsobligatoire integer (int64)
statusobligatoire string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMsobligatoire integer (int64) The plan's target (the Effectiveness % denominator).
workdayobligatoire boolean

DayPlanDto

The day plan of one user's day.

ChampTypeDescription
absencesobligatoire PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMsobligatoire integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindobligatoire string schedule, shift, dayOff or holiday.
leaveFractionobligatoire number (double) The approved absence coverage f (0–1).
shiftsobligatoire PlanShiftDto[] Shifts starting on the day, by start.
targetMsobligatoire integer (int64) Effectiveness % denominator (base × (1 − f)).
workdayobligatoire boolean

DayProductivityDto

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

ChampTypeDescription
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMsobligatoire integer (int64)
unproductiveMsobligatoire integer (int64)

DayTotalDto

One local day of a summary.

ChampTypeDescription
activeMsobligatoire integer (int64)
activeUserCountobligatoire integer (int32)
atWorkMsobligatoire integer (int64)
dateobligatoire string (date)
idleMsobligatoire integer (int64)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
privateMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null
unproductiveMsobligatoire integer (int64)

DomainTotalDto

ChampTypeDescription
activeMsobligatoire integer (int64)
categoryKey string | null
domainobligatoire string
level string | null
percentageobligatoire number (double)

DomainUsageDto

ChampTypeDescription
activeMsobligatoire integer (int64)
categoryKey string | null
domainobligatoire 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).

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

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

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

ExportJobDto

An export job as the panel lists and polls it.

ChampTypeDescription
createdAtobligatoire string (date-time)
datasetobligatoire 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
formatobligatoire string
fromobligatoire string (date)
groupBy string | null
idobligatoire string (uuid)
localeobligatoire string
progressobligatoire integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statusobligatoire 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.
toobligatoire string (date)

ExportOptionsDto

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

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

ChampTypeDescription
codeobligatoire string Stable snake_case code (required, too_long, invalid, ...).
fieldobligatoire 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).

ChampTypeDescription
half string | null
keyobligatoire string Built-in key (republic_day, …) or custom.
nameobligatoire string
nameEnobligatoire string
nameTrobligatoire string
source string | null builtin or tenant.

HostUsageDto

ChampTypeDescription
activeMsobligatoire integer (int64)
domain string | null
hostobligatoire string
levelobligatoire string
levelSourceobligatoire string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

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

ChampTypeDescription
expiresAtobligatoire string
idobligatoire string (uuid)

InvitationResult

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

ChampTypeDescription
emailobligatoire InvitationEmail
invitationobligatoire InvitationRef
memberobligatoire MemberDto

LevelContextDto

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

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

MeDto

GET /v1/me.

ChampTypeDescription
accessobligatoire AccessDto
capabilitiesobligatoire CapabilitiesDto
effectiveTimeZoneobligatoire string
membershipobligatoire MeMembership
organizationobligatoire MeOrganization
organizationsobligatoire OrganizationChoice[]
session MeSession | null
userobligatoire MeUser

MeMembership

The membership in the current organization.

ChampTypeDescription
idobligatoire string (uuid)
isTrackedobligatoire boolean
joinedAt string | null
roleobligatoire string
statusobligatoire string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdsobligatoire string (uuid)[]

MeOrganization

The current organization.

ChampTypeDescription
defaultLocaleobligatoire string
idobligatoire string (uuid)
nameobligatoire string
slugobligatoire string
statusobligatoire string
timeZoneobligatoire string

MeSession

The current session.

ChampTypeDescription
absoluteExpiresAtobligatoire string
amrobligatoire string[]
authTimeobligatoire string
clientIdobligatoire string
idobligatoire string (uuid)
idleExpiresAtobligatoire string

MeUser

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

ChampTypeDescription
emailobligatoire string
emailVerificationobligatoire EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedobligatoire boolean
fullName string | null
idobligatoire string (uuid)
localeobligatoire string

MemberDto

A membership with its person (MemberDto).

ChampTypeDescription
createdAtobligatoire string
emailobligatoire string
emailVerifiedobligatoire boolean
fullName string | null
idobligatoire string (uuid)
invitation MemberInvitationDto | null
isTrackedobligatoire boolean
joinedAt string | null
localeobligatoire string
roleobligatoire string owner, admin, team_admin, manager, employee.
statusobligatoire string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerobligatoire boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdobligatoire string (uuid)
viewerTeamIdsobligatoire string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

ChampTypeDescription
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.
expiresAtobligatoire string
idobligatoire string (uuid)
lastSentAtobligatoire string
sentCountobligatoire integer (int32)

MemberPage

A page of members (OpenAPI).

ChampTypeDescription
itemsobligatoire MemberDto[]
nextCursor string | null

MemberRefDto

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

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

NamedRefDto

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

ChampTypeDescription
idobligatoire string (uuid)
nameobligatoire string

OrganizationChoice

One organization of the person (sec.user_memberships).

ChampTypeDescription
currentobligatoire boolean
idobligatoire string (uuid)
nameobligatoire string
roleobligatoire string
selectableobligatoire boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

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

ChampTypeDescription
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

ChampTypeDescription
fromobligatoire string (date)
groupByobligatoire string
levelContextobligatoire LevelContextDto
periodsobligatoire ReportPeriodDto[]
subjectobligatoire ReportSubjectDto
teamsobligatoire TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
toobligatoire string (date)
totalsobligatoire ReportFiguresDto

PlanAbsenceDto

ChampTypeDescription
colorobligatoire string
countsAsWorkedobligatoire boolean timeEffect == worked.
endTime string | null
half string | null
idobligatoire string (uuid)
startTime string | null Local start and end of an hours absence.
statusobligatoire string approved or pending.
timeEffectobligatoire 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).
unitobligatoire string days, half_day or hours.

PlanShiftDto

ChampTypeDescription
color string | null
endobligatoire string (date-time)
endTimeobligatoire string Local end; before the start for a night shift.
idobligatoire string (uuid)
locationobligatoire string
minMinutesobligatoire integer (int32)
startobligatoire string (date-time)
startTimeobligatoire string Local start (HH:mm, the shift's zone).

Problem

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

ChampTypeDescription
action string | null Permission key of a 403 (teams.create).
codeobligatoire 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).
statusobligatoire integer (int32)
titleobligatoire string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typeobligatoire 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).

ChampTypeDescription
billableMinorobligatoire integer (int64) The billable hours at their rate.
costMinorobligatoire integer (int64) Every allocated hour at its rate.
currencyobligatoire string

ProjectBudgetUsageDto

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

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

ProjectDto

A project.

ChampTypeDescription
accessobligatoire string everyone or members.
archivedobligatoire boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtobligatoire string (date-time)
currencyobligatoire string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idobligatoire string (uuid)
isBillableobligatoire boolean
memberCountobligatoire integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
nameobligatoire string
permissionsobligatoire ProjectPermissionsDto
spentMsobligatoire integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statusobligatoire string active, on_hold or completed.
taskCountobligatoire integer (int64)
updatedAtobligatoire string (date-time)

ProjectPage

GET /v1/projects.

ChampTypeDescription
itemsobligatoire ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

ChampTypeDescription
archiveobligatoire boolean
deleteobligatoire boolean Only a project without time.
editobligatoire boolean The project's fields (Owners and Admins).
manageMembersobligatoire boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTasksobligatoire boolean Tasks (an Admin or the project's manager).
trackobligatoire boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

ChampTypeDescription
color string | null #RRGGBB.
idobligatoire string (uuid)
nameobligatoire string

ProjectReportDto

GET /v1/reports/projects.

ChampTypeDescription
budgetsobligatoire ProjectBudgetUsageDto[]
costsIncludedobligatoire boolean The caller sees rates and amounts (projects.costs.read).
fromobligatoire string (date)
groupByobligatoire string[]
rowsobligatoire ProjectReportRowDto[]
toobligatoire string (date)
totalsobligatoire ProjectReportTotalsDto

ProjectReportKeysDto

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

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

ChampTypeDescription
allocatedMsobligatoire integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMsobligatoire integer (int64)
keysobligatoire ProjectReportKeysDto
nonBillableMsobligatoire integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMsobligatoire integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

ChampTypeDescription
allocatedMsobligatoire integer (int64)
amounts ProjectAmountDto[] | null
billableMsobligatoire integer (int64)
nonBillableMsobligatoire integer (int64)
productiveMs integer (int64) | null
unratedMsobligatoire integer (int64)

ProjectRequest

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

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

ChampTypeDescription
absenceCreditMsobligatoire integer (int64)
absentDaysobligatoire integer (int32)
activeMsobligatoire integer (int64)
activeUserCountobligatoire integer (int32)
effectivenessPct number (double) | null
idleMsobligatoire integer (int64)
lateDaysobligatoire integer (int32)
leaveDaysobligatoire number (double)
leftEarlyDaysobligatoire integer (int32)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
overtimeDaysobligatoire integer (int32)
overtimeMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null
targetMsobligatoire integer (int64)
unproductiveMsobligatoire integer (int64)
userCountobligatoire integer (int32)
workedMsobligatoire 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).

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

ReportSubjectDto

Whom a report is about.

ChampTypeDescription
id string (uuid) | null
kindobligatoire string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

ChampTypeDescription
previousSecretExpiresAtobligatoire string Until then deliveries carry both signatures.
secretobligatoire 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.

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

ChampTypeDescription
breakMinutesobligatoire integer (int32)
color string | null
createdAtobligatoire string (date-time)
createdByobligatoire CalendarUserRefDto
crossesMidnightobligatoire boolean
dateobligatoire string (date)
durationMinutesobligatoire integer (int32)
endobligatoire string (date-time)
endTimeobligatoire string
idobligatoire string (uuid)
locationobligatoire string
minMinutesobligatoire integer (int32)
note string | null
openobligatoire boolean No user assigned.
permissionsobligatoire ShiftPermissionsDto
sourceobligatoire string manual, template, copy or request.
startobligatoire string (date-time)
startTimeobligatoire 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
timeZoneobligatoire string
updatedAtobligatoire 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).

ChampTypeDescription
itemsobligatoire ShiftDto[]

ShiftPermissionsDto

ChampTypeDescription
canDeleteobligatoire boolean
canEditobligatoire boolean
canPickUpobligatoire boolean
canRequestSwapobligatoire boolean

SummaryDto

The summary of the visible users over a range.

ChampTypeDescription
absenceCreditMsobligatoire integer (int64)
absentDaysobligatoire integer (int32)
activeMsobligatoire integer (int64)
activeUserCountobligatoire integer (int32)
atWorkMsobligatoire integer (int64)
daysobligatoire DayTotalDto[]
deletedMsobligatoire integer (int64)
domainsobligatoire DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromobligatoire string (date)
holidayDaysobligatoire number (double)
idleMsobligatoire integer (int64)
inactiveUsersobligatoire UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDaysobligatoire integer (int32)
leaveDaysobligatoire number (double)
leftEarlyDaysobligatoire integer (int32)
levelContextobligatoire LevelContextDto
meetingMsobligatoire integer (int64)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
overtimeMsobligatoire integer (int64)
privateMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopeobligatoire ReportScopeDto
shiftDaysobligatoire integer (int32)
teamsobligatoire TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
toobligatoire string (date)
topAppsobligatoire AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMsobligatoire integer (int64)
usersobligatoire UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMsobligatoire integer (int64)

TargetItemDto

ChampTypeDescription
activeMsobligatoire integer (int64)
categoryKey string | null
categorySourceobligatoire string tenant, builtin or none.
domain string | null
levelobligatoire string
levelSourceobligatoire string team, company or default.
matchedKey string | null
nameobligatoire string
percentageobligatoire number (double)
targetKeyobligatoire string
targetTypeobligatoire string app for apps, domain for domains and hosts.
userCountobligatoire integer (int32)

TargetListDto

The "Apps & URLs" list.

ChampTypeDescription
fromobligatoire string (date)
itemsobligatoire TargetItemDto[] By active time descending, then key.
levelContextobligatoire LevelContextDto
nextCursor string | null
toobligatoire string (date)
totalobligatoire integer (int32) Targets matching the filters (before paging).
totalActiveMsobligatoire integer (int64) Active time over every target of the type before the filters (the percentage base).
typeobligatoire string app, domain or host.

TaskDto

A task.

ChampTypeDescription
archivedobligatoire boolean
assignee NamedRefDto | null
createdAtobligatoire string (date-time)
description string | null
dueDate string (date) | null
effectiveBillableobligatoire boolean
estimateMinutes integer (int64) | null
idobligatoire string (uuid)
isBillable boolean | null null takes the project's value.
nameobligatoire string
permissionsobligatoire TaskPermissionsDto
projectIdobligatoire string (uuid)
sortOrderobligatoire integer (int64)
spentMsobligatoire integer (int64)
statusobligatoire string open, in_progress or done.
updatedAtobligatoire string (date-time)

TaskPage

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

ChampTypeDescription
itemsobligatoire TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

ChampTypeDescription
deleteobligatoire boolean Only a task without time.
editobligatoire boolean

TaskRequest

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

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

ChampTypeDescription
archivedAt string | null
createdAtobligatoire string
description string | null
idobligatoire string (uuid)
leadsobligatoire object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountobligatoire integer (int64) Members whose primary team this is (left members excluded).
nameobligatoire string
updatedAtobligatoire string

TeamPage

A page of teams (OpenAPI).

ChampTypeDescription
itemsobligatoire TeamDto[]
nextCursor string | null

TeamPeriodsDto

ChampTypeDescription
periodsobligatoire ReportPeriodDto[]
teamIdobligatoire string (uuid)
teamName string | null
totalsobligatoire ReportFiguresDto

TeamTotalDto

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

ChampTypeDescription
absenceCreditMsobligatoire integer (int64)
absentDaysobligatoire integer (int32)
activeMsobligatoire integer (int64)
activeUserCountobligatoire integer (int32)
effectivenessPct number (double) | null
holidayDaysobligatoire number (double)
idleMsobligatoire integer (int64)
lateDaysobligatoire integer (int32)
leaveDaysobligatoire number (double)
leftEarlyDaysobligatoire integer (int32)
memberCountobligatoire integer (int32)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
overtimeMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null
shiftDaysobligatoire integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMsobligatoire integer (int64)
workedMsobligatoire integer (int64)

TimeEntryDecisionRequest

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

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

TimeEntryDto

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

ChampTypeDescription
createdAtobligatoire string (date-time)
createdByobligatoire TimeEntryUserRefDto
dateobligatoire 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
durationMsobligatoire integer (int64)
endobligatoire string (date-time)
idobligatoire string (uuid)
kindobligatoire string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionsobligatoire TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourceobligatoire string manual (Phase 8 adds calendar).
startobligatoire string (date-time)
statusobligatoire string pending, approved or rejected.
timeZoneobligatoire string
updatedAtobligatoire string (date-time)
userIdobligatoire string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

ChampTypeDescription
itemsobligatoire TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

ChampTypeDescription
canApproveobligatoire boolean
canDeleteobligatoire boolean
canEditobligatoire boolean

TimeEntryUserRefDto

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

ChampTypeDescription
fullName string | null
idobligatoire string (uuid)

TimeIntervalDto

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

ChampTypeDescription
endobligatoire string (date-time)
startobligatoire string (date-time)

TimerAtRequest

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

ChampTypeDescription
at string (date-time) | null

TimerCommandResultDto

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

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

TimerDto

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

ChampTypeDescription
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
serverTimeobligatoire 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
stateobligatoire string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

ChampTypeDescription
endReasonobligatoire string stop, switch, autostop or discard.
endedAtobligatoire string (date-time)
segmentIdobligatoire string (uuid)
startedAtobligatoire string (date-time)

TimerProjectDto

The project of the running segment.

ChampTypeDescription
clientName string | null
color string | null
idobligatoire string (uuid)
nameobligatoire string

TimerStartRequest

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

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

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

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

ChampTypeDescription
daysobligatoire UserDayDto[]
fromobligatoire string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZoneobligatoire string
toobligatoire string (date)
userIdobligatoire string (uuid)

UserDayDto

ChampTypeDescription
absence DayAbsenceDto | null
absenceCreditMsobligatoire integer (int64)
activeMsobligatoire integer (int64)
afkCoverageobligatoire boolean
arrivalAt string (date-time) | null
atWorkMsobligatoire integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedobligatoire boolean
dateobligatoire string (date)
dayOffWorkedMsobligatoire integer (int64)
deletedMsobligatoire integer (int64)
effectivenessPct number (double) | null
eventCountobligatoire integer (int64)
expectedWorkMsobligatoire integer (int64)
holiday DailyHolidayDto | null
idleMsobligatoire integer (int64)
lateByMsobligatoire integer (int64)
leftAt string (date-time) | null
leftEarlyobligatoire boolean
leftEarlyByMsobligatoire integer (int64)
meetingMsobligatoire integer (int64)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
overtimeMsobligatoire integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null
shiftCountobligatoire integer (int32)
targetMsobligatoire integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMsobligatoire integer (int64)
workday boolean | null
workedMsobligatoire integer (int64)

UserTotalDto

One user of a summary.

ChampTypeDescription
absenceCreditMsobligatoire integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDaysobligatoire integer (int32) Local days with active time.
activeMsobligatoire integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMsobligatoire integer (int64)
classifiedDaysobligatoire integer (int32)
dayOffWorkedMsobligatoire integer (int64)
deletedMsobligatoire integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountobligatoire integer (int64)
fullName string | null
holidayDaysobligatoire number (double)
idleMsobligatoire integer (int64)
lateDays integer (int32) | null
leaveDaysobligatoire number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMsobligatoire integer (int64)
neutralMsobligatoire integer (int64)
offlineMsobligatoire integer (int64)
overtimeDaysobligatoire integer (int32)
overtimeMsobligatoire integer (int64)
privateMsobligatoire integer (int64)
productiveMsobligatoire integer (int64)
productivityPct number (double) | null
shiftDaysobligatoire integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZoneobligatoire string
unproductiveMsobligatoire integer (int64)
userIdobligatoire string (uuid)
workdays integer (int32) | null
workedMsobligatoire integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

ChampTypeDescription
attemptsobligatoire integer (int32)
createdAtobligatoire string
deliveredAt string | null
eventIdobligatoire string (uuid) The webhook-id header.
eventTypeobligatoire string
idobligatoire 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
statusobligatoire string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

ChampTypeDescription
itemsobligatoire WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

ChampTypeDescription
createdAtobligatoire string
description string | null
eventTypesobligatoire string[]
idobligatoire string (uuid)
ownerobligatoire 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).
secretPrefixobligatoire string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statsobligatoire WebhookEndpointStatsDto
statusobligatoire string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtobligatoire string
urlobligatoire string
versionobligatoire integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

ChampTypeDescription
itemsobligatoire WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

ChampTypeDescription
consecutiveFailuresobligatoire integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

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

WebhookEventsDto

GET /v1/webhook-events.

ChampTypeDescription
itemsobligatoire WebhookEventDto[]

WebhookTestDto

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

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