Skip to content
The API may change between versions while TTX-Zone is 0.x.

Save MSEL

PUT
/api/v1/ttx/{ttx_id}/msel

Save the MSEL as a whole.

Media typeapplication/json
MselSaveRequest

PUT /ttx/{ttx_id}/msel – the whole MSEL in one save, like the needs form: a DRAFT may be incomplete (the validation report judges it), only what can never be stored is rejected (unknown references, limits), and collections are full-replace keyed by id. revision is the one the client edited (optimistic locking).

object
actors
Actors
Array<object>
<= 30 items
ActorInput

A simulated actor. id is set for a saved row; key is how injects in the same payload refer to it – the id itself for a saved row, any temporary string for a new one (same scheme as the needs form).

object
channel
Any of:
DeliveryMethod
string
Allowed values: email phone chat ticket security_tool in_person briefing media document
description
Description
string
"" <= 5000 characters
id
Any of:
string format: uuid
key
required
Key
string
>= 1 characters <= 64 characters
name
Name
string
"" <= 255 characters
origin
ActorOrigin

Where a simulated actor comes from – the actor library’s levels. An exercise’s cast only holds copies; the origin says of what.

string
default: exercise
Allowed values: system organization exercise
origin_id
Any of:
string
<= 64 characters
origin_name
Any of:
string
<= 255 characters
played_by
Played By
string
"" <= 255 characters
type
ActorType
string
default: other
Allowed values: soc csirt authority media supplier customer threat_actor internal other
duration_minutes
Any of:
integer
>= 1 <= 1440
exercise_start
Any of:
string format: time
incident_date
Any of:
string format: date
incident_start
Any of:
string format: time
injects
Injects
Array<object>
<= 40 items
InjectInput
object
actor_key
Any of:
string
>= 1 characters <= 64 characters
artifact
Any of:
InjectArtifact

An inject’s content rendered as a simulated artifact. The body is the inject’s own content; these are the template’s other fields, whose meaning follows kind (email: from, address, to, subject, date; press release: outlet, dateline, headline, date; social post: author, handle, date; chat message: sender, channel, date). All plain text: the Playground draws them, nothing is ever rendered as markup.

object
kind
required
ArtifactKind

How the Playground renders an inject’s content as a simulated artifact (a template drawn by the app, never uploaded markup).

string
Allowed values: email press_release social_post chat_message
location
Location
string
"" <= 255 characters
recipient
Recipient
string
"" <= 255 characters
sender
Sender
string
"" <= 255 characters
sender_address
Sender Address
string
"" <= 255 characters
subject
Subject
string
"" <= 255 characters
timestamp
Timestamp
string
"" <= 64 characters
attachment_notes
Attachment Notes
Array<string>
<= 10 items
attack_attribution
Any of:
AttackAttribution

Whose activity an inject’s ATT&CK techniques are: a threat actor of the scenario’s, or noise – unrelated activity (other attackers, commodity malware, coincidences, false positives) that tests the players’ triage. None (the column null): no ATT&CK at all.

string
Allowed values: threat_actor noise
attack_techniques
Attack Techniques
Array<object>
<= 20 items
AttackRef

An ATT&CK technique under the tactic it serves, by id. Whether it exists is checked against the MSEL’s pinned release by the service (the payload doesn’t carry the release).

object
domain
required
Domain
string
Allowed values: enterprise ics
tactic_id
required
Tactic Id
string
/^TA\d{4}$/
technique_id
required
Technique Id
string
/^T\d{4}(\.\d{3})?$/
branch_action_key
Any of:
string
<= 64 characters
branch_from_key
Any of:
string
<= 64 characters
content
Content
string
"" <= 5000 characters
contingent_purpose
Contingent Purpose
string
"" <= 5000 characters
delivery_method
DeliveryMethod
string
default: email
Allowed values: email phone chat ticket security_tool in_person briefing media document
expected_actions
Expected Actions
Array<object>
<= 8 items
ExpectedActionInput
object
description
Description
string
"" <= 5000 characters
expected_within_minutes
Any of:
integer
>= 1 <= 1440
id
Any of:
string format: uuid
key
Any of:
string
<= 64 characters
objective_ids
Any of:
Array<string>
<= 20 items
responsible_role
Responsible Role
string
"" <= 255 characters
facilitator_notes
Facilitator Notes
string
"" <= 5000 characters
files
Files
Array<object>
<= 10 items
InjectFileInput

