WorkscopeAPI Open Workscope

API reference

Team

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

On this page

My own team member record (the app)

GET/v1/me/team-member

Permission
team.self
Answers
200

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • addressstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • customFieldsobjectrequired
curl "https://app.workscope.co.uk/v1/me/team-member" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "address": "1 Harbour Road, Bristol",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "customFields": {
    "contract-number": "CN-1042"
  }
}

Change my own contact details: name, phone, address, job title (the app)

PATCH/v1/me/team-member

Permission
team.self
Answers
200

Request body JSON

  • namestringoptional

    1–200 characters

  • surnamestringoptionalcan be null

    Up to 200 characters

  • phonestringoptionalcan be null

    Up to 50 characters

  • addressstringoptionalcan be null

    Up to 500 characters

  • jobTitlestringoptionalcan be null

    Up to 200 characters

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • addressstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • customFieldsobjectrequired
curl -X PATCH "https://app.workscope.co.uk/v1/me/team-member" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "surname": "Harbourside Dental",
    "phone": "0117 496 0123",
    "address": "1 Harbour Road, Bristol",
    "jobTitle": "text"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "address": "1 Harbour Road, Bristol",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "customFields": {
    "contract-number": "CN-1042"
  }
}

Team members

GET/v1/team-members

Permission
team.view
Answers
200

Parameters

NameInKind
statusqueryenumOne of active, archived, all · Default "active"
qquerystring
accessqueryenumOne of login, invited, none

Response array of object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • notesstringrequiredcan be null
  • employmentStartDatedaterequiredcan be null

    YYYY-MM-DD

  • employmentEndDatedaterequiredcan be null

    YYYY-MM-DD

  • addressstringrequiredcan be null
  • dateOfBirthdaterequiredcan be null

    YYYY-MM-DD

  • niNumberMaskedstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • hasLoginbooleanrequired
  • accessobjectrequired
    • stateenumrequired

      One of "login", "invited", "none"

    • lastSeenAtstringrequiredcan be null
    • invitationIduuidrequiredcan be null
    • invitedAtstringrequiredcan be null
  • archivedbooleanrequired
  • customFieldsobjectrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • accrualRatePercentnumberrequiredcan be null
  • salariedAllowanceDaysnumberrequiredcan be null
  • workingWeekdaysarray of integerrequired
  • minutesPerDayintegerrequired

    -9007199254740991 to 9007199254740991

  • breaksPaidbooleanrequired
  • hoursFromenumrequired

    One of "bookings", "timesheets"

  • inPayrollbooleanrequired
  • onTrialbooleanrequired
  • emergencyContactobjectrequiredcan be null
    • namestringrequired
    • relationshipstringrequiredcan be null
    • phonestringrequired
  • bankMaskedstringrequiredcan be null
curl "https://app.workscope.co.uk/v1/team-members" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental",
    "surname": "Harbourside Dental",
    "email": "office@example.co.uk",
    "phone": "0117 496 0123",
    "jobTitle": "text",
    "notes": "Side gate code is on the key safe.",
    "employmentStartDate": "2026-11-06",
    "employmentEndDate": "2026-11-06",
    "address": "1 Harbour Road, Bristol",
    "dateOfBirth": "2026-11-06",
    "niNumberMasked": "text",
    "photoUrl": "https://example.co.uk",
    "teamIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ],
    "hasLogin": false,
    "access": {
      "state": "login",
      "lastSeenAt": "2026-11-06T09:30:00.000Z",
      "invitationId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "invitedAt": "2026-11-06T09:30:00.000Z"
    },
    "archived": false,
    "customFields": {
      "contract-number": "CN-1042"
    },
    "payBasis": "hourly",
    "accrualRatePercent": 1,
    "salariedAllowanceDays": 1,
    "workingWeekdays": [
      0
    ],
    "minutesPerDay": -9007199254740991,
    "breaksPaid": false,
    "hoursFrom": "bookings",
    "inPayroll": false,
    "onTrial": false,
    "emergencyContact": {
      "name": "Harbourside Dental",
      "relationship": "text",
      "phone": "0117 496 0123"
    },
    "bankMasked": "text"
  }
]

