WorkscopeAPI Open Workscope

API reference

Payroll

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

On this page

Pay runs, newest first

GET/v1/pay-runs

Permission
payroll.view
Module
payroll
Answers
200

Parameters

NameInKind
statusqueryenumOne of draft, finalised, paid
frequencyqueryenumOne of weekly, fortnightly, four_weekly, monthly

Response array of object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
curl "https://app.workscope.co.uk/v1/pay-runs" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "number": -9007199254740991,
    "reference": "INV-0042",
    "frequency": "weekly",
    "periodStart": "2026-11-06",
    "periodEnd": "2026-11-06",
    "status": "draft",
    "notes": "Side gate code is on the key safe.",
    "people": -9007199254740991,
    "grossPence": 4500,
    "missingRates": -9007199254740991,
    "calculatedAt": "2026-11-06T09:30:00.000Z",
    "finalisedAt": "2026-11-06T09:30:00.000Z",
    "paidAt": "2026-11-06T09:30:00.000Z",
    "createdAt": "2026-11-06T09:30:00.000Z"
  }
]

Start a pay run for a period (a draft, worked out straight away)

POST/v1/pay-runs

Permission
payroll.manage
Module
payroll
Answers
201

Request body JSON

  • frequencyenumoptional

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddateoptional

    YYYY-MM-DD

  • notesstringoptionalcan be null

    Up to 2000 characters

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "frequency": "weekly",
    "periodStart": "2026-11-06",
    "periodEnd": "2026-11-06",
    "notes": "Side gate code is on the key safe."
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

One pay run: each person, their lines and totals, and its history

GET/v1/pay-runs/{id}

Permission
payroll.view
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

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

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Change a pay run's notes

PATCH/v1/pay-runs/{id}

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • notesstringoptionalcan be null

    Up to 2000 characters

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/pay-runs/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "notes": "Side gate code is on the key safe."
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Delete a draft pay run (what it held is free again)

DELETE/v1/pay-runs/{id}

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • okconstantrequired

    Always true

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

Example response

{
  "ok": true
}

Accept someone's pay with a missing rate as it is (or take that back), so the run can be finalised

POST/v1/pay-runs/{id}/entries/{entryId}/accept-missing

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired
entryIdpathuuidrequired

Request body JSON

  • acceptedbooleanrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs/ID/entries/ID/accept-missing" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "accepted": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Download a pay run as CSV for a payroll provider or accountant: one row per person, or every line

GET/v1/pay-runs/{id}/export

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

Parameters

NameInKind
idpathuuidrequired
formatqueryenumOne of people, lines · Default "people"
curl "https://app.workscope.co.uk/v1/pay-runs/ID/export" \
  -H "Authorization: Bearer wsk_your_key_here"

Finalise a draft: worked out one last time, then it and everything in it is locked

POST/v1/pay-runs/{id}/finalise

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs/ID/finalise" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Add an addition (bonus, expenses …) or a deduction (advance …) for someone in a draft

POST/v1/pay-runs/{id}/lines

Permission
payroll.manage
Module
payroll
Answers
201

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • teamMemberIduuidrequired
  • kindenumrequired

    One of "bonus", "overtime", "expenses", "other_addition", "advance", "loan_repayment", "other_deduction"

  • descriptionstringrequired

    1–300 characters

  • amountPenceintegerrequired

    0 to 100000000

  • datedateoptionalcan be null

    YYYY-MM-DD

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs/ID/lines" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "kind": "bonus",
    "description": "Side gate code is on the key safe.",
    "amountPence": 4500,
    "date": "2026-11-06"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Change a line added by hand

PATCH/v1/pay-runs/{id}/lines/{lineId}

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired
lineIdpathuuidrequired

Request body JSON

  • kindenumoptional

    One of "bonus", "overtime", "expenses", "other_addition", "advance", "loan_repayment", "other_deduction"

  • descriptionstringoptional

    1–300 characters

  • amountPenceintegeroptional

    0 to 100000000

  • datedateoptionalcan be null

    YYYY-MM-DD

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/pay-runs/ID/lines/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "bonus",
    "description": "Side gate code is on the key safe.",
    "amountPence": 4500,
    "date": "2026-11-06"
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Remove a line added by hand

