Workflows Reference

This page lists the workflow identifiers, contracts, and limits used by the dashboard, API, Terraform, and automation clients. For a task-oriented introduction, see the Workflows guide.

The authenticated GET /v1/workflows/catalog response is the canonical contract for the triggers, scope fields, actions, parameters, outputs, and graph nodes available to the current organization. The catalog accounts for the installed edition and enabled capabilities; clients should use it instead of hard-coding the lists below.

Triggers

Common triggers

IdentifierStarts a run when
alert.triggeredMoneat fires an alert lifecycle event
alert.resolvedMoneat resolves an alert episode
monitor.alertedA telemetry monitor enters an alerting state
monitor.recoveredA telemetry monitor recovers
uptime.downAn uptime monitor reports a failure
uptime.upAn uptime monitor recovers
synthetic.failedA synthetic test fails
synthetic.passedA synthetic test passes
incident.createdAn incident is created
incident.resolvedAn incident is resolved
incident.role_changedAn incident response role changes
security.signalMoneat creates a security signal
manualAn authorized operator starts a run
apiAn authenticated client submits a typed input payload
webhookA request passes the workflow's signature verification
scheduleAn enabled schedule reaches an occurrence

Incident and routing triggers

Additional incident response and deterministic alert routing triggers include:

  • Incident changes: incident.lifecycle_changed, incident.status_changed, incident.severity_changed, incident.field_changed, incident.update_published, incident.action_changed, incident.follow_up_changed, incident.escalation_changed, incident.participant_changed, incident.message_received, incident.post_incident_started, and incident.acknowledged
  • Routing decisions: alert.route_matched, alert.group_created, alert.group_updated, alert.group_decision, incident.triage_accepted, incident.triage_declined, and incident.triage_merged

A published version can declare multiple compatible triggers. Every run records the trigger context that admitted it. Fields that are not present in every selected trigger are rejected where the graph requires a shared, unambiguous type.

Alert context

The catalog supplies the complete scope for each trigger. Frequently used alert references include:

ReferenceType or meaning
alert.titleAlert title
alert.descriptionAlert description
alert.priorityPriority from P0 through P5
alert.statusFiring or resolved state
alert.sourceTelemetry source
alert.deduplication_keyStable identity of the underlying condition
alert.episode_keyIdentity of the current alert episode
alert.notification_sequenceNotification number within the episode
alert.notification_kindInitial, reminder, or resolved notification
alert.opened_atTime the episode opened
alert.last_seen_atLast time the episode was observed as active
alert.urlLink to the alert in Moneat
organization.idOrganization identifier

Dashboard alerts also expose alert.dashboard.title, alert.widget.title, alert.condition, alert.threshold, and alert.current_value.

Conditions and schemas

Conditions support nested and, or, and not groups, equality and membership, regular expressions, numeric comparisons, date/time comparisons, null predicates, and supported changed-from/changed-to predicates. Operators are checked against the reference type during validation.

Equality and membership do not match a missing value unless a null predicate is used. Ordering and regular-expression operators reject missing or incompatible values.

JSON
{
  "operator": "and",
  "children": [
    {"operator": "eq", "reference": "alert.priority", "value": "P1"},
    {"operator": "contains", "reference": "telemetry.service.name", "value": "checkout"}
  ]
}

Use input_schema for workflows started manually, through the API, by signed webhook, or as a subflow. Inputs and step outputs preserve bounded strings, numbers, booleans, objects, arrays, timestamps, and resource references. Secrets are not available to expressions; connector actions receive credentials only through protected connection parameters.

Actions

Notifications

IdentifierResult
notification.email_orgEmail verified organization members
notification.slackPost to the configured Slack alert channel
notification.discordPost to the configured Discord alert channel

Telemetry and Moneat resources

CategoryIdentifiers and primary outputs
Logsmoneat.logs.search (logs: Object), moneat.logs.aggregate (aggregate: Object)
Metricsmoneat.metrics.query (metrics: Object)
Tracesmoneat.traces.search (traces: Array), moneat.span.get (span: Object)
Issuesmoneat.issues.list (issues: Array), moneat.issues.get (issue: Object)
Status pagesstatuspage.update (status_page: Object), statuspage.incident.create (incident: Object)
Alertsalert.silence (silence: Object)
On-calloncall.page (alert_id, incident_id: ResourceReference), oncall.incident.declare (incident_id: ResourceReference), oncall.incident.action.create (action_id: ResourceReference), oncall.incident.investigate (investigation_id: ResourceReference, status: String, created: Boolean)

On-call actions require the Enterprise on-call bridge. Their resource outputs use opaque resource identifiers.

Incident response

Incident response actions include:

  • Participation and roles: incident.invite_user, incident.invite_group, incident.participant.add, incident.observer.add, incident.role.assign, incident.role.claim, incident.role.unassign, and incident.role.handover
  • Actions and follow-ups: incident.action.create, incident.action.update, incident.action.claim, incident.action.reassign, incident.action.complete, incident.action.cancel, incident.follow_up.create, incident.follow_up.update, incident.follow_up.accept, incident.follow_up.complete, and incident.follow_up.cancel
  • Lifecycle and coordination: incident.update.publish, incident.acknowledge, incident.request_decision, incident.timeline.add, incident.resolve, incident.close, incident.cancel, and incident.reopen
  • Status and chat: incident.status_page.create, incident.status_page.update, incident.status_page.resolve, and incident.slack.message

