> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useboom.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Message variable catalog

> List the variables a SEND_MESSAGE template binding can reference for a journey — the same set the builder offers, and the authority on what resolves for THIS journey (when docs and this catalog disagree, trust the catalog). customer.* and person.* are offered for every trigger type (person.* is read live at send time from the identity the enrollment named — personExternalId, which event triggers always carry — and only falls back to a phone/email lookup, blank on zero or several matches, for contacts enrolled without a CDP person). The trigger-aware part is participant data: event-triggered journeys get the event payload under engagement.workflowState.* and no engagement.context.*, segment-triggered journeys get segment output columns under engagement.workflowState.*, and manual/CSV enrollment populates engagement.context.*. Bind a template placeholder to one of the returned `path` values (custom person attributes are `person.<key>`, NOT `attributes.<key>` — that is the DECISION/CASE condition syntax). A binding may append ONE formatting helper after a pipe: `currency:MXN` (code required), `date` or `date:long`, `sum` / `sum:field`, `count`, `fixed:N` — e.g. "engagement.nodeOutputs.fetch.body.total | currency:MXN". No chaining. `currency`/`date` are localized to the org language; `sum`/`count`/`fixed` are deliberately NOT, so they stay parseable by a DECISION comparison and valid inside a JSON body. Applied to a missing value the helper is skipped entirely, so a gap renders blank rather than "NaN" or "Invalid Date". `count` is the one to reach for before indexing an array: binding `body.buyers.0.account` on a plural array picks an arbitrary element, so gate a DECISION on `count eq 1` instead of guessing. Pass a journey id or its initiative id.



## OpenAPI

````yaml /api-reference/openapi.json get /api/v1/journeys/{journeyId}/message-variables
openapi: 3.1.0
info:
  title: Boom API
  version: 1.0.0
  description: >-
    Boom's public REST API — one uniform surface over every platform capability.
    CDP: upsert people and custom objects, define object and relationship types,
    link and unlink relationships, and record behavioral events — one record per
    request or up to 1000 per request via the `/batch` endpoints. Segments: read
    (list, read, membership) and full authoring — discover the filterable
    catalog, validate a filter, create and update segments, preview match
    counts, and trigger evaluation. Initiatives: create and configure outreach
    initiatives, link WhatsApp templates, drive the lifecycle (launch, cancel,
    archive), and read collected-data summaries. Participants: enroll people
    into an active initiative, track their status, read conversation
    transcripts, and stop outreach. Journeys: read-only access to always-on
    message flows and their metrics. WhatsApp templates: list your WhatsApp
    numbers and list, read, and create message templates. The same capabilities
    are exposed as MCP tools with identical schemas.
servers:
  - url: https://www.useboom.ai
    description: Production
  - url: https://dev.useboom.ai
    description: Development (sandbox — use a development organization API key)
security:
  - bearerAuth: []
paths:
  /api/v1/journeys/{journeyId}/message-variables:
    get:
      tags:
        - Journeys
      summary: Message variable catalog
      description: >-
        List the variables a SEND_MESSAGE template binding can reference for a
        journey — the same set the builder offers, and the authority on what
        resolves for THIS journey (when docs and this catalog disagree, trust
        the catalog). customer.* and person.* are offered for every trigger type
        (person.* is read live at send time from the identity the enrollment
        named — personExternalId, which event triggers always carry — and only
        falls back to a phone/email lookup, blank on zero or several matches,
        for contacts enrolled without a CDP person). The trigger-aware part is
        participant data: event-triggered journeys get the event payload under
        engagement.workflowState.* and no engagement.context.*,
        segment-triggered journeys get segment output columns under
        engagement.workflowState.*, and manual/CSV enrollment populates
        engagement.context.*. Bind a template placeholder to one of the returned
        `path` values (custom person attributes are `person.<key>`, NOT
        `attributes.<key>` — that is the DECISION/CASE condition syntax). A
        binding may append ONE formatting helper after a pipe: `currency:MXN`
        (code required), `date` or `date:long`, `sum` / `sum:field`, `count`,
        `fixed:N` — e.g. "engagement.nodeOutputs.fetch.body.total |
        currency:MXN". No chaining. `currency`/`date` are localized to the org
        language; `sum`/`count`/`fixed` are deliberately NOT, so they stay
        parseable by a DECISION comparison and valid inside a JSON body. Applied
        to a missing value the helper is skipped entirely, so a gap renders
        blank rather than "NaN" or "Invalid Date". `count` is the one to reach
        for before indexing an array: binding `body.buyers.0.account` on a
        plural array picks an arbitrary element, so gate a DECISION on `count eq
        1` instead of guessing. Pass a journey id or its initiative id.
      operationId: journeys_message_variables
      parameters:
        - name: journeyId
          in: path
          required: true
          schema:
            $schema: https://json-schema.org/draft/2020-12/schema
            type: string
            minLength: 1
            description: >-
              A journey id, or the initiative id (resolves to its current
              draft).
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $schema: https://json-schema.org/draft/2020-12/schema
                type: object
                properties:
                  groups:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        label:
                          type: string
                        description:
                          type: string
                        variables:
                          type: array
                          items:
                            type: object
                            properties:
                              key:
                                type: string
                              label:
                                type: string
                              path:
                                type: string
                                description: >-
                                  Bind a placeholder to this exact value, e.g.
                                  customer.name or
                                  engagement.workflowState.plan.
                              description:
                                type: string
                            required:
                              - key
                              - label
                              - path
                            additionalProperties: false
                      required:
                        - id
                        - label
                        - variables
                      additionalProperties: false
                  notes:
                    description: >-
                      Trigger-specific caveats. Present for event-triggered
                      journeys: explains why the person.* and
                      engagement.context.* groups are absent.
                    type: string
                required:
                  - groups
                additionalProperties: false
        '400':
          description: Validation failed or the request cannot proceed.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '401':
          description: Missing, malformed, or revoked API key.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '404':
          description: The resource does not exist in this organization.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '409':
          description: >-
            Conflicts with the current state (duplicates, wrong lifecycle
            state).
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '422':
          description: The request is well-formed but semantically invalid.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '429':
          description: Rate limit exceeded — retry after `Retry-After`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
        '503':
          description: Transient error — retry with a narrower request.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: object
                    properties:
                      code:
                        type: string
                        description: Stable machine-readable error code (snake_case).
                      message:
                        type: string
                    required:
                      - code
                      - message
                required:
                  - error
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Organization API key, sent as `Authorization: Bearer boom_org_...`.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.