WorkscopeAPI Open Workscope

API reference

Organisation

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

On this page

This organisation and its settings

GET/v1/organization

Permission
Any key
Answers
200

Response object

  • iduuidrequired
  • namestringrequired
  • timeZonestringrequired
  • currencystringrequired
  • modulesarray of enumrequired
  • termsobjectrequired
    • clientobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • projectobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • bookingobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • jobobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamMemberobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

  • durationDisplayenumrequired

    One of "minutes", "hours"

  • weekStartsOnenumrequired

    One of "saturday", "sunday", "monday"

  • needsClockInDefaultbooleanrequired
  • recordClockLocationbooleanrequired
  • openPickupbooleanrequired
  • openNotifyDelayMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • missedClockInAlertsbooleanrequired
  • missedClockInGraceMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • phoneRemindersbooleanrequired
  • photosVisibleToClientsbooleanrequired

    Default true

  • logoUrlstringrequiredcan be null
  • addressstringrequiredcan be null
  • phonestringrequiredcan be null
  • emailstringrequiredcan be null
  • websitestringrequiredcan be null
  • companyNumberstringrequiredcan be null
  • vatNumberstringrequiredcan be null
  • vatRegisteredbooleanrequired
  • vatRateBpintegerrequired

    -9007199254740991 to 9007199254740991

  • activeClientDaysintegerrequired

    -9007199254740991 to 9007199254740991

  • emailCopyToCompanybooleanrequired
  • profileobjectrequiredcan be null
    • teamSizeenumrequired

      One of "1", "2-5", "6-10", "11-25", "26-50", "50+"

    • workTypeenumrequired

      One of "domestic-cleaning", "commercial-cleaning", "end-of-tenancy-cleaning", "window-cleaning", "carpet-and-upholstery-cleaning", "plumbers", "heating-engineers", "electricians", "air-conditioning", "roofers", "property-maintenance", "facilities-management", "gardening-and-landscaping", "grounds-maintenance", "pest-control", "pool-and-hot-tub-care", "fire-safety-servicing", "security-patrols", "other"

    • workTypesarray of enumrequired
    • workTypeOtherstringrequiredcan be null
    • customerTypeenumrequired

      One of "commercial", "domestic", "both"

    • clientCountenumrequired

      One of "0-10", "11-50", "51-100", "101-250", "250+"

    • answeredAtstringrequired
  • closureobjectrequiredcan be null
    • closedAtstringrequired
    • deleteAfterstringrequired
curl "https://app.workscope.co.uk/v1/organization" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "timeZone": "text",
  "currency": "text",
  "modules": [
    "projects"
  ],
  "terms": {
    "client": {
      "one": "text",
      "many": "text"
    },
    "project": {
      "one": "text",
      "many": "text"
    },
    "booking": {
      "one": "text",
      "many": "text"
    },
    "job": {
      "one": "text",
      "many": "text"
    },
    "teamMember": {
      "one": "text",
      "many": "text"
    },
    "team": {
      "one": "text",
      "many": "text"
    }
  },
  "durationDisplay": "minutes",
  "weekStartsOn": "saturday",
  "needsClockInDefault": false,
  "recordClockLocation": false,
  "openPickup": false,
  "openNotifyDelayMinutes": 120,
  "missedClockInAlerts": false,
  "missedClockInGraceMinutes": 120,
  "phoneReminders": false,
  "photosVisibleToClients": true,
  "logoUrl": "https://example.co.uk",
  "address": "1 Harbour Road, Bristol",
  "phone": "0117 496 0123",
  "email": "office@example.co.uk",
  "website": "https://example.co.uk",
  "companyNumber": "text",
  "vatNumber": "text",
  "vatRegistered": false,
  "vatRateBp": 1207,
  "activeClientDays": -9007199254740991,
  "emailCopyToCompany": false,
  "profile": {
    "teamSize": "1",
    "workType": "domestic-cleaning",
    "workTypes": [
      "domestic-cleaning"
    ],
    "workTypeOther": "text",
    "customerType": "commercial",
    "clientCount": "0-10",
    "answeredAt": "2026-11-06T09:30:00.000Z"
  },
  "closure": {
    "closedAt": "2026-11-06T09:30:00.000Z",
    "deleteAfter": "text"
  }
}

Change settings

PATCH/v1/organization

Permission
organization.update
Answers
200

