API reference
Timesheets
12 requests. Each shows the permission a key needs, what to send and what comes back.
On this page
Timesheets between two dates (by the day they count for), with filters
GET/v1/timesheets
- Permission
timesheet.view- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
from | query | daterequired | |
to | query | daterequired | |
teamMemberId | query | uuid | |
teamId | query | uuid | |
teamIds | query | array of uuid | |
status | query | enum | One of open, submitted, signed_off |
Response array of object
iduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequired
curl "https://app.workscope.co.uk/v1/timesheets?from=2026-11-06&to=2026-11-06" \
-H "Authorization: Bearer wsk_your_key_here"Example response
[
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z"
}
]Add a timesheet for someone (submitted, or signed off straight away)
POST/v1/timesheets
- Permission
timesheet.manage- Module
timesheets- Answers
201
Request body JSON
teamMemberIduuidrequireddatedaterequiredYYYY-MM-DD
starttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
breakMinutesintegeroptional0 to 720 · Default
0bookingIduuidoptionalcan be nullclientIduuidoptionalcan be nullprojectIduuidoptionalcan be nullnotesstringoptionalcan be nullUp to 2000 characters
signOffbooleanoptionalDefault
false
Response object
iduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequiredhistoryarray of objectrequirediduuidrequiredkindenumrequiredOne of
"created","edited","submitted","signed_off","unsigned","deleted"byNamestringrequiredcan be nullatstringrequiredreasonstringrequiredcan be nullsummarystringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/timesheets" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"breakMinutes": 0,
"bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"notes": "Side gate code is on the key safe.",
"signOff": false
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z",
"history": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"kind": "created",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z",
"reason": "text",
"summary": "text"
}
]
}One timesheet, with its history
GET/v1/timesheets/{id}
- Permission
timesheet.view- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequiredhistoryarray of objectrequirediduuidrequiredkindenumrequiredOne of
"created","edited","submitted","signed_off","unsigned","deleted"byNamestringrequiredcan be nullatstringrequiredreasonstringrequiredcan be nullsummarystringrequiredcan be null
curl "https://app.workscope.co.uk/v1/timesheets/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z",
"history": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"kind": "created",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z",
"reason": "text",
"summary": "text"
}
]
}Change a timesheet. A reason is needed when it isn't your own; a timesheet in a pay run can't change.
PATCH/v1/timesheets/{id}
- Permission
timesheet.manage- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
datedateoptionalYYYY-MM-DD
starttimeoptionalHH:MM, 24-hour
endtimeoptionalHH:MM, 24-hour
breakMinutesintegeroptional0 to 720
bookingIduuidoptionalcan be nullclientIduuidoptionalcan be nullprojectIduuidoptionalcan be nullnotesstringoptionalcan be nullUp to 2000 characters
reasonstringoptionalcan be nullUp to 500 characters
Response object
iduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequiredhistoryarray of objectrequirediduuidrequiredkindenumrequiredOne of
"created","edited","submitted","signed_off","unsigned","deleted"byNamestringrequiredcan be nullatstringrequiredreasonstringrequiredcan be nullsummarystringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/timesheets/ID" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"breakMinutes": 120,
"bookingId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"notes": "Side gate code is on the key safe.",
"reason": "text"
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z",
"history": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"kind": "created",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z",
"reason": "text",
"summary": "text"
}
]
}Delete a timesheet, with a reason (kept in its history; its holiday goes back)
POST/v1/timesheets/{id}/delete
- Permission
timesheet.manage- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
reasonstringoptionalcan be nullUp to 500 characters
Response object
okconstantrequiredAlways
true
curl -X POST "https://app.workscope.co.uk/v1/timesheets/ID/delete" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"reason": "text"
}'Example response
{
"ok": true
}Take a signed-off timesheet back to submitted, saying why (its holiday is taken back)
POST/v1/timesheets/{id}/unsign
- Permission
timesheet.manage- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
reasonstringrequired1–500 characters
Response object
iduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequiredhistoryarray of objectrequirediduuidrequiredkindenumrequiredOne of
"created","edited","submitted","signed_off","unsigned","deleted"byNamestringrequiredcan be nullatstringrequiredreasonstringrequiredcan be nullsummarystringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/timesheets/ID/unsign" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"reason": "text"
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z",
"history": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"kind": "created",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z",
"reason": "text",
"summary": "text"
}
]
}For each person and day: booked work and travel, to check timesheets against (the week grid)
GET/v1/timesheets/booked
- Permission
timesheet.view- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
from | query | daterequired | |
to | query | daterequired | |
teamIds | query | array of uuid |
Response object
toleranceMinutesintegerrequired-9007199254740991 to 9007199254740991
daysarray of objectrequiredteamMemberIduuidrequireddatedaterequiredYYYY-MM-DD
bookingsintegerrequired-9007199254740991 to 9007199254740991
bookedMinutesintegerrequired-9007199254740991 to 9007199254740991
travelMinutesintegerrequired-9007199254740991 to 9007199254740991
curl "https://app.workscope.co.uk/v1/timesheets/booked?from=2026-11-06&to=2026-11-06" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"toleranceMinutes": 120,
"days": [
{
"teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"date": "2026-11-06",
"bookings": -9007199254740991,
"bookedMinutes": 120,
"travelMinutes": 120
}
]
}What a team member had booked on a day, with the total, to check their timesheets against (as Xota's timesheet page)
GET/v1/timesheets/day-bookings
- Permission
timesheet.view- Module
timesheets- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
teamMemberId | query | uuidrequired | |
date | query | daterequired |
Response object
datedaterequiredYYYY-MM-DD
bookingsarray of objectrequirediduuidrequirednamestringrequiredclientNamestringrequiredprojectNamestringrequiredcan be nullstatusstringrequiredstarttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
minutesintegerrequired-9007199254740991 to 9007199254740991
totalMinutesintegerrequired-9007199254740991 to 9007199254740991
curl "https://app.workscope.co.uk/v1/timesheets/day-bookings?teamMemberId=3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41&date=2026-11-06" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"date": "2026-11-06",
"bookings": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental",
"clientName": "Harbourside Dental",
"projectName": "1 Harbour Road",
"status": "text",
"start": "09:00",
"end": "11:00",
"minutes": 120
}
],
"totalMinutes": 120
}Download timesheets as CSV for payroll: one row per timesheet, or one row per person per week
GET/v1/timesheets/export
- Permission
timesheet.view- Module
timesheets- Answers
200with a file (image/jpeg)
Parameters
| Name | In | Kind | |
|---|---|---|---|
from | query | daterequired | |
to | query | daterequired | |
format | query | enum | One of entries, weekly · Default "entries" |
teamMemberId | query | uuid | |
status | query | enum | One of signed_off, all · Default "signed_off" |
curl "https://app.workscope.co.uk/v1/timesheets/export?from=2026-11-06&to=2026-11-06" \
-H "Authorization: Bearer wsk_your_key_here"How worked minutes are rounded
GET/v1/timesheets/settings
- Permission
timesheet.self- Module
timesheets- Answers
200
Response object
roundingenumrequiredOne of
"5","10","15","none"roundingModeenumrequiredOne of
"nearest","favour"toleranceMinutesintegerrequired0 to 600
curl "https://app.workscope.co.uk/v1/timesheets/settings" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"rounding": "5",
"roundingMode": "nearest",
"toleranceMinutes": 120
}Change the timesheet settings
PATCH/v1/timesheets/settings
- Permission
organization.update- Module
timesheets- Answers
200
Request body JSON
roundingenumoptionalOne of
"5","10","15","none"roundingModeenumoptionalOne of
"nearest","favour"toleranceMinutesintegeroptional0 to 600
Response object
roundingenumrequiredOne of
"5","10","15","none"roundingModeenumrequiredOne of
"nearest","favour"toleranceMinutesintegerrequired0 to 600
curl -X PATCH "https://app.workscope.co.uk/v1/timesheets/settings" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"rounding": "5",
"roundingMode": "nearest",
"toleranceMinutes": 120
}'Example response
{
"rounding": "5",
"roundingMode": "nearest",
"toleranceMinutes": 120
}Sign off submitted timesheets (one or many). Open ones are skipped.
POST/v1/timesheets/sign-off
- Permission
timesheet.manage- Module
timesheets- Answers
200
Request body JSON
idsarray of uuidrequired1–500 items
Response object
signedOffarray of objectrequirediduuidrequiredteamMemberIduuidrequiredteamMemberNamestringrequiredstatusenumrequiredOne of
"open","submitted","signed_off"datedaterequiredYYYY-MM-DD
startsAtstringrequiredendsAtstringrequiredstarttimerequiredHH:MM, 24-hour
endtimerequiredHH:MM, 24-hour
endDatedaterequiredYYYY-MM-DD
breakMinutesintegerrequired-9007199254740991 to 9007199254740991
workedMinutesintegerrequired-9007199254740991 to 9007199254740991
roundedMinutesintegerrequired-9007199254740991 to 9007199254740991
bookingobjectrequiredcan be nulliduuidrequirednamestringrequireddatedaterequiredcan be nullYYYY-MM-DD
clientobjectrequiredcan be nulliduuidrequirednamestringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequired
notesstringrequiredcan be nullsubmittedAtstringrequiredcan be nullsignedOffAtstringrequiredcan be nullsignedOffByNamestringrequiredcan be nullpayrolledbooleanrequiredcreatedAtstringrequiredupdatedAtstringrequired
skippedarray of objectrequirediduuidrequiredreasonstringrequired
curl -X POST "https://app.workscope.co.uk/v1/timesheets/sign-off" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
]
}'Example response
{
"signedOff": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"status": "open",
"date": "2026-11-06",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"start": "09:00",
"end": "11:00",
"endDate": "2026-11-06",
"breakMinutes": 120,
"workedMinutes": 120,
"roundedMinutes": 120,
"booking": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"date": "2026-11-06"
},
"client": {
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental"
},
"project": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental"
},
"notes": "Side gate code is on the key safe.",
"submittedAt": "2026-11-06T09:30:00.000Z",
"signedOffAt": "2026-11-06T09:30:00.000Z",
"signedOffByName": "Harbourside Dental",
"payrolled": false,
"createdAt": "2026-11-06T09:30:00.000Z",
"updatedAt": "2026-11-06T09:30:00.000Z"
}
],
"skipped": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"reason": "text"
}
]
}