Query Projects
Retrieve a list of company projects
/projects
Parameters
| Name |
Required |
Default |
Type/Format |
Description |
| archived |
no |
False |
Boolean |
set to true to retrieve archived/closed projects |
| rootOnly |
no |
False |
Boolean |
if set to true returns only root projects |
Response
Sample response →
[
{
"id": "PROJECT-ID",
"name": "Client Projects",
"description": "",
"endDate": null,
"estimate": null,
"moment_created": "2015-11-14T14:52:57.26943",
"parentProjectId": "PARENT-ID",
"priority": 5,
"progress": null,
"startDate": null,
"status": "In Progress",
"systemStatus": 2
"statusComments": "comments",
"customFieldsData": {
"CUSTOM-FIELD-ID": "CUSTOM-FIELD-VALUE"
}
},
...
]
Get Project
Get project details
/project/PROJECT-ID
Response
Sample response →
{
"id": "PROJECT-ID",
"name": "Client Project",
"description": "",
"endDate": null,
"estimate": null,
"moment_created": "2015-11-14T14:52:57.26943",
"parentProjectId": "PARENT-PROJECT-ID",
"priority": 5,
"progress": null,
"startDate": null,
"status": "In Progress",
"statusComments": "",
"systemStatus": 2,
"customFieldsData": {
"CUSTOM-FIELD-ID": "CUSTOM-FIELD-VALUE"
},
"settings": {
"workItems": [
"ATTACHMENT",
"DISCUSSION",
"DOCUMENT",
"EVENT",
"MEETING",
"PROJECT",
"REQUEST_FORM",
"TASK",
"EXPENSE"
],
"additionalTaskCustomFields": ["CUSTOM-FIELD-ID", ],
"taskCustomWorkflow": ["STATUS-ID", ],
"taskTypes": ["TASK-TYPE-ID", ],
}
}
Update Project
Update project properties. All the parameters are optional and won't be updated if not passed. Set to null to reset.
/project/PROJECT-ID
Parameters
| Name |
Required |
Type/Format |
Description |
| userId |
yes |
String |
User on behalf of whom API will execute update |
| name |
no |
String |
Project name |
| description |
no |
String |
Project description |
| color |
no |
Integer |
Project color (1-24) |
| health |
no |
Integer |
Project health (0,1,2,null) |
| statusComments |
no |
String |
Project status comments |
| parentProjectId |
no |
String |
Move a project to a different project/folder |
| ownerUserId |
no |
String |
Set the project owner. The user must already be a member of the project. Pass 'null' to remove the current owner |
| startDate |
no |
YYYY-MM-DD |
Project start date, 'null' to reset |
| endDate |
no |
YYYY-MM-DD |
Project end date, 'null' to reset |
| priority |
no |
Integer |
Project priority (1-10), 50 - Blocker, 100 - Emergency |
| estimate |
no |
Integer |
Project estimate in minutes, 'null' to reset |
| progress |
no |
Integer |
Project progress percentage (0-100) or 'null' to reset |
| systemStatus |
no |
Integer |
Pass 5 to archive, 2 to re-open |
| statusId |
no |
String |
Project status id. Not supported for folders and tags. If both statusId and systemStatus are passed, statusId wins. The project's system status will be set automatically based on the chosen status (archiving it if the status is a closed one) |
Sample CURL →
curl -X PUT
https://api.goodday.work/2.0/project/PROJECT-ID
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"userId": "USER-ID",
"startDate":"2023-01-15",
"endDate":"2023-01-25",
"progress":70
}'
Create Folder
Create new workfolder
/projects/new-folder
Parameters
| Name |
Required |
Type/Format |
Description |
| createdByUserId |
yes |
String |
ID of a user, a new record is created on behalf of |
| parentProjectId |
no |
String |
Pass parent project ID to create a subfolder |
| name |
yes |
String |
Folder name |
| color |
no |
Integer |
Folder color (1..24) |
Sample CURL →
curl -X POST
https://api.goodday.work/2.0/projects/new-folder
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"createdByUserId": "USER-ID",
"name": "New Folder name",
"parentProjectId": "PROJECT-ID"
}'
Response
Sample response →
{
"id": "PROJECT-ID",
"name": "Folder Name",
"description": "",
"endDate": null,
"estimate": null,
"moment_created": "2015-11-14T14:52:57.26943",
"parentProjectId": "PARENT-PROJECT-ID",
"priority": 5,
"progress": null,
"startDate": null,
"status": "In Progress",
"statusComments": "",
"systemStatus": 2
}
Create Project
Create new project
/projects/new-project
Parameters
| Name |
Required |
Type/Format |
Description |
| createdByUserId |
yes |
String |
ID of a user, a new record is created on behalf of |
| projectTemplateId |
yes |
String |
Project template (type) ID you can find in Organization settings → Project templates |
| parentProjectId |
no |
String |
Pass parent project ID to create a sub project |
| name |
yes |
String |
Project name |
| color |
no |
Integer |
Folder color (1..24) |
| projectOwnerUserId |
no |
String |
Project owner user ID |
| startDate |
no |
YYYY-MM-DD |
Project start date |
| endDate |
no |
YYYY-MM-DD |
Project end date |
| deadline |
no |
YYYY-MM-DD |
Project deadline |
Sample CURL →
curl -X POST
https://api.goodday.work/2.0/projects/new-project
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"createdByUserId": "USER-ID",
"projectTemplateId": "TEMPLATE-ID",
"name": "New Project name",
"parentProjectId": "PARENT-PROJECT-ID",
"projectOwnerUserId": "PROJECT-OWNER-USER-ID",
"deadline": "2020-04-01"
}'
Response
Sample response →
{
"id": "PROJECT-ID",
"name": "New Project Name",
"description": "",
"endDate": null,
"estimate": null,
"moment_created": "2020-03-28T14:52:57.26943",
"parentProjectId": "PARENT-PROJECT-ID",
"priority": 5,
"progress": null,
"startDate": null,
"status": "In Progress",
"statusComments": "",
"systemStatus": 2
}
Query project tasks
Retrieve a list of project tasks
/project/PROJECT-ID/tasks
Parameters
| Name |
Required |
Default |
Type/Format |
Description |
| closed |
no |
False |
Boolean |
set to true to retrieve all open and closed tasks |
| subfolders |
no |
False |
Boolean |
if set to true returns tasks from project it's subfolders |
Response
Sample response →
[
{
"id": "TASK-ID",
"shortId": "75",
"actionRequiredUserId": USER-ID,
"assignedToUserId": "USER-ID",
"createdByUserId": "USER-ID",
"customFieldsData": {
"CUSTOM-FIELD-ID": "CUSTOM-FIELD-VALUE"
},
"deadline": null,
"endDate": null,
"estimate": null,
"momentClosed": null,
"momentCreated": "2018-09-07T19:35:32.09136",
"name": "Sample task name",
"parentTaskId": null,
"priority": 5,
"progress": null,
"projectId": "PROJECT-ID",
"recentActivityMoment": "2018-10-30T15:15:20.437519",
"reportedTime": null,
"scheduleDate": null,
"scheduleStatus": 0,
"startDate": null,
"status": {
"id": "STATUS-ID",
"name": "New"
},
"systemStatus": 1,
"systemType": 1,
"taskType": {
"id": "TASK-TYPE-ID",
"name": "Task"
},
"users": [
"USER-ID",
"USER-ID"
],
"formSubmission": null
},
{
"id": "TASK-ID",
"shortId": "76",
"actionRequiredUserId": "USER-ID",
"assignedToUserId": "USER-ID",
"createdByUserId": null,
"customFieldsData": {
"CUSTOM-FIELD-ID": "CUSTOM-FIELD-VALUE"
},
"deadline": null,
"endDate": null,
"estimate": null,
"momentClosed": null,
"momentCreated": "2018-09-08T10:00:00.000000",
"name": "Support request from form",
"parentTaskId": null,
"priority": 5,
"progress": null,
"projectId": "PROJECT-ID",
"recentActivityMoment": "2018-09-08T10:00:00.000000",
"reportedTime": null,
"scheduleDate": null,
"scheduleStatus": 0,
"startDate": null,
"status": {
"id": "STATUS-ID",
"name": "New"
},
"systemStatus": 1,
"systemType": 1,
"taskType": {
"id": "TASK-TYPE-ID",
"name": "Task"
},
"users": [
"USER-ID"
],
"formSubmission": {
"requestFormName": "Technical Support",
"formFields": [
{
"config": {
"fieldId": "request-type",
"label": "Request type",
"type": "dropdown",
"options": ["Bug", "Feature", "Other"],
"isRequired": false,
"description": ""
},
"value": "Bug"
},
{
"config": {
"fieldId": "form-field-3",
"label": "Description",
"type": "textarea",
"isRequired": false,
"description": ""
},
"value": "Login page throws 500 error"
}
]
}
},
...
]
Query tag tasks
Retrieve a list of tag tasks
/tag/TAG-ID/tasks
Parameters
| Name |
Required |
Default |
Type/Format |
Description |
| closed |
no |
False |
Boolean |
set to true to retrieve all open and closed tasks |
Response
Sample response →
[
{
"id": "TASK-ID",
"shortId": "75",
"actionRequiredUserId": USER-ID,
"assignedToUserId": "USER-ID",
"createdByUserId": "USER-ID",
"customFieldsData": {
"CUSTOM-FIELD-ID": "CUSTOM-FIELD-VALUE"
},
"deadline": null,
"endDate": null,
"estimate": null,
"momentClosed": null,
"momentCreated": "2018-09-07T19:35:32.09136",
"name": "Sample task name",
"parentTaskId": null,
"priority": 5,
"progress": null,
"projectId": "PROJECT-ID",
"recentActivityMoment": "2018-10-30T15:15:20.437519",
"reportedTime": null,
"scheduleDate": null,
"scheduleStatus": 0,
"startDate": null,
"status": {
"id": "STATUS-ID",
"name": "New"
},
"systemStatus": 1,
"systemType": 1,
"taskType": {
"id": "TASK-TYPE-ID",
"name": "Task"
},
"users": [
"USER-ID",
"USER-ID"
]
},
...
]
Query project users
Retrieve project users list
/project/PROJECT-ID/users
Response
Sample response →
[
{
"access": "Standard",
"id": "USER-ID",
"name": "Alex Kim",
"primaryEmail": "alex@company.com",
"watchAll": false
},
...
]
Add user to project
Add a company member to a project. For a non-Workspace project the user must already be a member of the Workspace.
/project/PROJECT-ID/user/USER-ID
Parameters
| Name |
Required |
Type/Format |
Description |
| userId |
yes |
String |
User on behalf of whom API will execute the action |
| access |
yes |
Integer |
Project access level: 1 = Limited, 2 = Standard, 3 = Full |
Sample CURL →
curl -X POST
https://api.goodday.work/2.0/project/PROJECT-ID/user/USER-ID
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"userId": "CALLER-USER-ID",
"access": 2
}'
Update project user access
Change a user's access level in a project. If the new access is "Read only" or "Read only + comment", any items currently assigned to the user in this project (tasks, milestones, sub-projects) are automatically unassigned or reassigned to the project owner, since a read-only user cannot own work.
/project/PROJECT-ID/user/USER-ID
Parameters
| Name |
Required |
Type/Format |
Description |
| userId |
yes |
String |
User on behalf of whom API will execute the action |
| access |
yes |
Integer |
New access level: -10 = Read only, -5 = Read only + comment, 1 = Limited, 2 = Standard, 3 = Full |
Sample CURL →
curl -X PUT
https://api.goodday.work/2.0/project/PROJECT-ID/user/USER-ID
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"userId": "CALLER-USER-ID",
"access": 3
}'
Remove user from project
Remove a user from a project. Any items currently assigned to the user (tasks, milestones, sub-projects) are automatically reassigned to the project owner. The project owner cannot be removed (change the owner first via PUT /project/PROJECT-ID). Users cannot be removed from public projects or when they are inherited from a parent project, a team, or have company-wide full access.
/project/PROJECT-ID/user/USER-ID
Parameters
| Name |
Required |
Type/Format |
Description |
| userId |
yes |
String |
User on behalf of whom API will execute the action |
Sample CURL →
curl -X DELETE
https://api.goodday.work/2.0/project/PROJECT-ID/user/USER-ID
-H "Content-Type: application/json"
-H "gd-api-token: AUTH-TOKEN"
-d '{
"userId": "CALLER-USER-ID"
}'
Get Project History
Retrieve a list of history events for a projec
/projects/PROJECT-ID/history
Response
Sample response →
[
{
"eventType": "STATUS_COMMENTS_UPDATED",
"id": "HISTORY-EVENT-ID",
"momentCreated": "2025-09-22T09:56:59.118157",
"params": {
"newValue": "Status updated...",
"oldValue": null
},
"userId": "USER-ID"
},
...
]