An uploaded file of the MSEL handed out with the inject (in order).

object
description
Description
string
"" <= 255 characters
file_id
required
File Id
string format: uuid
fires_at_minute
Any of:
integer
<= 1440
format
InjectFormat

What an inject is, and so what it asks of the table: an inject that evaluates objectives (INJ), a discussion slide – a debrief or reflection prompt, no objective, not in the EEG nor the coverage (DSC) –, or a poll the Players vote on, outside the evaluation too (POL).

string
default: inject
Allowed values: inject discussion poll
id
Any of:
string format: uuid
images
Images
Array<object>
<= 10 items
InjectImageInput

An uploaded image of the MSEL shown with the inject (in order).

object
caption
Caption
string
"" <= 255 characters
image_id
required
Image Id
string format: uuid
key
Any of:
string
<= 64 characters
kind
InjectKind
string
default: mandatory
Allowed values: mandatory contingent
objective_ids
Objective Ids
Array<string>
<= 20 items
offset_minutes
Any of:
integer
<= 1440
phase_key
required
Phase Key
string
>= 1 characters <= 64 characters
poll_impacts
Poll Impacts
Array<object>
<= 6 items
object
key
additional properties
integer
<= 3
poll_options
Poll Options
Array<string>
<= 6 items
poll_outcomes
Poll Outcomes
Array<string>
<= 6 items
poll_question
Poll Question
string
"" <= 300 characters
recipients
Recipients
Array<string>
<= 20 items
rejoin_key
Any of:
string
<= 64 characters
review_status
InjectReviewStatus
string
default: draft
Allowed values: draft validated
room_ids
Room Ids
Array<string>
<= 50 items
threat_actor_key
Any of:
string
>= 1 characters <= 64 characters
title
Title
string
"" <= 255 characters
trigger_condition
Trigger Condition
string
"" <= 5000 characters
validated_by
Validated By
string
"" <= 255 characters
validated_by_id
Any of:
string format: uuid
meters
Meters
Array<object>
<= 6 items
MeterInput

An impact meter: what the polls’ decisions add up on.

object
key
required
Key
string
>= 1 characters <= 64 characters
name
Name
string
"" <= 40 characters
phases
Phases
Array<object>
<= 8 items
PhaseInput
object
due_objective_ids
Due Objective Ids
Array<string>
<= 20 items
end_offset
End Offset
integer
0 <= 1440
headline
Headline
string
"" <= 80 characters
id
Any of:
string format: uuid
incident_jump_minutes
Incident Jump Minutes
integer
0 <= 43200
key
required
Key
string
>= 1 characters <= 64 characters
key_questions
Key Questions
Array<string>
<= 20 items
name
Name
string
"" <= 255 characters
objective_ids
Objective Ids
Array<string>
<= 20 items
situation_update
Situation Update
string
"" <= 5000 characters
start_offset
Start Offset
integer
0 <= 1440
revision
required
Revision
integer
summary
Summary
string
"" <= 5000 characters
threat_actors
Threat Actors
Array<object>
<= 5 items
ThreatActorInput

A threat actor of the scenario (see MselThreatActor). key is how injects in the same payload attribute to it (the id for a saved row).

object
aliases
Aliases
Array<string>
<= 50 items
description
Description
string
"" <= 5000 characters
id
Any of:
string format: uuid
key
required
Key
string
>= 1 characters <= 64 characters
mitre_group_id
Any of:
string
/^G\d{4}$/
name
Name
string
"" <= 255 characters
origin
ActorOrigin

Where a simulated actor comes from – the actor library’s levels. An exercise’s cast only holds copies; the origin says of what.

string
default: exercise
Allowed values: system organization exercise
origin_id
Any of:
string
<= 64 characters
origin_name
Any of:
string
<= 255 characters
techniques
Techniques
Array<object>
<= 400 items
ThreatActorTechnique

