#Scrum: epics and task placement
Manage scrum in Bitrix24 projects: create and rename epics, bind tasks to epics, place tasks in the backlog, set story points. Works on top of regular Tasks — first create the task via POST /v1/tasks, then place it in scrum.
Bitrix24 API: tasks.api.scrum.epic.*, tasks.api.scrum.task.*, tasks.api.scrum.backlog.get
Scope: task
#Endpoints
| Method | Path | What it does |
|---|---|---|
POST |
/v1/scrum/epics |
Create an epic |
GET |
/v1/scrum/epics?groupId=N&limit=200 |
List epics (project filter and limit are optional) |
GET |
/v1/scrum/epics/:id |
Get an epic |
PATCH |
/v1/scrum/epics/:id |
Rename / update an epic |
GET |
/v1/scrum/tasks/:taskId |
Scrum placement of a task (backlog/sprint, epic, story points) |
PATCH |
/v1/scrum/tasks/:taskId |
Place / move a task in scrum |
#Quick start
#Create an epic
curl -X POST "https://vibecode.bitrix24.com/v1/scrum/epics" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Chat folders",
"groupId": 7,
"description": "Mirror of an epic from an external tracker",
"color": "#5eead4"
}'
Response 201:
{
"success": true,
"data": {
"id": 87,
"groupId": 7,
"name": "Chat folders",
"description": "Mirror of an epic from an external tracker",
"createdBy": 1,
"modifiedBy": 1,
"color": "#5eead4"
}
}
#Bind a task to an epic
curl -X PATCH "https://vibecode.bitrix24.com/v1/scrum/tasks/59" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "epicId": 87 }'
The response is the task's actual placement after the change (the API re-reads it so you can verify the binding applied):
{
"success": true,
"data": { "entityId": 1, "epicId": 87, "storyPoints": "" }
}
#Epic fields (POST / PATCH)
| Field | Type | Req. | Description |
|---|---|---|---|
name |
string | ★ (POST) | Epic name |
groupId |
number | ★ (POST) | Scrum project (workgroup). List: GET /v1/workgroups |
description |
string | Description | |
color |
string | Color, e.g. "#5eead4" |
|
createdBy |
number | POST only: author, defaults to the key's user. Rejected on PATCH | |
modifiedBy |
number | PATCH only |
#Task placement fields (PATCH /v1/scrum/tasks/:taskId)
| Field | Type | Description |
|---|---|---|
epicId |
number | Epic binding. 0 detaches the task from its epic |
entityId |
number | Backlog or sprint id. Usually not needed — resolved automatically (see below) |
storyPoints |
string | number | Story points, e.g. "3" or "0.5". An empty string clears them |
sort / sortFloat |
number | Position in the list (sortFloat takes precedence) |
modifiedBy |
number | Change authorship (createdBy of a placement is immutable) |
#What to know before you start
entityIdis resolved automatically. If the task is already in scrum, its current placement (backlog or sprint) is kept. If not, the API finds the backlog of the task's scrum project and places it there. PassentityIdexplicitly only when you need to put the task into a specific sprint.- The task must belong to a group. Auto-placement works through the task's
groupId. A task without a workgroup returns400 TASK_NOT_IN_GROUP— move it into a scrum project first (PATCH /v1/tasks/:id { "groupId": N }) or passentityIdexplicitly. - The group must be a scrum project. For a regular (non-scrum) group Bitrix24 cannot find a backlog — the API returns
422 BACKLOG_NOT_RESOLVED. - The epic's and the task's
groupIdmust match. Bitrix24 rejects binding a task to an epic from another project. - PATCH returns the actual placement. The native Bitrix24 method returns only
true— the API additionally re-reads the task's scrum row so the response is verifiable (no silent no-ops). - Permissions. Creating epics and moving tasks requires the key's B24 user to be a member of the scrum project with the right to create tasks.
- The epic list paginates automatically.
GET /v1/scrum/epicsreturns up tolimitepics (default 200, max 1000) — the API fetches the Bitrix24 pages of 50 records for you.
#Typical scenario: mirroring an external tracker
- Create an epic:
POST /v1/scrum/epics { name, groupId }→ rememberdata.id. - Create a task: `POST /v1/tasks`
{ title, groupId, responsibleId, tags }. - Bind it to the epic:
PATCH /v1/scrum/tasks/:taskId { epicId }— the task is automatically placed into the project backlog. - When the epic is renamed in the external tracker:
PATCH /v1/scrum/epics/:id { name }. - Verify the placement:
GET /v1/scrum/tasks/:taskId.
#Errors
| HTTP | Code | Cause |
|---|---|---|
| 400 | INVALID_PARAMS |
Missing required fields (name, groupId), empty PATCH body, non-numeric id |
| 400 | TASK_NOT_IN_GROUP |
Task has no workgroup — auto-placement into the backlog is impossible |
| 403 | SCOPE_DENIED |
The key lacks the task scope |
| 403 | WRITE_BLOCKED_READONLY_KEY |
The key is in read-only mode |
| 404 | ENTITY_NOT_FOUND |
Epic / task / group not found ("Epic not found", "Group id not found", …) |
| 422 | BACKLOG_NOT_RESOLVED |
The task's group is not a scrum project, no backlog found |
| 422 | BITRIX_ERROR |
Other Bitrix24 errors (e.g. Access denied) |
#See also
- Tasks — creating and updating the tasks themselves
- Task chat — reading task chat messages
- Workgroups — source of
groupId - Limits and optimization — rate limits