WorkscopeAPI Open Workscope

API reference

Webhooks

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

On this page

The company's webhook endpoints, each with its latest delivery (never the secrets)

GET/v1/webhook-endpoints

Permission
users.manage
Answers
200

Response array of object

  • iduuidrequired
  • urlstringrequired
  • descriptionstringrequiredcan be null
  • eventsarray of stringrequired
  • enabledbooleanrequired
  • disabledReasonstringrequiredcan be null
  • createdByNamestringrequiredcan be null
  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • lastDeliveryobjectrequiredcan be null
    • atdate-timerequired

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • eventstringrequired
    • statusenumrequired

      One of "pending", "delivered", "failed"

    • statusCodeintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

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

Example response

[
  {
    "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
    "url": "https://example.co.uk",
    "description": "Side gate code is on the key safe.",
    "events": [
      "text"
    ],
    "enabled": false,
    "disabledReason": "text",
    "createdByName": "Harbourside Dental",
    "createdAt": "2026-11-06T09:30:00.000Z",
    "lastDelivery": {
      "at": "2026-11-06T09:30:00.000Z",
      "event": "text",
      "status": "pending",
      "statusCode": -9007199254740991
    }
  }
]

Add an endpoint. The answer is the only time its signing secret is shown.

POST/v1/webhook-endpoints

Permission
users.manage
Answers
201

Request body JSON

  • urlstringrequired

    Up to 2000 characters

  • descriptionstringoptionalcan be null

    Up to 200 characters

  • eventsarray of enum or constantrequired

    At least 1 item

Response object

  • iduuidrequired
  • urlstringrequired
  • descriptionstringrequiredcan be null
  • eventsarray of stringrequired
  • enabledbooleanrequired
  • disabledReasonstringrequiredcan be null
  • createdByNamestringrequiredcan be null
  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • lastDeliveryobjectrequiredcan be null
    • atdate-timerequired

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • eventstringrequired
    • statusenumrequired

      One of "pending", "delivered", "failed"

    • statusCodeintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

  • secretstringrequired
curl -X POST "https://app.workscope.co.uk/v1/webhook-endpoints" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.co.uk",
    "description": "Side gate code is on the key safe.",
    "events": [
      "booking.created"
    ]
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "url": "https://example.co.uk",
  "description": "Side gate code is on the key safe.",
  "events": [
    "text"
  ],
  "enabled": false,
  "disabledReason": "text",
  "createdByName": "Harbourside Dental",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "lastDelivery": {
    "at": "2026-11-06T09:30:00.000Z",
    "event": "text",
    "status": "pending",
    "statusCode": -9007199254740991
  },
  "secret": "text"
}

Change its address, description or events, or switch it off and on (on again clears the failures)

PATCH/v1/webhook-endpoints/{id}

Permission
users.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Request body JSON

  • urlstringoptional

    Up to 2000 characters

  • descriptionstringoptionalcan be null

    Up to 200 characters

  • eventsarray of enum or constantoptional

    At least 1 item

  • enabledbooleanoptional

Response object

  • iduuidrequired
  • urlstringrequired
  • descriptionstringrequiredcan be null
  • eventsarray of stringrequired
  • enabledbooleanrequired
  • disabledReasonstringrequiredcan be null
  • createdByNamestringrequiredcan be null
  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • lastDeliveryobjectrequiredcan be null
    • atdate-timerequired

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • eventstringrequired
    • statusenumrequired

      One of "pending", "delivered", "failed"

    • statusCodeintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

curl -X PATCH "https://app.workscope.co.uk/v1/webhook-endpoints/ID" \
  -H "Authorization: Bearer wsk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.co.uk",
    "description": "Side gate code is on the key safe.",
    "events": [
      "booking.created"
    ],
    "enabled": false
  }'

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "url": "https://example.co.uk",
  "description": "Side gate code is on the key safe.",
  "events": [
    "text"
  ],
  "enabled": false,
  "disabledReason": "text",
  "createdByName": "Harbourside Dental",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "lastDelivery": {
    "at": "2026-11-06T09:30:00.000Z",
    "event": "text",
    "status": "pending",
    "statusCode": -9007199254740991
  }
}

Delete an endpoint and its delivery log

DELETE/v1/webhook-endpoints/{id}

Permission
users.manage
Answers
204 with no body

Parameters

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

What was sent to it, newest first (kept 30 days)

GET/v1/webhook-endpoints/{id}/deliveries

Permission
users.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired
beforequeryuuid
limitqueryintegerDefault 25

Response object

  • itemsarray of objectrequired
    • iduuidrequired
    • eventstringrequired
    • eventIduuidrequired
    • statusenumrequired

      One of "pending", "delivered", "failed"

    • attemptsintegerrequired

      -9007199254740991 to 9007199254740991

    • nextAttemptAtdate-timerequiredcan be null

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • statusCodeintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • errorstringrequiredcan be null
    • responseMsintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

    • createdAtdate-timerequired

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • deliveredAtdate-timerequiredcan be null

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • payloadanyrequired
  • morebooleanrequired
