WorkscopeAPI Open Workscope

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

NameInKind
fromquerydate
toquerydate
teamMemberIdqueryuuid
statusqueryenumOne of draft, open, active, complete, signed_off, failed
jobIdqueryuuid
clientIdqueryuuid
projectIdqueryuuid
clientLevelqueryenumOne of true, false

Response array of object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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 null
  • clientIduuidoptionalcan be null
  • teamMemberIduuidoptionalcan be null
  • namestringrequired

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 5000 characters

  • notesstringoptionalcan be null

    Up to 5000 characters

  • datedateoptionalcan be null

    YYYY-MM-DD

  • starttimeoptionalcan be null

    HH:MM, 24-hour

  • endtimeoptionalcan be null

    HH:MM, 24-hour

  • breakMinutesintegeroptionalcan be null

    0 to 1440

  • durationMinutesintegeroptionalcan be null

    0 to 10080

  • openToTeamIdsarray of uuidoptional

    Up to 100 items · Default []

  • openToTeamMemberIdsarray of uuidoptional

    Up to 500 items · Default []

  • priceOverridePenceintegeroptionalcan be null

    0 to 100000000

  • templateIduuidoptionalcan be null
  • customFieldsobjectoptional
  • needsClockInbooleanoptionalcan be null
  • checklistarray of objectoptional

    Up to 50 items

    • iduuidoptional
    • labelstringrequired

      1–200 characters

    • instructionstringoptionalcan be null

      Up to 1000 characters

    • kindenumoptional

      One of "tick", "text", "textarea", "number", "date", "time", "checkbox", "select", "photo" · Default "tick"

    • unitstringoptionalcan be null

      Up to 20 characters

    • optionsarray of stringoptional

      Up to 30 items · Default []

    • askCommentbooleanoptional

      Default false

    • requiredbooleanoptional

      Default false

    • visibleToClientsbooleanoptional

      Default false

  • statusenumoptional

    One of "draft", "open", "active" · Default "active"

  • fromQuoteobjectoptional
    • quoteIduuidrequired
    • lineIduuidrequired
  • forDealuuidoptional

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Request body JSON

  • projectIduuidoptionalcan be null
  • clientIduuidoptionalcan be null
  • teamMemberIduuidoptionalcan be null
  • namestringoptional

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 5000 characters

  • notesstringoptionalcan be null

    Up to 5000 characters

  • datedateoptionalcan be null

    YYYY-MM-DD

  • starttimeoptionalcan be null

    HH:MM, 24-hour

  • endtimeoptionalcan be null

    HH:MM, 24-hour

  • breakMinutesintegeroptionalcan be null

    0 to 1440

  • durationMinutesintegeroptionalcan be null

    0 to 10080

  • openToTeamIdsarray of uuidoptional

    Up to 100 items

  • openToTeamMemberIdsarray of uuidoptional

    Up to 500 items

  • priceOverridePenceintegeroptionalcan be null

    0 to 100000000

  • templateIduuidoptionalcan be null
  • customFieldsobjectoptional
  • needsClockInbooleanoptionalcan be null
  • checklistarray of objectoptional

    Up to 50 items

    • iduuidoptional
    • labelstringrequired

      1–200 characters

    • instructionstringoptionalcan be null

      Up to 1000 characters

    • kindenumoptional

      One of "tick", "text", "textarea", "number", "date", "time", "checkbox", "select", "photo" · Default "tick"

    • unitstringoptionalcan be null

      Up to 20 characters

    • optionsarray of stringoptional

      Up to 30 items · Default []

    • askCommentbooleanoptional

      Default false

    • requiredbooleanoptional

      Default false

    • visibleToClientsbooleanoptional

      Default false

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Response object

  • okconstantrequired

    Always 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

NameInKind
idpathuuidrequired

Response object

  • bookingIduuidrequired
  • itemsarray of objectrequired
    • iduuidrequired
    • labelstringrequired
    • instructionstringrequiredcan be null
    • kindenumrequired

      One of "tick", "text", "textarea", "number", "date", "time", "checkbox", "select", "photo"

    • unitstringrequiredcan be null
    • optionsarray of stringrequired
    • askCommentbooleanrequired
    • requiredbooleanrequired
    • visibleToClientsbooleanrequired
    • donebooleanrequired
    • valuestring or number or booleanrequiredcan be null
    • valueTextstringrequiredcan be null
    • commentstringrequiredcan be null
    • photoIduuidrequiredcan be null
    • photoThumbUrlstringrequiredcan be null
    • photoFullUrlstringrequiredcan be null
    • doneAtstringrequiredcan be null
    • doneByNamestringrequiredcan be null
  • summaryobjectrequired
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired
itemIdpathuuidrequired

