WorkscopeAPI Open Workscope

API reference

Schedule

10 requests. Each shows the permission a key needs, what to send and what comes back.

On this page

Bookings and planned visits between two dates

GET/v1/schedule

Permission
booking.viewAll or booking.viewOwn
Answers
200

Parameters

NameInKind
fromquerydaterequired
toquerydaterequired
teamMemberIdqueryuuid
workqueryenumOne of all, clients, internal · Default "all"

Response object

  • 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

  • plannedarray of objectrequired
    • jobIduuidrequired
    • unbookedobjectrequiredcan be null
      • atstringrequired
      • byNamestringrequiredcan be null
      • fromStatusenumrequired

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

    • visitNumberintegerrequired

      -9007199254740991 to 9007199254740991

    • datedaterequired

      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
    • clientIduuidrequired
    • clientNamestringrequired
    • projectIduuidrequiredcan be null
    • projectNamestringrequiredcan be null
    • teamMemberIduuidrequiredcan be null
    • pricePenceintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • internalbooleanrequired
    • templateIduuidrequiredcan be null
    • customFieldsobjectrequired
  • unavailablearray of objectrequired
    • teamMemberIduuidrequired
    • fromstringrequired
    • tostringrequired
    • reasonstringrequired
curl "https://app.workscope.co.uk/v1/schedule?from=2026-11-06&to=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "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
      }
    }
  ],
  "planned": [
    {
      "jobId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "unbooked": {
        "at": "2026-11-06T09:30:00.000Z",
        "byName": "Harbourside Dental",
        "fromStatus": "draft"
      },
      "visitNumber": -9007199254740991,
      "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",
      "clientId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "clientName": "Harbourside Dental",
      "projectId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "projectName": "1 Harbour Road",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "pricePence": 4500,
      "internal": false,
      "templateId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "customFields": {
        "contract-number": "CN-1042"
      }
    }
  ],
  "unavailable": [
    {
      "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "from": "2026-11-06",
      "to": "2026-11-06",
      "reason": "text"
    }
  ]
}

The company's saved schedule filters (and which is the caller's default)

GET/v1/schedule-filters

Permission
scheduleFilter.manage
Answers
200

Response array of object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • criteriaobjectrequired
    • teamMemberIdsarray of uuidrequired

      Up to 500 items · Default []

    • teamIdsarray of uuidrequired

      Up to 100 items · Default []

    • clientIdsarray of uuidrequired

      Up to 500 items · Default []

    • projectIdsarray of uuidrequired

      Up to 500 items · Default []

    • templateIdsarray of uuidrequired

      Up to 100 items · Default []

    • statusesarray of enumrequired

      Up to 6 items · Default []

    • workenumrequired

      One of "all", "clients", "internal" · Default "all"

  • showOthersbooleanrequired
  • isDefaultbooleanrequired
  • createdByNamestringrequiredcan be null
curl "https://app.workscope.co.uk/v1/schedule-filters" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental",
    "description": "Side gate code is on the key safe.",
    "criteria": {
      "teamMemberIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "teamIds": [
        "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
      ],
      "clientIds": [
        "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
      ],
      "projectIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "templateIds": [
        "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
      ],
      "statuses": [
        "draft"
      ],
      "work": "all"
    },
    "showOthers": false,
    "isDefault": false,
    "createdByName": "Harbourside Dental"
  }
]

Save a schedule filter

POST/v1/schedule-filters

Permission
scheduleFilter.manage
Answers
201

Request body JSON

  • namestringrequired

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 500 characters

  • criteriaobjectrequired
    • teamMemberIdsarray of uuidoptional

      Up to 500 items · Default []

    • teamIdsarray of uuidoptional

      Up to 100 items · Default []

    • clientIdsarray of uuidoptional

      Up to 500 items · Default []

    • projectIdsarray of uuidoptional

      Up to 500 items · Default []

    • templateIdsarray of uuidoptional

      Up to 100 items · Default []

    • statusesarray of enumoptional

      Up to 6 items · Default []

    • workenumoptional

      One of "all", "clients", "internal" · Default "all"

  • showOthersbooleanoptional

    Default false

Response object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • criteriaobjectrequired
    • teamMemberIdsarray of uuidrequired

      Up to 500 items · Default []

    • teamIdsarray of uuidrequired

      Up to 100 items · Default []

    • clientIdsarray of uuidrequired

      Up to 500 items · Default []

    • projectIdsarray of uuidrequired

      Up to 500 items · Default []

    • templateIdsarray of uuidrequired

      Up to 100 items · Default []

    • statusesarray of enumrequired

      Up to 6 items · Default []

    • workenumrequired

      One of "all", "clients", "internal" · Default "all"

  • showOthersbooleanrequired
  • isDefaultbooleanrequired
  • createdByNamestringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/schedule-filters" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "description": "Side gate code is on the key safe.",
    "criteria": {
      "teamMemberIds": [
        "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
      ],
      "teamIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "clientIds": [
        "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
      ],
      "projectIds": [
        "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
      ],
      "templateIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "statuses": [
        "draft"
      ],
      "work": "all"
    },
    "showOthers": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "description": "Side gate code is on the key safe.",
  "criteria": {
    "teamMemberIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ],
    "teamIds": [
      "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
    ],
    "clientIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ],
    "projectIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ],
    "templateIds": [
      "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
    ],
    "statuses": [
      "draft"
    ],
    "work": "all"
  },
  "showOthers": false,
  "isDefault": false,
  "createdByName": "Harbourside Dental"
}