curl "https://app.workscope.co.uk/v1/webhook-endpoints/ID/deliveries" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "items": [
    {
      "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
      "event": "text",
      "eventId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "status": "pending",
      "attempts": -9007199254740991,
      "nextAttemptAt": "2026-11-06T09:30:00.000Z",
      "statusCode": -9007199254740991,
      "error": "text",
      "responseMs": -9007199254740991,
      "createdAt": "2026-11-06T09:30:00.000Z",
      "deliveredAt": "2026-11-06T09:30:00.000Z",
      "payload": null
    }
  ],
  "more": false
}

Send a delivery again now (the same event id, so a receiver can tell it is a repeat)

POST/v1/webhook-endpoints/{id}/deliveries/{deliveryId}/redeliver

Permission
users.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired
deliveryIdpathuuidrequired

Response object

  • iduuidrequired
  • eventstringrequired
  • eventIduuidrequired
  • statusenumrequired

    One of "pending", "delivered", "failed"

  • attemptsintegerrequired

    -9007199254740991 to 9007199254740991

  • nextAttemptAtdate-timerequiredcan be null

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • statusCodeintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • errorstringrequiredcan be null
  • responseMsintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • deliveredAtdate-timerequiredcan be null

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • payloadanyrequired
curl -X POST "https://app.workscope.co.uk/v1/webhook-endpoints/ID/deliveries/ID/redeliver" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "event": "text",
  "eventId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "status": "pending",
  "attempts": -9007199254740991,
  "nextAttemptAt": "2026-11-06T09:30:00.000Z",
  "statusCode": -9007199254740991,
  "error": "text",
  "responseMs": -9007199254740991,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "deliveredAt": "2026-11-06T09:30:00.000Z",
  "payload": null
}

Give it a new signing secret (shown once); the old one stops at once

POST/v1/webhook-endpoints/{id}/rotate-secret

Permission
users.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • urlstringrequired
  • descriptionstringrequiredcan be null
  • eventsarray of stringrequired
  • enabledbooleanrequired
  • disabledReasonstringrequiredcan be null
  • createdByNamestringrequiredcan be null
  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • lastDeliveryobjectrequiredcan be null
    • atdate-timerequired

      Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

    • eventstringrequired
    • statusenumrequired

      One of "pending", "delivered", "failed"

    • statusCodeintegerrequiredcan be null

      -9007199254740991 to 9007199254740991

  • secretstringrequired
curl -X POST "https://app.workscope.co.uk/v1/webhook-endpoints/ID/rotate-secret" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "url": "https://example.co.uk",
  "description": "Side gate code is on the key safe.",
  "events": [
    "text"
  ],
  "enabled": false,
  "disabledReason": "text",
  "createdByName": "Harbourside Dental",
  "createdAt": "2026-11-06T09:30:00.000Z",
  "lastDelivery": {
    "at": "2026-11-06T09:30:00.000Z",
    "event": "text",
    "status": "pending",
    "statusCode": -9007199254740991
  },
  "secret": "text"
}

Send a 'ping' event now, to check the endpoint works; answers with the delivery

POST/v1/webhook-endpoints/{id}/test

Permission
users.manage
Answers
200

Parameters

NameInKind
idpathuuidrequired

Response object

  • iduuidrequired
  • eventstringrequired
  • eventIduuidrequired
  • statusenumrequired

    One of "pending", "delivered", "failed"

  • attemptsintegerrequired

    -9007199254740991 to 9007199254740991

  • nextAttemptAtdate-timerequiredcan be null

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • statusCodeintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • errorstringrequiredcan be null
  • responseMsintegerrequiredcan be null

    -9007199254740991 to 9007199254740991

  • createdAtdate-timerequired

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • deliveredAtdate-timerequiredcan be null

    Matches ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$

  • payloadanyrequired
curl -X POST "https://app.workscope.co.uk/v1/webhook-endpoints/ID/test" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

{
  "id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
  "event": "text",
  "eventId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "status": "pending",
  "attempts": -9007199254740991,
  "nextAttemptAt": "2026-11-06T09:30:00.000Z",
  "statusCode": -9007199254740991,
  "error": "text",
  "responseMs": -9007199254740991,
  "createdAt": "2026-11-06T09:30:00.000Z",
  "deliveredAt": "2026-11-06T09:30:00.000Z",
  "payload": null
}

Every event Workscope can send, what it means and what its data is

GET/v1/webhook-endpoints/events

Permission
users.manage
Answers
200

Response array of object

  • eventstringrequired
  • groupenumrequired

    One of "work", "team", "money", "sales", "clients"

  • descriptionstringrequired
  • datastringrequired
curl "https://app.workscope.co.uk/v1/webhook-endpoints/events" \
  -H "Authorization: Bearer wsk_your_key_here"

Example response

[
  {
    "event": "text",
    "group": "work",
    "description": "Side gate code is on the key safe.",
    "data": "text"
  }
]