Timer
Solo timer request and response fields.
Base URL https://api.klockwork.org. Send the agency key and X-Klockwork-Talent (or talentId). The call acts as that active talent. /api/public/solo/public returns 404.
Get the open session
GET /api/public/solo/timer/session
Response 200: { session: Session | null }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Update the open session
PATCH /api/public/solo/timer/session
Request body:
| Field | Type | Required |
|---|---|---|
summary | string | no |
tasks | string | no |
notes | string | no |
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Start a session
POST /api/public/solo/timer/session/start
Request body:
| Field | Type | Required |
|---|---|---|
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | no |
Response 201: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Save the open session
POST /api/public/solo/timer/session/save
Request body:
| Field | Type | Required |
|---|---|---|
summary | string, min 1 | yes |
tasks | string, default "" | no |
notes | string, default "" | no |
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Discard, resume, or time out
POST /api/public/solo/timer/session/discard
/resume and /timeout use the same empty body. The response session is the resulting open session, or null when the session is gone.
No request body.
Response 200: { session: Session | null }
Start a break
POST /api/public/solo/timer/session/break/start
Request body:
| Field | Type | Required |
|---|---|---|
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string, default "" | no |
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
End a break
POST /api/public/solo/timer/session/break/end
No request body.
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
List sessions
GET /api/public/solo/timer/sessions
Query:
| Field | Type | Required |
|---|---|---|
from | string, min 1 | yes |
to | string, min 1 | yes |
clientId | string (uuid) | no |
status | "working" or "break" or "pending" or "completed" or "discarded" | no |
includeDeleted | boolean or "0" or "1" or "true" or "false" | no |
Response 200: { sessions: Session[] }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Create a manual session
POST /api/public/solo/timer/sessions
Request body:
| Field | Type | Required |
|---|---|---|
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | no |
startedAt | string, min 1 | yes |
endedAt | string, min 1 | yes |
unpaidBreakMinutes | number, min 0, default 0 | no |
summary | string, min 1 | yes |
tasks | string, default "" | no |
notes | string, default "" | no |
billable | boolean, default true | no |
Response 201: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Get a session
GET /api/public/solo/timer/sessions/{id}
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Update a completed session
PATCH /api/public/solo/timer/sessions/{id}
Request body:
| Field | Type | Required |
|---|---|---|
summary | string, min 1 | no |
tasks | string | no |
notes | string | no |
startedAt | string, min 1 | no |
endedAt | string, min 1 | no |
unpaidBreakMinutes | number, min 0 | no |
reason | string | no |
Response 200: { session: Session }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
clientId | string (uuid) | yes |
orgClientId | string (uuid) or null | yes |
status | "working" or "break" or "pending" or "completed" or "discarded" | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
deletedAt | string or null | yes |
createdAt | string | yes |
updatedAt | string | yes |
breaks | array of object | yes |
breaks items:
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
sessionId | string (uuid) | yes |
label | string, min 1 | yes |
plannedMinutes | integer, min 0 | yes |
note | string | yes |
startedAt | string | yes |
startedAtMs | integer, min 0 | yes |
endedAt | string or null | yes |
endedAtMs | integer, min 0 or null | yes |
Delete a completed session
DELETE /api/public/solo/timer/sessions/{id}
Request body:
| Field | Type | Required |
|---|---|---|
reason | string, min 1 | yes |
Response 200: { ok: true }
List session events
GET /api/public/solo/timer/sessions/{id}/events
Response 200: { events: Event[] }
| Field | Type | Required |
|---|---|---|
id | string (uuid) | yes |
clerkUserId | string, min 1 | yes |
sessionId | string (uuid) | yes |
clientId | string (uuid) | yes |
action | "created" or "updated" or "deleted" | yes |
actorLabel | string, min 1 | yes |
reason | string or null | yes |
before | object or null | yes |
after | object or null | yes |
createdAt | string | yes |
before object:
| Field | Type | Required |
|---|---|---|
startedAt | string | yes |
endedAt | string or null | yes |
unpaidBreakMinutes | number, min 0 | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
billableMs | integer, min 0 | yes |
after object:
| Field | Type | Required |
|---|---|---|
startedAt | string | yes |
endedAt | string or null | yes |
unpaidBreakMinutes | number, min 0 | yes |
summary | string or null | yes |
tasks | string or null | yes |
notes | string or null | yes |
billableMs | integer, min 0 | yes |
