---
title: "Update Scenario"
method: PUT
path: "/api/v1/simulation/scenarios/{scenario_id}"
tags: ["simulation"]
---

# Update Scenario

`PUT /api/v1/simulation/scenarios/{scenario_id}`

## Request

- Base URL: `https://cp.xenovia.io` (the document declares no server; this is the origin it was published from)
- URL: `https://cp.xenovia.io/api/v1/simulation/scenarios/{scenario_id}`
- Auth: none declared

## Path parameters

- `scenario_id` string, uuid, required

## Headers

- `Authorization` string, nullable
- `X-Request-ID` string, nullable

## Request body

- ScenarioIn: A written scenario. Without a name it is the objective cut short; without a category or severity they are derived (simulation_scenario_rules). `expected` ("a good result") is what the scenario is graded on; `must_not` adds something the agent must never do. A functional scenario (Normal use) has no category.
  - `kind` 'attack' | 'functional', required
  - `objective` string, required
  - `expected` string, required
  - `name` string, nullable
  - `category` 'prompt_injection' | 'data_exfiltration' | 'system_prompt_leak' | 'unauthorized_action' | 'off_scope' | 'harmful_content' | 'impersonation' | 'cost_abuse' | 'tool_misuse' | 'privilege_escalation' | 'context_poisoning' | 'jailbreak' | 'output_exfiltration' | 'false_action', nullable
  - `severity` 'critical' | 'high' | 'medium' | 'low', nullable
  - `must_not` string, nullable
  - `persona` Persona: The simulated user: a name and who they are.
    - `name` string, required
    - `context` string, nullable
  - `tool_responses` ToolResponse[], nullable
    - `tool` string, nullable
    - `response` string, required
    - `planted` boolean
  - `facts` string[]
  - `tool_expectations` ToolExpectation[]
    - `kind` 'must_call' | 'never_call' | 'max_calls', required
    - `tool` string, required
    - `arguments` object, nullable
    - `before` string, nullable
    - `count` integer, nullable
  - `tactic` string, nullable
  - `technique` 'direct' | 'crescendo' | 'split_request' | 'role_drift' | 'context_poisoning' | 'many_shot' | 'planted_instruction', nullable
  - `resembles` 'prompt_injection' | 'data_exfiltration' | 'system_prompt_leak' | 'unauthorized_action' | 'off_scope' | 'harmful_content' | 'impersonation' | 'cost_abuse' | 'tool_misuse' | 'privilege_escalation' | 'context_poisoning' | 'jailbreak' | 'output_exfiltration' | 'false_action', nullable
  - `cves` string[]
  - `max_turns` integer

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-26** `3e25bef24f8f`: 4 breaking, 5 warning, 15 info
  - the request property `expected` became required
  - the request property `kind` became required
  - request property `expected` list-of-types was narrowed by removing types `null` from media type `application/json`
  - the `expected` request property's minLength was increased from `0` to `1`
  - …20 more
- **2026-10-08** `1882866431ad`: 5 breaking, 5 warning, 13 info
  - removed the enum value `data_exfiltration` of the request property `category`
  - removed the enum value `off_scope` of the request property `category`
  - removed the enum value `prompt_injection` of the request property `category`
  - removed the enum value `system_prompt_leak` of the request property `category`
  - …19 more
- **2026-10-08** `a141cb4fdc6a`: 8 info
  - added the new optional request property `faults`
  - added the new optional request property `injections`
  - added the new optional request property `kind`
  - added the new optional request property `persona`
  - …4 more
- **2026-10-04** `b475b750a0b7`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/xenovia/apis/controlplane/changes/api/v1/simulation/scenarios/:scenario_id/put.md)

---

[API](https://skmtc.dev/xenovia/apis/controlplane.md) - [All operations](https://skmtc.dev/xenovia/apis/controlplane/llms.txt) - [OpenAPI document](https://skmtc.dev/xenovia/apis/controlplane/revisions/3e25bef24f8f?raw)
