WorkscopeAPI Open Workscope

API reference

Timesheets

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

On this page

Timesheets between two dates (by the day they count for), with filters

GET/v1/timesheets

Permission
timesheet.view
Module
timesheets
Answers
200

Parameters

NameInKind
fromquerydaterequired
toquerydaterequired
teamMemberIdqueryuuid
teamIdqueryuuid
teamIdsqueryarray of uuid
statusqueryenumOne of open, submitted, signed_off

Response array of object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • statusenumrequired

    One of "open", "submitted", "signed_off"

  • datedaterequired

    YYYY-MM-DD

  • startsAtstringrequired
  • endsAtstringrequired
  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • endDatedaterequired

    YYYY-MM-DD

  • breakMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • workedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • roundedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • bookingobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

  • clientobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • notesstringrequiredcan be null
  • submittedAtstringrequiredcan be null
  • signedOffAtstringrequiredcan be null
  • signedOffByNamestringrequiredcan be null
  • payrolledbooleanrequired
  • createdAtstringrequired
  • updatedAtstringrequired
curl "https://app.workscope.co.uk/v1/timesheets?from=2026-11-06&to=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "teamMemberName": "Sam Hart",
    "status": "open",
    "date": "2026-11-06",
    "startsAt": "2026-11-06T09:30:00.000Z",
    "endsAt": "2026-11-06T09:30:00.000Z",
    "start": "09:00",
    "end": "11:00",
    "endDate": "2026-11-06",
    "breakMinutes": 120,
    "workedMinutes": 120,
    "roundedMinutes": 120,
    "booking": {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "date": "2026-11-06"
    },
    "client": {
      "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "name": "Harbourside Dental"
    },
    "project": {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "name": "Harbourside Dental"
    },
    "notes": "Side gate code is on the key safe.",
    "submittedAt": "2026-11-06T09:30:00.000Z",
    "signedOffAt": "2026-11-06T09:30:00.000Z",
    "signedOffByName": "Harbourside Dental",
    "payrolled": false,
    "createdAt": "2026-11-06T09:30:00.000Z",
    "updatedAt": "2026-11-06T09:30:00.000Z"
  }
]

Add a timesheet for someone (submitted, or signed off straight away)

POST/v1/timesheets

Permission
timesheet.manage
Module
timesheets
Answers
201

Request body JSON

  • teamMemberIduuidrequired
  • datedaterequired

    YYYY-MM-DD

  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • breakMinutesintegeroptional

    0 to 720 · Default 0

  • bookingIduuidoptionalcan be null
  • clientIduuidoptionalcan be null
  • projectIduuidoptionalcan be null
  • notesstringoptionalcan be null

    Up to 2000 characters

  • signOffbooleanoptional

    Default false

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • statusenumrequired

    One of "open", "submitted", "signed_off"

  • datedaterequired

    YYYY-MM-DD

  • startsAtstringrequired
  • endsAtstringrequired
  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • endDatedaterequired

    YYYY-MM-DD

  • breakMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • workedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • roundedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • bookingobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

  • clientobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • notesstringrequiredcan be null
  • submittedAtstringrequiredcan be null
  • signedOffAtstringrequiredcan be null
  • signedOffByNamestringrequiredcan be null
  • payrolledbooleanrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "edited", "submitted", "signed_off", "unsigned", "deleted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/timesheets" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "date": "2026-11-06",
    "start": "09:00",
    "end": "11:00",
    "breakMinutes": 0,
    "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "clientId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "projectId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "notes": "Side gate code is on the key safe.",
    "signOff": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "status": "open",
  "date": "2026-11-06",
  "startsAt": "2026-11-06T09:30:00.000Z",
  "endsAt": "2026-11-06T09:30:00.000Z",
  "start": "09:00",
  "end": "11:00",
  "endDate": "2026-11-06",
  "breakMinutes": 120,
  "workedMinutes": 120,
  "roundedMinutes": 120,
  "booking": {
    "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "name": "Harbourside Dental",
    "date": "2026-11-06"
  },
  "client": {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental"
  },
  "project": {
    "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "name": "Harbourside Dental"
  },
  "notes": "Side gate code is on the key safe.",
  "submittedAt": "2026-11-06T09:30:00.000Z",
  "signedOffAt": "2026-11-06T09:30:00.000Z",
  "signedOffByName": "Harbourside Dental",
  "payrolled": false,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "updatedAt": "2026-11-06T09:30:00.000Z",
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ]
}

One timesheet, with its history