Request body JSON

  • donebooleanrequired
  • valuestring or number or booleanoptionalcan be null
  • commentstringoptionalcan be null

    Up to 2000 characters

  • photoIduuidoptionalcan be null

Response object

  • bookingIduuidrequired
  • itemsarray of objectrequired
    • iduuidrequired
    • labelstringrequired
    • instructionstringrequiredcan be null
    • kindenumrequired

      One of "tick", "text", "textarea", "number", "date", "time", "checkbox", "select", "photo"

    • unitstringrequiredcan be null
    • optionsarray of stringrequired
    • askCommentbooleanrequired
    • requiredbooleanrequired
    • visibleToClientsbooleanrequired
    • donebooleanrequired
    • valuestring or number or booleanrequiredcan be null
    • valueTextstringrequiredcan be null
    • commentstringrequiredcan be null
    • photoIduuidrequiredcan be null
    • photoThumbUrlstringrequiredcan be null
    • photoFullUrlstringrequiredcan be null
    • doneAtstringrequiredcan be null
    • doneByNamestringrequiredcan be null
  • summaryobjectrequired
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Request body JSON

  • clockedInAtdate-timerequiredcan be null

    Matches ^(?:(?:\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 null

    Matches ^(?:(?:\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)))$

  • reasonstringrequired

    1–500 characters

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Response object

  • historyarray of objectrequired
    • iduuidrequired
    • fromenumrequiredcan be null

      One of "draft", "open", "active", "complete", "signed_off", "failed"

    • toenumrequired

      One of "draft", "open", "active", "complete", "signed_off", "failed"

    • reasonstringrequiredcan be null
    • byNamestringrequiredcan be null
    • atstringrequired
  • eventsarray of objectrequired
    • iduuidrequired
    • kindstringrequired
    • textstringrequired
    • byNamestringrequiredcan be null
    • atstringrequired
  • clockChangesarray of objectrequired
    • iduuidrequired
    • oldClockedInAtstringrequiredcan be null
    • newClockedInAtstringrequiredcan be null
    • oldClockedOutAtstringrequiredcan be null
    • newClockedOutAtstringrequiredcan be null
    • reasonstringrequired
    • byNamestringrequiredcan be null
    • atstringrequired
  • notesarray of objectrequired
    • iduuidrequired
    • bodystringrequired
    • visibleToTeambooleanrequired
    • visibleToClientsbooleanrequired
    • authorNamestringrequiredcan be null
    • authorRoleenumrequired

      One of "owner", "admin", "operative", "client"

    • minebooleanrequired
    • createdAtstringrequired
  • photosarray of objectrequired
    • iduuidrequired
    • widthintegerrequired

      -9007199254740991 to 9007199254740991

    • heightintegerrequired

      -9007199254740991 to 9007199254740991

    • bytesintegerrequired

      -9007199254740991 to 9007199254740991

    • captionstringrequiredcan be null
    • visibleToTeambooleanrequired
    • visibleToClientsbooleanrequired
    • uploadedByNamestringrequiredcan be null
    • createdAtstringrequired
    • thumbUrlstringrequired
    • fullUrlstringrequired
  • 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

NameInKind
idpathuuidrequired

Request body JSON

  • bodystringrequired

    1–5000 characters

  • visibleToTeambooleanoptional

    Default true

  • visibleToClientsbooleanoptional

    Default false

Response object

  • iduuidrequired
  • bodystringrequired
  • visibleToTeambooleanrequired
  • visibleToClientsbooleanrequired
  • authorNamestringrequiredcan be null
  • authorRoleenumrequired

    One of "owner", "admin", "operative", "client"

  • minebooleanrequired
  • createdAtstringrequired
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

NameInKind
idpathuuidrequired
noteIdpathuuidrequired

Response object

  • okconstantrequired

    Always 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

NameInKind
idpathuuidrequired

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

  • iduuidrequired
  • widthintegerrequired

    -9007199254740991 to 9007199254740991

  • heightintegerrequired

    -9007199254740991 to 9007199254740991

  • bytesintegerrequired

    -9007199254740991 to 9007199254740991

  • captionstringrequiredcan be null
  • visibleToTeambooleanrequired
  • visibleToClientsbooleanrequired
  • uploadedByNamestringrequiredcan be null
  • createdAtstringrequired
  • thumbUrlstringrequired
  • fullUrlstringrequired
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.jpg

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"
}

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

