Referensi API publik

API publik Workify360 Focus memungkinkan skrip dan alat Anda sendiri membaca laporan dan data waktu serta melakukan perubahan dengan aturan yang sama seperti di dasbor. API publik, kunci API, dan webhook adalah bagian dari paket Premium.

Operasi di halaman ini dijaga agar tetap kompatibel dengan versi sebelumnya. Dokumen OpenAPI yang dapat dibaca mesin untuk operasi yang sama:

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

Dihasilkan dari kontrak API versi 0.1.0 (c95fb97bb49a).

Autentikasi

Kirim kunci API pribadi di header Authorization pada setiap permintaan. Kunci adalah milik orang yang membuatnya, bertindak sebagai orang tersebut, dan tidak pernah melakukan lebih dari yang diizinkan oleh perannya saat ini. Permintaan dengan kunci yang tidak ada, salah, kedaluwarsa, atau dicabut akan mendapat 401 dengan kode unauthorized.

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

Cara membuat, menetapkan scope, dan mencabut kunci: Kunci API dan API publik

Scope

Setiap operasi memerlukan satu scope, yang ditampilkan di sebelahnya. Sebuah kunci dapat menjangkau suatu operasi jika memiliki scope tersebut dan peran, tim, serta paket pemiliknya saat ini mengizinkan permintaan itu, persis seperti di dasbor.

ScopeYang diizinkan
meProfil Anda sendiri dan timer Anda
reports:readMembaca laporan, entri waktu, ketidakhadiran, shift, tim, proyek, tugas, dan ekspor
time:writeMenambahkan dan mengubah entri waktu, ketidakhadiran, shift, tugas, dan waktu yang ditetapkan ke tugas, serta memutuskan permintaan
org:adminMengelola anggota, tim, undangan, dan proyek
webhooks:manageMengelola endpoint webhook

Batas laju

Setiap kunci dapat mengirim 600 unit per menit dan sebuah organisasi 1.800 unit untuk semua kuncinya secara bersama-sama. Permintaan yang mengubah sesuatu (apa pun selain GET dan HEAD) dihitung sebagai dua unit, permintaan lainnya sebagai satu unit. Sebuah kunci juga dapat mengirim paling banyak 60 unit sekaligus, yang diisi ulang 10 per detik: lebih dari 60 pembacaan (atau 30 perubahan) secara beruntun akan mendapat 429 meskipun masih di bawah 600 per menit.

HeaderArti
RateLimit: "key";r=598;t=2Pada setiap respons yang dihitung: unit yang tersisa untuk kunci dan jumlah detik sampai unit penuh kembali
RateLimit-Policy: "key";q=600;w=60, "tenant";q=1800;w=60Pada setiap respons yang dihitung: batas per menit untuk kunci dan untuk organisasi
Retry-After: 12Dengan 429 (kode rate_limited): jumlah detik yang harus ditunggu sebelum permintaan berikutnya

Error

Error adalah dokumen masalah RFC 9457 (Content-Type: application/problem+json). code adalah kode snake_case yang stabil untuk digunakan dalam pemrograman; title adalah teks bahasa Inggris untuk log. type adalah alamat bantuan untuk kode tersebut, https://workify360.com/help/errors/<code>/ dengan setiap _ ditulis sebagai -, yang membuka artikel bantuan yang menjelaskan kode tersebut jika kode itu memilikinya.

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

Beberapa dokumen masalah memuat field tambahan: errors (error per field dari 422 validation_failed), action (izin yang dirujuk oleh 403 forbidden), requiredPlan (402 feature_not_in_plan), retryAfterSeconds (429 dan 503), dan traceId (sebutkan saat Anda menghubungi dukungan).

StatusKodeKapan
400 invalid_request Format parameter salah atau parameter tidak ada
401 unauthorized Kunci tidak ada, salah, kedaluwarsa, atau dicabut, atau pemiliknya telah keluar dari organisasi
402 feature_not_in_plan, subscription_read_only Paket tidak mencakup fitur tersebut, atau langganan dalam mode hanya-baca
403 forbidden, feature_not_enabled Kunci tidak memiliki scope tersebut, atau peran, tim, atau pengaturan pemiliknya saat ini tidak mengizinkan permintaan itu
412 version_conflict Versi If-Match bukan lagi versi terkini; baca kembali resource tersebut
422 validation_failed Body tidak valid; errors mencantumkan field-field yang bermasalah
428 precondition_required Operasi memerlukan header If-Match dengan versi yang Anda baca
429 rate_limited Terlalu banyak permintaan; tunggu sejumlah detik yang tertera di Retry-After

Kode yang memiliki artikel bantuan ditampilkan sebagai tautan di daftar operasi.

Webhook

Alih-alih memanggil API berulang kali, endpoint milik Anda dapat menerima permintaan HTTPS yang ditandatangani saat sesuatu berubah. Event, format permintaan, cara memverifikasi tanda tangan di Node.js dan Python, percobaan ulang, serta rotasi secret dijelaskan di artikel bantuan: Webhook

Operasi

Dikelompokkan berdasarkan area. Ringkasan dan deskripsi field berasal dari kontrak API.

Ketidakhadiran

GET /v1/absences Scope: reports:read

List absences overlapping a range.

