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

Add exercise inject

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

Add one inject to the MSEL – a copy when it comes from the library, its techniques moved onto the MSEL’s ATT&CK release. Answers the whole MSEL, as its other writes do, and what the move changed.

Media typeapplication/json
ExerciseInjectInput

POST /ttx/{ttx_id}/msel/injects: one inject added to the MSEL – a copy of a library inject, already in the exercise’s language with its variables filled in. The MSEL’s own save rules apply afterwards (the validation report judges it; nothing here needs to be complete).

object
actor_id
Any of:
string format: uuid
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})?$/
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
CopyActionInput
object
description
required
Description
string
>= 1 characters <= 5000 characters
expected_within_minutes
Any of:
integer
>= 1 <= 1440
responsible_role
Responsible Role
string
"" <= 255 characters
facilitator_notes
Facilitator Notes
string
"" <= 5000 characters
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
kind
InjectKind
string
default: mandatory
Allowed values: mandatory contingent
language
Any of:
string
Allowed values: en es
objective_ids
Objective Ids
Array<string>
<= 20 items
offset_minutes
Any of:
integer
<= 1440
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
<= 64 characters
origin_name
Any of:
string
<= 255 characters
phase_id
required
Phase Id
string format: uuid
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
sender
Any of:
CopySender

Who sends it, when it isn’t already in the cast: found there by its TTX-Zone id or its name, or added as a copy.

object
channel
Any of:
DeliveryMethod
string
Allowed values: email phone chat ticket security_tool in_person briefing media document
description
Description
string
"" <= 5000 characters
name
required
Name
string
>= 1 characters <= 255 characters
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
<= 64 characters
type
ActorType
string
default: other
Allowed values: soc csirt authority media supplier customer threat_actor internal other
threat_actor_id
Any of:
string format: uuid
title
required
Title
string
>= 1 characters <= 255 characters
trigger_condition
Trigger Condition
string
"" <= 5000 characters

Successful Response

Media typeapplication/json
ExerciseInjectAddedRead

POST /ttx/{ttx_id}/msel/injects: the MSEL, and what moving the copy’s techniques onto its ATT&CK release changed.

object
conversion
required
AttackConversionRead

What moving references onto another ATT&CK release changed: MITRE’s replacements applied (techniques and groups) and what that release doesn’t have.

object
removed
Removed
Array<string>
replaced
Replaced
Array<object>
AttackReplacement
object
from_id
required
From Id
string
to_id
required
To Id
string
msel
required
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

{
"msel": {
"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"
}
]
}