NameInKind
idpathuuidrequired
photoIdpathuuidrequired

Request body JSON

  • captionstringoptionalcan be null

    Up to 500 characters

  • visibleToTeambooleanoptional
  • visibleToClientsbooleanoptional

Response object

  • iduuidrequired
  • widthintegerrequired

    -9007199254740991 to 9007199254740991

  • heightintegerrequired

    -9007199254740991 to 9007199254740991

  • bytesintegerrequired

    -9007199254740991 to 9007199254740991

  • captionstringrequiredcan be null
  • visibleToTeambooleanrequired
  • visibleToClientsbooleanrequired
  • uploadedByNamestringrequiredcan be null
  • createdAtstringrequired
  • thumbUrlstringrequired
  • fullUrlstringrequired
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

NameInKind
idpathuuidrequired
photoIdpathuuidrequired

Response object

  • okconstantrequired

    Always 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
200 with a file (image/jpeg)

Parameters

NameInKind
idpathuuidrequired
photoIdpathuuidrequired
sizepathenumrequiredOne 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

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Request body JSON

  • pricePenceintegerrequiredcan be null

    0 to 100000000

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Response object

  • bookingIduuidrequired
  • addressstringrequiredcan be null
  • addressFromenumrequiredcan be null

    One of "project", "client"

  • mapsUrlstringrequiredcan be null
  • clientobjectrequired
    • iduuidrequired
    • namestringrequired
    • addressstringrequiredcan be null
    • phonestringrequiredcan be null
    • emailstringrequiredcan be null
    • websitestringrequiredcan be null
    • notesstringrequiredcan be null
    • fieldsarray of objectrequired
      • slugstringrequired
      • labelstringrequired
      • typeenumrequired

        One of "text", "textarea", "number", "date", "checkbox", "select", "address"

      • valuestring or number or booleanrequired
      • textstringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • fieldsarray of objectrequired
      • slugstringrequired
      • labelstringrequired
      • typeenumrequired

        One of "text", "textarea", "number", "date", "checkbox", "select", "address"

      • valuestring or number or booleanrequired
      • textstringrequired
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

NameInKind
idpathuuidrequired

Request body JSON

  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • reasonstringoptionalcan be null

    Up to 500 characters

  • completeAnywaybooleanoptional

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

NameInKind
idpathuuidrequired

Request body JSON

  • discardExtrasbooleanoptional

    Default false