Add a team member

POST/v1/team-members

Permission
team.manage
Answers
201

Request body JSON

  • namestringrequired

    1–200 characters

  • surnamestringoptionalcan be null

    Up to 200 characters

  • emailconstant or stringoptionalcan be null
  • phonestringoptionalcan be null

    Up to 50 characters

  • jobTitlestringoptionalcan be null

    Up to 200 characters

  • notesstringoptionalcan be null

    Up to 5000 characters

  • employmentStartDatedateoptionalcan be null

    YYYY-MM-DD

  • employmentEndDatedateoptionalcan be null

    YYYY-MM-DD

  • addressstringoptionalcan be null

    Up to 500 characters

  • dateOfBirthdateoptionalcan be null

    YYYY-MM-DD

  • niNumberstringoptionalcan be null

    Up to 20 characters

  • teamIdsarray of uuidoptional

    Up to 100 items · Default []

  • customFieldsobjectoptional
  • payBasisenumoptional

    One of "hourly", "salaried"

  • accrualRatePercentnumberoptionalcan be null

    0 to 50

  • salariedAllowanceDaysnumberoptionalcan be null

    0 to 366

  • workingWeekdaysarray of integeroptional

    Up to 7 items

  • minutesPerDayintegeroptional

    15 to 1440

  • breaksPaidbooleanoptional
  • inPayrollbooleanoptional
  • hoursFromenumoptional

    One of "bookings", "timesheets"

  • hoursFromStartsOndateoptional

    YYYY-MM-DD

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • notesstringrequiredcan be null
  • employmentStartDatedaterequiredcan be null

    YYYY-MM-DD

  • employmentEndDatedaterequiredcan be null

    YYYY-MM-DD

  • addressstringrequiredcan be null
  • dateOfBirthdaterequiredcan be null

    YYYY-MM-DD

  • niNumberMaskedstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • hasLoginbooleanrequired
  • accessobjectrequired
    • stateenumrequired

      One of "login", "invited", "none"

    • lastSeenAtstringrequiredcan be null
    • invitationIduuidrequiredcan be null
    • invitedAtstringrequiredcan be null
  • archivedbooleanrequired
  • customFieldsobjectrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • accrualRatePercentnumberrequiredcan be null
  • salariedAllowanceDaysnumberrequiredcan be null
  • workingWeekdaysarray of integerrequired
  • minutesPerDayintegerrequired

    -9007199254740991 to 9007199254740991

  • breaksPaidbooleanrequired
  • hoursFromenumrequired

    One of "bookings", "timesheets"

  • inPayrollbooleanrequired
  • onTrialbooleanrequired
  • emergencyContactobjectrequiredcan be null
    • namestringrequired
    • relationshipstringrequiredcan be null
    • phonestringrequired
  • bankMaskedstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/team-members" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "surname": "Harbourside Dental",
    "email": "",
    "phone": "0117 496 0123",
    "jobTitle": "text",
    "notes": "Side gate code is on the key safe.",
    "employmentStartDate": "2026-11-06",
    "employmentEndDate": "2026-11-06",
    "address": "1 Harbour Road, Bristol",
    "dateOfBirth": "2026-11-06",
    "niNumber": "text",
    "teamIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ],
    "customFields": {
      "contract-number": "CN-1042"
    },
    "payBasis": "hourly",
    "accrualRatePercent": 0,
    "salariedAllowanceDays": 0,
    "workingWeekdays": [
      0
    ],
    "minutesPerDay": 15,
    "breaksPaid": false,
    "inPayroll": false,
    "hoursFrom": "bookings",
    "hoursFromStartsOn": "2026-11-06"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "notes": "Side gate code is on the key safe.",
  "employmentStartDate": "2026-11-06",
  "employmentEndDate": "2026-11-06",
  "address": "1 Harbour Road, Bristol",
  "dateOfBirth": "2026-11-06",
  "niNumberMasked": "text",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "hasLogin": false,
  "access": {
    "state": "login",
    "lastSeenAt": "2026-11-06T09:30:00.000Z",
    "invitationId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "invitedAt": "2026-11-06T09:30:00.000Z"
  },
  "archived": false,
  "customFields": {
    "contract-number": "CN-1042"
  },
  "payBasis": "hourly",
  "accrualRatePercent": 1,
  "salariedAllowanceDays": 1,
  "workingWeekdays": [
    0
  ],
  "minutesPerDay": -9007199254740991,
  "breaksPaid": false,
  "hoursFrom": "bookings",
  "inPayroll": false,
  "onTrial": false,
  "emergencyContact": {
    "name": "Harbourside Dental",
    "relationship": "text",
    "phone": "0117 496 0123"
  },
  "bankMasked": "text"
}

