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

Validate MSEL

POST
/api/v1/ttx/{ttx_id}/msel/validate

Dry run: the report this payload would produce. Saves nothing.

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
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

Example generated

{
"approved": [
{
"code": "example",
"field": "example",
"item_id": "example",
"section": 1
}
],
"ready": [
{
"code": "example",
"field": "example",
"item_id": "example",
"section": 1
}
],
"warnings": [
{
"code": "example",
"field": "example",
"item_id": "example",
"section": 1
}
]
}

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"
}
]
}