Response object

  • unbookarray of objectrequired
    • iduuidrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

    • namestringrequired
  • refusedarray of objectrequired
    • iduuidrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

    • namestringrequired
    • reasonstringrequired
  • extrasobjectrequired
    • notesintegerrequired

      -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

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • statusenumrequired

    One of "draft", "open", "active", "complete", "signed_off", "failed"

  • datedaterequiredcan be null

    YYYY-MM-DD

  • starttimerequiredcan be null

    HH:MM, 24-hour

  • endtimerequiredcan be null

    HH:MM, 24-hour

  • startsAtstringrequiredcan be null
  • endsAtstringrequiredcan be null
  • overnightbooleanrequired
  • breakMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • durationMinutesintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • namestringrequired
  • descriptionstringrequiredcan be null
  • notesstringrequiredcan be null
  • clientIduuidrequired
  • clientNamestringrequired
  • projectIduuidrequiredcan be null
  • projectNamestringrequiredcan be null
  • jobIduuidrequiredcan be null
  • visitNumberintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • teamMemberIduuidrequiredcan be null
  • teamMemberNamestringrequiredcan be null
  • openToTeamIdsarray of uuidrequired
  • openToTeamMemberIdsarray of uuidrequired
  • openNotifyAtstringrequiredcan be null
  • priceobjectrequiredcan be null
    • penceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • sourceenumrequired

      One of "locked", "override", "list", "none"

    • lockedAtstringrequiredcan be null
    • lockReasonenumrequiredcan be null

      One of "completed", "signed_off", "invoiced"

    • invoiceRefstringoptionalcan be null
  • internalbooleanrequired
  • backdatedAtstringrequiredcan be null
  • templateIduuidrequiredcan be null
  • templateNamestringrequiredcan be null
  • customFieldsobjectrequired
  • needsClockInbooleanrequiredcan be null
  • clockInRequiredbooleanrequired
  • clockInMissedbooleanrequired
  • clockedInAtstringrequiredcan be null
  • clockedOutAtstringrequiredcan be null
  • clockInLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockOutLocationobjectrequiredcan be null
    • latnumberrequired

      -90 to 90

    • lngnumberrequired

      -180 to 180

    • accuracyMetresnumberrequiredcan be null

      0 to 100000

  • clockInDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockOutDeviceobjectrequiredcan be null
    • idstringrequiredcan be null
    • osstringrequiredcan be null
    • ipstringrequiredcan be null
  • clockInSetByNamestringrequiredcan be null
  • clockOutSetByNamestringrequiredcan be null
  • checklistobjectrequiredcan be null
    • doneintegerrequired

      -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

  • canPickUpbooleanrequired
  • bookingsarray of objectrequired
    • iduuidrequired
    • statusenumrequired

      One of "draft", "open", "active", "complete", "signed_off", "failed"

    • datedaterequiredcan be null

      YYYY-MM-DD

    • starttimerequiredcan be null

      HH:MM, 24-hour

    • endtimerequiredcan be null

      HH:MM, 24-hour

    • startsAtstringrequiredcan be null
    • endsAtstringrequiredcan be null
    • overnightbooleanrequired
    • breakMinutesintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • durationMinutesintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • namestringrequired
    • descriptionstringrequiredcan be null
    • notesstringrequiredcan be null
    • clientIduuidrequired
    • clientNamestringrequired
    • projectIduuidrequiredcan be null
    • projectNamestringrequiredcan be null
    • jobIduuidrequiredcan be null
    • visitNumberintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • teamMemberIduuidrequiredcan be null
    • teamMemberNamestringrequiredcan be null
    • openToTeamIdsarray of uuidrequired
    • openToTeamMemberIdsarray of uuidrequired
    • openNotifyAtstringrequiredcan be null
    • priceobjectrequiredcan be null
      • penceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • sourceenumrequired

        One of "locked", "override", "list", "none"

      • lockedAtstringrequiredcan be null
      • lockReasonenumrequiredcan be null

        One of "completed", "signed_off", "invoiced"

      • invoiceRefstringoptionalcan be null
    • internalbooleanrequired
    • backdatedAtstringrequiredcan be null
    • templateIduuidrequiredcan be null
    • templateNamestringrequiredcan be null
    • customFieldsobjectrequired
    • needsClockInbooleanrequiredcan be null
    • clockInRequiredbooleanrequired
    • clockInMissedbooleanrequired
    • clockedInAtstringrequiredcan be null
    • clockedOutAtstringrequiredcan be null
    • clockInLocationobjectrequiredcan be null
      • latnumberrequired

        -90 to 90

      • lngnumberrequired

        -180 to 180

      • accuracyMetresnumberrequiredcan be null

        0 to 100000

    • clockOutLocationobjectrequiredcan be null
      • latnumberrequired

        -90 to 90

      • lngnumberrequired

        -180 to 180

      • accuracyMetresnumberrequiredcan be null

        0 to 100000

    • clockInDeviceobjectrequiredcan be null
      • idstringrequiredcan be null
      • osstringrequiredcan be null
      • ipstringrequiredcan be null
    • clockOutDeviceobjectrequiredcan be null
      • idstringrequiredcan be null
      • osstringrequiredcan be null
      • ipstringrequiredcan be null
    • clockInSetByNamestringrequiredcan be null
    • clockOutSetByNamestringrequiredcan be null
    • checklistobjectrequiredcan be null
      • doneintegerrequired

        -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 uuidrequired

    1–500 items

  • confirmbooleanoptional

    Default false

  • discardExtrasbooleanoptional

    Default false

Response object

  • unbookarray of objectrequired
    • iduuidrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

    • namestringrequired
  • refusedarray of objectrequired
    • iduuidrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

    • namestringrequired
    • reasonstringrequired
  • extrasobjectrequired
    • notesintegerrequired

      -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
}