One team member

GET/v1/team-members/{id}

Permission
team.view
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • notesstringrequiredcan be null
  • employmentStartDatedaterequiredcan be null

    YYYY-MM-DD

  • employmentEndDatedaterequiredcan be null

    YYYY-MM-DD

  • addressstringrequiredcan be null
  • dateOfBirthdaterequiredcan be null

    YYYY-MM-DD

  • niNumberMaskedstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • hasLoginbooleanrequired
  • accessobjectrequired
    • stateenumrequired

      One of "login", "invited", "none"

    • lastSeenAtstringrequiredcan be null
    • invitationIduuidrequiredcan be null
    • invitedAtstringrequiredcan be null
  • archivedbooleanrequired
  • customFieldsobjectrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • accrualRatePercentnumberrequiredcan be null
  • salariedAllowanceDaysnumberrequiredcan be null
  • workingWeekdaysarray of integerrequired
  • minutesPerDayintegerrequired

    -9007199254740991 to 9007199254740991

  • breaksPaidbooleanrequired
  • hoursFromenumrequired

    One of "bookings", "timesheets"

  • inPayrollbooleanrequired
  • onTrialbooleanrequired
  • emergencyContactobjectrequiredcan be null
    • namestringrequired
    • relationshipstringrequiredcan be null
    • phonestringrequired
  • bankMaskedstringrequiredcan be null
curl "https://app.workscope.co.uk/v1/team-members/ID" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "notes": "Side gate code is on the key safe.",
  "employmentStartDate": "2026-11-06",
  "employmentEndDate": "2026-11-06",
  "address": "1 Harbour Road, Bristol",
  "dateOfBirth": "2026-11-06",
  "niNumberMasked": "text",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "hasLogin": false,
  "access": {
    "state": "login",
    "lastSeenAt": "2026-11-06T09:30:00.000Z",
    "invitationId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "invitedAt": "2026-11-06T09:30:00.000Z"
  },
  "archived": false,
  "customFields": {
    "contract-number": "CN-1042"
  },
  "payBasis": "hourly",
  "accrualRatePercent": 1,
  "salariedAllowanceDays": 1,
  "workingWeekdays": [
    0
  ],
  "minutesPerDay": -9007199254740991,
  "breaksPaid": false,
  "hoursFrom": "bookings",
  "inPayroll": false,
  "onTrial": false,
  "emergencyContact": {
    "name": "Harbourside Dental",
    "relationship": "text",
    "phone": "0117 496 0123"
  },
  "bankMasked": "text"
}

Change or archive a team member

PATCH/v1/team-members/{id}