Parameter
NamaLokasiTipeDeskripsi
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)
Respons
200 AbsencePage
Error

POST /v1/absences Scope: time:write

Request (or record) an absence.

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Keywajib header string Required: the same key and body return the first answer
Body permintaan
AbsenceRequest
Respons
201 AbsenceDto
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Id
If-Matchwajib header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body permintaan
CalendarDecisionRequest
Respons
200 AbsenceDto
Error

Aktivitas

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

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

Parameter
NamaLokasiTipeDeskripsi
date query string (date) The user's local day (required).
userId query string (uuid) Default: the caller; another user must be visible (else 403).
Respons
200 ActivityDayDto
Error

Alokasi waktu

GET /v1/allocations Scope: reports:read

A person's allocations of a range of local days (the caller's, the people they manage, and the time on the projects they manage).

Parameter
NamaLokasiTipeDeskripsi
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).
Respons
200 AllocationPage
Error

POST /v1/allocations Scope: time:write

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

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Body permintaan
AllocationCreateRequest
Respons
201 AllocationCreatedDto
Error

Ekspor

POST /v1/exports Scope: reports:read

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

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Keywajib header string Required: the same key and body return the first answer
Body permintaan
CreateExportRequest
Respons
202 ExportJobDto
Error

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

One export job (poll every 2 s).

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Id
Respons
200 ExportJobDto
Error

Saya

GET /v1/me Scope: me

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

Respons
200 MeDto
Error

Anggota

GET /v1/members Scope: org:admin

List members.

Parameter
NamaLokasiTipeDeskripsi
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
Respons
200 MemberPage
Error
  • 403 No right

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

One member.

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Membership id
Respons
200 MemberDto
Error
  • 404 member_not_found

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Membership id
If-Matchwajib header string ETag of the member ("v<n>")
Body permintaan
PatchMember
Respons
200 MemberDto
Error

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

Reactivate a suspended member.

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Membership id
Respons
200 MemberDto

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Membership id
Respons
200 MemberDto
Error
  • 409 conflict (an invitation is revoked instead)

Proyek

GET /v1/projects Scope: reports:read

The projects the caller sees (Owners and Admins: all; others: open ones, their teams and, read only, the projects of the people they manage).

Parameter
NamaLokasiTipeDeskripsi
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).
Respons
200 ProjectPage
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Project id
If-Matchwajib header string The ETag the caller read (412 version_conflict when it changed)
Body permintaan
ProjectRequest
Respons
200 ProjectDto
Error

Laporan

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

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

Parameter
NamaLokasiTipeDeskripsi
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)
Respons
200 PeriodReportDto
Error

GET /v1/reports/projects Scope: reports:read

Allocated time, billable time and the rate-layered amounts (Owners and Admins) of projects in a range, grouped by one or two of project, task, user, client and day, with the projects' budget use.

Parameter
NamaLokasiTipeDeskripsi
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).
Respons
200 ProjectReportDto
Error

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

The summary of the visible users over a range.

Parameter
NamaLokasiTipeDeskripsi
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).
Respons
200 SummaryDto
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
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.
Respons
200 TargetListDto
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
userIdwajib path string (uuid) User
from query string (date)
to query string (date) At most 93 days after from.
Respons
200 UserDailyDto
Error

Shift

GET /v1/shifts Scope: reports:read

List the shifts starting in a range.

Parameter
NamaLokasiTipeDeskripsi
from query string (date)
to query string (date)
teamId query string (uuid)
userId query string (uuid)
includeOpen query boolean Also open shifts (default true).
Respons
200 ShiftListDto
Error

POST /v1/shifts Scope: time:write

Create a shift (assigned or open).

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Keywajib header string Required: the same key and body return the first answer
Body permintaan
ShiftBody
Respons
201 ShiftDto
Error

Tugas

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

A visible project's tasks, by sort order.

Parameter
NamaLokasiTipeDeskripsi
idwajib 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).
Respons
200 TaskPage
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Project id
Idempotency-Key header string | null The same key and body return the first answer (a different body: 422 idempotency_key_reused)
Body permintaan
TaskRequest
Respons
201 TaskDto
Error

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

Change a task (the whole body).

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Task id
If-Matchwajib header string The ETag the caller read (412 version_conflict when it changed)
Body permintaan
TaskRequest
Respons
200 TaskDto
Error

Tim

GET /v1/teams Scope: reports:read

List teams.

Parameter
NamaLokasiTipeDeskripsi
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
Respons
200 TeamPage

POST /v1/teams Scope: org:admin

Create a team (the G1 endpoint).

Body permintaan
CreateTeam
Respons
201 TeamDto
Error
  • 403 forbidden (action teams.create)
  • 409 team_name_taken

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

Rename a team or change its description.

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Team id
If-Matchwajib header string ETag of the team
Body permintaan
PatchTeam
Respons
200 TeamDto
Error
  • 409 team_name_taken

Entri waktu

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

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

Parameter
NamaLokasiTipeDeskripsi
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.
Respons
200 TimeEntryPage
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Keywajib header string Required: the same key and body return the first answer
Body permintaan
CreateTimeEntryRequest
Respons
201 TimeEntryDto
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Entry id
Respons
200 TimeEntryDto
Error

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

