Days and weeks that need PM approval, scoped to projects the caller leads
Returns project-days and project-weeks that have non-approved time entries, restricted to projects the caller is project lead on. Used to surface "to do" items in the approval inbox. Looks back six months (or to the account's approval-active date, whichever is later). Returns 403 if the caller leads no projects, or if approval is not active on the account.
Days and weeks that need PM approval, scoped to projects the caller leads › Responses
Actionable project days and weeks
Worktime days and weeks that need approval, scoped to teams the caller approves
Returns user-days and user-weeks where worktime entries are submitted but not yet approved, restricted to teams the caller has canApproveTeamWorktime for. Excludes freelancers (whose worktime isn't subject to this approval flow). Looks back six months.
Worktime days and weeks that need approval, scoped to teams the caller approves › Responses
Actionable user days and weeks
Approve / unapprove time entries and lock / unlock project days across up to seven days
Performs two related actions in one call. This is the canonical endpoint for approving or unapproving project days — direct CRUD on /v1/project-days is not supported.
- Approving time entries (retrospective): sets
validationStatus: APPROVEDon existing WORK entries that have already been submitted. - Locking project days (write-blocking): an APPROVED ProjectDay closes that (project, date) to all further WORK entry creation by any user until it is unlocked — this is the gate, not a side effect of approving entries. ProjectDay records may be locked on dates with zero existing time entries; this is the right way to close any period (past, present, or future) to new tracking without affecting any existing work.
Invariant: an APPROVED ProjectDay means every WORK entry on that day is also APPROVED. There is no separate "approve the entries first, then approve the day" path — this endpoint is that path. Passing dayStatus: APPROVED together with teStatus: APPROVED both approves the day's submitted entries and locks the day in one shot. (Days with zero entries trivially satisfy the invariant and are still locked.)
Two parameter modes:
- Single-status (
validationStatus): setsdayStatustovalidationStatus;teStatusdefaults toAPPROVEDwhen approving,SUBMITTEDotherwise. - Split (
teStatus+dayStatus): control the two independently within the invariant above. To lock a day, pass both asAPPROVED.
Constraints: dates capped at 7. At least one of projectId and userId must be set. ProjectDay locking only happens when projectId is set without userId (scoping by a single user does not lock the day, since other users may still need to track to it). Operates on WORK entries only. Permissions are checked per project: only PMs of a project may approve / unlock that project's days. Per-day and per-TE errors are collected into dayErrors rather than aborting the batch.
Approve / unapprove time entries and lock / unlock project days across up to seven days › Request Body
datesDays to process (YYYY-MM-DD). Max 7.
projectIdProject ID to scope changes to. Either projectId or userId must be set; both may be set to scope to a (user, project) intersection.
userIdUser ID to scope changes to. Either projectId or userId must be set.
validationStatusSingle-status convenience param. Sets dayStatus; sets teStatus to APPROVED when approving, SUBMITTED otherwise. Ignored when either teStatus or dayStatus is supplied.
teStatusTarget validation status for affected time entries.
dayStatusTarget validation status for ProjectDay records. Requires project. When APPROVED, teStatus must also be APPROVED.
Approve / unapprove time entries and lock / unlock project days across up to seven days › Responses
Updated time entries, affected project days, and per-day errors when any operation failed.
Present only when some operations failed; omitted on full success.
Bulk-change validationStatus on a user's worktime entries across a date range
Bulk-updates validationStatus on a single user's WORKTIME entries across a date range of up to seven days. Only entries already past NOTSUBMITTED are affected — submitted, approved, and rejected worktime can be moved between those states; not-yet-submitted worktime is ignored. When the new status is APPROVED, approvedBy and approvedOn are stamped; otherwise both are cleared. Permissions: canManageUsers for any user, or canApproveTeamWorktime covering a team the target user belongs to. Does not touch WORK or BREAK entries and does not affect ProjectDay records. Per-entry failures are collected into errors rather than aborting the batch.
Bulk-change validationStatus on a user's worktime entries across a date range › Request Body
startDateStart of the range (YYYY-MM-DD). Inclusive.
endDateEnd of the range (YYYY-MM-DD). Inclusive. Must be strictly after startDate and within seven days of it.
statusNew validationStatus for the affected worktime entries. Typically APPROVED (approve), SUBMITTED (un-approve back to submitted), or REJECTED.
userIdID of the user whose worktime entries to update.
Bulk-change validationStatus on a user's worktime entries across a date range › Responses
Updated worktime entries, plus per-entry errors when any update failed.
Present only when some updates failed; omitted on full success.
Approve, reject, or re-submit a single time entry
Changes one time entry's validationStatus and, optionally, patches its fields and sibling break entries in the same call. If the entry's ProjectDay is APPROVED and the new status is not APPROVED, the ProjectDay is automatically unlocked (set to NOTAPPROVED with approvedBy / approvedOn cleared) — only a PM of the project may trigger this. Permissions: an owner may submit their own entry; PMs of the entry's project may approve/reject WORK entries; users with canApproveTeamWorktime over the entry owner's team may approve/reject WORKTIME and BREAK entries. Running entries are rejected. Rejection (sendRejectionEmail) and re-submission (sendResubmissionEmail) notifications are sent asynchronously and do not block the response.
Approve, reject, or re-submit a single time entry › Request Body
timeEntryIdID of the time entry to update.
validationStatusNew status for the time entry.
isUpdatingTimeEntryWhen true, applies the fields in timeEntryNewData to the entry alongside the status change.
Patched fields applied when isUpdatingTimeEntry is true. Each property is optional; only changed values are written. Used by the resubmission modal.
Break entries (siblings of a WORKTIME entry) to update in the same call. Each item is a partial TimeEntry payload and must include id.
sendRejectionEmailWhen true and validationStatus is REJECTED, emails the entry owner with metaData.pmComment.
sendResubmissionEmailWhen true and validationStatus is SUBMITTED, emails the reviewer at metaData.projectManager with metaData.ownerComment.
Comments and recipients for email notifications.
Approve, reject, or re-submit a single time entry › Responses
Updated time entry, any updated breaks, and the affected ProjectDay if it was unlocked.
Null when no ProjectDay was affected; otherwise a single-element array containing the unlocked ProjectDay.
Per-project, per-week approval roll-up for a year
Returns a per-project map of weekly approval roll-ups (counts of submitted / approved / rejected / not-submitted entries plus project-day approval status). Admins (canManageAllProjects) see every project; others see only projects they are PM of, plus weeks belonging to teams they manage.
query Parameters
yearCalendar year. Defaults to current.
Per-project, per-week approval roll-up for a year › Responses
Project approval status by week
weekyearweekyearmonthcountapprovednotSubmittedsubmittedrejectedapprovedDayCountpdCountProject-day count for the week.
pdNotApprovedpdApprovedSubmit the caller's own time entries for a single day
Advances the caller's NOTSUBMITTED and REJECTED WORK time entries on the given day to SUBMITTED. Running entries are stopped first. If worktime tracking is active on the account and no SUBMITTED/APPROVED WORKTIME entry exists for the day, one is created from the user's default start/end (or a zero-duration record on a non-working day) and submitted. Scoped to the caller — there is no way to submit on behalf of another user.
Submit the caller's own time entries for a single day › Request Body
dateDay to submit (YYYY-MM-DD).
Submit the caller's own time entries for a single day › Responses
Time entries that were updated (or created, for auto-generated worktime).
Per-user, per-day tracked / submitted flags for a short window
Returns a {userId: {day: {tracked, submitted}}} map. tracked is true if the user has any time entry on that day; submitted is true if all entries are submitted. Admins (canManageAllProjects) see all active users; others see users assigned to projects they are PM of. Window must be at most a week.
query Parameters
startDateStart of the window (YYYY-MM-DD). Inclusive.
endDateEnd of the window (YYYY-MM-DD). Inclusive. Window must be at most a week.
Per-user, per-day tracked / submitted flags for a short window › Responses
User tracking status
Per-user, per-day worktime and break compliance check
For each requested user, returns whether their WORKTIME and BREAK entries on each day of a date range meet labor-law compliance rules. Currently hard-coded to German rules (no per-user country handling yet): worktime is compliant when (worktime hours − break hours) >= expectedHours for the day; breaks are compliant when total break duration meets the legal minimum for the worked duration (no minimum below 6h, 30min for 6–9h, 45min above 9h). Date range capped at 7 days. Worktime entries with status NOTSUBMITTED or APPROVED are skipped during evaluation, which makes those days appear compliant. Permissions: canManageUsers or isRootAdmin for any user; otherwise canApproveTeamWorktime covering a team the target user belongs to. Users the caller is not allowed to see are silently dropped from the response.
query Parameters
startDateStart of the window (YYYY-MM-DD). Inclusive.
endDateEnd of the window (YYYY-MM-DD). Inclusive. Must be strictly after startDate and within seven days of it.
usersIdsUser IDs to evaluate. Pass repeated usersIds query parameters. Users the caller cannot access are dropped from the response.
Per-user, per-day worktime and break compliance check › Responses
Compliance status, keyed by user ID, with per-day detail and an overall summary.
Per-day compliance, keyed by YYYY-MM-DD.
Window-level roll-up; true only when every day is compliant.