- ActionService
  - post Create a new action
  - post Search actions
  - get Get action by ID
  - put Update action state

API docs by Redocly

# Raft Warfighting Data Model (WDM) Action Service API (1.0)

Download OpenAPI specification:

REST API for managing action lifecycle and execution in the Raft Warfighting Data Model (WDM). Handles action creation across scopes (tasks, orders, alerts, reports), assignment to principals (persons, units, systems), state tracking and progress updates, and real-time distribution for execution.

Note: Streaming APIs (StreamActions) are only available via gRPC and are not supported over standard REST/HTTP at this time.

## ActionService

## Create a new action

Creates a new action in the system. If action.id is not provided, a UUID will be generated. Initial state defaults to DRAFT unless specified.

Important: Actions are immutable after creation except for state transitions, progress updates, BDA attachment, and approval chain progression. To modify other action details, cancel the existing action (set state to CANCELLED) and create a new one.

##### Authorizations:

rdp_basic rdp_jwt rdp_api_key

##### Request Body schema: application/json
required

Request body for creating a new action. Note: Actions are immutable after creation except for state transitions, progress updates, BDA attachment, and approval chain progression.

required | object (v1Action) A flexible, self-describing record representing any directed activity, notification, or structured report shared across the warfighting mesh. Action is intentionally general. The `scope` and `type` fields control how the message is interpreted, and producers populate only the fields relevant to their context. Common patterns: TASK scope -- individual directed activities such as fire missions, ISR collection, movement orders. ORDER scope -- composite operations and directives with PHASE and TASK children via the hierarchy fields. ALERT scope -- time-critical notifications (e.g., contact, CBRN, MEDEVAC 9-line). Populate the `alert` field. REPORT scope -- structured observations and assessments (e.g., SPOTREP, SALUTE, etc.). Actions are immutable after creation except for state transitions, progress updates, BDA attachment, and approval chain progression. To change action content, cancel the existing action and create a new one.

### Responses

/api/v1/wdm/actions

### Request samples

- Payload

Content type
application/json
`
{

- "action":
  {
  - "alert":
    {
    - "category": "ALERT_CATEGORY_CONTACT",
    - "responseInstructions": "QRF move to ORP ALPHA; suppressive fires on call",
    - "severity": "ALERT_SEVERITY_CRITICAL",
    - "source": "ALERT_SOURCE_HUMAN"
    },
  - "assignedTo":
    {
    - "id": "unit-qrf",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "description": "Troops in contact, small arms and indirect fire from treeline north",
  - "name": "Contact - Grid AB9876543210",
  - "priority": "ACTION_PRIORITY_CRITICAL",
  - "provenance":
    {
    - "name": "patrol-base-05",
    - "updatedAt": "2026-04-15T10:30:00Z"
    },
  - "requestedBy":
    {
    - "id": "unit-patrol-3",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "scope": "ACTION_SCOPE_ALERT",
  - "state": "ACTION_STATE_IN_PROGRESS",
  - "type": "contact"
  }

}`

### Response samples

- 200
- 400
- 401
- 403
- 500
- default

Content type
application/json
`
{

- "action":
  {
  - "assignedTo":
    {
    - "id": "unit-bravo-co",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "authorizedBy":
    {
    - "id": "user-bn-co",
    - "type": "PRINCIPAL_TYPE_USER"
    },
  - "description": "Move Bravo Co into forward assembly area prior to H-hour",
  - "id": "550e8400-e29b-41d4-a716-446655440000",
  - "intent":
    {
    - "endState": "Bravo Co set in FAA with Class III/V complete",
    - "method": "Tactical road march along MSR TAMPA",
    - "purpose": "Occupy FAA prior to H-hour to enable on-time crossing of LD"
    },
  - "name": "Movement Alpha",
  - "notAfter": "2026-04-16T02:00:00Z",
  - "notBefore": "2026-04-15T22:00:00Z",
  - "priority": "ACTION_PRIORITY_HIGH",
  - "provenance":
    {
    - "name": "ops-center-01",
    - "updatedAt": "2026-04-15T10:30:00Z"
    },
  - "requestedBy":
    {
    - "id": "user-s3-planner",
    - "type": "PRINCIPAL_TYPE_USER"
    },
  - "scope": "ACTION_SCOPE_ORDER",
  - "state": "ACTION_STATE_APPROVED",
  - "type": "execution_order"
  }

}`

