Restore an archived custom field
const url = 'https://beta-api.plune.ai/v1/custom-fields/example/restore';const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
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/custom-fields/example/restore \ --header 'Authorization: Bearer <token>'The project owner’s. Back at the end of the order, with the values the cases kept. Refused with 429 when the entity already has 50 live fields.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Responses
Section titled “ Responses ”The live field
object
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.
Unique among the fields of the entity in the project, case-insensitively, archived fields included.
Fixed after creation.
A list field that takes several options. Fixed after creation; only a list can be.
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.
object
Never changes and is never reused: this is what a case stores. A rename changes label only.
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.
Checked when a case is created. On an existing case the server only refuses to clear the value; it does not demand one.
Independent of showInList (#1250 AC-07). A toggle for the screen, not for access.
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).
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.
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.
Set while the field is archived: it takes no new value and its old values stay.
Example
{ "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"}No / invalid token or session
You are in the project, but not as its owner
object
Example
{ "error": "project owner only"}No such field in your projects
object
Example generated
{ "error": "example"}Two refusals share this status, and what to do about them is opposite. Rate-limited — the per-route throttle, or the per-minute request limit of the plan an API token counts by (#1442, #2092): Retry-After carries the seconds until the window rolls over, and waiting that long is the way out. Quota reached — a ceiling on what the project holds (runs in the last 24 hours, test cases, items waiting in the review queue): { error, quota }. A retry straight away frees nothing, so do not loop on it; the message says what makes room — deleting cases, working the queue down, an operator raising the limit — and the run quota, a rolling 24 hours, frees its oldest runs as they age out. Tell the two apart by the body: a 429 whose body has a quota object is a quota, one without it is a throttle. quota carries kind, limit, used, remaining and resetsAt: the figures behind the sentence, and for the run quota the instant its oldest run ages out (#1258). Retry-After is sent on a quota only where there is such an instant (the run quota: the whole seconds, at least 1, until resetsAt); the case, review-queue and project quotas free only by an action, have resetsAt: null, and send no Retry-After. GET /v1/quotas reads the same figures without a refusal.
object
The body of a 429 that is a quota and not a throttle: the sentence, and the figures behind it.
object
What was reached and the way out.
object
The ceiling. A write that would take used past it is refused with 429.
What the project holds now, counted by the same query that refuses a write.
limit - used, never below 0.
When the oldest counted run ages out of the rolling 24 hours and a slot frees on its own. null for the two quotas only an action frees (delete cases, decide queue items), and for a run quota with no runs in the window.
Example
{ "quota": { "kind": "runsPerDay" }}Headers
Section titled “Headers ”Seconds until the window rolls over on a throttle; on a quota, until quota.resetsAt — sent only for the run quota, which has one