A technique a threat actor uses, as MITRE records it: no tactic (a technique may serve several).

object
domain
required
Domain
string
Allowed values: enterprise ics
technique_id
required
Technique Id
string
/^T\d{4}(\.\d{3})?$/
time_compression
Time Compression
integer
default: 60 >= 1 <= 1440
title
Title
string
"" <= 255 characters

Successful Response

Media typeapplication/json
MselRead
object
actors
required
Actors
Array<object>
ActorRead
object
channel
Any of:
DeliveryMethod
string
Allowed values: email phone chat ticket security_tool in_person briefing media document
code
required
Code
string
description
Description
string
""
id
required
Id
string format: uuid
name
required
Name
string
origin
ActorOrigin

Where a simulated actor comes from – the actor library’s levels. An exercise’s cast only holds copies; the origin says of what.

string
default: exercise
Allowed values: system organization exercise
origin_id
Any of:
string
origin_name
Any of:
string
played_by
required
Played By
string
type
required
ActorType
string
Allowed values: soc csirt authority media supplier customer threat_actor internal other
attack_techniques
required
Attack Techniques
Array<object>
AttackRefRead

With its names in the pinned release (English, as MITRE publishes them) – kept in snapshots, so a frozen MSEL reads on its own.

object
domain
required
Domain
string
Allowed values: enterprise ics
tactic_id
required
Tactic Id
string
/^TA\d{4}$/
tactic_name
required
Tactic Name
string
technique_id
required
Technique Id
string
/^T\d{4}(\.\d{3})?$/
technique_name
required
Technique Name
string
attack_version
required
Attack Version
string
duration_minutes
required
Any of:
integer
editable
required
Editable
boolean
exercise_code
required
Exercise Code
string
exercise_start
required
Any of:
string format: time
frozen_versions
Frozen Versions
Array<object>
FrozenVersionRead

A version of the MSEL frozen when it became READY, and the sessions played from it.

object
ready_at
required
Ready At
string format: date-time
ready_by
required
Ready By
string
sessions
required
Sessions
integer
version
required
Version
integer
id
required
Id
string format: uuid
incident_date
Any of:
string format: date
incident_start
Any of:
string format: time
injects
required
Injects
Array<object>
InjectRead
object
artifact
Any of:
InjectArtifact

An inject’s content rendered as a simulated artifact. The body is the inject’s own content; these are the template’s other fields, whose meaning follows kind (email: from, address, to, subject, date; press release: outlet, dateline, headline, date; social post: author, handle, date; chat message: sender, channel, date). All plain text: the Playground draws them, nothing is ever rendered as markup.

object
kind
required
ArtifactKind

How the Playground renders an inject’s content as a simulated artifact (a template drawn by the app, never uploaded markup).

string
Allowed values: email press_release social_post chat_message
location
Location
string
"" <= 255 characters
recipient
Recipient
string
"" <= 255 characters
sender
Sender
string
"" <= 255 characters
sender_address
Sender Address
string
"" <= 255 characters
subject
Subject
string
"" <= 255 characters
timestamp
Timestamp
string
"" <= 64 characters
attachment_notes
required
Attachment Notes
Array<string>
attack_attribution
Any of:
AttackAttribution

Whose activity an inject’s ATT&CK techniques are: a threat actor of the scenario’s, or noise – unrelated activity (other attackers, commodity malware, coincidences, false positives) that tests the players’ triage. None (the column null): no ATT&CK at all.

string
Allowed values: threat_actor noise
attack_techniques
required
Attack Techniques
Array<object>
AttackRefRead

With its names in the pinned release (English, as MITRE publishes them) – kept in snapshots, so a frozen MSEL reads on its own.