## Search actions

Retrieves a paginated list of actions matching the specified filter criteria.

##### Authorizations:

rdp_basic rdp_jwt rdp_api_key

##### Request Body schema: application/json
required

Request message for retrieving multiple actions.

| object (serviceActionQuery) Query criteria for retrieving actions from storage. Uses a flat structure where all criteria are combined with AND logic between fields, and OR logic within repeated fields. Optimized for efficient bulk retrieval. Empty query returns all actions. Logic semantics: Multiple values within a repeated field use OR (e.g., states=[1,2] means state=DRAFT OR state=PENDING) Different fields are combined with AND (e.g., states=[7] AND priorities=[3]) Scope semantics: The `scopes` field filters on Action.scope (ACTION_SCOPE_TASK, ORDER, ALERT, REPORT, PHASE, SUB_TASK, DIRECTIVE, PLAN). Multiple scopes use OR and combine with AND against the rest of the query. Omit to include all scopes. Examples: Query high-priority in-progress actions:
    {
      "states": [7],
      "priorities": [3]
    }
Matches: `state=IN_PROGRESS AND priority=HIGH` Query actions assigned to specific principals:
    {
      "assigned_to": [
        {"id": "unit-123", "type": "PRINCIPAL_TYPE_OBJECT"}
      ]
    }
Query pending or approved fire missions:
    {
      "states": [2, 3],
      "type": ["fire_mission"]
    }
Matches: `(state=PENDING OR state=APPROVED) AND type="fire_mission"` Query alerts and reports:
    {
      "scopes": [7, 8]
    }
Matches: `scope=ALERT OR scope=REPORT` Query actions of type ISR Collection where details.sensor_type is "EO":
    {
      "type": ["isr_collection"],
      "filter": {
        "actionPredicate": {
          "field": {
            "fieldPath": "details.sensor_type",
            "comparator": "FIELD_COMPARATOR_EQ",
            "value": { "stringValue": "EO" }
          }
        }
      }
    }
Matches: `type="isr_collection" AND details.sensor_type == "EO"` Query actions where details.sensor is EO or IR, and details.priority > 5:
    {
      "filter": {
        "and": {
          "statements": [
            {
              "or": {
                "statements": [
                  {
                    "actionPredicate": {
                      "field": {
                        "fieldPath": "details.sensor",
                        "comparator": "FIELD_COMPARATOR_EQ",
                        "value": { "stringValue": "EO" }
                      }
                    }
                  },
                  {
                    "actionPredicate": {
                      "field": {
                        "fieldPath": "details.sensor",
                        "comparator": "FIELD_COMPARATOR_EQ",
                        "value": { "stringValue": "IR" }
                      }
                    }
                  }
                ]
              }
            },
            {
              "actionPredicate": {
                "field": {
                  "fieldPath": "details.priority",
                  "comparator": "FIELD_COMPARATOR_GT",
                  "value": { "numberValue": 5 }
                }
              }
            }
          ]
        }
      }
    }
Matches: `(details.sensor == "EO" OR details.sensor == "IR") AND details.priority > 5` Query in-progress actions by state name (enum-by-name in a field predicate):
    {
      "filter": {
        "actionPredicate": {
          "field": {
            "fieldPath": "state",
            "comparator": "FIELD_COMPARATOR_EQ",
            "value": { "stringValue": "ACTION_STATE_IN_PROGRESS" }
          }
        }
      }
    }
cursor | string Pagination cursor from previous response. Omit or leave empty for first page.
pageSize | integer <int32> <= 1000 Default: "10" Maximum number of actions per page.

### Responses

/api/v1/wdm/actions/search

### Request samples

- Payload

