Add or remove release work items
Releases group shipped work and carry a changelog. Add work items to a workspace release and take them out in one request. Adding a work item links it to the release without moving or changing it. Removing it only removes the link.
The API runs remove first, then add, and answers with what changed:
removedlists the ids fromremovethat were on the release. The API ignores ids that weren't on it.addedlists every id fromaddthat matched a work item in the workspace that you can see, including work items already on the release. Archived work items, work items in archived projects, drafts, and work items in intake triage count as matches too, although List a release's work items doesn't return them. The API skips other ids without an error.
Compare added with what you sent to find ids that were skipped. To read the work items afterward, use List a release's work items, or filter the workspace work items list with ?release_id=. For a project release, use Add or remove project release work items.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
pk:requiredstring (uuid)The release id.
Body Parameters
add:optionalarray of string (uuid)Ids of work items to add to the release. Defaults to an empty array.
remove:optionalarray of string (uuid)Ids of work items to take out of the release. Defaults to an empty array.
Scopes
releases:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | invalid_request | add or remove isn't an array, or an entry isn't a UUID. |
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | The feature this endpoint belongs to isn't enabled on your plan or is switched off. |
403 | forbidden | Your role or token scope doesn't allow this. |
404 | not_found | No such resource, or it's outside your tenant. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
409 | governance_migration_in_progress | A governance migration is running in this workspace, so writes are paused. Retry after it finishes. |
413 | payload_too_large | The request body is over the size limit. |
415 | unsupported_media_type | The Content-Type isn't one this endpoint accepts. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X POST \
"https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/work-items/" \
-H "X-Api-Key: $PLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"add": [
"f960d3c2-8524-4a41-b8eb-055ce4be2a7f"
],
"remove": [
"f960d3c2-8524-4a41-b8eb-055ce4be2a7f"
]
}'import requests
response = requests.post(
"https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/work-items/",
headers={"X-Api-Key": "your-api-key"},
json={
"add": [
"f960d3c2-8524-4a41-b8eb-055ce4be2a7f"
],
"remove": [
"f960d3c2-8524-4a41-b8eb-055ce4be2a7f"
]
},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/releases/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/work-items/",
{
method: "POST",
headers: {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
add: ["f960d3c2-8524-4a41-b8eb-055ce4be2a7f"],
remove: ["f960d3c2-8524-4a41-b8eb-055ce4be2a7f"],
}),
},
);
const data = await response.json();{
"added": ["f960d3c2-8524-4a41-b8eb-055ce4be2a7f"],
"removed": ["f960d3c2-8524-4a41-b8eb-055ce4be2a7f"]
}