Execution requires the corresponding incident response capabilities and access.

Connectors and egress

IdentifierPrimary outputs
connector.jira.create_issueissue_id: ResourceReference, issue_key: String, url: String
connector.github.create_issueissue_id: ResourceReference, issue_number: Number, url: String
connector.pagerduty.trigger_incidentincident_id: ResourceReference, incident_number: String, status: String, url: String
connector.servicenow.create_incidentincident_id: ResourceReference, incident_number: String, url: String

Connector actions require an authorized workflow connection. Delivery keys make confirmed provider operations idempotent across retries.

The http.request and transform.graaljs actions are available only when WORKFLOWS_EGRESS_ENABLED=true on an isolated egress deployment. Unavailable editions, entitlements, connections, or permissions fail closed during validation or execution.

Control nodes

IdentifierPurpose
condition.ifChoose between true and false branches
condition.switchChoose among named cases
control.sleepPause for a duration
control.wait_untilWait for a correlated event or timeout
control.for_eachIterate over a bounded collection
control.whileRepeat while a bounded condition matches
control.approvalWait for an eligible operator's decision
control.parallelStart bounded parallel branches
control.joinJoin branches using the configured policy
control.subflowRun a pinned published workflow version
control.breakLeave the current loop
control.continueStart the next loop iteration

Only action nodes can originate error edges. Graph cycles are rejected except inside bounded loop bodies. Parallel joins support all, any, quorum, and timeout behavior. Recursive subflows, protected values, missing outputs, incompatible mappings, and unbounded fan-out are rejected.

Limits

AreaLimit
Conditions32 per node
Expression depth8 levels
Children per expression group32
Condition value length4,096 characters
Parallel branches16
Loop items or while iterations2,000
Iteration concurrency32; default 1
Subflow depth8
Subflow input/output mappings64 entries
Wait correlation8 fields, 512 characters per value
Buffered wait signals16 per correlation key
Draft sample fields128
Draft test payload128 KiB
Run-history page size100 results

Schedules

A schedule contains an id, cron expression, IANA timezone, enabled flag, missed_run_policy, overlap_policy, and max_concurrency.

Daylight-saving transitions use the named timezone. Overlap policies are reject, queue, replace, and bounded_parallel. Queued occurrences are promoted in creation order, and bounded parallelism never exceeds max_concurrency.

Terraform exposes schedules through schedules_json:

schedules_json = jsonencode([{
  id                = "maintenance"
  cron              = "0 2 * * 0"
  timezone          = "America/New_York"
  missed_run_policy = "skip"
  overlap_policy    = "queue"
  max_concurrency   = 1
}])

Signed webhooks

Read signing metadata from GET /v1/workflows/{workflowId}/webhook-signing. Sign the exact raw body with HMAC-SHA256, prefix the hexadecimal signature with sha256=, and send it in X-Moneat-Workflow-Signature. Use X-Moneat-Webhook-Event as the delivery identity.

Shell
body='{"incident_id":"<incident-uuid>","reason":"maintenance"}'
signature=$(printf '%s' "$body" | openssl dgst -sha256 -hmac "$SIGNING_SECRET" -hex | sed 's/^.* //')
curl -X POST "https://api.moneat.io/v1/workflows/<workflow-uuid>/webhook" \
  -H 'Content-Type: application/json' \
  -H "X-Moneat-Workflow-Signature: sha256=$signature" \
  -H 'X-Moneat-Webhook-Event: maintenance-<uuid>' \
  --data "$body"

Execution and recovery

Execution history uses these outcomes: running, succeeded, failed, cancelled, dead_letter, deduplicated, and rate_limited. Deduplicated and rate-limited admissions retain their reason and identity without counting as successful executions.

Instance recovery routes use public workflow and run UUIDs:

OperationRoute
RetryPOST /v1/workflows/{workflowId}/instances/{runId}/retry
ResumePOST /v1/workflows/{workflowId}/instances/{runId}/resume
ReplayPOST /v1/workflows/{workflowId}/instances/{runId}/replay
Move to dead letterPOST /v1/workflows/{workflowId}/instances/{runId}/dead-letter
CancelPUT /v1/workflows/{workflowId}/instances/{runId}/cancel

Retry, resume, replay, and dead-letter commands require an idempotency key or receive a server-generated one. Replaying uses the original immutable version without reusing the source run's progress.

Versions and access

Editing a published workflow creates a draft. Publishing creates an immutable version; active runs stay on the version that admitted them. Administrators can restore an older version into a new draft.

Workflow access is organization-scoped. Owners and grants provide Viewer, Runner, and Editor access. Service-principal grants authorize non-human subflow execution. Connections separately control metadata visibility, action use, and administration. Approval eligibility is checked against current membership and private-incident visibility when the response arrives.

Terraform

The Terraform provider exposes workflows through moneat_workflow. Use trigger_names, input_schema_json, schedules_json, and graph_json. Workflow owners are computed by the server, and connector credentials are never stored in workflow state.

Updates are pinned to the version read during refresh. A concurrent edit returns a conflict and requires Terraform to refresh before planning again.

Return to the Workflows guide for the dashboard workflow and a first notification example.