object
domain
required
Domain
string
Allowed values: enterprise ics
tactic_id
required
Tactic Id
string
/^TA\d{4}$/
tactic_name
required
Tactic Name
string
technique_id
required
Technique Id
string
/^T\d{4}(\.\d{3})?$/
technique_name
required
Technique Name
string
branch_action_id
Any of:
string format: uuid
branch_from_id
Any of:
string format: uuid
code
required
Code
string
content
required
Content
string
contingent_purpose
required
Contingent Purpose
string
delivery_method
required
DeliveryMethod
string
Allowed values: email phone chat ticket security_tool in_person briefing media document
expected_actions
required
Expected Actions
Array<object>
ExpectedActionRead
object
code
required
Code
string
description
required
Description
string
expected_within_minutes
required
Any of:
integer
id
required
Id
string format: uuid
objective_ids
Any of:
Array<string>
responsible_role
required
Responsible Role
string
facilitator_notes
required
Facilitator Notes
string
files
Files
Array<object>
default:
InjectFileRead
object
description
required
Description
string
id
required
Id
string format: uuid
name
required
Name
string
sha256
required
Sha256
string
size_bytes
required
Size Bytes
integer
fires_at_minute
Any of:
integer
format
InjectFormat

What an inject is, and so what it asks of the table: an inject that evaluates objectives (INJ), a discussion slide – a debrief or reflection prompt, no objective, not in the EEG nor the coverage (DSC) –, or a poll the Players vote on, outside the evaluation too (POL).

string
default: inject
Allowed values: inject discussion poll
id
required
Id
string format: uuid
images
Images
Array<object>
default:
InjectImageRead
object
caption
required
Caption
string
height
required
Height
integer
id
required
Id
string format: uuid
width
required
Width
integer
kind
required
InjectKind
string
Allowed values: mandatory contingent
objective_ids
required
Objective Ids
Array<string>
offset_minutes
required
Any of:
integer
origin
Any of:
ActorOrigin

Where a simulated actor comes from – the actor library’s levels. An exercise’s cast only holds copies; the origin says of what.

string
Allowed values: system organization exercise
origin_id
Any of:
string
origin_name
Any of:
string
phase_id
required
Any of:
string format: uuid
poll_impacts
Poll Impacts
Array<object>
default:
object
key
additional properties
integer
poll_options
Poll Options
Array<string>
default:
poll_outcomes
Poll Outcomes
Array<string>
default:
poll_question
Poll Question
string
""
recipients
required
Recipients
Array<string>
rejoin_inject_id
Any of:
string format: uuid
review_status
required
InjectReviewStatus
string
Allowed values: draft validated
room_ids
Room Ids
Array<string>
default:
simulated_actor_id
required
Any of:
string format: uuid
threat_actor_id
Any of:
string format: uuid
title
required
Title
string
trigger_condition
required
Trigger Condition
string
validated_by
required
Validated By
string
validated_by_id
Any of:
string format: uuid
meters
Meters
Array<object>
MeterRead
object
key
required
Key
string
name
required
Name
string
needs
required
NeedsContext

What the MSEL needs from the needs analysis to be edited: the objectives to link, the participants recipients must be (M09: the participating areas and, optional, the third parties), the duration limit and the TLP it inherits. Nothing else of the form.

object
max_duration_hours
required
Any of:
integer
objectives
required
Objectives
Array<object>
NeedsObjectiveSummary
object
capability
required
Capability

Capabilities an exercise can validate – TTX-Zone’s own taxonomy.

string
Allowed values: detection_triage_escalation incident_classification crisis_decision_making regulatory_notification internal_external_comms cross_unit_coordination third_party_supply_chain continuity_recovery legal_forensics
code
required
Code
string
id
required
Id
string format: uuid
statement
required
Statement
string
title
Title
string
""
participating_areas
required
Participating Areas
Array<string>
status
required
NeedsFormStatus
string
Allowed values: draft ready_for_approval approved
third_parties
Third Parties
Array<string>
default:
tlp
required
Tlp

FIRST Traffic Light Protocol 2.0 labels.

string
Allowed values: clear green amber amber_strict red
version
required
Version
integer
needs_form_version
required
Needs Form Version
integer
phases
required
Phases
Array<object>
PhaseRead
object
code
required
Code
string
due_objective_ids
Due Objective Ids
Array<string>
default:
end_offset
required
End Offset
integer
headline
Headline
string
""
id
required
Id
string format: uuid
incident_jump_minutes
Incident Jump Minutes
integer
0
key_questions
required
Key Questions
Array<string>
name
required
Name
string
objective_ids
required
Objective Ids
Array<string>
situation_update
required
Situation Update
string
start_offset
required
Start Offset
integer
ready_at
Any of:
string format: date-time
ready_by
Ready By
string
""
ready_by_id
Any of:
string format: uuid
renumberable
Renumberable
Array<string>
revision
required
Revision
integer
rooms
Rooms
Array<object>
MselRoomRead