Replace an entry's editable fields.

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Entry id
If-Matchwajib header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body permintaan
UpdateTimeEntryRequest
Respons
200 TimeEntryDto
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) Entry id
If-Matchwajib header string ETag of the resource ("v<n>"); missing: 428, stale: 412
Body permintaan
TimeEntryDecisionRequest
Respons
200 TimeEntryDto
Error

Timer

GET /v1/me/timer Scope: me

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

Parameter
NamaLokasiTipeDeskripsi
If-None-Match header string | null The ETag the caller holds (304 when unchanged)
Respons
200 TimerDto · 304 (tanpa body)
Error

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

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

Parameter
NamaLokasiTipeDeskripsi
Idempotency-Key header string | null The client's command id; a retry returns the first answer
Body permintaan
TimerStartRequest
Respons
200 TimerCommandResultDto
Error

Webhook

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

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

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) The endpoint
If-Matchwajib header string The endpoint's ETag ("v<n>")
Body permintaan
UpdateWebhookEndpointRequest
Respons
200 WebhookEndpointDto
Error

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

Delete an endpoint and its deliveries.

Parameter
NamaLokasiTipeDeskripsi
idwajib path string (uuid) The endpoint
Respons
204 (tanpa body)
Error

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

The deliveries of an endpoint, newest first.

Parameter
NamaLokasiTipeDeskripsi
idwajib 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.
Respons
200 WebhookDeliveryPage
Error

Skema

Body permintaan dan respons yang digunakan oleh operasi. Field yang wajib ditandai.

AbsenceDto

An absence.

FieldTipeDeskripsi
createdAtwajib string (date-time)
createdBywajib CalendarUserRefDto
dayswajib 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
deductionByYearwajib object The balance deduction per year, e.g. {"2026": 3.5}; empty for types that do not deduct.
endwajib string (date-time)
endDatewajib string (date)
endTime string | null
half string | null
idwajib string (uuid)
note string | null
permissionswajib AbsencePermissionsDto
startwajib string (date-time) UTC coverage start.
startDatewajib string (date)
startTime string | null
statuswajib string
timeZonewajib string
typewajib AbsenceTypeRefDto
unitwajib string
updatedAtwajib string (date-time)
userwajib CalendarPersonDto
userIdwajib string (uuid)

AbsencePage

GET /v1/absences.

FieldTipeDeskripsi
itemswajib AbsenceDto[]
nextCursor string | null

AbsencePermissionsDto

FieldTipeDeskripsi
canApprovewajib boolean
canCancelwajib boolean
canEditwajib boolean

AbsenceRequest

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

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

FieldTipeDeskripsi
colorwajib string
countsAsWorkedwajib boolean
deductsFromBalancewajib boolean
idwajib string (uuid)
key string | null
namewajib string
paidwajib boolean
timeEffectwajib string

AcceptedDto

202 Accepted of a queued job.

FieldTipeDeskripsi
acceptedwajib boolean Always true.

AccessDto

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

FieldTipeDeskripsi
assignableRoleswajib string[]
canManageCompanySettingswajib boolean
canManageTeamswajib boolean
canManageUserswajib boolean
manageTeamIdswajib string[]
scopewajib string company, teams or self.
unassignedFallbackwajib boolean
viewTeamIdswajib string[]

ActivityDayDto

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

FieldTipeDeskripsi
absenceCreditMswajib integer (int64) A worked absence tops the worked time up to the expected work.
activeMswajib integer (int64) Window time ∩ not AFK (computer time only).
afkCoveragewajib boolean False when no device reported AFK data (idle unknown).
appswajib AppUsageDto[] Daily totals, largest first.
arrivalAt string (date-time) | null
atWorkMswajib integer (int64)
attendance DayAttendanceDto | null
categorieswajib CategoryUsageDto[] Active time per category (null key = uncategorized); offline time is in no category.
classifiedwajib boolean False for a day written before the Phase 2 classification (all neutral).
datewajib string (date)
dayEndwajib string (date-time)
dayStartwajib string (date-time) The day's window: local midnight, or the end of the previous day's night shift window.
deletedMswajib integer (int64) Tracked time removed by approved deletions (part of idle).
domainswajib DomainUsageDto[]
hostswajib HostUsageDto[] Hosts with a URL, at most 50, largest first.
idleMswajib integer (int64)
leftAt string (date-time) | null
meetingMswajib integer (int64) Active time the meeting apps exception turned from idle into active.
offlineMswajib integer (int64) Approved offline time outside the tracked active time.
pendingOfflineMswajib integer (int64) Pending offline entries of the day (information only).
plan DayPlanDto | null
privateIntervalswajib TimeIntervalDto[] Private intervals of the day, merged and clipped, without detail.
privateMswajib integer (int64) Private time outside active and offline time.
productivitywajib DayProductivityDto
recomputingwajib boolean The day waits in the recompute queue (the UI refetches every 15 s).
slotswajib 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).
timeEntrieswajib TimeEntryDto[] Offline and deletion entries of every status overlapping the day's window, by start; the caller's permissions.
timeZonewajib string The zone the day was computed in; the UI draws slots at their wall-clock time in it.
userIdwajib string (uuid)
workedMswajib integer (int64) activeMs + offlineMs: the denominator of productivity.productivityPct.

ActivitySlotDto

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