Request body JSON

  • namestringoptional

    1–200 characters

  • timeZonestringoptional
  • modulesarray of enumoptional
  • termsobjectoptional
    • clientobjectoptionalcan be null
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • projectobjectoptionalcan be null
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • bookingobjectoptionalcan be null
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamMemberobjectoptionalcan be null
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamobjectoptionalcan be null
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

  • durationDisplayenumoptional

    One of "minutes", "hours"

  • weekStartsOnenumoptional

    One of "saturday", "sunday", "monday"

  • needsClockInDefaultbooleanoptional
  • recordClockLocationbooleanoptional
  • openPickupbooleanoptional
  • openNotifyDelayMinutesintegeroptional

    0 to 60

  • missedClockInAlertsbooleanoptional
  • missedClockInGraceMinutesintegeroptional

    0 to 240

  • phoneRemindersbooleanoptional
  • photosVisibleToClientsbooleanoptional
  • invoiceSignedOffOnlybooleanoptional
  • activeClientDaysintegeroptional

    1 to 366

  • emailCopyToCompanybooleanoptional
  • addressstringoptionalcan be null

    Up to 500 characters

  • phonestringoptionalcan be null

    Up to 50 characters

  • emailconstant or stringoptionalcan be null
  • websitestringoptionalcan be null

    Up to 200 characters

  • companyNumberstringoptionalcan be null
  • vatNumberstringoptionalcan be null
  • vatRegisteredbooleanoptional
  • vatRateBpintegeroptional

    0 to 10000

  • profileobjectoptional
    • teamSizeenumrequired

      One of "1", "2-5", "6-10", "11-25", "26-50", "50+"

    • workTypeenumrequired

      One of "domestic-cleaning", "commercial-cleaning", "end-of-tenancy-cleaning", "window-cleaning", "carpet-and-upholstery-cleaning", "plumbers", "heating-engineers", "electricians", "air-conditioning", "roofers", "property-maintenance", "facilities-management", "gardening-and-landscaping", "grounds-maintenance", "pest-control", "pool-and-hot-tub-care", "fire-safety-servicing", "security-patrols", "other"

    • workTypesarray of enumoptionalcan be null

      Up to 19 items

    • workTypeOtherstringoptionalcan be null

      Up to 100 characters

    • customerTypeenumrequired

      One of "commercial", "domestic", "both"

    • clientCountenumrequired

      One of "0-10", "11-50", "51-100", "101-250", "250+"

Response object

  • iduuidrequired
  • namestringrequired
  • timeZonestringrequired
  • currencystringrequired
  • modulesarray of enumrequired
  • termsobjectrequired
    • clientobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • projectobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • bookingobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • jobobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamMemberobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

    • teamobjectrequired
      • onestringrequired

        1–40 characters

      • manystringrequired

        1–40 characters

  • durationDisplayenumrequired

    One of "minutes", "hours"

  • weekStartsOnenumrequired

    One of "saturday", "sunday", "monday"

  • needsClockInDefaultbooleanrequired
  • recordClockLocationbooleanrequired
  • openPickupbooleanrequired
  • openNotifyDelayMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • missedClockInAlertsbooleanrequired
  • missedClockInGraceMinutesintegerrequired

    -9007199254740991 to 9007199254740991

  • phoneRemindersbooleanrequired
  • photosVisibleToClientsbooleanrequired

    Default true

  • logoUrlstringrequiredcan be null
  • addressstringrequiredcan be null
  • phonestringrequiredcan be null
  • emailstringrequiredcan be null
  • websitestringrequiredcan be null
  • companyNumberstringrequiredcan be null
  • vatNumberstringrequiredcan be null
  • vatRegisteredbooleanrequired
  • vatRateBpintegerrequired

    -9007199254740991 to 9007199254740991

  • activeClientDaysintegerrequired

    -9007199254740991 to 9007199254740991

  • emailCopyToCompanybooleanrequired
  • profileobjectrequiredcan be null
    • teamSizeenumrequired

      One of "1", "2-5", "6-10", "11-25", "26-50", "50+"

    • workTypeenumrequired

      One of "domestic-cleaning", "commercial-cleaning", "end-of-tenancy-cleaning", "window-cleaning", "carpet-and-upholstery-cleaning", "plumbers", "heating-engineers", "electricians", "air-conditioning", "roofers", "property-maintenance", "facilities-management", "gardening-and-landscaping", "grounds-maintenance", "pest-control", "pool-and-hot-tub-care", "fire-safety-servicing", "security-patrols", "other"

    • workTypesarray of enumrequired
    • workTypeOtherstringrequiredcan be null
    • customerTypeenumrequired

      One of "commercial", "domestic", "both"

    • clientCountenumrequired

      One of "0-10", "11-50", "51-100", "101-250", "250+"

    • answeredAtstringrequired
  • closureobjectrequiredcan be null
    • closedAtstringrequired
    • deleteAfterstringrequired