A room of the exercise, as the MSEL aims injects at it.

object
code
required
Code
string
id
required
Id
string format: uuid
name
required
Name
string
status
required
MselStatus
string
Allowed values: draft in_review ready
summary
required
Summary
string
threat_actors
Threat Actors
Array<object>
ThreatActorRead
object
aliases
required
Aliases
Array<string>
code
required
Code
string
description
required
Description
string
id
required
Id
string format: uuid
mitre_group_id
required
Any of:
string
modified_at
Any of:
string format: date-time
name
required
Name
string
origin
required
ActorOrigin

Where a simulated actor comes from – the actor library’s levels. An exercise’s cast only holds copies; the origin says of what.

string
Allowed values: system organization exercise
origin_id
required
Any of:
string
origin_name
required
Any of:
string
techniques
required
Techniques
Array<object>
ThreatActorTechniqueRead
object
domain
required
Domain
string
Allowed values: enterprise ics
tactic_ids
required
Tactic Ids
Array<string>
technique_id
required
Technique Id
string
/^T\d{4}(\.\d{3})?$/
technique_name
required
Technique Name
string
time_compression
required
Time Compression
integer
title
required
Title
string
ttx_id
required
Ttx Id
string format: uuid
updated_at
required
Updated At
string format: date-time
uses_rooms
Uses Rooms
boolean
validation
required
ValidationReport

ready blocks DRAFT -> READY_FOR_APPROVAL, approved additionally blocks READY_FOR_APPROVAL -> APPROVED; warnings never block.

object
approved
required
Approved
Array<object>
ValidationIssue

One rule a form breaks. section is the form section (0-9) to send the user to; field the field within it; item_id the row (need, objective) or value (capability, approver kind) concerned, if any.

object
code
required
Code
string
field
Any of:
string
item_id
Any of:
string
section
required
Section
integer
ready
required
Ready
Array<object>
ValidationIssue

One rule a form breaks. section is the form section (0-9) to send the user to; field the field within it; item_id the row (need, objective) or value (capability, approver kind) concerned, if any.

object
code
required
Code
string
field
Any of:
string
item_id
Any of:
string
section
required
Section
integer
warnings
required
Warnings
Array<object>
ValidationIssue

One rule a form breaks. section is the form section (0-9) to send the user to; field the field within it; item_id the row (need, objective) or value (capability, approver kind) concerned, if any.

object
code
required
Code
string
field
Any of:
string
item_id
Any of:
string
section
required
Section
integer
version
required
Version
integer

Example

{
"actors": [
{
"channel": "email",
"description": "",
"origin": "system",
"type": "soc"
}
],
"attack_techniques": [
{
"domain": "enterprise"
}
],
"injects": [
{
"artifact": {
"kind": "email",
"location": "",
"recipient": "",
"sender": "",
"sender_address": "",
"subject": "",
"timestamp": ""
},
"attack_attribution": "threat_actor",
"attack_techniques": [
{
"domain": "enterprise"
}
],
"delivery_method": "email",
"files": [],
"format": "inject",
"images": [],
"kind": "mandatory",
"origin": "system",
"poll_impacts": [],
"poll_options": [],
"poll_outcomes": [],
"poll_question": "",
"review_status": "draft",
"room_ids": []
}
],
"needs": {
"objectives": [
{
"capability": "detection_triage_escalation",
"title": ""
}
],
"status": "draft",
"third_parties": [],
"tlp": "clear"
},
"phases": [
{
"due_objective_ids": [],
"headline": "",
"incident_jump_minutes": 0
}
],
"ready_by": "",
"status": "draft",
"threat_actors": [
{
"origin": "system",
"techniques": [
{
"domain": "enterprise"
}
]
}
],
"uses_rooms": false
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
ctx
Context
object
input
Input
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string

Example generated

{
"detail": [
{
"ctx": {},
"input": "example",
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
]
}