Skip to content

Reorder the fields of an entity

PUT
/v1/custom-fields/order
curl --request PUT \
--url https://beta-api.plune.ai/v1/custom-fields/order \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "entity": "case", "ids": [ "6f1c2b3a-0000-4000-8000-0000000000f4" ] }'

The project owner’s. ids is every live field of the entity in the order wanted — a missing, repeated or foreign id is a 400 and nothing moves. One audit entry per field that changed place.

Media type application/json
object
entity
required
string
Allowed values: case suite run plan step
role

#1251: orders the configuration groups among themselves; left out, the fields.

string
Allowed values: configuration
ids
required

Every live field of the entity (of the role, when one is named), in the order wanted.

Array<string>
Example
{
"entity": "case",
"ids": [
"6f1c2b3a-0000-4000-8000-0000000000f4"
]
}

The live fields of the entity as they are now

Media type application/json
object
fields
required
Array<object>
object
id
required
string format: uuid
projectId
required
string
entity
required

What the field is on: a case, a suite, a run, a plan or a step. Its values ride on that entity as custom (for a step, on the Steps Database row, not on the case that carries it). A step field cannot be required.

string
Allowed values: case suite run plan step
name
required

Unique among the fields of the entity in the project, case-insensitively, archived fields included.

string
>= 1 characters <= 100 characters
type
required

Fixed after creation.

string
Allowed values: string number list
multiple
required

A list field that takes several options. Fixed after creation; only a list can be.

boolean
options
required

In the order a person set; null for a string or number field. An option taken off the list stays on the cases that hold it, shown as stale, and is refused only as a NEW value.

Array<object>
nullable <= 100 items
object
id
required

Never changes and is never reused: this is what a case stores. A rename changes label only.

string
label
required
string
>= 1 characters <= 200 characters
archivedAt

Present while the option is archived (#1251), set by the server on archived: true: it is not taken as a new value, and an entity that holds it keeps it.

string format: date-time
required
required

Checked when a case is created. On an existing case the server only refuses to clear the value; it does not demand one.

boolean
defaultValue
required
One of:
string
showInList
required
boolean
showInFilter
required

Independent of showInList (#1250 AC-07). A toggle for the screen, not for access.

boolean
position
required

Dense 0..n-1 among the live fields of the entity with the same role: the configuration groups have an order of their own (#1251).

integer
source
required

Where the field came from (#1930): testrail - the TestRail import made it or carries values into it (the settings page shows “From TestRail”); null - a person made it. Set by the server only: a create or a patch that sends it does not set it, and it never changes once set.

string
nullable
Allowed values: testrail
role
required

configuration — a configuration group (#1251, ADR 0070): a run list of several values, which a launch multiplies into the run’s combinations. Fixed at creation. Its values are archived, never removed; it is neither required nor has a default; position, the limit of 50 and the name are counted among the groups apart from the fields. null — a field.

string
nullable
Allowed values: configuration
archivedAt
required

Set while the field is archived: it takes no new value and its old values stay.

string format: date-time
nullable
createdAt
required
string format: date-time
updatedAt
required
string format: date-time
Example
{
"fields": [
{
"id": "6f1c2b3a-0000-4000-8000-0000000000f4",
"projectId": "u-shop::default",
"entity": "case",
"name": "Browser",
"type": "list",
"multiple": true,
"options": [
{
"id": "opt_chrome0001",
"label": "Chrome"
},
{
"id": "opt_firefox001",
"label": "Firefox"
}
],
"required": false,
"defaultValue": null,
"showInList": true,
"showInFilter": false,
"position": 0,
"role": null,
"archivedAt": null,
"createdAt": "2026-09-16T09:12:04.151Z",
"updatedAt": "2026-09-16T09:12:04.151Z"
}
]
}

Invalid body, a value the field does not take, or a rule broken

Media type application/json
object
error
required
string
Example
{
"error": "validation failed — name: a field needs a name"
}

No / invalid token or session

You are in the project, but not as its owner

Media type application/json
object
error
required
string
Example
{
"error": "project owner only"
}

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