Content type
application/json
`
{

- "pageSize": 100,
- "query":
  {
  - "priorities":
    [
    - "ACTION_PRIORITY_HIGH"
    ],
  - "scopes":
    [
    - "ACTION_SCOPE_ORDER"
    ],
  - "states":
    [
    - "ACTION_STATE_IN_PROGRESS"
    ]
  }

}`

### Response samples

- 200
- 400
- 401
- 403
- 500
- default

Content type
application/json
`
{

- "actions":
  [
  - {
    - "description": "Observed 8x dismounts moving NE along ridge at grid AB5554443330",
    - "id": "660f9500-e29b-41d4-a716-446655440001",
    - "intent":
      {
      - "purpose": "Report observed enemy activity to higher"
      },
    - "killChainPhase": "F3EAD_PHASE_FIND",
    - "name": "SPOTREP - Dismounted Patrol",
    - "priority": "ACTION_PRIORITY_MEDIUM",
    - "provenance":
      {
      - "name": "fob-warhorse",
      - "updatedAt": "2026-04-15T09:12:00Z"
      },
    - "requestedBy":
      {
      - "id": "unit-scout-2",
      - "type": "PRINCIPAL_TYPE_OBJECT"
      },
    - "scope": "ACTION_SCOPE_REPORT",
    - "state": "ACTION_STATE_COMPLETED",
    - "type": "spotrep"
    }
  ],
- "nextCursor": "a2919858-75bf-42c4-8850-2bbb2b94d154"

}`

## Get action by ID

Retrieves a single action by its UUID.

##### Authorizations:

rdp_basic rdp_jwt rdp_api_key

##### path Parameters

actionId required | string UUID of the action to retrieve

### Responses

/api/v1/wdm/actions/{actionId}

### Response samples

- 200
- 400
- 401
- 403
- 404
- 500
- default

Content type
application/json
`
{

- "action":
  {
  - "alert":
    {
    - "affectedCount": 2,
    - "category": "ALERT_CATEGORY_MEDEVAC",
    - "responseInstructions": "Hoist required; LZ marked with IR strobe",
    - "severity": "ALERT_SEVERITY_CRITICAL",
    - "source": "ALERT_SOURCE_HUMAN"
    },
  - "assignedTo":
    {
    - "id": "unit-dustoff-6",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "description": "Two urgent surgical casualties at LZ BROWN",
  - "id": "440e8467-a29b-41c4-d716-446659870000",
  - "name": "MEDEVAC 9-Line - Grid AB1234567890",
  - "priority": "ACTION_PRIORITY_CRITICAL",
  - "provenance":
    {
    - "name": "listening-post-01",
    - "updatedAt": "2026-04-15T10:30:00Z"
    },
  - "requestedBy":
    {
    - "id": "unit-alpha-1",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "scope": "ACTION_SCOPE_ALERT",
  - "state": "ACTION_STATE_IN_PROGRESS",
  - "type": "medevac_9line"
  }

}`

## Update action state

Updates the state of an existing action. This is the primary way to modify an action after creation. State transitions should follow the action lifecycle. Terminal states (COMPLETED, FAILED, CANCELLED, REJECTED) are final and cannot be changed.

To delete an action, set state to CANCELLED. There is no separate delete endpoint.

##### Authorizations:

rdp_basic rdp_jwt rdp_api_key

##### path Parameters

actionId required | string UUID of the action to update

##### Request Body schema: application/json
required

