Skip to content

Available now

The envelope ​

Every SOM message is a JSON envelope around a payload. The envelope says who sent what, when, about which story; message_type chooses the payload's schema.

json
{
  "som_version": "1.0.0",
  "message_id": "0199a1c4-7a2e-7b31-8c55-4d2f9e6a1b07",
  "correlation_id": "0199a1c4-5b10-7c3a-9e4f-2a6b8c0d1e22",
  "causation_id": "0199a1c4-7a2e-7b31-8c55-4d2f9e6a1b06",
  "message_type": "story.context",
  "timestamp": "2026-09-11T16:41:00Z",
  "originating_system": { "system_id": "acme-ncs-test", "system_type": "ncs", "vendor": "acme", "version": "4.2" },
  "topic": "som.story.context",
  "payload": { "story_id": "acme-hurricane-001", "…": "…" }
}

Fields ​

Each field in full, with the SOM text and glossary entry behind it: Envelope in the SOM 1.0 schema reference.

FieldRuleTip
som_versionExactly "1.0.0" for a 1.0 producer. Anything before 1.0 (such as 0.3.2) is refused: som_version.pre_1_0Don't copy it from older drafts
message_idA UUID, unique per messageUse UUIDv7 (time-ordered). A retry of the same message reuses it; a new message never does: message_id.reused
correlation_idA UUID that ties a story's messages togetherMint one per story and keep it for the story's life. The bus keeps order per correlation_id
causation_idOptional UUID of the message that caused this oneSet it when you react to another message: a skill warning caused by a snapshot, for example
message_typeChooses the payload schema, and nothing else doesSee Message families
timestampRFC 3339 date-timeAlways include a time zone: Z or an offset
originating_systemsystem_id and system_type required; system_name, vendor, version optional. Nothing else is allowedsystem_id must be one your connection may stamp: producer.system_id_not_allowed
topicMust start with som.e.g. som.story.context, som.telling.started
extensionsOptional; every key reverse-domain namespaced, com.<vendor>.Consumers ignore extensions they don't know
modification_header, _actors, @contextOptional; the schema allows them. No other top-level field isSee the Envelope schema reference

system_type is one of SOM 1.0's values: ncs, mos_device, graphics, automation, wire_service, ai_agent, compliance_engine, editorial_dashboard, archive, prompter, camera, audio, skill_worker, custom.

Strict on the envelope ​

The envelope is never relaxed. An unknown field (envelope.additionalProperties), a signature field or a legacy source field (envelope.false_schema) is refused, whatever the som_version. The payload is treated more generously for newer 1.x producers: see Forward compatibility.

What the bus adds ​

These are rules of the bus, reported with source: policy, not rules of SOM:

  • At most 240,000 bytes per message (message.too_large). Media never travels the bus; send references to it.
  • One message per request. No batching.
  • Your system_ids and message types are the ones granted to your connection (see Credentials).

SOM is an open standard maintained by the SOM working group. This service is not endorsed by it.