Skip to content

Change a requirement

PATCH
/v1/requirements/{id}
curl --request PATCH \
--url https://beta-api.plune.ai/v1/requirements/example \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "status": "done" }'

An owner’s or a member’s. Type, status, title, key, description, priority, acceptance criteria and category (null clears the optional ones); an unchanged save leaves no audit entry. A changed key is an audit entry (its text is not secret).

id
required
string

The requirement’s id, or its key (REQ-214, any case): a key is never only digits and never looks like an id, so the two cannot be confused.

Media type application/json

Any of these; an empty object is refused (400).

object
type
string
Allowed values: user_story feature epic
title
string
>= 1 characters <= 200 characters
status
string
Allowed values: draft active done
description
string
nullable
priority

A free short label (Must-have, High), not an enum. null clears it.

string
nullable >= 1 characters <= 40 characters
acceptanceCriteria

Markdown text. null clears it.

string
nullable <= 20000 characters
category

Which kind of requirement it is. null clears it.

string
nullable
Allowed values: functional non-functional other
key

A new key (same rules as on create); the old one stops resolving. It cannot be cleared. A key the project already has is a 409.

string
/^[A-Za-z0-9._-]{1,40}$/
Example
{
"status": "done"
}

The requirement as it is now

Media type application/json
object
id
required
string format: uuid
key
required

The requirement’s short name (REQ-214), unique in the project, case-insensitive. Generated (REQ-<n>, per project, a number is never reused) or supplied. Never only digits, never an id.

string
/^[A-Za-z0-9._-]{1,40}$/
projectId
required
string
type
required
string
Allowed values: user_story feature epic
status
required

Where the requirement stands. Archiving is separate (archivedAt) and keeps the status.

string
Allowed values: draft active done
title
required
string
>= 1 characters <= 200 characters
description
required

Plain text, at most 16384 bytes.

string
nullable
priority
required

A free short label (Must-have, High), not an enum. null - not set.

string
nullable >= 1 characters <= 40 characters
acceptanceCriteria
required

Markdown text. null - not set.

string
nullable <= 20000 characters
category
required

Which kind of requirement it is. null - not set.

string
nullable
Allowed values: functional non-functional other
coverage
required

How the linked cases stand, counted from their RESULTS, never from a flag: each live case once, under the status of its newest result in a run that is not in the Bin (newest by when the run was created) — the status the run counters count it under, so a muted case’s failure is muted. A case with no result is notRun; a case in the Bin is not counted. total is the sum of the rest; «N of M cases passed» is passed of total.

object
total
required

M — the live cases linked to the requirement.

integer
passed
required

N — the cases whose newest result is passed.

integer
failed
required
integer
broken
required
integer
blocked
required
integer
skipped
required
integer
muted
required

Muted cases whose newest result failed or broke.

integer
notRun
required

Cases with no result in a run that is not in the Bin.

integer
automated
required

Of total, the cases of kind automated — the numerator of «9 of 14 cases are automated»; the denominator is total.

integer
cases

Only in the list asked with ?cases=true; always in the one requirement’s page.

Array<object>
object
id
required
string
title
required
string
suiteId
required
string
nullable
priority
required
string
latestStatus
required

The status the coverage counted the case under; null — no result yet.

string
nullable
Allowed values: passed failed broken blocked skipped muted
latestRunId
required

The run that result is in; null — no result yet.

string
nullable
archivedAt
required

Set while the requirement is archived: out of the default list and out of every coverage filter; its links stay.

string format: date-time
nullable
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
Example
{
"id": "6f1c2b3a-0000-4000-8000-0000000000f5",
"key": "REQ-214",
"projectId": "u-shop::default",
"type": "user_story",
"status": "done",
"title": "A buyer pays by card",
"description": "As a buyer I pay for the order by card, so that I do not wait for an invoice.",
"priority": "Must-have",
"acceptanceCriteria": "- the card is charged once\n- a declined card shows the bank reason",
"category": "functional",
"coverage": {
"total": 3,
"passed": 2,
"failed": 1,
"broken": 0,
"blocked": 0,
"skipped": 0,
"muted": 0,
"notRun": 0,
"automated": 0
},
"archivedAt": null,
"createdAt": "2026-09-16T09:12:04.151Z",
"updatedAt": "2026-09-16T09:12:04.151Z"
}

Invalid body, or nothing to change

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

No / invalid token or session

You are in the project as a reader

No such requirement in your projects

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

The new key is already used by a requirement of this project

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}

Rate-limited: the per-route throttle, or the per-minute request limit of the plan an API token counts by (#1442; the body names the plan, #2092). Retry-After carries the seconds until the window rolls over.

Media type application/json
object
error
required
string
Example generated
{
"error": "example"
}
Retry-After
integer

Seconds until the window rolls over