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

# Update localized content

> Partially updates journey message content. Optional `content` must be exactly one of `mjml`, `html`, `text`, or `payload` as the UI infers the editor type from that key.
Unlike broadcasts, a journey does not need to be a draft in order to edit message content. A live or paused journey is editable. Archived and locked journeys are rejected with `409 Conflict`.
You cannot add a `locale` value to the default content and you cannot clear the `locale` on a localized content record. Duplicate `locale` values are rejected with `409 Conflict`.


<Warning>
  This feature only works when editing journeys created in Vero 1.0 (known as workflows) at the present time. You can add content to journeys created in Vero 2.0 but this feature is not yet supported in the Vero 2.0 UI.
</Warning>


## OpenAPI

````yaml /api-reference/campaigns-v2/campaigns-v2.yaml patch /journeys/{journey_id}/messages/{message_id}/contents/{id}
openapi: 3.0.3
info:
  title: Vero Open API v2
  version: 2.0.0
  description: >
    OpenAPI description for the API key-authenticated `api/v2` campaign and

    broadcast endpoints.


    Authentication uses the `Authorization` header. Both of these forms are
    accepted:


    - `Authorization: sk_valid_123`

    - `Authorization: Bearer sk_valid_123`

    - `revision: 2026-03-01`


    Campaign read endpoints require the `campaign:read` permission, and campaign

    write endpoints require the `campaign:write` permission.


    Broadcast read endpoints require the `broadcast:read` permission. A
    broadcast

    is a one-off or recurring message sent to an audience.
servers:
  - url: https://api.getvero.com/api/v2
security:
  - ApiKeyAuth: []
tags:
  - name: Broadcasts
  - name: Broadcast Messages
  - name: Broadcast Message Contents
  - name: Journeys
  - name: Journey Messages
  - name: Journey Message Contents
  - name: Campaigns
  - name: Campaign Messages
  - name: Campaign Message Contents
paths:
  /journeys/{journey_id}/messages/{message_id}/contents/{id}:
    patch:
      tags:
        - Journey Message Contents
      summary: Update localized content
      description: >
        Partially updates journey message content. Optional `content` must be
        exactly one of `mjml`, `html`, `text`, or `payload` as the UI infers the
        editor type from that key.

        Unlike broadcasts, a journey does not need to be a draft in order to
        edit message content. A live or paused journey is editable. Archived and
        locked journeys are rejected with `409 Conflict`.

        You cannot add a `locale` value to the default content and you cannot
        clear the `locale` on a localized content record. Duplicate `locale`
        values are rejected with `409 Conflict`.
      operationId: updateJourneyContent
      parameters:
        - name: journey_id
          in: path
          required: true
          description: Journey ID.
          schema:
            type: integer
        - name: message_id
          in: path
          required: true
          description: Message ID.
          schema:
            type: integer
        - name: id
          in: path
          required: true
          description: Content ID.
          schema:
            type: integer
        - name: revision
          in: header
          required: false
          description: >-
            Optional dated API revision for the request. Must use `YYYY-MM-DD`
            format.
          schema:
            type: string
            pattern: ^\d{4}-\d{2}-\d{2}$
            example: '2026-03-01'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                locale:
                  type: string
                  maxLength: 255
                  description: >-
                    New locale for a localized content. The default content's
                    locale cannot be changed, and a locale already used on this
                    message is rejected.
                subject:
                  type: string
                  nullable: true
                  description: Subject line. Omit to leave it unchanged.
                preheader_text:
                  type: string
                  nullable: true
                  description: Preheader text. Omit to leave it unchanged.
                content:
                  type: object
                  description: >-
                    Channel content body — exactly one of `mjml`, `html`,
                    `text`, or `payload`.
                  properties:
                    mjml:
                      type: string
                    html:
                      type: string
                    text:
                      type: string
                    payload:
                      type: object
            examples:
              htmlContent:
                summary: Update subject and body
                value:
                  subject: Bonjour
                  content:
                    html: <p>Bonjour</p>
        required: true
      responses:
        '200':
          description: Journey content updated.
          content:
            application/json:
              examples:
                default:
                  value:
                    id: 201
                    locale: fr
                    is_default: false
                    subject: Bonjour
                    preheader_text: Ravi
                    content:
                      html: <p>Bonjour</p>
              schema:
                type: object
                required:
                  - id
                  - locale
                  - is_default
                  - subject
                  - preheader_text
                  - content
                properties:
                  id:
                    type: integer
                  locale:
                    type: string
                    nullable: true
                  is_default:
                    type: boolean
                  subject:
                    type: string
                    nullable: true
                  preheader_text:
                    type: string
                    nullable: true
                  content:
                    type: object
                    description: >-
                      Channel content body — exactly one of `mjml`, `html`,
                      `text`, or `payload`.
                    properties:
                      mjml:
                        type: string
                      html:
                        type: string
                      text:
                        type: string
                      payload:
                        type: object
        '409':
          description: Duplicate locale is rejected.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorList'
        '422':
          description: Default content cannot gain a locale.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorList'
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ErrorList:
      type: object
      required:
        - errors
      properties:
        errors:
          type: array
          items:
            type: object
            required:
              - message
            properties:
              message:
                type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: Accepts either a raw API key or `Bearer <key>`.

````