GET/v1/timesheets/{id}

Permission
timesheet.view
Module
timesheets
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • statusenumrequired

    One of "open", "submitted", "signed_off"

  • datedaterequired

    YYYY-MM-DD

  • startsAtstringrequired
  • endsAtstringrequired
  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • endDatedaterequired

    YYYY-MM-DD

  • breakMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • workedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • roundedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • bookingobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

  • clientobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • notesstringrequiredcan be null
  • submittedAtstringrequiredcan be null
  • signedOffAtstringrequiredcan be null
  • signedOffByNamestringrequiredcan be null
  • payrolledbooleanrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "edited", "submitted", "signed_off", "unsigned", "deleted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
curl "https://app.workscope.co.uk/v1/timesheets/ID" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "status": "open",
  "date": "2026-11-06",
  "startsAt": "2026-11-06T09:30:00.000Z",
  "endsAt": "2026-11-06T09:30:00.000Z",
  "start": "09:00",
  "end": "11:00",
  "endDate": "2026-11-06",
  "breakMinutes": 120,
  "workedMinutes": 120,
  "roundedMinutes": 120,
  "booking": {
    "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "name": "Harbourside Dental",
    "date": "2026-11-06"
  },
  "client": {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental"
  },
  "project": {
    "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "name": "Harbourside Dental"
  },
  "notes": "Side gate code is on the key safe.",
  "submittedAt": "2026-11-06T09:30:00.000Z",
  "signedOffAt": "2026-11-06T09:30:00.000Z",
  "signedOffByName": "Harbourside Dental",
  "payrolled": false,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "updatedAt": "2026-11-06T09:30:00.000Z",
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ]
}

Change a timesheet. A reason is needed when it isn't your own; a timesheet in a pay run can't change.

PATCH/v1/timesheets/{id}

Permission
timesheet.manage
Module
timesheets
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • datedateoptional

    YYYY-MM-DD

  • starttimeoptional

    HH:MM, 24-hour

  • endtimeoptional

    HH:MM, 24-hour

  • breakMinutesintegeroptional

    0 to 720

  • bookingIduuidoptionalcan be null
  • clientIduuidoptionalcan be null
  • projectIduuidoptionalcan be null
  • notesstringoptionalcan be null

    Up to 2000 characters

  • reasonstringoptionalcan be null

    Up to 500 characters

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • statusenumrequired

    One of "open", "submitted", "signed_off"

  • datedaterequired

    YYYY-MM-DD

  • startsAtstringrequired
  • endsAtstringrequired
  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • endDatedaterequired

    YYYY-MM-DD

  • breakMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • workedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • roundedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • bookingobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

  • clientobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • notesstringrequiredcan be null
  • submittedAtstringrequiredcan be null
  • signedOffAtstringrequiredcan be null
  • signedOffByNamestringrequiredcan be null
  • payrolledbooleanrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "edited", "submitted", "signed_off", "unsigned", "deleted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/timesheets/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "date": "2026-11-06",
    "start": "09:00",
    "end": "11:00",
    "breakMinutes": 120,
    "bookingId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "projectId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "notes": "Side gate code is on the key safe.",
    "reason": "text"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "status": "open",
  "date": "2026-11-06",
  "startsAt": "2026-11-06T09:30:00.000Z",
  "endsAt": "2026-11-06T09:30:00.000Z",
  "start": "09:00",
  "end": "11:00",
  "endDate": "2026-11-06",
  "breakMinutes": 120,
  "workedMinutes": 120,
  "roundedMinutes": 120,
  "booking": {
    "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "name": "Harbourside Dental",
    "date": "2026-11-06"
  },
  "client": {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental"
  },
  "project": {
    "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "name": "Harbourside Dental"
  },
  "notes": "Side gate code is on the key safe.",
  "submittedAt": "2026-11-06T09:30:00.000Z",
  "signedOffAt": "2026-11-06T09:30:00.000Z",
  "signedOffByName": "Harbourside Dental",
  "payrolled": false,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "updatedAt": "2026-11-06T09:30:00.000Z",
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ]
}

Delete a timesheet, with a reason (kept in its history; its holiday goes back)

POST/v1/timesheets/{id}/delete

Permission
timesheet.manage
Module
timesheets
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • reasonstringoptionalcan be null

    Up to 500 characters

Response object

  • okconstantrequired

    Always true

curl -X POST "https://app.workscope.co.uk/v1/timesheets/ID/delete" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "text"
  }'

Example response

{
  "ok": true
}