FieldTipeDeskripsi
activeMswajib integer (int64)
appswajib AppUsageDto[]
neutralMswajib integer (int64)
offlineMswajib integer (int64)
productiveMswajib integer (int64)
slotStartwajib string (date-time)
unproductiveMswajib integer (int64)

AffectedAllocationDto

An allocation replace changed.

FieldTipeDeskripsi
changewajib string trimmed, split or deleted.
idwajib string (uuid)

AllocationCreateRequest

POST /v1/allocations (Idempotency-Key).

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

FieldTipeDeskripsi
affectedwajib AffectedAllocationDto[]
allocationwajib AllocationDto

AllocationDto

Time on a project.

FieldTipeDeskripsi
createdAtwajib string (date-time)
createdBywajib NamedRefDto
durationMswajib integer (int64)
effectiveBillablewajib boolean
endedAtwajib string (date-time)
idwajib 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.
localDatewajib string (date) The start's day in the person's zone (rates, reports).
note string | null
permissionswajib AllocationPermissionsDto
projectwajib ProjectRefDto
sourcewajib string timer, manual or assignment.
startedAtwajib string (date-time)
task NamedRefDto | null
timeZonewajib string
updatedAtwajib string (date-time)
userIdwajib string (uuid)
versionwajib integer (int64) The row version: If-Match: "v<version>" of a change (the same value as the resource's ETag).

AllocationPage

GET /v1/allocations.

FieldTipeDeskripsi
itemswajib AllocationDto[]
nextCursor string | null

AllocationPermissionsDto

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

FieldTipeDeskripsi
deletewajib boolean
editwajib boolean

AppTotalDto

FieldTipeDeskripsi
activeMswajib integer (int64)
appKeywajib string
categoryKey string | null
level string | null Level in the response's levelContext.
namewajib string
percentagewajib 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".

FieldTipeDeskripsi
activeMswajib integer (int64)
appKeywajib string
categoryKey string | null
level string | null The app's own rule (productive, unproductive, neutral).
levelSource string | null team, company, default or offline.
namewajib string

BudgetDto

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

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

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

FieldTipeDeskripsi
decision string | null
note string | null

CalendarPersonDto

A user with the current team.

FieldTipeDeskripsi
fullName string | null
idwajib string (uuid)
teamId string (uuid) | null
teamName string | null

CalendarUserRefDto

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

FieldTipeDeskripsi
fullName string | null
idwajib string (uuid)

CapabilitiesDto

Subscription capabilities.

FieldTipeDeskripsi
featureswajib string[]
readOnlywajib boolean

CategoryUsageDto

FieldTipeDeskripsi
activeMswajib 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.

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

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

CreateTeam

POST /v1/teams.

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

CreateTimeEntryRequest

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

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

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

CreatedWebhookEndpointDto

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

FieldTipeDeskripsi
endpointwajib WebhookEndpointDto
secretwajib string whsec_<base64>: shown once, never again.

DailyHolidayDto

A holiday of a daily report day.

FieldTipeDeskripsi
half string | null
keywajib string
namewajib string English name; nameTr is the Turkish one.
nameTrwajib string

DayAbsenceDto

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

FieldTipeDeskripsi
colorwajib string
fractionwajib number (double) The day's approved absence coverage (0–1).
half string | null
typeKey string | null
typeName string | null
unitwajib string

DayAttendanceDto

Attendance of the day on the day plan.

FieldTipeDeskripsi
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
flexiblewajib boolean
lateByMswajib integer (int64)
lateToleranceMinuteswajib integer (int32)
leftEarlywajib boolean
leftEarlyByMswajib integer (int64)
statuswajib string onTime, late, absent, notStarted, dayOff, onLeave, holiday.
targetMswajib integer (int64) The plan's target (the Effectiveness % denominator).
workdaywajib boolean

DayPlanDto

The day plan of one user's day.

FieldTipeDeskripsi
absenceswajib PlanAbsenceDto[] Approved and pending absences covering the day (only approved ones change the numbers).
expectedEnd string (date-time) | null
expectedStart string (date-time) | null
expectedWorkMswajib integer (int64) Overtime target (base × (1 − fLeave)).
holiday HolidayRefDto | null
kindwajib string schedule, shift, dayOff or holiday.
leaveFractionwajib number (double) The approved absence coverage f (0–1).
shiftswajib PlanShiftDto[] Shifts starting on the day, by start.
targetMswajib integer (int64) Effectiveness % denominator (base × (1 − f)).
workdaywajib boolean

DayProductivityDto

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

FieldTipeDeskripsi
effectivenessPct number (double) | null productive ÷ target × 100 (not capped); null without a target.
neutralMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null productive ÷ worked × 100, one decimal; null without worked time.
targetMswajib integer (int64)
unproductiveMswajib integer (int64)

DayTotalDto

One local day of a summary.

FieldTipeDeskripsi
activeMswajib integer (int64)
activeUserCountwajib integer (int32)
atWorkMswajib integer (int64)
datewajib string (date)
idleMswajib integer (int64)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
privateMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null
unproductiveMswajib integer (int64)

DomainTotalDto

FieldTipeDeskripsi
activeMswajib integer (int64)
categoryKey string | null
domainwajib string
level string | null
percentagewajib number (double)

DomainUsageDto

FieldTipeDeskripsi
activeMswajib integer (int64)
categoryKey string | null
domainwajib 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).

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

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

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

