API reference
Projects
14 requests. Each shows the permission a key needs, what to send and what comes back.
On this page
Projects (optional pieces of work under a client)
GET/v1/projects
- Permission
project.view- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
clientId | query | uuid | |
status | query | enum | One of active, archived |
q | query | string |
Response array of object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl "https://app.workscope.co.uk/v1/projects" \
-H "Authorization: Bearer wsk_your_key_here"Example response
[
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}
]Add a project
POST/v1/projects
- Permission
project.manage- Module
projects- Answers
201
Request body JSON
clientIduuidrequirednamestringrequired1–200 characters
descriptionstringoptionalcan be nullUp to 5000 characters
startDatedateoptionalcan be nullYYYY-MM-DD
endDatedateoptionalcan be nullYYYY-MM-DD
notesstringoptionalcan be nullUp to 5000 characters
customFieldsobjectoptional
Response object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl -X POST "https://app.workscope.co.uk/v1/projects" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"clientId": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"customFields": {
"contract-number": "CN-1042"
}
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}One project
GET/v1/projects/{id}
- Permission
project.view- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl "https://app.workscope.co.uk/v1/projects/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}Change or archive a project
PATCH/v1/projects/{id}
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
namestringoptional1–200 characters
descriptionstringoptionalcan be nullUp to 5000 characters
startDatedateoptionalcan be nullYYYY-MM-DD
endDatedateoptionalcan be nullYYYY-MM-DD
notesstringoptionalcan be nullUp to 5000 characters
statusenumoptionalOne of
"active","archived"customFieldsobjectoptional
Response object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl -X PATCH "https://app.workscope.co.uk/v1/projects/ID" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"customFields": {
"contract-number": "CN-1042"
}
}'Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}A project's brief: text and images (and whether its public report link is on)
GET/v1/projects/{id}/brief
- Permission
project.view- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
textstringrequiredcan be nullimagesarray of objectrequirediduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
createdAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
publicTokenstringrequiredcan be null
curl "https://app.workscope.co.uk/v1/projects/ID/brief" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"text": "text",
"images": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}
],
"publicToken": "wsk_example"
}Change a project's brief text
PATCH/v1/projects/{id}/brief
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
textstringoptionalcan be nullUp to 20000 characters
Response object
textstringrequiredcan be nullimagesarray of objectrequirediduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
createdAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
publicTokenstringrequiredcan be null
curl -X PATCH "https://app.workscope.co.uk/v1/projects/ID/brief" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"text": "text"
}'Example response
{
"text": "text",
"images": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}
],
"publicToken": "wsk_example"
}Add an image to the brief: send the image itself (JPEG, PNG, WebP; up to 15 MB). Location and other metadata are removed.
POST/v1/projects/{id}/brief/images
- Permission
project.manage- Answers
201
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body the file itself
Send the file as the body, with Content-Type one of image/jpeg, image/png, image/webp, image/heic, image/heif. See Files and photos.
Response object
textstringrequiredcan be nullimagesarray of objectrequirediduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
createdAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
publicTokenstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/projects/ID/brief/images" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgExample response
{
"text": "text",
"images": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}
],
"publicToken": "wsk_example"
}Remove a brief image
DELETE/v1/projects/{id}/brief/images/{imageId}
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
imageId | path | uuidrequired |
Response object
textstringrequiredcan be nullimagesarray of objectrequirediduuidrequiredwidthintegerrequired-9007199254740991 to 9007199254740991
heightintegerrequired-9007199254740991 to 9007199254740991
createdAtstringrequiredthumbUrlstringrequiredfullUrlstringrequired
publicTokenstringrequiredcan be null
curl -X DELETE "https://app.workscope.co.uk/v1/projects/ID/brief/images/ID" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"text": "text",
"images": [
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"width": -9007199254740991,
"height": -9007199254740991,
"createdAt": "2026-11-06T09:30:00.000Z",
"thumbUrl": "https://example.co.uk",
"fullUrl": "https://example.co.uk"
}
],
"publicToken": "wsk_example"
}A brief image (thumb or full size)
GET/v1/projects/{id}/brief/images/{imageId}/{size}
- Permission
project.view- Answers
200with a file (image/jpeg)
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired | |
imageId | path | uuidrequired | |
size | path | enumrequired | One of thumb, full |
curl "https://app.workscope.co.uk/v1/projects/ID/brief/images/ID/SIZE" \
-H "Authorization: Bearer wsk_your_key_here"The project's logo (PNG)
GET/v1/projects/{id}/logo
- Permission
project.view- Answers
200with a file (image/jpeg)
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
curl "https://app.workscope.co.uk/v1/projects/ID/logo" \
-H "Authorization: Bearer wsk_your_key_here"Set a project's logo: send the image itself (JPEG, PNG, WebP; up to 5 MB)
POST/v1/projects/{id}/logo
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body the file itself
Send the file as the body, with Content-Type one of image/jpeg, image/png, image/webp. See Files and photos.
Response object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl -X POST "https://app.workscope.co.uk/v1/projects/ID/logo" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgExample response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}Remove a project's logo
DELETE/v1/projects/{id}/logo
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
iduuidrequiredclientIduuidrequiredclientNamestringrequirednamestringrequireddescriptionstringrequiredcan be nullstartDatedaterequiredcan be nullYYYY-MM-DD
endDatedaterequiredcan be nullYYYY-MM-DD
notesstringrequiredcan be nullstatusenumrequiredOne of
"active","archived"logoUrlstringrequiredcan be nullclientLogoUrlstringrequiredcan be nullcustomFieldsobjectrequired
curl -X DELETE "https://app.workscope.co.uk/v1/projects/ID/logo" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"id": "3f2a9c1e-6b4d-4e8a-9f1c-2d7b5a0e8c41",
"clientId": "8c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
"clientName": "Harbourside Dental",
"name": "Harbourside Dental",
"description": "Side gate code is on the key safe.",
"startDate": "2026-11-06",
"endDate": "2026-11-06",
"notes": "Side gate code is on the key safe.",
"status": "active",
"logoUrl": "https://example.co.uk",
"clientLogoUrl": "https://example.co.uk",
"customFields": {
"contract-number": "CN-1042"
}
}Turn on the project's public report link, or make a new one (the old link stops working)
POST/v1/projects/{id}/public-link
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Request body JSON
actionenumoptionalOne of
"create","regenerate"· Default"create"
Response object
publicTokenstringrequiredcan be null
curl -X POST "https://app.workscope.co.uk/v1/projects/ID/public-link" \
-H "Authorization: Bearer wsk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"action": "create"
}'Example response
{
"publicToken": "wsk_example"
}Turn the public report link off
DELETE/v1/projects/{id}/public-link
- Permission
project.manage- Answers
200
Parameters
| Name | In | Kind | |
|---|---|---|---|
id | path | uuidrequired |
Response object
publicTokenstringrequiredcan be null
curl -X DELETE "https://app.workscope.co.uk/v1/projects/ID/public-link" \
-H "Authorization: Bearer wsk_your_key_here"Example response
{
"publicToken": "wsk_example"
}