Permission
team.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • namestringoptional

    1–200 characters

  • surnamestringoptionalcan be null

    Up to 200 characters

  • emailconstant or stringoptionalcan be null
  • phonestringoptionalcan be null

    Up to 50 characters

  • jobTitlestringoptionalcan be null

    Up to 200 characters

  • notesstringoptionalcan be null

    Up to 5000 characters

  • employmentStartDatedateoptionalcan be null

    YYYY-MM-DD

  • employmentEndDatedateoptionalcan be null

    YYYY-MM-DD

  • addressstringoptionalcan be null

    Up to 500 characters

  • dateOfBirthdateoptionalcan be null

    YYYY-MM-DD

  • niNumberstringoptionalcan be null

    Up to 20 characters

  • teamIdsarray of uuidoptional

    Up to 100 items

  • customFieldsobjectoptional
  • payBasisenumoptional

    One of "hourly", "salaried"

  • accrualRatePercentnumberoptionalcan be null

    0 to 50

  • salariedAllowanceDaysnumberoptionalcan be null

    0 to 366

  • workingWeekdaysarray of integeroptional

    Up to 7 items

  • minutesPerDayintegeroptional

    15 to 1440

  • breaksPaidbooleanoptional
  • inPayrollbooleanoptional
  • hoursFromenumoptional

    One of "bookings", "timesheets"

  • hoursFromStartsOndateoptional

    YYYY-MM-DD

  • archivedbooleanoptional

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • notesstringrequiredcan be null
  • employmentStartDatedaterequiredcan be null

    YYYY-MM-DD

  • employmentEndDatedaterequiredcan be null

    YYYY-MM-DD

  • addressstringrequiredcan be null
  • dateOfBirthdaterequiredcan be null

    YYYY-MM-DD

  • niNumberMaskedstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • hasLoginbooleanrequired
  • accessobjectrequired
    • stateenumrequired

      One of "login", "invited", "none"

    • lastSeenAtstringrequiredcan be null
    • invitationIduuidrequiredcan be null
    • invitedAtstringrequiredcan be null
  • archivedbooleanrequired
  • customFieldsobjectrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • accrualRatePercentnumberrequiredcan be null
  • salariedAllowanceDaysnumberrequiredcan be null
  • workingWeekdaysarray of integerrequired
  • minutesPerDayintegerrequired

    -9007199254740991 to 9007199254740991

  • breaksPaidbooleanrequired
  • hoursFromenumrequired

    One of "bookings", "timesheets"

  • inPayrollbooleanrequired
  • onTrialbooleanrequired
  • emergencyContactobjectrequiredcan be null
    • namestringrequired
    • relationshipstringrequiredcan be null
    • phonestringrequired
  • bankMaskedstringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/team-members/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "surname": "Harbourside Dental",
    "email": "",
    "phone": "0117 496 0123",
    "jobTitle": "text",
    "notes": "Side gate code is on the key safe.",
    "employmentStartDate": "2026-11-06",
    "employmentEndDate": "2026-11-06",
    "address": "1 Harbour Road, Bristol",
    "dateOfBirth": "2026-11-06",
    "niNumber": "text",
    "teamIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ],
    "customFields": {
      "contract-number": "CN-1042"
    },
    "payBasis": "hourly",
    "accrualRatePercent": 0,
    "salariedAllowanceDays": 0,
    "workingWeekdays": [
      0
    ],
    "minutesPerDay": 15,
    "breaksPaid": false,
    "inPayroll": false,
    "hoursFrom": "bookings",
    "hoursFromStartsOn": "2026-11-06",
    "archived": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "notes": "Side gate code is on the key safe.",
  "employmentStartDate": "2026-11-06",
  "employmentEndDate": "2026-11-06",
  "address": "1 Harbour Road, Bristol",
  "dateOfBirth": "2026-11-06",
  "niNumberMasked": "text",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "hasLogin": false,
  "access": {
    "state": "login",
    "lastSeenAt": "2026-11-06T09:30:00.000Z",
    "invitationId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "invitedAt": "2026-11-06T09:30:00.000Z"
  },
  "archived": false,
  "customFields": {
    "contract-number": "CN-1042"
  },
  "payBasis": "hourly",
  "accrualRatePercent": 1,
  "salariedAllowanceDays": 1,
  "workingWeekdays": [
    0
  ],
  "minutesPerDay": -9007199254740991,
  "breaksPaid": false,
  "hoursFrom": "bookings",
  "inPayroll": false,
  "onTrial": false,
  "emergencyContact": {
    "name": "Harbourside Dental",
    "relationship": "text",
    "phone": "0117 496 0123"
  },
  "bankMasked": "text"
}

A team member's login and any open invitation

GET/v1/team-members/{id}/access

Permission
users.view
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • loginobjectrequiredcan be null
    • userIduuidrequired
    • namestringrequired
    • emailstringrequired
    • roleenumrequired

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

    • joinedAtstringrequired
  • invitationobjectrequiredcan be null
    • iduuidrequired
    • emailstringrequired
    • roleenumrequired

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

    • expiresAtstringrequired
  • linkablearray of objectrequired
    • userIduuidrequired
    • namestringrequired
    • emailstringrequired
    • roleenumrequired

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

