One action over many cases
const url = 'https://beta-api.plune.ai/v1/test-cases/bulk';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"ids":["6f1c2b3a-0000-4000-8000-0000000000c1"],"action":{"kind":"move","suiteId":"6f1c2b3a-0000-4000-8000-0000000000a1"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://beta-api.plune.ai/v1/test-cases/bulk \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "move", "suiteId": "6f1c2b3a-0000-4000-8000-0000000000a1" } }'The dashboard’s selection bar (D30) and an agent’s batch: move, set the priority, change the state or delete up to 200 cases in one call. Every id walks the same road as the single PATCH/DELETE — same actor rule for states (a bearer token is an agent, a session a person), same suite rule, same words when refused — and the answer is always 200 with done and refused by id: a refusal of one case is a result, not an error of the call. Sequential, not atomic: what was done before a refusal stays done, and each case gets its own audit entry under one session. A move target that would refuse every case (a folder, a stranger’s suite) is answered 400 before anything moves.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”One action over up to 200 cases — the selection’s «Move to… · Priority · Retire · Delete». Each id walks the single PATCH/DELETE road and is refused with the same sentence it would get alone.
object
object
null takes the cases out of their suite
Where the selection lands (D31): the slot, counted among the target’s cases that are NOT in ids, the first moved case takes — the rest follow in the order of ids. Past the end means last. Absent, each case goes last, as PATCH does.
object
object
object
object
A member of this project (B8-team T4), or null to take the cases back. A stranger is refused once, for the whole batch (400), with PATCH’s sentence.
Examples
Move three cases into a suite
{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "move", "suiteId": "6f1c2b3a-0000-4000-8000-0000000000a1" }}Drop them first in the suite, in this order
{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "move", "suiteId": "6f1c2b3a-0000-4000-8000-0000000000a1", "position": 0 }}Mark them critical
{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "priority", "priority": "critical" }}Retire them with one reason
{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "state", "state": "deprecated", "stateReason": "the old checkout flow is gone" }}Delete them — into the bin, six months
{ "ids": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "action": { "kind": "delete" }}Responses
Section titled “ Responses ”What was done and what was refused
Always 200 when the body is valid: what was done and what was refused, by id. Sequential and not atomic — what was done before a refusal stays done.
object
object
Example
{ "done": [ "6f1c2b3a-0000-4000-8000-0000000000c1" ], "refused": []}Invalid body, or a move target every case would be refused for
object
Example
{ "error": "suite '6f1c2b3a-0000-4000-8000-0000000000a2' is a folder — cases go in suites"}No / invalid token or session
Rate-limited: either the per-route throttle or a tenant quota. Retry-After carries the seconds until the window rolls over.
object
Example generated
{ "error": "example"}Headers
Section titled “Headers ”Seconds until the window rolls over