DELETE/v1/pay-runs/{id}/lines/{lineId}

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired
lineIdpathuuidrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X DELETE "https://app.workscope.co.uk/v1/pay-runs/ID/lines/ID" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Mark a finalised run as paid (final)

POST/v1/pay-runs/{id}/paid

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs/ID/paid" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Work a draft out again from bookings, timesheets, absences and rates (lines added by hand stay)

POST/v1/pay-runs/{id}/recalculate

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

    • byNamestringrequiredcan be null
    • atstringrequired
    • reasonstringrequiredcan be null
    • summarystringrequiredcan be null
  • finaliseBlockerstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/pay-runs/ID/recalculate" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

Take a finalised run back to draft, saying why (not once paid)

POST/v1/pay-runs/{id}/reopen

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • reasonstringrequired

    1–500 characters

Response object

  • iduuidrequired
  • numberintegerrequired

    -9007199254740991 to 9007199254740991

  • referencestringrequired
  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • statusenumrequired

    One of "draft", "finalised", "paid"

  • notesstringrequiredcan be null
  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

  • grossPenceintegerrequired

    -9007199254740991 to 9007199254740991

  • missingRatesintegerrequired

    -9007199254740991 to 9007199254740991

  • calculatedAtstringrequiredcan be null
  • finalisedAtstringrequiredcan be null
  • paidAtstringrequiredcan be null
  • createdAtstringrequired
  • entriesarray of objectrequired
    • iduuidrequired
    • teamMemberIduuidrequired
    • namestringrequired
    • payBasisenumrequired

      One of "hourly", "salaried"

    • hoursFromenumrequiredcan be null

      One of "bookings", "timesheets"

    • grossPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • additionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • deductionsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workedMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • paidAbsenceMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • missingRatesintegerrequired

      -9007199254740991 to 9007199254740991

    • workPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • workMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • travelMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • holidayMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • sickPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • sickMinutesintegerrequired

      -9007199254740991 to 9007199254740991

    • milesX100integerrequired

      -9007199254740991 to 9007199254740991

    • mileagePenceintegerrequired

      -9007199254740991 to 9007199254740991

    • adjustmentsPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • missingAcceptedbooleanrequired
    • linesarray of objectrequired
      • iduuidrequired
      • kindenumrequired

        One of "work", "salary", "paid_absence", "unpaid_absence", "bonus", "overtime", "expenses", "mileage", "other_addition", "advance", "loan_repayment", "other_deduction", "travel_time"

      • manualbooleanrequired
      • descriptionstringrequired
      • datedaterequiredcan be null

        YYYY-MM-DD

      • minutesintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • daysnumberrequiredcan be null
      • ratePenceintegerrequiredcan be null

        -9007199254740991 to 9007199254740991

      • amountPenceintegerrequired

        -9007199254740991 to 9007199254740991

      • missingRatebooleanrequired
      • latebooleanrequired
      • holidaybooleanrequired
      • milesnumberrequiredcan be null
      • bookingIduuidrequiredcan be null
      • timesheetIduuidrequiredcan be null
      • absenceIduuidrequiredcan be null
      • travelTimeIduuidrequiredcan be null
  • historyarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "created", "recalculated", "finalised", "reopened", "paid", "line_added", "line_changed", "line_removed", "missing_accepted"

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

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "number": -9007199254740991,
  "reference": "INV-0042",
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "status": "draft",
  "notes": "Side gate code is on the key safe.",
  "people": -9007199254740991,
  "grossPence": 4500,
  "missingRates": -9007199254740991,
  "calculatedAt": "2026-11-06T09:30:00.000Z",
  "finalisedAt": "2026-11-06T09:30:00.000Z",
  "paidAt": "2026-11-06T09:30:00.000Z",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "entries": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "teamMemberId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "name": "Harbourside Dental",
      "payBasis": "hourly",
      "hoursFrom": "bookings",
      "grossPence": 4500,
      "additionsPence": 4500,
      "deductionsPence": 4500,
      "workedMinutes": 120,
      "paidAbsenceMinutes": 120,
      "missingRates": -9007199254740991,
      "workPence": 4500,
      "workMinutes": 120,
      "travelMinutes": 120,
      "holidayPence": 4500,
      "holidayMinutes": 120,
      "sickPence": 4500,
      "sickMinutes": 120,
      "milesX100": -9007199254740991,
      "mileagePence": 4500,
      "adjustmentsPence": 4500,
      "missingAccepted": false,
      "lines": [
        {
          "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "kind": "work",
          "manual": false,
          "description": "Side gate code is on the key safe.",
          "date": "2026-11-06",
          "minutes": 120,
          "days": 1,
          "ratePence": 4500,
          "amountPence": 4500,
          "missingRate": false,
          "late": false,
          "holiday": false,
          "miles": 1,
          "bookingId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
          "timesheetId": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
          "absenceId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
          "travelTimeId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f"
        }
      ]
    }
  ],
  "history": [
    {
      "id": "b7e6d5c4-3b2a-4190-8f7e-6d5c4b3a2918",
      "kind": "created",
      "byName": "Harbourside Dental",
      "at": "2026-11-06T09:30:00.000Z",
      "reason": "text",
      "summary": "text"
    }
  ],
  "finaliseBlocker": "text"
}