ExportJobDto

An export job as the panel lists and polls it.

FieldTipeDeskripsi
createdAtwajib string (date-time)
datasetwajib 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
formatwajib string
fromwajib string (date)
groupBy string | null
idwajib string (uuid)
localewajib string
progresswajib integer (int32) 0–100.
rowCount integer (int32) | null
startedAt string (date-time) | null
statuswajib 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.
towajib string (date)

ExportOptionsDto

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

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

FieldTipeDeskripsi
codewajib string Stable snake_case code (required, too_long, invalid, ...).
fieldwajib 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).

FieldTipeDeskripsi
half string | null
keywajib string Built-in key (republic_day, …) or custom.
namewajib string
nameEnwajib string
nameTrwajib string
source string | null builtin or tenant.

HostUsageDto

FieldTipeDeskripsi
activeMswajib integer (int64)
domain string | null
hostwajib string
levelwajib string
levelSourcewajib string
matchedKey string | null Key of the matching domain rule; null for the default.

InvitationEmail

What happened to the invitation e-mail.

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

FieldTipeDeskripsi
expiresAtwajib string
idwajib string (uuid)

InvitationResult

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

FieldTipeDeskripsi
emailwajib InvitationEmail
invitationwajib InvitationRef
memberwajib MemberDto

LevelContextDto

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

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

MeDto

GET /v1/me.

FieldTipeDeskripsi
accesswajib AccessDto
capabilitieswajib CapabilitiesDto
effectiveTimeZonewajib string
membershipwajib MeMembership
organizationwajib MeOrganization
organizationswajib OrganizationChoice[]
session MeSession | null
userwajib MeUser

MeMembership

The membership in the current organization.

FieldTipeDeskripsi
idwajib string (uuid)
isTrackedwajib boolean
joinedAt string | null
rolewajib string
statuswajib string
teamId string (uuid) | null
teamName string | null
timeZone string | null
viewerTeamIdswajib string (uuid)[]

MeOrganization

The current organization.

FieldTipeDeskripsi
defaultLocalewajib string
idwajib string (uuid)
namewajib string
slugwajib string
statuswajib string
timeZonewajib string

MeSession

The current session.

FieldTipeDeskripsi
absoluteExpiresAtwajib string
amrwajib string[]
authTimewajib string
clientIdwajib string
idwajib string (uuid)
idleExpiresAtwajib string

MeUser

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

FieldTipeDeskripsi
emailwajib string
emailVerificationwajib EmailVerificationDto The e-mail verification gate (owner decision 3 Oct 2026).
emailVerifiedwajib boolean
fullName string | null
idwajib string (uuid)
localewajib string

MemberDto

A membership with its person (MemberDto).

FieldTipeDeskripsi
createdAtwajib string
emailwajib string
emailVerifiedwajib boolean
fullName string | null
idwajib string (uuid)
invitation MemberInvitationDto | null
isTrackedwajib boolean
joinedAt string | null
localewajib string
rolewajib string owner, admin, team_admin, manager, employee.
statuswajib string invited, active, suspended, left.
teamId string (uuid) | null
teamName string | null
timeZone string | null
unassignedManagerwajib boolean A Manager with neither a team nor viewer teams (sees the whole company until assigned).
userIdwajib string (uuid)
viewerTeamIdswajib string (uuid)[]

MemberInvitationDto

The invitation of an invited member.

FieldTipeDeskripsi
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.
expiresAtwajib string
idwajib string (uuid)
lastSentAtwajib string
sentCountwajib integer (int32)

MemberPage

A page of members (OpenAPI).

FieldTipeDeskripsi
itemswajib MemberDto[]
nextCursor string | null

MemberRefDto

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

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

NamedRefDto

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

FieldTipeDeskripsi
idwajib string (uuid)
namewajib string

OrganizationChoice

One organization of the person (sec.user_memberships).

FieldTipeDeskripsi
currentwajib boolean
idwajib string (uuid)
namewajib string
rolewajib string
selectablewajib boolean Can this session's sign-in method open it (design §4.5.3)?

PatchMember

PATCH /v1/members/{id}.

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

FieldTipeDeskripsi
description string | null
name string | null

PeriodReportDto

GET /v1/reports/productivity.

FieldTipeDeskripsi
fromwajib string (date)
groupBywajib string
levelContextwajib LevelContextDto
periodswajib ReportPeriodDto[]
subjectwajib ReportSubjectDto
teamswajib TeamPeriodsDto[] Only for the company subject: every visible team over its current members.
towajib string (date)
totalswajib ReportFiguresDto

PlanAbsenceDto

FieldTipeDeskripsi
colorwajib string
countsAsWorkedwajib boolean timeEffect == worked.
endTime string | null
half string | null
idwajib string (uuid)
startTime string | null Local start and end of an hours absence.
statuswajib string approved or pending.
timeEffectwajib 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).
unitwajib string days, half_day or hours.

PlanShiftDto

FieldTipeDeskripsi
color string | null
endwajib string (date-time)
endTimewajib string Local end; before the start for a night shift.
idwajib string (uuid)
locationwajib string
minMinuteswajib integer (int32)
startwajib string (date-time)
startTimewajib string Local start (HH:mm, the shift's zone).

Problem

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

FieldTipeDeskripsi
action string | null Permission key of a 403 (teams.create).
codewajib 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).
statuswajib integer (int32)
titlewajib string English title of the code (clients translate code).
traceId string | null W3C trace id of the request.
typewajib 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).