curl "https://app.workscope.co.uk/v1/team-members/ID/access" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "login": {
    "userId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental",
    "email": "office@example.co.uk",
    "role": "owner",
    "joinedAt": "2026-11-06T09:30:00.000Z"
  },
  "invitation": {
    "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "email": "office@example.co.uk",
    "role": "owner",
    "expiresAt": "2026-11-06T09:30:00.000Z"
  },
  "linkable": [
    {
      "userId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "email": "office@example.co.uk",
      "role": "owner"
    }
  ]
}

A team member's whole NI number (owners and admins; everywhere else it is masked)

GET/v1/team-members/{id}/ni-number

Permission
team.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • niNumberstringrequiredcan be null
curl "https://app.workscope.co.uk/v1/team-members/ID/ni-number" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "niNumber": "text"
}

A team member's photo (JPEG)

GET/v1/team-members/{id}/photo

Permission
team.photo
Answers
200 with a file (image/jpeg)

Parameters

NameInKind
idpathuuidrequired
curl "https://app.workscope.co.uk/v1/team-members/ID/photo" \
  -H "Authorization: Bearer wsk_your_key_here"

Set a team member's photo: send the image itself (JPEG, PNG, WebP; up to 5 MB). A team member may set their own.

POST/v1/team-members/{id}/photo

Permission
team.manage or team.self
Answers
200

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. See Files and photos.

Response object

  • photoUrlstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/team-members/ID/photo" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg

Example response

{
  "photoUrl": "https://example.co.uk"
}

Remove a team member's photo. A team member may remove their own.

DELETE/v1/team-members/{id}/photo

Permission
team.manage or team.self
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • photoUrlstringrequiredcan be null
curl -X DELETE "https://app.workscope.co.uk/v1/team-members/ID/photo" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "photoUrl": "https://example.co.uk"
}

Put an owner or admin on the schedule: a team member record made from their login (name and email) and linked to it. Their role doesn't change, and they are left out of pay runs until someone includes them.

POST/v1/team-members/for-login

Permission
team.manage
Answers
201

Request body JSON

  • userIduuidrequired

Response object

  • iduuidrequired
  • namestringrequired
  • surnamestringrequiredcan be null
  • emailstringrequiredcan be null
  • phonestringrequiredcan be null
  • jobTitlestringrequiredcan be null
  • notesstringrequiredcan be null
  • employmentStartDatedaterequiredcan be null

    YYYY-MM-DD

  • employmentEndDatedaterequiredcan be null

    YYYY-MM-DD

  • addressstringrequiredcan be null
  • dateOfBirthdaterequiredcan be null

    YYYY-MM-DD

  • niNumberMaskedstringrequiredcan be null
  • photoUrlstringrequiredcan be null
  • teamIdsarray of uuidrequired
  • hasLoginbooleanrequired
  • accessobjectrequired
    • stateenumrequired

      One of "login", "invited", "none"

    • lastSeenAtstringrequiredcan be null
    • invitationIduuidrequiredcan be null
    • invitedAtstringrequiredcan be null
  • archivedbooleanrequired
  • customFieldsobjectrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • accrualRatePercentnumberrequiredcan be null
  • salariedAllowanceDaysnumberrequiredcan be null
  • workingWeekdaysarray of integerrequired
  • minutesPerDayintegerrequired

    -9007199254740991 to 9007199254740991

  • breaksPaidbooleanrequired
  • hoursFromenumrequired

    One of "bookings", "timesheets"

  • inPayrollbooleanrequired
  • onTrialbooleanrequired
  • emergencyContactobjectrequiredcan be null
    • namestringrequired
    • relationshipstringrequiredcan be null
    • phonestringrequired
  • bankMaskedstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/team-members/for-login" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "userId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "surname": "Harbourside Dental",
  "email": "office@example.co.uk",
  "phone": "0117 496 0123",
  "jobTitle": "text",
  "notes": "Side gate code is on the key safe.",
  "employmentStartDate": "2026-11-06",
  "employmentEndDate": "2026-11-06",
  "address": "1 Harbour Road, Bristol",
  "dateOfBirth": "2026-11-06",
  "niNumberMasked": "text",
  "photoUrl": "https://example.co.uk",
  "teamIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ],
  "hasLogin": false,
  "access": {
    "state": "login",
    "lastSeenAt": "2026-11-06T09:30:00.000Z",
    "invitationId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "invitedAt": "2026-11-06T09:30:00.000Z"
  },
  "archived": false,
  "customFields": {
    "contract-number": "CN-1042"
  },
  "payBasis": "hourly",
  "accrualRatePercent": 1,
  "salariedAllowanceDays": 1,
  "workingWeekdays": [
    0
  ],
  "minutesPerDay": -9007199254740991,
  "breaksPaid": false,
  "hoursFrom": "bookings",
  "inPayroll": false,
  "onTrial": false,
  "emergencyContact": {
    "name": "Harbourside Dental",
    "relationship": "text",
    "phone": "0117 496 0123"
  },
  "bankMasked": "text"
}