Change a saved schedule filter

PATCH/v1/schedule-filters/{id}

Permission
scheduleFilter.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • namestringoptional

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 500 characters

  • criteriaobjectoptional
    • teamMemberIdsarray of uuidoptional

      Up to 500 items · Default []

    • teamIdsarray of uuidoptional

      Up to 100 items · Default []

    • clientIdsarray of uuidoptional

      Up to 500 items · Default []

    • projectIdsarray of uuidoptional

      Up to 500 items · Default []

    • templateIdsarray of uuidoptional

      Up to 100 items · Default []

    • statusesarray of enumoptional

      Up to 6 items · Default []

    • workenumoptional

      One of "all", "clients", "internal" · Default "all"

  • showOthersbooleanoptional

Response object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • criteriaobjectrequired
    • teamMemberIdsarray of uuidrequired

      Up to 500 items · Default []

    • teamIdsarray of uuidrequired

      Up to 100 items · Default []

    • clientIdsarray of uuidrequired

      Up to 500 items · Default []

    • projectIdsarray of uuidrequired

      Up to 500 items · Default []

    • templateIdsarray of uuidrequired

      Up to 100 items · Default []

    • statusesarray of enumrequired

      Up to 6 items · Default []

    • workenumrequired

      One of "all", "clients", "internal" · Default "all"

  • showOthersbooleanrequired
  • isDefaultbooleanrequired
  • createdByNamestringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/schedule-filters/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "description": "Side gate code is on the key safe.",
    "criteria": {
      "teamMemberIds": [
        "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
      ],
      "teamIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "clientIds": [
        "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
      ],
      "projectIds": [
        "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
      ],
      "templateIds": [
        "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
      ],
      "statuses": [
        "draft"
      ],
      "work": "all"
    },
    "showOthers": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "description": "Side gate code is on the key safe.",
  "criteria": {
    "teamMemberIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ],
    "teamIds": [
      "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
    ],
    "clientIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ],
    "projectIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ],
    "templateIds": [
      "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918"
    ],
    "statuses": [
      "draft"
    ],
    "work": "all"
  },
  "showOthers": false,
  "isDefault": false,
  "createdByName": "Harbourside Dental"
}

Delete a saved schedule filter

DELETE/v1/schedule-filters/{id}

Permission
scheduleFilter.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • okconstantrequired

    Always true

curl -X DELETE "https://app.workscope.co.uk/v1/schedule-filters/ID" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "ok": true
}

Choose the filter the schedule opens with for me (null: none)

PUT/v1/schedule-filters/default

Permission
scheduleFilter.manage
Answers
200

Request body JSON

  • filterIduuidrequiredcan be null

Response object

  • okconstantrequired

    Always true

curl -X PUT "https://app.workscope.co.uk/v1/schedule-filters/default" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "filterId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
  }'

Example response

{
  "ok": true
}

Travel time and miles between two dates

GET/v1/travel-time

Permission
travel.view
Answers
200

Parameters

NameInKind
fromquerydaterequired
toquerydaterequired
teamMemberIdqueryuuid

Response array of object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • datedaterequired

    YYYY-MM-DD

  • minutesintegerrequired

    -9007199254740991 to 9007199254740991

  • milesnumberrequired
  • createdAtstringrequired
curl "https://app.workscope.co.uk/v1/travel-time?from=2026-11-06&to=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "teamMemberName": "Sam Hart",
    "date": "2026-11-06",
    "minutes": 120,
    "miles": 1,
    "createdAt": "2026-11-06T09:30:00.000Z"
  }
]

Add travel time or miles for a person on a day

POST/v1/travel-time

Permission
travel.manage
Answers
201

Request body JSON

  • teamMemberIduuidrequired
  • datedaterequired

    YYYY-MM-DD

  • minutesintegeroptional

    0 to 1440 · Default 0

  • milesnumberoptional

    0 to 10000 · Default 0

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • datedaterequired

    YYYY-MM-DD

  • minutesintegerrequired

    -9007199254740991 to 9007199254740991

  • milesnumberrequired
  • createdAtstringrequired
curl -X POST "https://app.workscope.co.uk/v1/travel-time" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "date": "2026-11-06",
    "minutes": 0,
    "miles": 0
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "date": "2026-11-06",
  "minutes": 120,
  "miles": 1,
  "createdAt": "2026-11-06T09:30:00.000Z"
}

Change a travel time entry

PATCH/v1/travel-time/{id}

Permission
travel.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • teamMemberIduuidoptional
  • datedateoptional

    YYYY-MM-DD

  • minutesintegeroptional

    0 to 1440

  • milesnumberoptional

    0 to 10000

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • datedaterequired

    YYYY-MM-DD

  • minutesintegerrequired

    -9007199254740991 to 9007199254740991

  • milesnumberrequired
  • createdAtstringrequired
curl -X PATCH "https://app.workscope.co.uk/v1/travel-time/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "date": "2026-11-06",
    "minutes": 120,
    "miles": 0
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "date": "2026-11-06",
  "minutes": 120,
  "miles": 1,
  "createdAt": "2026-11-06T09:30:00.000Z"
}

Delete a travel time entry

DELETE/v1/travel-time/{id}

Permission
travel.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • okconstantrequired

    Always true

curl -X DELETE "https://app.workscope.co.uk/v1/travel-time/ID" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "ok": true
}