FieldTipeDeskripsi
billableMinorwajib integer (int64) The billable hours at their rate.
costMinorwajib integer (int64) Every allocated hour at its rate.
currencywajib string

ProjectBudgetUsageDto

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

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

ProjectDto

A project.

FieldTipeDeskripsi
accesswajib string everyone or members.
archivedwajib boolean
budget BudgetDto | null
client NamedRefDto | null
code string | null
color string | null
createdAtwajib string (date-time)
currencywajib string The currency of the project's rates and amount budget.
description string | null
endDate string (date) | null
idwajib string (uuid)
isBillablewajib boolean
memberCountwajib integer (int64)
myRole string | null The caller's role in the project team (member, manager), null outside it.
namewajib string
permissionswajib ProjectPermissionsDto
spentMswajib integer (int64) Every allocation of the project, all time.
startDate string (date) | null
statuswajib string active, on_hold or completed.
taskCountwajib integer (int64)
updatedAtwajib string (date-time)

ProjectPage

GET /v1/projects.

FieldTipeDeskripsi
itemswajib ProjectDto[]
nextCursor string | null

ProjectPermissionsDto

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

FieldTipeDeskripsi
archivewajib boolean
deletewajib boolean Only a project without time.
editwajib boolean The project's fields (Owners and Admins).
manageMemberswajib boolean The team (an Admin or the project's manager; only an Admin changes managers).
manageTaskswajib boolean Tasks (an Admin or the project's manager).
trackwajib boolean The caller may track time on it now.

ProjectRefDto

A project reference of an allocation.

FieldTipeDeskripsi
color string | null #RRGGBB.
idwajib string (uuid)
namewajib string

ProjectReportDto

GET /v1/reports/projects.

FieldTipeDeskripsi
budgetswajib ProjectBudgetUsageDto[]
costsIncludedwajib boolean The caller sees rates and amounts (projects.costs.read).
fromwajib string (date)
groupBywajib string[]
rowswajib ProjectReportRowDto[]
towajib string (date)
totalswajib ProjectReportTotalsDto

ProjectReportKeysDto

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

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

FieldTipeDeskripsi
allocatedMswajib integer (int64)
amounts ProjectAmountDto[] | null null unless costsIncluded.
billableMswajib integer (int64)
keyswajib ProjectReportKeysDto
nonBillableMswajib integer (int64)
productiveMs integer (int64) | null With includeProductive only.
unratedMswajib integer (int64) Time without any rate (it is left out of the amounts).

ProjectReportTotalsDto

The totals of the report.

FieldTipeDeskripsi
allocatedMswajib integer (int64)
amounts ProjectAmountDto[] | null
billableMswajib integer (int64)
nonBillableMswajib integer (int64)
productiveMs integer (int64) | null
unratedMswajib integer (int64)

ProjectRequest

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

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

FieldTipeDeskripsi
absenceCreditMswajib integer (int64)
absentDayswajib integer (int32)
activeMswajib integer (int64)
activeUserCountwajib integer (int32)
effectivenessPct number (double) | null
idleMswajib integer (int64)
lateDayswajib integer (int32)
leaveDayswajib number (double)
leftEarlyDayswajib integer (int32)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
overtimeDayswajib integer (int32)
overtimeMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null
targetMswajib integer (int64)
unproductiveMswajib integer (int64)
userCountwajib integer (int32)
workedMswajib 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).

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

ReportSubjectDto

Whom a report is about.

FieldTipeDeskripsi
id string (uuid) | null
kindwajib string company, team or user.
name string | null

RotatedWebhookSecretDto

RotatedWebhookSecretDto: the new signing secret, shown once.

FieldTipeDeskripsi
previousSecretExpiresAtwajib string Until then deliveries carry both signatures.
secretwajib 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.

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

FieldTipeDeskripsi
breakMinuteswajib integer (int32)
color string | null
createdAtwajib string (date-time)
createdBywajib CalendarUserRefDto
crossesMidnightwajib boolean
datewajib string (date)
durationMinuteswajib integer (int32)
endwajib string (date-time)
endTimewajib string
idwajib string (uuid)
locationwajib string
minMinuteswajib integer (int32)
note string | null
openwajib boolean No user assigned.
permissionswajib ShiftPermissionsDto
sourcewajib string manual, template, copy or request.
startwajib string (date-time)
startTimewajib 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
timeZonewajib string
updatedAtwajib 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).

FieldTipeDeskripsi
itemswajib ShiftDto[]

ShiftPermissionsDto

FieldTipeDeskripsi
canDeletewajib boolean
canEditwajib boolean
canPickUpwajib boolean
canRequestSwapwajib boolean

SummaryDto

The summary of the visible users over a range.

