API reference
Bookings
23 requests. Each shows the permission a key needs, what to send and what comes back.
On this page
Bookings the caller may see
GET/v1/bookings
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
from | query | date | |
to | query | date | |
teamMemberId | query | uuid | |
status | query | enum | One of draft, open, active, complete, signed_off, failed |
jobId | query | uuid | |
clientId | query | uuid | |
projectId | query | uuid | |
clientLevel | query | enum | One of true, false |
Response array of object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl "https://app.workscope.co.uk/v1/bookings" \
-H "Authorization: Bearer wsk_your_key_here"Example response
[
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}
]Add a booking not made from a job
POST/v1/bookings
- Permission
booking.manage- Answers
201
Request body JSON
projectIduuidoptionalcan be nullclientIduuidoptionalcan be nullteamMemberIduuidoptionalcan be nullnamestringrequired1–200 characters
descriptionstringoptionalcan be nullUp to 5000 characters
notesstringoptionalcan be nullUp to 5000 characters
datedateoptionalcan be nullYYYY-MM-DD
starttimeoptionalcan be nullHH:MM, 24-hour
endtimeoptionalcan be nullHH:MM, 24-hour
breakMinutesintegeroptionalcan be null0 to 1440
durationMinutesintegeroptionalcan be null0 to 10080
openToTeamIdsarray of uuidoptionalUp to 100 items · Default
[]openToTeamMemberIdsarray of uuidoptionalUp to 500 items · Default
[]priceOverridePenceintegeroptionalcan be null0 to 100000000
templateIduuidoptionalcan be nullcustomFieldsobjectoptionalneedsClockInbooleanoptionalcan be nullchecklistarray of objectoptionalUp to 50 items
iduuidoptionallabelstringrequired1–200 characters
instructionstringoptionalcan be nullUp to 1000 characters
kindenumoptionalOne of
"tick","text","textarea","number","date","time","checkbox","select","photo"· Default"tick"unitstringoptionalcan be nullUp to 20 characters
optionsarray of stringoptionalUp to 30 items · Default
[]askCommentbooleanoptionalDefault
falserequiredbooleanoptionalDefault
falsevisibleToClientsbooleanoptionalDefault
false
statusenumoptionalOne of
"draft","open","active"· Default"active"fromQuoteobjectoptionalquoteIduuidrequiredlineIduuidrequired
forDealuuidoptional
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"projectId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"breakMinutes": 120,
"durationMinutes": 120,
"openToTeamIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openToTeamMemberIds": [
"8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
],
"priceOverridePence": 4500,
"templateId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"checklist": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"label": "text",
"instruction": "text",
"kind": "tick",
"unit": "text",
"options": [
"text"
],
"askComment": false,
"required": false,
"visibleToClients": false
}
],
"status": "active",
"fromQuote": {
"quoteId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"lineId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
},
"forDeal": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}One booking
GET/v1/bookings/{id}
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl "https://app.workscope.co.uk/v1/bookings/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}Change a booking
PATCH/v1/bookings/{id}
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
projectIduuidoptionalcan be nullclientIduuidoptionalcan be nullteamMemberIduuidoptionalcan be nullnamestringoptional1–200 characters
descriptionstringoptionalcan be nullUp to 5000 characters
notesstringoptionalcan be nullUp to 5000 characters
datedateoptionalcan be nullYYYY-MM-DD
starttimeoptionalcan be nullHH:MM, 24-hour
endtimeoptionalcan be nullHH:MM, 24-hour
breakMinutesintegeroptionalcan be null0 to 1440
durationMinutesintegeroptionalcan be null0 to 10080
openToTeamIdsarray of uuidoptionalUp to 100 items
openToTeamMemberIdsarray of uuidoptionalUp to 500 items
priceOverridePenceintegeroptionalcan be null0 to 100000000
templateIduuidoptionalcan be nullcustomFieldsobjectoptionalneedsClockInbooleanoptionalcan be nullchecklistarray of objectoptionalUp to 50 items
iduuidoptionallabelstringrequired1–200 characters
instructionstringoptionalcan be nullUp to 1000 characters
kindenumoptionalOne of
"tick","text","textarea","number","date","time","checkbox","select","photo"· Default"tick"unitstringoptionalcan be nullUp to 20 characters
optionsarray of stringoptionalUp to 30 items · Default
[]askCommentbooleanoptionalDefault
falserequiredbooleanoptionalDefault
falsevisibleToClientsbooleanoptionalDefault
false
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X PATCH "https://app.workscope.co.uk/v1/bookings/ID" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"projectId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"breakMinutes": 120,
"durationMinutes": 120,
"openToTeamIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openToTeamMemberIds": [
"8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
],
"priceOverridePence": 4500,
"templateId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"checklist": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"label": "text",
"instruction": "text",
"kind": "tick",
"unit": "text",
"options": [
"text"
],
"askComment": false,
"required": false,
"visibleToClients": false
}
]
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}Delete a booking whose price is not locked
DELETE/v1/bookings/{id}
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
okconstantrequiredAlways
true
curl -X DELETE "https://app.workscope.co.uk/v1/bookings/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"ok": true
}A booking's checklist lines and their answers (as the caller may see them)
GET/v1/bookings/{id}/checklist
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
bookingIduuidrequireditemsarray of objectrequirediduuidrequiredlabelstringrequiredinstructionstringrequiredcan be nullkindenumrequiredOne of
"tick","text","textarea","number","date","time","checkbox","select","photo"unitstringrequiredcan be nulloptionsarray of stringrequiredaskCommentbooleanrequiredrequiredbooleanrequiredvisibleToClientsbooleanrequireddonebooleanrequiredvaluestring or number or booleanrequiredcan be nullvalueTextstringrequiredcan be nullcommentstringrequiredcan be nullphotoIduuidrequiredcan be nullphotoThumbUrlstringrequiredcan be nullphotoFullUrlstringrequiredcan be nulldoneAtstringrequiredcan be nulldoneByNamestringrequiredcan be null
summaryobjectrequireddoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
canEditbooleanrequired
curl "https://app.workscope.co.uk/v1/bookings/ID/checklist" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"bookingId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"items": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"label": "text",
"instruction": "text",
"kind": "tick",
"unit": "text",
"options": [
"text"
],
"askComment": false,
"required": false,
"visibleToClients": false,
"done": false,
"value": "text",
"valueText": "text",
"comment": "text",
"photoId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"photoThumbUrl": "https://example.co.uk",
"photoFullUrl": "https://example.co.uk",
"doneAt": "2026-11-06T09:30:00.000Z",
"doneByName": "Harbourside Dental"
}
],
"summary": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
},
"canEdit": false
}Answer one checklist line, or clear it (done: false). The team member doing the work until it's complete, or an owner or admin until it's signed off. The answer is checked for its kind (400 with the field). A photo line takes a photo already on the booking (upload it first)
PUT/v1/bookings/{id}/checklist/{itemId}
- Permission
booking.manage or booking.updateOwnStatus- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
itemId | path | uuidrequired |
Request body JSON
donebooleanrequiredvaluestring or number or booleanoptionalcan be nullcommentstringoptionalcan be nullUp to 2000 characters
photoIduuidoptionalcan be null
Response object
bookingIduuidrequireditemsarray of objectrequirediduuidrequiredlabelstringrequiredinstructionstringrequiredcan be nullkindenumrequiredOne of
"tick","text","textarea","number","date","time","checkbox","select","photo"unitstringrequiredcan be nulloptionsarray of stringrequiredaskCommentbooleanrequiredrequiredbooleanrequiredvisibleToClientsbooleanrequireddonebooleanrequiredvaluestring or number or booleanrequiredcan be nullvalueTextstringrequiredcan be nullcommentstringrequiredcan be nullphotoIduuidrequiredcan be nullphotoThumbUrlstringrequiredcan be nullphotoFullUrlstringrequiredcan be nulldoneAtstringrequiredcan be nulldoneByNamestringrequiredcan be null
summaryobjectrequireddoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
canEditbooleanrequired
curl -X PUT "https://app.workscope.co.uk/v1/bookings/ID/checklist/ID" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"done": false,
"value": "text",
"comment": "text",
"photoId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
}'Example response
{
"bookingId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"items": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"label": "text",
"instruction": "text",
"kind": "tick",
"unit": "text",
"options": [
"text"
],
"askComment": false,
"required": false,
"visibleToClients": false,
"done": false,
"value": "text",
"valueText": "text",
"comment": "text",
"photoId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"photoThumbUrl": "https://example.co.uk",
"photoFullUrl": "https://example.co.uk",
"doneAt": "2026-11-06T09:30:00.000Z",
"doneByName": "Harbourside Dental"
}
],
"summary": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
},
"canEdit": false
}Set, correct or clear a booking's clock-in and clock-out times, with a reason kept in its history (as Xota). Setting a clock-out on an active booking that needs a clock in completes it.
POST/v1/bookings/{id}/clock
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
clockedInAtdate-timerequiredcan be nullMatches
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$clockedOutAtdate-timerequiredcan be nullMatches
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$reasonstringrequired1–500 characters
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/clock" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"reason": "text"
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}A booking's status history, notes and photos (each as the caller may see them)
GET/v1/bookings/{id}/details
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
historyarray of objectrequirediduuidrequiredfromenumrequiredcan be nullOne of
"draft","open","active","complete","signed_off","failed"toenumrequiredOne of
"draft","open","active","complete","signed_off","failed"reasonstringrequiredcan be nullbyNamestringrequiredcan be nullatstringrequired
eventsarray of objectrequirediduuidrequiredkindstringrequiredtextstringrequiredbyNamestringrequiredcan be nullatstringrequired
clockChangesarray of objectrequirediduuidrequiredoldClockedInAtstringrequiredcan be nullnewClockedInAtstringrequiredcan be nulloldClockedOutAtstringrequiredcan be nullnewClockedOutAtstringrequiredcan be nullreasonstringrequiredbyNamestringrequiredcan be nullatstringrequired
notesarray of objectrequirediduuidrequiredbodystringrequiredvisibleToTeambooleanrequiredvisibleToClientsbooleanrequiredauthorNamestringrequiredcan be nullauthorRoleenumrequiredOne of
"owner","admin","operative","client"minebooleanrequiredcreatedAtstringrequired
photosarray of objectrequirediduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
bytesintegerrequired-9007199254740991 to 9007199254740991
captionstringrequiredcan be nullvisibleToTeambooleanrequiredvisibleToClientsbooleanrequireduploadedByNamestringrequiredcan be nullcreatedAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
failedReasonstringrequiredcan be null
curl "https://app.workscope.co.uk/v1/bookings/ID/details" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"history": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"from": "draft",
"to": "draft",
"reason": "text",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z"
}
],
"events": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"kind": "text",
"text": "text",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z"
}
],
"clockChanges": [
{
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"oldClockedInAt": "2026-11-06T09:30:00.000Z",
"newClockedInAt": "2026-11-06T09:30:00.000Z",
"oldClockedOutAt": "2026-11-06T09:30:00.000Z",
"newClockedOutAt": "2026-11-06T09:30:00.000Z",
"reason": "text",
"byName": "Harbourside Dental",
"at": "2026-11-06T09:30:00.000Z"
}
],
"notes": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"body": "Side gate code is on the key safe.",
"visibleToTeam": false,
"visibleToClients": false,
"authorName": "Harbourside Dental",
"authorRole": "owner",
"mine": false,
"createdAt": "2026-11-06T09:30:00.000Z"
}
],
"photos": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"width": -9007199254740991,
"height": -9007199254740991,
"bytes": -9007199254740991,
"caption": "text",
"visibleToTeam": false,
"visibleToClients": false,
"uploadedByName": "Harbourside Dental",
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}
],
"failedReason": "text"
}Add a note to a booking
POST/v1/bookings/{id}/notes
- Permission
booking.note- Answers
201
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
bodystringrequired1–5000 characters
visibleToTeambooleanoptionalDefault
truevisibleToClientsbooleanoptionalDefault
false
Response object
iduuidrequiredbodystringrequiredvisibleToTeambooleanrequiredvisibleToClientsbooleanrequiredauthorNamestringrequiredcan be nullauthorRoleenumrequiredOne of
"owner","admin","operative","client"minebooleanrequiredcreatedAtstringrequired
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/notes" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"body": "Side gate code is on the key safe.",
"visibleToTeam": true,
"visibleToClients": false
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"body": "Side gate code is on the key safe.",
"visibleToTeam": false,
"visibleToClients": false,
"authorName": "Harbourside Dental",
"authorRole": "owner",
"mine": false,
"createdAt": "2026-11-06T09:30:00.000Z"
}Delete a note (your own, or any for owners and admins)
DELETE/v1/bookings/{id}/notes/{noteId}
- Permission
booking.note- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
noteId | path | uuidrequired |
Response object
okconstantrequiredAlways
true
curl -X DELETE "https://app.workscope.co.uk/v1/bookings/ID/notes/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"ok": true
}Add a photo: send the image itself (JPEG, PNG, WebP; up to 15 MB). Location and other metadata are removed.
POST/v1/bookings/{id}/photos
- Permission
booking.photo- Answers
201
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body the file itself
Send the file as the body, with Content-Type one of image/jpeg, image/png, image/webp, image/heic, image/heif. See Files and photos.
Response object
iduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
bytesintegerrequired-9007199254740991 to 9007199254740991
captionstringrequiredcan be nullvisibleToTeambooleanrequiredvisibleToClientsbooleanrequireduploadedByNamestringrequiredcan be nullcreatedAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/photos" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgExample response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"bytes": -9007199254740991,
"caption": "text",
"visibleToTeam": false,
"visibleToClients": false,
"uploadedByName": "Harbourside Dental",
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}Change a photo's caption, or who can see it (team member, client)
PATCH/v1/bookings/{id}/photos/{photoId}
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
photoId | path | uuidrequired |
Request body JSON
captionstringoptionalcan be nullUp to 500 characters
visibleToTeambooleanoptionalvisibleToClientsbooleanoptional
Response object
iduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
bytesintegerrequired-9007199254740991 to 9007199254740991
captionstringrequiredcan be nullvisibleToTeambooleanrequiredvisibleToClientsbooleanrequireduploadedByNamestringrequiredcan be nullcreatedAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
curl -X PATCH "https://app.workscope.co.uk/v1/bookings/ID/photos/ID" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"caption": "text",
"visibleToTeam": false,
"visibleToClients": false
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"bytes": -9007199254740991,
"caption": "text",
"visibleToTeam": false,
"visibleToClients": false,
"uploadedByName": "Harbourside Dental",
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}Delete a photo
DELETE/v1/bookings/{id}/photos/{photoId}
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
photoId | path | uuidrequired |
Response object
okconstantrequiredAlways
true
curl -X DELETE "https://app.workscope.co.uk/v1/bookings/ID/photos/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"ok": true
}The photo itself (thumb or full size)
GET/v1/bookings/{id}/photos/{photoId}/{size}
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200with a file (image/jpeg)
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
photoId | path | uuidrequired | |
size | path | enumrequired | One of thumb, full |
curl "https://app.workscope.co.uk/v1/bookings/ID/photos/ID/SIZE" \
-H "Authorization: Bearer wsk_your_key_here"The app: take an open booking offered to me. It becomes mine and active. Refused if someone else got there first (409 AlreadyTaken), I'm off that day (409 OffThatDay), it clashes with my own work (409 Clash), it isn't offered to me (403 NotOffered), the day has passed (409 DayPassed) or my company doesn't allow it (403 PickUpOff)
POST/v1/bookings/{id}/pick-up
- Permission
booking.updateOwnStatus- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/pick-up" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}Change a booking's price (null: its repeat booking's price list). A finished one stays locked at the new price; an invoiced one can't change.
POST/v1/bookings/{id}/price
- Permission
price.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
pricePenceintegerrequiredcan be null0 to 100000000
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/price" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"pricePence": 4500
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}Where the booking happens: the address to go to (project address field, else the client's), the client's contact details, and the project and client fields the caller may see
GET/v1/bookings/{id}/site
- Permission
booking.viewAll or booking.viewOwn or booking.viewClient- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
bookingIduuidrequiredaddressstringrequiredcan be nulladdressFromenumrequiredcan be nullOne of
"project","client"mapsUrlstringrequiredcan be nullclientobjectrequirediduuidrequirednamestringrequiredaddressstringrequiredcan be nullphonestringrequiredcan be nullemailstringrequiredcan be nullwebsitestringrequiredcan be nullnotesstringrequiredcan be nullfieldsarray of objectrequiredslugstringrequiredlabelstringrequiredtypeenumrequiredOne of
"text","textarea","number","date","checkbox","select","address"valuestring or number or booleanrequiredtextstringrequired
projectobjectrequiredcan be nulliduuidrequirednamestringrequiredfieldsarray of objectrequiredslugstringrequiredlabelstringrequiredtypeenumrequiredOne of
"text","textarea","number","date","checkbox","select","address"valuestring or number or booleanrequiredtextstringrequired
curl "https://app.workscope.co.uk/v1/bookings/ID/site" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"bookingId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"address": "1 Harbour Road, Bristol",
"addressFrom": "project",
"mapsUrl": "https://example.co.uk",
"client": {
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"name": "Harbourside Dental",
"address": "1 Harbour Road, Bristol",
"phone": "0117 496 0123",
"email": "office@example.co.uk",
"website": "https://example.co.uk",
"notes": "Side gate code is on the key safe.",
"fields": [
{
"slug": "example-slug",
"label": "text",
"type": "text",
"value": "text",
"text": "text"
}
]
},
"project": {
"id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"name": "Harbourside Dental",
"fields": [
{
"slug": "example-slug",
"label": "text",
"type": "text",
"value": "text",
"text": "text"
}
]
}
}Move a booking to a new status. Complete and signed off lock its price.
POST/v1/bookings/{id}/status
- Permission
booking.manage or booking.updateOwnStatus- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
statusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"reasonstringoptionalcan be nullUp to 500 characters
completeAnywaybooleanoptional
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/status" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"status": "draft",
"reason": "text",
"completeAnyway": false
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}Put a repeat booking's visit back to planned (the booking goes; the visit shows as planned again). Refused for finished visits, and asks before deleting notes, photos or documents.
POST/v1/bookings/{id}/unbook
- Permission
booking.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
discardExtrasbooleanoptionalDefault
false
Response object
unbookarray of objectrequirediduuidrequireddatedaterequiredcan be nullYYYY-MM-DD
namestringrequired
refusedarray of objectrequirediduuidrequireddatedaterequiredcan be nullYYYY-MM-DD
namestringrequiredreasonstringrequired
extrasobjectrequirednotesintegerrequired-9007199254740991 to 9007199254740991
photosintegerrequired-9007199254740991 to 9007199254740991
documentsintegerrequired-9007199254740991 to 9007199254740991
donebooleanrequired
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/unbook" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"discardExtras": false
}'Example response
{
"unbook": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"date": "2026-11-06",
"name": "Harbourside Dental"
}
],
"refused": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"date": "2026-11-06",
"name": "Harbourside Dental",
"reason": "text"
}
],
"extras": {
"notes": -9007199254740991,
"photos": -9007199254740991,
"documents": -9007199254740991
},
"done": false
}Unlock a locked price (never an invoiced one)
POST/v1/bookings/{id}/unlock-price
- Permission
price.unlock- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl -X POST "https://app.workscope.co.uk/v1/bookings/ID/unlock-price" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}The app: open bookings offered to me from today on, soonest first, and whether my company lets me pick them up
GET/v1/bookings/open-work
- Permission
booking.updateOwnStatus- Answers
200
Response object
canPickUpbooleanrequiredbookingsarray of objectrequirediduuidrequiredstatusenumrequiredOne of
"draft","open","active","complete","signed_off","failed"datedaterequiredcan be nullYYYY-MM-DD
starttimerequiredcan be nullHH:MM, 24-hour
endtimerequiredcan be nullHH:MM, 24-hour
startsAtstringrequiredcan be nullendsAtstringrequiredcan be nullovernightbooleanrequiredbreakMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
durationMinutesintegerrequiredcan be null-9007199254740991 to 9007199254740991
namestringrequireddescriptionstringrequiredcan be nullnotesstringrequiredcan be nullclientIduuidrequiredclientNamestringrequiredprojectIduuidrequiredcan be nullprojectNamestringrequiredcan be nulljobIduuidrequiredcan be nullvisitNumberintegerrequiredcan be null-9007199254740991 to 9007199254740991
teamMemberIduuidrequiredcan be nullteamMemberNamestringrequiredcan be nullopenToTeamIdsarray of uuidrequiredopenToTeamMemberIdsarray of uuidrequiredopenNotifyAtstringrequiredcan be nullpriceobjectrequiredcan be nullpenceintegerrequiredcan be null-9007199254740991 to 9007199254740991
sourceenumrequiredOne of
"locked","override","list","none"lockedAtstringrequiredcan be nulllockReasonenumrequiredcan be nullOne of
"completed","signed_off","invoiced"invoiceRefstringoptionalcan be null
internalbooleanrequiredbackdatedAtstringrequiredcan be nulltemplateIduuidrequiredcan be nulltemplateNamestringrequiredcan be nullcustomFieldsobjectrequiredneedsClockInbooleanrequiredcan be nullclockInRequiredbooleanrequiredclockInMissedbooleanrequiredclockedInAtstringrequiredcan be nullclockedOutAtstringrequiredcan be nullclockInLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockOutLocationobjectrequiredcan be nulllatnumberrequired-90 to 90
lngnumberrequired-180 to 180
accuracyMetresnumberrequiredcan be null0 to 100000
clockInDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockOutDeviceobjectrequiredcan be nullidstringrequiredcan be nullosstringrequiredcan be nullipstringrequiredcan be null
clockInSetByNamestringrequiredcan be nullclockOutSetByNamestringrequiredcan be nullchecklistobjectrequiredcan be nulldoneintegerrequired-9007199254740991 to 9007199254740991
totalintegerrequired-9007199254740991 to 9007199254740991
mustDoLeftintegerrequired-9007199254740991 to 9007199254740991
curl "https://app.workscope.co.uk/v1/bookings/open-work" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"canPickUp": false,
"bookings": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"status": "draft",
"date": "2026-11-06",
"start": "09:00",
"end": "11:00",
"startsAt": "2026-11-06T09:30:00.000Z",
"endsAt": "2026-11-06T09:30:00.000Z",
"overnight": false,
"breakMinutes": 120,
"durationMinutes": 120,
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"notes": "Side gate code is on the key safe.",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
"projectName": "1 Harbour Road",
"jobId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"visitNumber": -9007199254740991,
"teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"teamMemberName": "Sam Hart",
"openToTeamIds": [
"b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
],
"openToTeamMemberIds": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"openNotifyAt": "2026-11-06T09:30:00.000Z",
"price": {
"pence": 4500,
"source": "locked",
"lockedAt": "2026-11-06T09:30:00.000Z",
"lockReason": "completed",
"invoiceRef": "text"
},
"internal": false,
"backdatedAt": "2026-11-06T09:30:00.000Z",
"templateId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"templateName": "Harbourside Dental",
"customFields": {
"contract-number": "CN-1042"
},
"needsClockIn": false,
"clockInRequired": false,
"clockInMissed": false,
"clockedInAt": "2026-11-06T09:30:00.000Z",
"clockedOutAt": "2026-11-06T09:30:00.000Z",
"clockInLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockOutLocation": {
"lat": 51.4545,
"lng": -2.5879,
"accuracyMetres": 0
},
"clockInDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockOutDevice": {
"id": "text",
"os": "text",
"ip": "text"
},
"clockInSetByName": "Harbourside Dental",
"clockOutSetByName": "Harbourside Dental",
"checklist": {
"done": -9007199254740991,
"total": -9007199254740991,
"mustDoLeft": -9007199254740991
}
}
]
}Put several repeat bookings' visits back to planned. confirm false: only say what would happen (and what can't, and why)
POST/v1/bookings/unbook
- Permission
booking.manage- Answers
200
Request body JSON
idsarray of uuidrequired1–500 items
confirmbooleanoptionalDefault
falsediscardExtrasbooleanoptionalDefault
false
Response object
unbookarray of objectrequirediduuidrequireddatedaterequiredcan be nullYYYY-MM-DD
namestringrequired
refusedarray of objectrequirediduuidrequireddatedaterequiredcan be nullYYYY-MM-DD
namestringrequiredreasonstringrequired
extrasobjectrequirednotesintegerrequired-9007199254740991 to 9007199254740991
photosintegerrequired-9007199254740991 to 9007199254740991
documentsintegerrequired-9007199254740991 to 9007199254740991
donebooleanrequired
curl -X POST "https://app.workscope.co.uk/v1/bookings/unbook" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
],
"confirm": false,
"discardExtras": false
}'Example response
{
"unbook": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"date": "2026-11-06",
"name": "Harbourside Dental"
}
],
"refused": [
{
"id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"date": "2026-11-06",
"name": "Harbourside Dental",
"reason": "text"
}
],
"extras": {
"notes": -9007199254740991,
"photos": -9007199254740991,
"documents": -9007199254740991
},
"done": false
}