state required | string (v1ActionState) Default: "ACTION_STATE_UNSPECIFIED" Enum: "ACTION_STATE_UNSPECIFIED" "ACTION_STATE_DRAFT" "ACTION_STATE_PENDING" "ACTION_STATE_APPROVED" "ACTION_STATE_ASSIGNED" "ACTION_STATE_ACKNOWLEDGED" "ACTION_STATE_PLANNED" "ACTION_STATE_IN_PROGRESS" "ACTION_STATE_PAUSED" "ACTION_STATE_COMPLETED" "ACTION_STATE_FAILED" "ACTION_STATE_CANCELLED" "ACTION_STATE_REJECTED" Action lifecycle states. State transitions follow a general flow: DRAFT -> PENDING -> APPROVED -> ASSIGNED -> ACKNOWLEDGED -> PLANNED -> IN_PROGRESS -> COMPLETED Terminal states (final, cannot be changed): COMPLETED: Successfully finished FAILED: Execution failed CANCELLED: Cancelled (the deletion mechanism for actions) REJECTED: Refused by assignee ACTION_STATE_DRAFT: Being composed; not yet submitted. ACTION_STATE_PENDING: Submitted, awaiting approval. ACTION_STATE_APPROVED: Approved by authority, not yet assigned. ACTION_STATE_ASSIGNED: Assigned to executing principal. ACTION_STATE_ACKNOWLEDGED: Executing principal acknowledged receipt of the action. ACTION_STATE_PLANNED: Executing principal has developed an execution plan. ACTION_STATE_IN_PROGRESS: Currently being executed. ACTION_STATE_PAUSED: Execution temporarily halted. ACTION_STATE_COMPLETED: Successfully completed (terminal). ACTION_STATE_FAILED: Failed to complete (terminal). ACTION_STATE_CANCELLED: Cancelled; this is the deletion mechanism for actions (terminal). ACTION_STATE_REJECTED: Rejected by assignee (terminal).
| object (v1ActionProgress) Execution progress within a action's current state.
| object (v1ProvenanceRecord) Data lineage and source attribution for a warfighting record. ProvenanceRecord is attached to every record in the Raft WDM and carries the information needed to assess trust, reconstruct lineage, and make informed fusion or approval decisions. Modeled loosely on W3C PROV-DM, with additions for multi-step transformation chains, upstream source linking, and collection method classification. Intentionally compact enough to be attached cheaply to every record. Reference: W3C PROV-DM (https://www.w3.org/TR/prov-dm/).

### Responses

/api/v1/wdm/actions/{actionId}/state

### Request samples

- Payload

Content type
application/json
`
{

- "state": "ACTION_STATE_UNSPECIFIED",
- "progress":
  {
  - "phase": "string",
  - "statusMessage": "string",
  - "metadata": { },
  - "updatedAt": "2019-08-24T14:15:22Z"
  },
- "provenance":
  {
  - "id": "string",
  - "name": "string",
  - "description": "string",
  - "updatedAt": "2019-08-24T14:15:22Z",
  - "producer": "string",
  - "collectionMethod": "COLLECTION_METHOD_UNSPECIFIED",
  - "sourceReliability": "SOURCE_RELIABILITY_UNSPECIFIED",
  - "informationCredibility": "INFORMATION_CREDIBILITY_UNSPECIFIED",
  - "parents":
    [
    - { }
    ],
  - "agent":
    {
    - "id": "string",
    - "type": "PRINCIPAL_TYPE_UNSPECIFIED",
    - "displayName": "string",
    - "role": "string"
    }
  }

}`

### Response samples

- 200
- 400
- 401
- 403
- 404
- 500
- default

Content type
application/json
`
{

- "action":
  {
  - "assignedTo":
    {
    - "id": "unit-uav-7",
    - "type": "PRINCIPAL_TYPE_OBJECT"
    },
  - "description": "Conduct ISR collection on NAI 3",
  - "id": "550e8400-e29b-41d4-a716-446655440000",
  - "killChainPhase": "F3EAD_PHASE_FIX",
  - "name": "ISR Collection Alpha",
  - "priority": "ACTION_PRIORITY_HIGH",
  - "progress":
    {
    - "phase": "ON_STATION",
    - "statusMessage": "UAV on station, commencing collection orbit"
    },
  - "provenance":
    {
    - "name": "ops-center-01",
    - "updatedAt": "2026-04-15T10:35:00Z"
    },
  - "requestedBy":
    {
    - "id": "user-s2-nco",
    - "type": "PRINCIPAL_TYPE_USER"
    },
  - "scope": "ACTION_SCOPE_TASK",
  - "state": "ACTION_STATE_IN_PROGRESS",
  - "type": "isr_collection"
  }

}`