curl -X PATCH "https://app.workscope.co.uk/v1/organization" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Harbourside Dental",
    "timeZone": "text",
    "modules": [
      "projects"
    ],
    "terms": {
      "client": {
        "one": "text",
        "many": "text"
      },
      "project": {
        "one": "text",
        "many": "text"
      },
      "booking": {
        "one": "text",
        "many": "text"
      },
      "teamMember": {
        "one": "text",
        "many": "text"
      },
      "team": {
        "one": "text",
        "many": "text"
      }
    },
    "durationDisplay": "minutes",
    "weekStartsOn": "saturday",
    "needsClockInDefault": false,
    "recordClockLocation": false,
    "openPickup": false,
    "openNotifyDelayMinutes": 120,
    "missedClockInAlerts": false,
    "missedClockInGraceMinutes": 120,
    "phoneReminders": false,
    "photosVisibleToClients": false,
    "invoiceSignedOffOnly": false,
    "activeClientDays": 1,
    "emailCopyToCompany": false,
    "address": "1 Harbour Road, Bristol",
    "phone": "0117 496 0123",
    "email": "",
    "website": "https://example.co.uk",
    "companyNumber": "text",
    "vatNumber": "text",
    "vatRegistered": false,
    "vatRateBp": 1207,
    "profile": {
      "teamSize": "1",
      "workType": "domestic-cleaning",
      "workTypes": [
        "domestic-cleaning"
      ],
      "workTypeOther": "text",
      "customerType": "commercial",
      "clientCount": "0-10"
    }
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "name": "Harbourside Dental",
  "timeZone": "text",
  "currency": "text",
  "modules": [
    "projects"
  ],
  "terms": {
    "client": {
      "one": "text",
      "many": "text"
    },
    "project": {
      "one": "text",
      "many": "text"
    },
    "booking": {
      "one": "text",
      "many": "text"
    },
    "job": {
      "one": "text",
      "many": "text"
    },
    "teamMember": {
      "one": "text",
      "many": "text"
    },
    "team": {
      "one": "text",
      "many": "text"
    }
  },
  "durationDisplay": "minutes",
  "weekStartsOn": "saturday",
  "needsClockInDefault": false,
  "recordClockLocation": false,
  "openPickup": false,
  "openNotifyDelayMinutes": 120,
  "missedClockInAlerts": false,
  "missedClockInGraceMinutes": 120,
  "phoneReminders": false,
  "photosVisibleToClients": true,
  "logoUrl": "https://example.co.uk",
  "address": "1 Harbour Road, Bristol",
  "phone": "0117 496 0123",
  "email": "office@example.co.uk",
  "website": "https://example.co.uk",
  "companyNumber": "text",
  "vatNumber": "text",
  "vatRegistered": false,
  "vatRateBp": 1207,
  "activeClientDays": -9007199254740991,
  "emailCopyToCompany": false,
  "profile": {
    "teamSize": "1",
    "workType": "domestic-cleaning",
    "workTypes": [
      "domestic-cleaning"
    ],
    "workTypeOther": "text",
    "customerType": "commercial",
    "clientCount": "0-10",
    "answeredAt": "2026-11-06T09:30:00.000Z"
  },
  "closure": {
    "closedAt": "2026-11-06T09:30:00.000Z",
    "deleteAfter": "text"
  }
}

Download the company's data: a ZIP of CSV files (clients, contacts, projects, bookings, repeat bookings, team members); owners only

GET/v1/organization/export

Permission
organization.close
Answers
200 with a file (image/jpeg)
curl "https://app.workscope.co.uk/v1/organization/export" \
  -H "Authorization: Bearer wsk_your_key_here"

Setting up a new company: where the guide carries on from, and the checklist Home shows (worked out from the company's data)

GET/v1/organization/setup

Permission
organization.update
Answers
200

Response object

  • stepenumrequired

    One of "company", "modules", "words", "money", "team", "clients", "done"

  • seenarray of enumrequired
  • checklistarray of objectrequired
    • keyenumrequired

      One of "company", "modules", "words", "money", "team", "clients", "job", "booking"

    • donebooleanrequired
  • completebooleanrequired
  • dismissedbooleanrequired
  • showbooleanrequired
curl "https://app.workscope.co.uk/v1/organization/setup" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "step": "company",
  "seen": [
    "company"
  ],
  "checklist": [
    {
      "key": "company",
      "done": false
    }
  ],
  "complete": false,
  "dismissed": false,
  "show": false
}

