Skip to main content
Submit the authenticated employee’s timesheet for a given pay period. This marks the employee’s PENDING entries as APPROVED and sets the pay period status to SUBMITTED.
POST /api/v1/employee/timesheet/submit
Authentication: requires an employee JWT. The employee is taken from the token’s userId.

Request body

payPeriodId
string
required
UUID of the pay period to submit. Must belong to the employee’s company (403 Access denied otherwise).

Behavior & preconditions

The request is rejected if any of the following hold:
StatuserrorCondition
404Employee not found or inactiveToken user missing or deactivated.
404Pay period not foundNo pay period with that id.
403Access deniedPay period belongs to a different company.
400Pay period lockedThe pay period is locked.
400Already submittedStatus is already SUBMITTED, APPROVED, PAID, or CLOSED.
400Open time entriesThe employee has entries with no clockOut (their id/clockIn are returned in data.openEntries).
400No time entriesThe employee has no entries in this pay period.
On success, the employee’s PENDING entries in the period are updated to APPROVED, the pay period status becomes SUBMITTED, and the response includes the updated period, the entry count, and computed totals.
On submission, this endpoint auto-approves the employee’s own PENDING entries (sets them to APPROVED) and flips the whole pay period to SUBMITTED. There is no per-employee submission state — submitting affects the shared pay period record.

Response

data.payPeriod
object
The updated pay period (now status: "SUBMITTED").
data.timeEntriesCount
integer
Number of the employee’s entries in this pay period.
data.totals
object
totalHours, regularHours, overtimeHours summed across those entries.
data.message
string
Timesheet submitted successfully.

Examples

curl -X POST https://app.paypunch.io/api/v1/employee/timesheet/submit \
  -H "Authorization: Bearer <employee-token>" \
  -H "Content-Type: application/json" \
  -d '{ "payPeriodId": "pp_01..." }'