The period the next pay run would cover, and how many people are paid at that frequency

GET/v1/pay-runs/next

Permission
payroll.view
Module
payroll
Answers
200

Parameters

NameInKind
frequencyqueryenumOne of weekly, fortnightly, four_weekly, monthly

Response object

  • frequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • periodStartdaterequired

    YYYY-MM-DD

  • periodEnddaterequired

    YYYY-MM-DD

  • peopleintegerrequired

    -9007199254740991 to 9007199254740991

curl "https://app.workscope.co.uk/v1/pay-runs/next" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "frequency": "weekly",
  "periodStart": "2026-11-06",
  "periodEnd": "2026-11-06",
  "people": -9007199254740991
}

How often people are paid, unless a team member says otherwise

GET/v1/payroll/settings

Permission
payroll.view
Module
payroll
Answers
200

Response object

  • payFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • payFrequenciesarray of enumrequired

    At least 1 item

  • mileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

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

Example response

{
  "payFrequency": "weekly",
  "payFrequencies": [
    "weekly"
  ],
  "mileageRatePence": 4500
}

Change the payroll settings

PATCH/v1/payroll/settings

Permission
payroll.manage
Module
payroll
Answers
200

Request body JSON

  • payFrequencyenumoptional

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • payFrequenciesarray of enumoptional

    At least 1 item

  • mileageRatePenceintegeroptional

    0 to 10000

Response object

  • payFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • payFrequenciesarray of enumrequired

    At least 1 item

  • mileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

curl -X PATCH "https://app.workscope.co.uk/v1/payroll/settings" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "payFrequency": "weekly",
    "payFrequencies": [
      "weekly"
    ],
    "mileageRatePence": 4500
  }'

Example response

{
  "payFrequency": "weekly",
  "payFrequencies": [
    "weekly"
  ],
  "mileageRatePence": 4500
}

A team member's pay: how often, and their dated hourly rates or salaries

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

Permission
payroll.view
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • teamMemberIduuidrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • payFrequencyenumrequiredcan be null

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • effectiveFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • mileageRatePenceintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • effectiveMileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

  • ratesarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "hourly", "salary"

    • effectiveFromdaterequired

      YYYY-MM-DD

    • amountPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • notestringrequiredcan be null
    • createdAtstringrequired
curl "https://app.workscope.co.uk/v1/team-members/ID/pay" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "payBasis": "hourly",
  "payFrequency": "weekly",
  "effectiveFrequency": "weekly",
  "mileageRatePence": 4500,
  "effectiveMileageRatePence": 4500,
  "rates": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "kind": "hourly",
      "effectiveFrom": "2026-11-06",
      "amountPence": 4500,
      "note": "Side gate code is on the key safe.",
      "createdAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}

