# Subtasks
The Subtasks API allows you to manage subtasks within main tasks in Fluent Boards. Subtasks are regular tasks with a parent_id
field that references their parent task, organized in groups for better organization.
# Base Endpoint
/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtasks
{
"id": 123,
"parent_id": "456",
"board_id": "3",
"crm_contact_id": null,
"title": "Create wireframes",
"slug": "create-wireframes",
"type": "task",
"status": "closed",
"stage_id": "25",
"source": "web",
"source_id": null,
"priority": "low",
"description": "Design wireframes for the new feature",
"lead_value": "0.00",
"created_by": "1",
"position": "1.00",
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": null
},
"subtask_count": null
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": "2024-01-15 08:01:43",
"archived_at": null,
"created_at": "2024-01-15T08:43:52+00:00",
"updated_at": "2024-01-15T08:01:43+00:00",
"meta": {
"subtask_group_id": "127"
},
"repeat_task_meta": null,
"assignees": []
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# List Subtasks
Retrieve all subtasks for a parent task, organized by groups.
HTTP Request
GET /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtasks
# Example Request
curl "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtasks" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD"
2
# Example Response
{
"subtaskGroups": [
{
"id": 127,
"task_id": 456,
"subtasks": [
{
"id": 123,
"parent_id": "456",
"board_id": "3",
"crm_contact_id": null,
"title": "Create wireframes",
"slug": "create-wireframes",
"type": "task",
"status": "closed",
"stage_id": "25",
"source": "web",
"source_id": null,
"priority": "low",
"description": "Design wireframes for the new feature",
"lead_value": "0.00",
"created_by": "1",
"position": "1.00",
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": null
},
"subtask_count": null
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": "2024-01-15 08:01:43",
"archived_at": null,
"created_at": "2024-01-15T08:43:52+00:00",
"updated_at": "2024-01-15T08:01:43+00:00",
"meta": {
"subtask_group_id": "127"
},
"repeat_task_meta": null,
"assignees": []
}
],
"value": "Design Phase"
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# Create a Subtask
Create a new subtask within a parent task.
HTTP Request
POST /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtasks
# Example Request
curl -X POST "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtasks" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"title": "The new subtask",
"group_id": 127,
"due_at": null,
"add_to_top": false
}'
2
3
4
5
6
7
8
9
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Yes | Title of the subtask |
group_id | int | Yes | ID of the subtask group |
due_at | string or null | No | Due date-time in ISO 8601 format or null |
add_to_top | boolean | No | If true, adds the subtask at the top of the group (default: false) |
# Example Response
{
"subtask": {
"parent_id": 85,
"title": "The new subtask",
"board_id": "3",
"status": "open",
"priority": "low",
"due_at": null,
"position": 20,
"created_by": 1,
"type": "task",
"slug": "the-new-subtask",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"updated_at": "2025-08-08T04:12:47+00:00",
"created_at": "2025-08-08T04:12:47+00:00",
"id": 284,
"assignees": [],
"meta": {
"subtask_group_id": "127"
},
"repeat_task_meta": null
},
"message": "Subtask has been added"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# Create a Subtask Group
Create a new group to organize subtasks.
HTTP Request
POST /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group
# Example Request
curl -X POST "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"title": "Design Phase"
}'
2
3
4
5
6
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Yes | Name of the subtask group |
# Example Response
{
"subtaskGroup": {
"id": 555,
"task_id": 85,
"key": "group_name",
"value": "Design Phase",
"created_at": "2025-08-08T04:12:47+00:00",
"updated_at": "2025-08-08T04:12:47+00:00"
},
"message": "New Subtask group has been added"
}
2
3
4
5
6
7
8
9
10
11
# Update a Subtask Group
Update the title of a subtask group.
HTTP Request
PUT /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group
# Example Request
curl -X PUT "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"group_id": 555,
"title": "Execution Phase"
}'
2
3
4
5
6
7
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
title | string | Yes | New title for the group |
group_id | int | Yes | ID of the group to update |
# Example Response
{
"subtaskGroup": {
"id": 555,
"task_id": 85,
"key": "group_name",
"value": "Execution Phase",
"created_at": "2025-08-08T04:12:47+00:00",
"updated_at": "2025-08-08T05:10:12+00:00"
},
"message": "Subtask group title has been added"
}
2
3
4
5
6
7
8
9
10
11
# Delete a Subtask Group
Delete a subtask group and its subtasks.
HTTP Request
DELETE /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group
# Example Request
curl -X DELETE "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/subtask-group" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"group_id": 555
}'
2
3
4
5
6
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
group_id | int | Yes | ID of the group to delete |
# Example Response
{
"message": "Subtask group has been deleted"
}
2
3
# Delete a Subtask
Delete a subtask.
HTTP Request
DELETE /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/delete-subtask
Note: task_id
in the path is the subtask ID to delete. No request body is required.
# Example Request
curl -X DELETE "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/delete-subtask" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD"
2
# Example Response
{
"deletedSubtask": {
"id": 284,
"parent_id": "85",
"board_id": "3",
"crm_contact_id": null,
"title": "The new subtask",
"slug": "the-new-subtask",
"type": "task",
"status": "open",
"stage_id": null,
"source": "web",
"source_id": null,
"priority": "low",
"description": null,
"lead_value": "0.00",
"created_by": "1",
"position": "20.00",
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": null,
"archived_at": null,
"created_at": "2025-08-08T04:12:47+00:00",
"updated_at": "2025-08-08T04:12:47+00:00",
"subtask_group_id": "127",
"meta": [],
"repeat_task_meta": null
},
"changedSubtasks": [],
"message": "Task has been deleted"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Move Subtask to Group
Move a subtask from one group to another.
HTTP Request
POST /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/move-subtask
# Example Request
curl -X POST "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/move-subtask" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"group_id": 127,
"subtask_id": 284
}'
2
3
4
5
6
7
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
group_id | int | Yes | Target group ID |
subtask_id | int or int[] | Yes | ID of the subtask to move (or an array of IDs) |
# Example Response
{
"subtask": {
"id": 284,
"parent_id": 85,
"position": 21,
"assignees": []
},
"message": "Subtask has been moved"
}
2
3
4
5
6
7
8
9
# Update Subtask Position
Move a subtask within its current group or to another group and update its position.
HTTP Request
PUT /wp-json/fluent-boards/v2/projects/{board_id}/tasks/update-subtask-position/{subtask_id}
Note: {subtask_id}
is the subtask being repositioned. If newSubtasksGroupId
is omitted, the API infers the current group from the subtask meta.
# Example Request
curl -X PUT "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/update-subtask-position/{subtask_id}" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"newPosition": 1,
"newSubtasksGroupId": 198
}'
2
3
4
5
6
7
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
newPosition | int | Yes | New position in the group |
newSubtasksGroupId | int | Yes | Group ID (can be same or different) |
# Behavior
- If
newPosition
is 1, the subtask is placed at the top; the API uses fractional positions under the hood and may reindex if needed. - If
newSubtasksGroupId
differs from the current group, the subtask is moved to the new group and positioned there. - Response includes
changedSubtasks
: subtasks under the same parent updated within the last minute (withassignees
).
# Example Response
{
"changedSubtasks": [
{
"id": 285,
"parent_id": "85",
"board_id": "3",
"crm_contact_id": null,
"title": "Hello Subtask",
"slug": "hello-subtask",
"type": "task",
"status": "open",
"stage_id": null,
"source": "web",
"source_id": null,
"priority": "low",
"description": null,
"lead_value": "0.00",
"created_by": "1",
"position": "1.00",
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": null,
"archived_at": null,
"created_at": "2025-08-08T04:49:24+00:00",
"updated_at": "2025-08-08T04:49:28+00:00",
"meta": {
"subtask_group_id": "198"
},
"repeat_task_meta": null,
"assignees": []
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Convert Task to Subtask
Convert an existing task to a subtask.
HTTP Request
PUT /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/convert-to-subtask
# Example Request
curl -X PUT "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/convert-to-subtask" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"parent_id": 133,
"assigneeId": 1
}'
2
3
4
5
6
7
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
parent_id | int | Yes | ID of the parent task |
assigneeId | int | No | User ID to assign |
subtaskGroupId | int | No | Group ID to place the subtask |
# Behavior
- Sets the task's
parent_id
and clearsstage_id
. - If
subtaskGroupId
is provided, links the new subtask to that group; otherwise a "Default Subtask Group" is created on the parent task and the subtask is added there. - If
assigneeId
is provided, assigns the user to the new subtask. - Removes existing notifications for the converted task.
# Example Response
{
"message": "Task has been converted to subtask",
"parentTask": {
"id": 133,
"parent_id": null,
"board_id": "3",
"crm_contact_id": null,
"title": "task activity check .",
"slug": "task-activity-check",
"type": "task",
"status": "open",
"stage_id": "26",
"source": "web",
"source_id": null,
"priority": "low",
"description": "",
"lead_value": "0.00",
"created_by": "1",
"position": "0.50",
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": null,
"archived_at": null,
"created_at": "2024-12-24T08:43:53+00:00",
"updated_at": "2025-01-28T03:15:14+00:00",
"meta": {
"is_template": "no",
"group_name": "Default Subtask Group"
},
"repeat_task_meta": null,
"watchers": []
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Move Subtask to Board
Convert a subtask back to a regular task and move it to a specific stage.
HTTP Request
PUT /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/move-to-board
Note: {task_id}
in this route refers to the subtask ID you are converting back to a regular task and moving to the specified stage.
# Example Request
curl -X PUT "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/move-to-board" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"stage_id": 26
}'
2
3
4
5
6
# Request Body
Parameter | Type | Required | Description |
---|---|---|---|
stage_id | int | Yes | Stage ID where the task should be moved |
# Example Response
{
"moveSubtask": {
"id": 283,
"parent_id": null,
"board_id": "3",
"crm_contact_id": null,
"title": "Design Homepage (Cloned)",
"slug": "customizable-dashboard-view-settings",
"type": "task",
"status": "open",
"stage_id": "26",
"source": "web",
"source_id": null,
"priority": "low",
"description": "<p>It will on a Kanban Page/Table view Page. </p>\n<ol>\n<li>Label</li>\n<li>Priority</li>\n<li>Due Date</li>\n<li> </li>\n</ol>",
"lead_value": "0.00",
"created_by": "1",
"position": 0.25,
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"remind_at": null,
"started_at": null,
"due_at": "2025-07-04 23:45:00",
"last_completed_at": null,
"archived_at": null,
"created_at": "2025-08-06T10:00:02+00:00",
"updated_at": "2025-08-08T04:56:17+00:00",
"meta": {
"is_template": "no"
},
"repeat_task_meta": null
},
"changedSubtasks": []
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Clone a Subtask
Create a copy of an existing subtask.
HTTP Request
POST /wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/clone-subtask
Note: {task_id}
in this route refers to the subtask ID you want to clone.
# Example Request
curl -X POST "https://yourdomain.com/wp-json/fluent-boards/v2/projects/{board_id}/tasks/{task_id}/clone-subtask" \
-H "Authorization: Basic API_USERNAME:API_PASSWORD"
2
# Behavior
- Title is suffixed with
(cloned)
- Retains
started_at
anddue_at
- Keeps the same subtask group membership
- Copies assignees and watchers
- Places the clone between the original and the next subtask by position, or at the end if none exists
# Example Response
{
"subtask": {
"parent_id": "133",
"board_id": "3",
"crm_contact_id": null,
"title": "Lorem ipsum (cloned)",
"slug": "lorem-ipsum",
"type": "task",
"status": "open",
"stage_id": null,
"source": "web",
"source_id": null,
"priority": "low",
"description": null,
"lead_value": "0.00",
"created_by": "1",
"position": 2,
"comments_count": "0",
"issue_number": null,
"reminder_type": "none",
"settings": {
"cover": {
"backgroundColor": ""
},
"subtask_count": 0,
"attachment_count": 0,
"subtask_completed_count": 0
},
"remind_at": null,
"started_at": null,
"due_at": null,
"last_completed_at": null,
"archived_at": null,
"updated_at": "2025-08-08T05:02:40+00:00",
"created_at": "2025-08-08T05:02:40+00:00",
"id": 287,
"meta": {
"subtask_group_id": "200"
},
"repeat_task_meta": null,
"assignees": []
},
"message": "Subtask has been cloned successfully"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Error Responses
See Common Error Responses for standard error formats.
# Common Subtask-Specific Errors
- 404 Not Found - Subtask or parent task not found
- 403 Forbidden - You don't have permission to access this subtask
- 400 Bad Request - Invalid subtask data or missing required fields