FieldTipeDeskripsi
absenceCreditMswajib integer (int64)
absentDayswajib integer (int32)
activeMswajib integer (int64)
activeUserCountwajib integer (int32)
atWorkMswajib integer (int64)
dayswajib DayTotalDto[]
deletedMswajib integer (int64)
domainswajib DomainTotalDto[] Top 10.
effectivenessPct number (double) | null Average of the users' range Effectiveness % (inactive tracked users included).
fromwajib string (date)
holidayDayswajib number (double)
idleMswajib integer (int64)
inactiveUserswajib UserTotalDto[] Tracked users without activity in the range (zero totals, attendance fields), by user id.
lateDayswajib integer (int32)
leaveDayswajib number (double)
leftEarlyDayswajib integer (int32)
levelContextwajib LevelContextDto
meetingMswajib integer (int64)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
overtimeMswajib integer (int64)
privateMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null Average of the users' range Productivity %.
scopewajib ReportScopeDto
shiftDayswajib integer (int32)
teamswajib TeamTotalDto[] By current team: named teams by name, the teamId: null row last.
towajib string (date)
topAppswajib AppTotalDto[] Top 10; name is "Offline time" for the reserved offline keys.
unproductiveMswajib integer (int64)
userswajib UserTotalDto[] One row per user with a computed day in the range, by activeMs.
workedMswajib integer (int64)

TargetItemDto

FieldTipeDeskripsi
activeMswajib integer (int64)
categoryKey string | null
categorySourcewajib string tenant, builtin or none.
domain string | null
levelwajib string
levelSourcewajib string team, company or default.
matchedKey string | null
namewajib string
percentagewajib number (double)
targetKeywajib string
targetTypewajib string app for apps, domain for domains and hosts.
userCountwajib integer (int32)

TargetListDto

The "Apps & URLs" list.

FieldTipeDeskripsi
fromwajib string (date)
itemswajib TargetItemDto[] By active time descending, then key.
levelContextwajib LevelContextDto
nextCursor string | null
towajib string (date)
totalwajib integer (int32) Targets matching the filters (before paging).
totalActiveMswajib integer (int64) Active time over every target of the type before the filters (the percentage base).
typewajib string app, domain or host.

TaskDto

A task.

FieldTipeDeskripsi
archivedwajib boolean
assignee NamedRefDto | null
createdAtwajib string (date-time)
description string | null
dueDate string (date) | null
effectiveBillablewajib boolean
estimateMinutes integer (int64) | null
idwajib string (uuid)
isBillable boolean | null null takes the project's value.
namewajib string
permissionswajib TaskPermissionsDto
projectIdwajib string (uuid)
sortOrderwajib integer (int64)
spentMswajib integer (int64)
statuswajib string open, in_progress or done.
updatedAtwajib string (date-time)

TaskPage

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

FieldTipeDeskripsi
itemswajib TaskDto[]
nextCursor string | null

TaskPermissionsDto

What the caller may do with a task.

FieldTipeDeskripsi
deletewajib boolean Only a task without time.
editwajib boolean

TaskRequest

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

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

FieldTipeDeskripsi
archivedAt string | null
createdAtwajib string
description string | null
idwajib string (uuid)
leadswajib object[] TeamAdmins and Managers of the team: [{membershipId, userId, fullName, role}].
memberCountwajib integer (int64) Members whose primary team this is (left members excluded).
namewajib string
updatedAtwajib string

TeamPage

A page of teams (OpenAPI).

FieldTipeDeskripsi
itemswajib TeamDto[]
nextCursor string | null

TeamPeriodsDto

FieldTipeDeskripsi
periodswajib ReportPeriodDto[]
teamIdwajib string (uuid)
teamName string | null
totalswajib ReportFiguresDto

TeamTotalDto

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

FieldTipeDeskripsi
absenceCreditMswajib integer (int64)
absentDayswajib integer (int32)
activeMswajib integer (int64)
activeUserCountwajib integer (int32)
effectivenessPct number (double) | null
holidayDayswajib number (double)
idleMswajib integer (int64)
lateDayswajib integer (int32)
leaveDayswajib number (double)
leftEarlyDayswajib integer (int32)
memberCountwajib integer (int32)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
overtimeMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null
shiftDayswajib integer (int32)
teamId string (uuid) | null null for the users without a team.
teamName string | null
unproductiveMswajib integer (int64)
workedMswajib integer (int64)

TimeEntryDecisionRequest

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

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

TimeEntryDto

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

FieldTipeDeskripsi
createdAtwajib string (date-time)
createdBywajib TimeEntryUserRefDto
datewajib 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
durationMswajib integer (int64)
endwajib string (date-time)
idwajib string (uuid)
kindwajib string offline or deletion.
level string | null Offline: productive, neutral or unproductive; deletion: null.
permissionswajib TimeEntryPermissionsDto
projectId string (uuid) | null Always null until projects (Phase 6).
sourcewajib string manual (Phase 8 adds calendar).
startwajib string (date-time)
statuswajib string pending, approved or rejected.
timeZonewajib string
updatedAtwajib string (date-time)
userIdwajib string (uuid)

TimeEntryPage

GET /v1/time-entries: by start.

FieldTipeDeskripsi
itemswajib TimeEntryDto[]
nextCursor string | null

TimeEntryPermissionsDto

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

FieldTipeDeskripsi
canApprovewajib boolean
canDeletewajib boolean
canEditwajib boolean

TimeEntryUserRefDto

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

FieldTipeDeskripsi
fullName string | null
idwajib string (uuid)

TimeIntervalDto

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