How often a team member is paid, and their rate per mile (null: the company’s)

PATCH/v1/team-members/{id}/pay

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • payFrequencyenumoptionalcan be null

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • mileageRatePenceintegeroptionalcan be null

    0 to 10000

Response object

  • teamMemberIduuidrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • payFrequencyenumrequiredcan be null

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • effectiveFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • mileageRatePenceintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • effectiveMileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

  • ratesarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "hourly", "salary"

    • effectiveFromdaterequired

      YYYY-MM-DD

    • amountPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • notestringrequiredcan be null
    • createdAtstringrequired
curl -X PATCH "https://app.workscope.co.uk/v1/team-members/ID/pay" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "payFrequency": "weekly",
    "mileageRatePence": 4500
  }'

Example response

{
  "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "payBasis": "hourly",
  "payFrequency": "weekly",
  "effectiveFrequency": "weekly",
  "mileageRatePence": 4500,
  "effectiveMileageRatePence": 4500,
  "rates": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "kind": "hourly",
      "effectiveFrom": "2026-11-06",
      "amountPence": 4500,
      "note": "Side gate code is on the key safe.",
      "createdAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}

Add an hourly rate or a yearly salary from a day (replacing one from the same day)

POST/v1/team-members/{id}/pay/rates

Permission
payroll.manage
Module
payroll
Answers
201

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • kindenumrequired

    One of "hourly", "salary"

  • effectiveFromdaterequired

    YYYY-MM-DD

  • amountPenceintegerrequired

    0 to 100000000

  • notestringoptionalcan be null

    Up to 500 characters

Response object

  • teamMemberIduuidrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • payFrequencyenumrequiredcan be null

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • effectiveFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • mileageRatePenceintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • effectiveMileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

  • ratesarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "hourly", "salary"

    • effectiveFromdaterequired

      YYYY-MM-DD

    • amountPenceintegerrequired

      -9007199254740991 to 9007199254740991

    • notestringrequiredcan be null
    • createdAtstringrequired
curl -X POST "https://app.workscope.co.uk/v1/team-members/ID/pay/rates" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "hourly",
    "effectiveFrom": "2026-11-06",
    "amountPence": 4500,
    "note": "Side gate code is on the key safe."
  }'

Example response

{
  "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "payBasis": "hourly",
  "payFrequency": "weekly",
  "effectiveFrequency": "weekly",
  "mileageRatePence": 4500,
  "effectiveMileageRatePence": 4500,
  "rates": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "kind": "hourly",
      "effectiveFrom": "2026-11-06",
      "amountPence": 4500,
      "note": "Side gate code is on the key safe.",
      "createdAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}

Remove a rate (pay already finalised keeps what it was)

DELETE/v1/team-members/{id}/pay/rates/{rateId}

Permission
payroll.manage
Module
payroll
Answers
200

Parameters

NameInKind
idpathuuidrequired
rateIdpathuuidrequired

Response object

  • teamMemberIduuidrequired
  • payBasisenumrequired

    One of "hourly", "salaried"

  • payFrequencyenumrequiredcan be null

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • effectiveFrequencyenumrequired

    One of "weekly", "fortnightly", "four_weekly", "monthly"

  • mileageRatePenceintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • effectiveMileageRatePenceintegerrequired

    -9007199254740991 to 9007199254740991

  • ratesarray of objectrequired
    • iduuidrequired
    • kindenumrequired

      One of "hourly", "salary"

    • effectiveFromdaterequired

      YYYY-MM-DD

    • amountPenceintegerrequired

      -9007199254740991 to 9007199254740991

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

Example response

{
  "teamMemberId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "payBasis": "hourly",
  "payFrequency": "weekly",
  "effectiveFrequency": "weekly",
  "mileageRatePence": 4500,
  "effectiveMileageRatePence": 4500,
  "rates": [
    {
      "id": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "kind": "hourly",
      "effectiveFrom": "2026-11-06",
      "amountPence": 4500,
      "note": "Side gate code is on the key safe.",
      "createdAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}