Move the setup guide on, mark a step finished, or hide the checklist

PATCH/v1/organization/setup

Permission
organization.update
Answers
200

Request body JSON

  • stepenumoptional

    One of "company", "modules", "words", "money", "team", "clients", "done"

  • seenenumoptional

    One of "company", "modules", "words", "money", "team", "clients"

  • dismissedbooleanoptional

Response object

  • stepenumrequired

    One of "company", "modules", "words", "money", "team", "clients", "done"

  • seenarray of enumrequired
  • checklistarray of objectrequired
    • keyenumrequired

      One of "company", "modules", "words", "money", "team", "clients", "job", "booking"

    • donebooleanrequired
  • completebooleanrequired
  • dismissedbooleanrequired
  • showbooleanrequired
curl -X PATCH "https://app.workscope.co.uk/v1/organization/setup" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "step": "company",
    "seen": "company",
    "dismissed": false
  }'

Example response

{
  "step": "company",
  "seen": [
    "company"
  ],
  "checklist": [
    {
      "key": "company",
      "done": false
    }
  ],
  "complete": false,
  "dismissed": false,
  "show": false
}

How the live sync from Xota is doing, and the differences left to decide

GET/v1/xota-sync

Permission
organization.update
Answers
200

Response object

  • setUpbooleanrequired
  • enabledbooleanrequired
  • xotaOrganizationIdstringrequiredcan be null
  • enabledAtstringrequiredcan be null
  • lastRunAtstringrequiredcan be null
  • lastOkAtstringrequiredcan be null
  • lastErrorstringrequiredcan be null
  • lastCountsobjectrequired
    • creatednumberrequired
    • updatednumberrequired
    • unchangednumberrequired
    • conflictsnumberrequired
    • failednumberrequired
    • skippednumberrequired
  • openConflictsnumberrequired
  • conflictsarray of objectrequired
    • idstringrequired
    • labelstringrequiredcan be null
    • tablestringrequired
    • fieldstringrequired
    • workscopeValueanyrequired
    • xotaValueanyrequired
    • seenAtstringrequired
curl "https://app.workscope.co.uk/v1/xota-sync" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "setUp": false,
  "enabled": false,
  "xotaOrganizationId": "text",
  "enabledAt": "2026-11-06T09:30:00.000Z",
  "lastRunAt": "2026-11-06T09:30:00.000Z",
  "lastOkAt": "2026-11-06T09:30:00.000Z",
  "lastError": "text",
  "lastCounts": {},
  "openConflicts": 1,
  "conflicts": [
    {
      "id": "text",
      "label": "text",
      "table": "text",
      "field": "text",
      "workscopeValue": null,
      "xotaValue": null,
      "seenAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}

Decide a difference: take Xota's value, or keep Workscope's

POST/v1/xota-sync/conflicts/{id}/resolve

Permission
organization.update
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • choiceenumrequired

    One of "xota", "workscope"

Response object

  • setUpbooleanrequired
  • enabledbooleanrequired
  • xotaOrganizationIdstringrequiredcan be null
  • enabledAtstringrequiredcan be null
  • lastRunAtstringrequiredcan be null
  • lastOkAtstringrequiredcan be null
  • lastErrorstringrequiredcan be null
  • lastCountsobjectrequired
    • creatednumberrequired
    • updatednumberrequired
    • unchangednumberrequired
    • conflictsnumberrequired
    • failednumberrequired
    • skippednumberrequired
  • openConflictsnumberrequired
  • conflictsarray of objectrequired
    • idstringrequired
    • labelstringrequiredcan be null
    • tablestringrequired
    • fieldstringrequired
    • workscopeValueanyrequired
    • xotaValueanyrequired
    • seenAtstringrequired
curl -X POST "https://app.workscope.co.uk/v1/xota-sync/conflicts/ID/resolve" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "choice": "xota"
  }'

Example response

{
  "setUp": false,
  "enabled": false,
  "xotaOrganizationId": "text",
  "enabledAt": "2026-11-06T09:30:00.000Z",
  "lastRunAt": "2026-11-06T09:30:00.000Z",
  "lastOkAt": "2026-11-06T09:30:00.000Z",
  "lastError": "text",
  "lastCounts": {},
  "openConflicts": 1,
  "conflicts": [
    {
      "id": "text",
      "label": "text",
      "table": "text",
      "field": "text",
      "workscopeValue": null,
      "xotaValue": null,
      "seenAt": "2026-11-06T09:30:00.000Z"
    }
  ]
}