Import team members from spreadsheet rows, already matched to fields; dryRun says what would happen

POST/v1/team-members/import

Permission
team.manage
Answers
200

Request body JSON

  • rowsarray of objectrequired

    1–2000 items

    • rowNumberintegerrequired

      1 to 9007199254740991

    • valuesobjectrequired
  • onDuplicateenumoptional

    One of "skip", "update" · Default "skip"

  • dryRunbooleanoptional

    Default false

Response object

  • dryRunbooleanrequired
  • createdintegerrequired

    -9007199254740991 to 9007199254740991

  • updatedintegerrequired

    -9007199254740991 to 9007199254740991

  • skippedintegerrequired

    -9007199254740991 to 9007199254740991

  • failedintegerrequired

    -9007199254740991 to 9007199254740991

  • rowsarray of objectrequired
    • rowNumberintegerrequired

      -9007199254740991 to 9007199254740991

    • namestringrequired
    • outcomeenumrequired

      One of "created", "updated", "skipped", "failed"

    • messagestringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/team-members/import" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "rows": [
      {
        "rowNumber": 1,
        "values": {}
      }
    ],
    "onDuplicate": "skip",
    "dryRun": false
  }'

Example response

{
  "dryRun": false,
  "created": -9007199254740991,
  "updated": -9007199254740991,
  "skipped": -9007199254740991,
  "failed": -9007199254740991,
  "rows": [
    {
      "rowNumber": -9007199254740991,
      "name": "Harbourside Dental",
      "outcome": "created",
      "message": "text"
    }
  ]
}

Teams

GET/v1/teams

Permission
team.view
Answers
200

Response array of object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • teamMemberIdsarray of uuidrequired
curl "https://app.workscope.co.uk/v1/teams" \
  -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.",
    "teamMemberIds": [
      "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
    ]
  }
]

Add a team

POST/v1/teams

Permission
team.manage
Answers
201

Request body JSON

  • namestringrequired

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 5000 characters

  • teamMemberIdsarray of uuidoptional

    Up to 500 items · Default []

Response object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • teamMemberIdsarray of uuidrequired
curl -X POST "https://app.workscope.co.uk/v1/teams" \
  -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.",
    "teamMemberIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ]
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "description": "Side gate code is on the key safe.",
  "teamMemberIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ]
}

Change a team

PATCH/v1/teams/{id}

Permission
team.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • namestringoptional

    1–200 characters

  • descriptionstringoptionalcan be null

    Up to 5000 characters

  • teamMemberIdsarray of uuidoptional

    Up to 500 items

Response object

  • iduuidrequired
  • namestringrequired
  • descriptionstringrequiredcan be null
  • teamMemberIdsarray of uuidrequired
curl -X PATCH "https://app.workscope.co.uk/v1/teams/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.",
    "teamMemberIds": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ]
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "description": "Side gate code is on the key safe.",
  "teamMemberIds": [
    "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
  ]
}

Remove a team

DELETE/v1/teams/{id}

Permission
team.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • okconstantrequired

    Always true

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

Example response

{
  "ok": true
}