Take a signed-off timesheet back to submitted, saying why (its holiday is taken back)

POST/v1/timesheets/{id}/unsign

Permission
timesheet.manage
Module
timesheets
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • reasonstringrequired

    1–500 characters

Response object

  • iduuidrequired
  • teamMemberIduuidrequired
  • teamMemberNamestringrequired
  • statusenumrequired

    One of "open", "submitted", "signed_off"

  • datedaterequired

    YYYY-MM-DD

  • startsAtstringrequired
  • endsAtstringrequired
  • starttimerequired

    HH:MM, 24-hour

  • endtimerequired

    HH:MM, 24-hour

  • endDatedaterequired

    YYYY-MM-DD

  • breakMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • workedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • roundedMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • bookingobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
    • datedaterequiredcan be null

      YYYY-MM-DD

  • clientobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • projectobjectrequiredcan be null
    • iduuidrequired
    • namestringrequired
  • notesstringrequiredcan be null
  • submittedAtstringrequiredcan be null
  • signedOffAtstringrequiredcan be null
  • signedOffByNamestringrequiredcan be null
  • payrolledbooleanrequired
  • createdAtstringrequired
  • updatedAtstringrequired
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "edited", "submitted", "signed_off", "unsigned", "deleted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/timesheets/ID/unsign" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "text"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "teamMemberName": "Sam Hart",
  "status": "open",
  "date": "2026-11-06",
  "startsAt": "2026-11-06T09:30:00.000Z",
  "endsAt": "2026-11-06T09:30:00.000Z",
  "start": "09:00",
  "end": "11:00",
  "endDate": "2026-11-06",
  "breakMinutes": 120,
  "workedMinutes": 120,
  "roundedMinutes": 120,
  "booking": {
    "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
    "name": "Harbourside Dental",
    "date": "2026-11-06"
  },
  "client": {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "name": "Harbourside Dental"
  },
  "project": {
    "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
    "name": "Harbourside Dental"
  },
  "notes": "Side gate code is on the key safe.",
  "submittedAt": "2026-11-06T09:30:00.000Z",
  "signedOffAt": "2026-11-06T09:30:00.000Z",
  "signedOffByName": "Harbourside Dental",
  "payrolled": false,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "updatedAt": "2026-11-06T09:30:00.000Z",
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ]
}

For each person and day: booked work and travel, to check timesheets against (the week grid)

GET/v1/timesheets/booked

Permission
timesheet.view
Module
timesheets
Answers
200

Parameters

NameInKind
fromquerydaterequired
toquerydaterequired
teamIdsqueryarray of uuid

Response object

  • toleranceMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • daysarray of objectrequired
    • teamMemberIduuidrequired
    • datedaterequired

      YYYY-MM-DD

    • bookingsintegerrequired

      -9007199254740991 to 9007199254740991

    • bookedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

curl "https://app.workscope.co.uk/v1/timesheets/booked?from=2026-11-06&to=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "toleranceMinutes": 120,
  "days": [
    {
      "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "date": "2026-11-06",
      "bookings": -9007199254740991,
      "bookedMinutes": 120,
      "travelMinutes": 120
    }
  ]
}

What a team member had booked on a day, with the total, to check their timesheets against (as Xota's timesheet page)

GET/v1/timesheets/day-bookings

Permission
timesheet.view
Module
timesheets
Answers
200

Parameters

NameInKind
teamMemberIdqueryuuidrequired
datequerydaterequired

Response object

  • datedaterequired

    YYYY-MM-DD

  • bookingsarray of objectrequired
    • iduuidrequired
    • namestringrequired
    • clientNamestringrequired
    • projectNamestringrequiredcan be null
    • statusstringrequired
    • starttimerequiredcan be null

      HH:MM, 24-hour

    • endtimerequiredcan be null

      HH:MM, 24-hour

    • minutesintegerrequired

      -9007199254740991 to 9007199254740991

  • totalMinutesintegerrequired

    -9007199254740991 to 9007199254740991

curl "https://app.workscope.co.uk/v1/timesheets/day-bookings?teamMemberId=3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41&date=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "date": "2026-11-06",
  "bookings": [
    {
      "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "name": "Harbourside Dental",
      "clientName": "Harbourside Dental",
      "projectName": "1 Harbour Road",
      "status": "text",
      "start": "09:00",
      "end": "11:00",
      "minutes": 120
    }
  ],
  "totalMinutes": 120
}

Download timesheets as CSV for payroll: one row per timesheet, or one row per person per week

