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
iduuidrequiredurlstringrequireddescriptionstringrequiredcan be nulleventsarray of stringrequiredenabledbooleanrequireddisabledReasonstringrequiredcan be nullcreatedByNamestringrequiredcan be nullcreatedAtdate-timerequiredMatches
^(?:(?:\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 nullatdate-timerequiredMatches
^(?:(?:\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)))$eventstringrequiredstatusenumrequiredOne 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
urlstringrequiredUp to 2000 characters
descriptionstringoptionalcan be nullUp to 200 characters
eventsarray of enum or constantrequiredAt least 1 item
Response object
iduuidrequiredurlstringrequireddescriptionstringrequiredcan be nulleventsarray of stringrequiredenabledbooleanrequireddisabledReasonstringrequiredcan be nullcreatedByNamestringrequiredcan be nullcreatedAtdate-timerequiredMatches
^(?:(?:\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 nullatdate-timerequiredMatches
^(?:(?:\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)))$eventstringrequiredstatusenumrequiredOne 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
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
urlstringoptionalUp to 2000 characters
descriptionstringoptionalcan be nullUp to 200 characters
eventsarray of enum or constantoptionalAt least 1 item
enabledbooleanoptional
Response object
iduuidrequiredurlstringrequireddescriptionstringrequiredcan be nulleventsarray of stringrequiredenabledbooleanrequireddisabledReasonstringrequiredcan be nullcreatedByNamestringrequiredcan be nullcreatedAtdate-timerequiredMatches
^(?:(?:\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 nullatdate-timerequiredMatches
^(?:(?:\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)))$eventstringrequiredstatusenumrequiredOne 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
204with no body
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
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
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
before | query | uuid | |
limit | query | integer | Default 25 |
Response object
itemsarray of objectrequirediduuidrequiredeventstringrequiredeventIduuidrequiredstatusenumrequiredOne of
"pending","delivered","failed"attemptsintegerrequired-9007199254740991 to 9007199254740991
nextAttemptAtdate-timerequiredcan be nullMatches
^(?:(?:\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 nullresponseMsintegerrequiredcan be null-9007199254740991 to 9007199254740991
createdAtdate-timerequiredMatches
^(?:(?:\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 nullMatches
^(?:(?:\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
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
deliveryId | path | uuidrequired |
Response object
iduuidrequiredeventstringrequiredeventIduuidrequiredstatusenumrequiredOne of
"pending","delivered","failed"attemptsintegerrequired-9007199254740991 to 9007199254740991
nextAttemptAtdate-timerequiredcan be nullMatches
^(?:(?:\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 nullresponseMsintegerrequiredcan be null-9007199254740991 to 9007199254740991
createdAtdate-timerequiredMatches
^(?:(?:\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 nullMatches
^(?:(?:\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
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredurlstringrequireddescriptionstringrequiredcan be nulleventsarray of stringrequiredenabledbooleanrequireddisabledReasonstringrequiredcan be nullcreatedByNamestringrequiredcan be nullcreatedAtdate-timerequiredMatches
^(?:(?:\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 nullatdate-timerequiredMatches
^(?:(?:\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)))$eventstringrequiredstatusenumrequiredOne 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
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredeventstringrequiredeventIduuidrequiredstatusenumrequiredOne of
"pending","delivered","failed"attemptsintegerrequired-9007199254740991 to 9007199254740991
nextAttemptAtdate-timerequiredcan be nullMatches
^(?:(?:\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 nullresponseMsintegerrequiredcan be null-9007199254740991 to 9007199254740991
createdAtdate-timerequiredMatches
^(?:(?:\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 nullMatches
^(?:(?:\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
eventstringrequiredgroupenumrequiredOne of
"work","team","money","sales","clients"descriptionstringrequireddatastringrequired
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"
}
]