FieldTipeDeskripsi
endwajib string (date-time)
startwajib string (date-time)

TimerAtRequest

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

FieldTipeDeskripsi
at string (date-time) | null

TimerCommandResultDto

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

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

TimerDto

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

FieldTipeDeskripsi
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
serverTimewajib 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
statewajib string running or stopped.
task NamedRefDto | null

TimerLastDto

The segment that ended last.

FieldTipeDeskripsi
endReasonwajib string stop, switch, autostop or discard.
endedAtwajib string (date-time)
segmentIdwajib string (uuid)
startedAtwajib string (date-time)

TimerProjectDto

The project of the running segment.

FieldTipeDeskripsi
clientName string | null
color string | null
idwajib string (uuid)
namewajib string

TimerStartRequest

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

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

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

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

FieldTipeDeskripsi
dayswajib UserDayDto[]
fromwajib string (date)
teamId string (uuid) | null The user's current primary team (its rules classify every day).
timeZonewajib string
towajib string (date)
userIdwajib string (uuid)

UserDayDto

FieldTipeDeskripsi
absence DayAbsenceDto | null
absenceCreditMswajib integer (int64)
activeMswajib integer (int64)
afkCoveragewajib boolean
arrivalAt string (date-time) | null
atWorkMswajib integer (int64)
attendanceStatus string | null onTime, late, absent, notStarted, dayOff, onLeave, holiday; null outside the directory.
classifiedwajib boolean
datewajib string (date)
dayOffWorkedMswajib integer (int64)
deletedMswajib integer (int64)
effectivenessPct number (double) | null
eventCountwajib integer (int64)
expectedWorkMswajib integer (int64)
holiday DailyHolidayDto | null
idleMswajib integer (int64)
lateByMswajib integer (int64)
leftAt string (date-time) | null
leftEarlywajib boolean
leftEarlyByMswajib integer (int64)
meetingMswajib integer (int64)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
overtimeMswajib integer (int64)
planKind string | null schedule, shift, dayOff or holiday.
privateMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null
shiftCountwajib integer (int32)
targetMswajib integer (int64)
topApp string | null Display name of the app with the most active time.
unproductiveMswajib integer (int64)
workday boolean | null
workedMswajib integer (int64)

UserTotalDto

One user of a summary.

FieldTipeDeskripsi
absenceCreditMswajib integer (int64)
absentDays integer (int32) | null Only for tracked users.
activeDayswajib integer (int32) Local days with active time.
activeMswajib integer (int64)
arrivalAt string (date-time) | null Earliest arrival and latest leave in the range.
atWorkMswajib integer (int64)
classifiedDayswajib integer (int32)
dayOffWorkedMswajib integer (int64)
deletedMswajib integer (int64)
effectivenessPct number (double) | null null without a target and for users missing from the directory.
email string | null
eventCountwajib integer (int64)
fullName string | null
holidayDayswajib number (double)
idleMswajib integer (int64)
lateDays integer (int32) | null
leaveDayswajib number (double)
leftAt string (date-time) | null
leftEarlyDays integer (int32) | null
meetingMswajib integer (int64)
neutralMswajib integer (int64)
offlineMswajib integer (int64)
overtimeDayswajib integer (int32)
overtimeMswajib integer (int64)
privateMswajib integer (int64)
productiveMswajib integer (int64)
productivityPct number (double) | null
shiftDayswajib integer (int32)
targetMs integer (int64) | null
teamId string (uuid) | null
teamName string | null
timeZonewajib string
unproductiveMswajib integer (int64)
userIdwajib string (uuid)
workdays integer (int32) | null
workedMswajib integer (int64)

WebhookDeliveryDetailDto

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

WebhookDeliveryDto

WebhookDeliveryDto.

FieldTipeDeskripsi
attemptswajib integer (int32)
createdAtwajib string
deliveredAt string | null
eventIdwajib string (uuid) The webhook-id header.
eventTypewajib string
idwajib 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
statuswajib string pending, succeeded, failed, dead.

WebhookDeliveryPage

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

FieldTipeDeskripsi
itemswajib WebhookDeliveryDto[]
nextCursor string | null

WebhookEndpointDto

WebhookEndpointDto.

FieldTipeDeskripsi
createdAtwajib string
description string | null
eventTypeswajib string[]
idwajib string (uuid)
ownerwajib 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).
secretPrefixwajib string The first 8 characters of the signing secret (whsec_Kx); never the secret.
statswajib WebhookEndpointStatsDto
statuswajib string active, paused, disabled.
statusReason string | null manual, owner_inactive, failing, gone; null while active.
updatedAtwajib string
urlwajib string
versionwajib integer (int64) row_version (ETag: "v<n>", If-Match of PATCH).

WebhookEndpointPage

GET /v1/webhook-endpoints.

FieldTipeDeskripsi
itemswajib WebhookEndpointDto[]
nextCursor string | null

WebhookEndpointStatsDto

The delivery statistics of an endpoint.

FieldTipeDeskripsi
consecutiveFailureswajib integer (int32)
lastFailureAt string | null
lastSuccessAt string | null

WebhookEventDto

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

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

WebhookEventsDto

GET /v1/webhook-events.

FieldTipeDeskripsi
itemswajib WebhookEventDto[]

WebhookTestDto

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

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