GET/v1/timesheets/export

Permission
timesheet.view
Module
timesheets
Answers
200 with a file (image/jpeg)

Parameters

NameInKind
fromquerydaterequired
toquerydaterequired
formatqueryenumOne of entries, weekly · Default "entries"
teamMemberIdqueryuuid
statusqueryenumOne of signed_off, all · Default "signed_off"
curl "https://app.workscope.co.uk/v1/timesheets/export?from=2026-11-06&to=2026-11-06" \
  -H "Authorization: Bearer wsk_your_key_here"

How worked minutes are rounded

GET/v1/timesheets/settings

Permission
timesheet.self
Module
timesheets
Answers
200

Response object

  • roundingenumrequired

    One of "5", "10", "15", "none"

  • roundingModeenumrequired

    One of "nearest", "favour"

  • toleranceMinutesintegerrequired

    0 to 600

curl "https://app.workscope.co.uk/v1/timesheets/settings" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "rounding": "5",
  "roundingMode": "nearest",
  "toleranceMinutes": 120
}

Change the timesheet settings

PATCH/v1/timesheets/settings

Permission
organization.update
Module
timesheets
Answers
200

Request body JSON

  • roundingenumoptional

    One of "5", "10", "15", "none"

  • roundingModeenumoptional

    One of "nearest", "favour"

  • toleranceMinutesintegeroptional

    0 to 600

Response object

  • roundingenumrequired

    One of "5", "10", "15", "none"

  • roundingModeenumrequired

    One of "nearest", "favour"

  • toleranceMinutesintegerrequired

    0 to 600

curl -X PATCH "https://app.workscope.co.uk/v1/timesheets/settings" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "rounding": "5",
    "roundingMode": "nearest",
    "toleranceMinutes": 120
  }'

Example response

{
  "rounding": "5",
  "roundingMode": "nearest",
  "toleranceMinutes": 120
}

Sign off submitted timesheets (one or many). Open ones are skipped.

POST/v1/timesheets/sign-off

Permission
timesheet.manage
Module
timesheets
Answers
200

Request body JSON

  • idsarray of uuidrequired

    1–500 items

Response object

  • signedOffarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • teamMemberNamestringrequired
    • statusenumrequired

      One of "open", "submitted", "signed_off"

    • datedaterequired

      YYYY-MM-DD

    • startsAtstringrequired
    • endsAtstringrequired
    • starttimerequired

      HH:MM, 24-hour

    • endtimerequired

      HH:MM, 24-hour

    • endDatedaterequired

      YYYY-MM-DD

    • breakMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • roundedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • bookingobjectrequiredcan be null
      • iduuidrequired
      • namestringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

    • clientobjectrequiredcan be null
      • iduuidrequired
      • namestringrequired
    • projectobjectrequiredcan be null
      • iduuidrequired
      • namestringrequired
    • notesstringrequiredcan be null
    • submittedAtstringrequiredcan be null
    • signedOffAtstringrequiredcan be null
    • signedOffByNamestringrequiredcan be null
    • payrolledbooleanrequired
    • createdAtstringrequired
    • updatedAtstringrequired
  • skippedarray of objectrequired
    • iduuidrequired
    • reasonstringrequired
curl -X POST "https://app.workscope.co.uk/v1/timesheets/sign-off" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41"
    ]
  }'

Example response

{
  "signedOff": [
    {
      "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "teamMemberId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberName": "Sam Hart",
      "status": "open",
      "date": "2026-11-06",
      "startsAt": "2026-11-06T09:30:00.000Z",
      "endsAt": "2026-11-06T09:30:00.000Z",
      "start": "09:00",
      "end": "11:00",
      "endDate": "2026-11-06",
      "breakMinutes": 120,
      "workedMinutes": 120,
      "roundedMinutes": 120,
      "booking": {
        "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
        "name": "Harbourside Dental",
        "date": "2026-11-06"
      },
      "client": {
        "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
        "name": "Harbourside Dental"
      },
      "project": {
        "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
        "name": "Harbourside Dental"
      },
      "notes": "Side gate code is on the key safe.",
      "submittedAt": "2026-11-06T09:30:00.000Z",
      "signedOffAt": "2026-11-06T09:30:00.000Z",
      "signedOffByName": "Harbourside Dental",
      "payrolled": false,
      "createdAt": "2026-11-06T09:30:00.000Z",
      "updatedAt": "2026-11-06T09:30:00.000Z"
    }
  ],
  "skipped": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "reason": "text"
    }
  ]
}