Create a project release
Creates a new release scoped to the project. project is set from the URL and any project value in the request body is ignored. name must be unique within the workspace, otherwise the request fails with a 400 RELEASE_NAME_ALREADY_EXISTS error. If tag is provided, it must reference a global release tag or a tag belonging to this project, otherwise the request fails with a 400 {"tag": "RELEASE_TAG_OUT_OF_SCOPE"} error.
Path parameters
workspace_slug:requiredstringThe workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.
project_id:requiredstringThe unique identifier of the project.
Body parameters
name:requiredstringName of the release.
description_html:optionalstringHTML description of the release.
description_json:optionalobjectJSON description of the release.
status:optionalstringStatus of the release: unreleased, released, or cancelled. Defaults to unreleased.
target_date:optionalstringTarget date of the release in YYYY-MM-DD format.
release_date:optionalstringActual release date of the release in YYYY-MM-DD format.
lead:optionalstringID of the user who leads the release.
tag:optionalstringID of the release tag associated with the release.
is_latest:optionalbooleanWhether this is the latest release. Defaults to false.
is_prerelease:optionalbooleanWhether this release is a prerelease. Defaults to false.
external_id:optionalstringExternal ID from an external source.
external_source:optionalstringExternal source identifier.
Scopes
releases:write
curl -X POST \
"https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/releases/" \
-H "X-API-Key: $PLANE_API_KEY" \
# Or use -H "Authorization: Bearer $PLANE_OAUTH_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "v2.4.0",
"description_html": "<p>Spring feature release.</p>",
"status": "unreleased",
"target_date": "2025-03-31",
"lead": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"tag": "9f8e7d6c-5b4a-3210-fedc-ba0987654321",
"is_latest": false,
"is_prerelease": false
}'import requests
response = requests.post(
"https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/releases/",
headers={"X-API-Key": "your-api-key"},
json={
'name': 'v2.4.0',
'description_html': '<p>Spring feature release.</p>',
'status': 'unreleased',
'target_date': '2025-03-31',
'lead': '16c61a3a-512a-48ac-b0be-b6b46fe6f430',
'tag': '9f8e7d6c-5b4a-3210-fedc-ba0987654321',
'is_latest': False,
'is_prerelease': False
}
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v1/workspaces/my-workspace/projects/project-uuid/releases/",
{
method: "POST",
headers: {
"X-API-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
name: "v2.4.0",
description_html: "<p>Spring feature release.</p>",
status: "unreleased",
target_date: "2025-03-31",
lead: "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
tag: "9f8e7d6c-5b4a-3210-fedc-ba0987654321",
is_latest: false,
is_prerelease: false,
}),
},
);
const data = await response.json();{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_at": "2025-03-01T10:00:00.000000Z",
"updated_at": "2025-03-05T14:30:00.000000Z",
"deleted_at": null,
"name": "v2.4.0",
"description": {
"description_html": "<p>Spring feature release.</p>",
"description_binary": null,
"description_stripped": "Spring feature release.",
"description_json": {}
},
"status": "unreleased",
"target_date": "2025-03-31",
"release_date": null,
"is_latest": false,
"is_prerelease": false,
"external_id": null,
"external_source": null,
"created_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"updated_by": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"workspace": "cd4ab5a2-1a5f-4516-a6c6-8da1a9fa5be4",
"lead": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
"tag": "9f8e7d6c-5b4a-3210-fedc-ba0987654321",
"project": "8b2e1c4d-6f3a-4d5e-9c1b-2a3b4c5d6e7f"
}
