---
title: "Convert a paused or draft legacy Journey to prepared managed content."
method: POST
path: "/v1/workspaces/{workspaceId}/journeys/{journeyId}/convert-managed"
---

# Convert a paused or draft legacy Journey to prepared managed content.

`POST /v1/workspaces/{workspaceId}/journeys/{journeyId}/convert-managed`

## Request

- Base URL: `https://api.bangermail.com`
- URL: `https://api.bangermail.com/v1/workspaces/{workspaceId}/journeys/{journeyId}/convert-managed`
- Auth: HTTP bearer

One-way conversion. For a Journey with one email step, supply contract. For multiple emails, including split arms, supply step_contents with exactly one saved step_id and prepared HTML/Liquid contract per email. The conversion is atomic and changes the Journey to draft. Every new managed content revision receives its own governed publication review; no email is sent or published during conversion. Banger never imports or executes source code.

## Headers

- `Idempotency-Key` string, required

## Request body

- union
  - object
    - `expected_version` integer, required
    - `contract` ManagedContentContract, required
      - `source_locale` string: Canonical BCP 47 source locale; inherits product settings when omitted.
      - `configured_locales` string[]: Source plus target locales; omitted source is added by the server.
      - `fallback_locale` string
      - `layout_id` string, uuid: Selected reusable layout; the server snapshots its published revision into this content revision.
      - `localization_policy` object: A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.
        - `manual_review` boolean
      - `source` object, required
        - `subject` string, required
        - `preheader` string
        - `body_text` string: Accepted for source compatibility; rendered plain text derives from final HTML.
        - `body_html` string, required
        - `layout` string: Must contain one {{ content }} slot.
        - `variants` object: Optional source versions. Every version is translated automatically in the same revision.
        - `variables` object, required
      - `samples` object: Named sample value sets for preview and source validation.
      - `translations` object: Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.
    - `step_contents` object[]
      - `step_id` string, uuid, required
      - `contract` ManagedContentContract, required
        - `source_locale` string: Canonical BCP 47 source locale; inherits product settings when omitted.
        - `configured_locales` string[]: Source plus target locales; omitted source is added by the server.
        - `fallback_locale` string
        - `layout_id` string, uuid: Selected reusable layout; the server snapshots its published revision into this content revision.
        - `localization_policy` object: A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.
          - `manual_review` boolean
        - `source` object, required
          - `subject` string, required
          - `preheader` string
          - `body_text` string: Accepted for source compatibility; rendered plain text derives from final HTML.
          - `body_html` string, required
          - `layout` string: Must contain one {{ content }} slot.
          - `variants` object: Optional source versions. Every version is translated automatically in the same revision.
          - `variables` object, required
        - `samples` object: Named sample value sets for preview and source validation.
        - `translations` object: Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.
  - object
    - `expected_version` integer, required
    - `contract` ManagedContentContract
      - `source_locale` string: Canonical BCP 47 source locale; inherits product settings when omitted.
      - `configured_locales` string[]: Source plus target locales; omitted source is added by the server.
      - `fallback_locale` string
      - `layout_id` string, uuid: Selected reusable layout; the server snapshots its published revision into this content revision.
      - `localization_policy` object: A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.
        - `manual_review` boolean
      - `source` object, required
        - `subject` string, required
        - `preheader` string
        - `body_text` string: Accepted for source compatibility; rendered plain text derives from final HTML.
        - `body_html` string, required
        - `layout` string: Must contain one {{ content }} slot.
        - `variants` object: Optional source versions. Every version is translated automatically in the same revision.
        - `variables` object, required
      - `samples` object: Named sample value sets for preview and source validation.
      - `translations` object: Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.
    - `step_contents` object[], required
      - `step_id` string, uuid, required
      - `contract` ManagedContentContract, required
        - `source_locale` string: Canonical BCP 47 source locale; inherits product settings when omitted.
        - `configured_locales` string[]: Source plus target locales; omitted source is added by the server.
        - `fallback_locale` string
        - `layout_id` string, uuid: Selected reusable layout; the server snapshots its published revision into this content revision.
        - `localization_policy` object: A Journey email goes out only in the person's own language: it waits for their translation, about a minute for receipts, codes and security notices and up to a day for other email, and is not sent if the translation is not ready by then.
          - `manual_review` boolean
        - `source` object, required
          - `subject` string, required
          - `preheader` string
          - `body_text` string: Accepted for source compatibility; rendered plain text derives from final HTML.
          - `body_html` string, required
          - `layout` string: Must contain one {{ content }} slot.
          - `variants` object: Optional source versions. Every version is translated automatically in the same revision.
          - `variables` object, required
        - `samples` object: Named sample value sets for preview and source validation.
        - `translations` object: Source ICU message catalog and optional supplied target catalogs. Missing configured targets are queued for asynchronous translation; saving does not require them.

## Response `200`

Idempotent replay of the same conversion.

- object
  - `data` JourneyManagedConversion, required
    - `journey_id` string, uuid, required
    - `status` 'draft', required
    - `review_required` true, required
    - `managed_content_steps` object[], required
      - `step_id` string, uuid, required
      - `managed_content_id` string, uuid, required
      - `content_version` integer, required
      - `source_revision_id` string, uuid, nullable, required
      - `preview` RenderedEmail, required
        - `subject` string, required
        - `preheader` string
        - `html` string, required
        - `text` string, required
        - `locale` string, required
        - `direction` 'ltr' | 'rtl', required
        - `warnings` string[]
      - `translation_jobs` string[], required
    - `managed_content_id` string, uuid
    - `content_version` integer
    - `source_revision_id` string, uuid, nullable
    - `preview` RenderedEmail
      - `subject` string, required
      - `preheader` string
      - `html` string, required
      - `text` string, required
      - `locale` string, required
      - `direction` 'ltr' | 'rtl', required
      - `warnings` string[]
    - `replayed` boolean, required
    - `approvals` object[], required
      - `step_id` string, uuid, required
      - `approval` ApprovalRequest, required
        - `id` string, uuid, required
        - `requested_by_actor_id` string, required
        - `action_kind` string, required
        - `summary` string, required
        - `capability_scopes` string[], required
        - `resource_scope` object, required
        - `payload` object, required
        - `payload_sha256` string, required
        - `status` 'pending' | 'approved' | 'rejected' | 'cancelled' | 'expired', required
        - `missed` boolean, required
        - `expires_at` string, date-time, required
        - `qa_automation` object, nullable: Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.
          - `kind` 'dedicated_qa_automation'
          - `authorization_reference` string
          - `run_id` string
          - `operation_key` string
          - `recipients` string[]
          - `approval_sha256` string
          - `resource_sha256` string
        - `decided_by_actor_id` string, nullable
        - `decision_reason` string, nullable
        - `created_at` string, date-time, required
        - `updated_at` string, date-time, required
        - `decided_at` string, date-time, nullable
        - `execution_job_id` string, uuid
        - `review` object
          - `disposition` 'automatic' | 'human_required', required
          - `recipient_count` integer, nullable, required
          - `reasons` string[], required
          - `checks` string[], required
    - `approval` ApprovalRequest
      - `id` string, uuid, required
      - `requested_by_actor_id` string, required
      - `action_kind` string, required
      - `summary` string, required
      - `capability_scopes` string[], required
      - `resource_scope` object, required
      - `payload` object, required
      - `payload_sha256` string, required
      - `status` 'pending' | 'approved' | 'rejected' | 'cancelled' | 'expired', required
      - `missed` boolean, required
      - `expires_at` string, date-time, required
      - `qa_automation` object, nullable: Server-recorded dedicated QA automation provenance; never evidence of a human payload review. The run and global authorization are rechecked at execution.
        - `kind` 'dedicated_qa_automation'
        - `authorization_reference` string
        - `run_id` string
        - `operation_key` string
        - `recipients` string[]
        - `approval_sha256` string
        - `resource_sha256` string
      - `decided_by_actor_id` string, nullable
      - `decision_reason` string, nullable
      - `created_at` string, date-time, required
      - `updated_at` string, date-time, required
      - `decided_at` string, date-time, nullable
      - `execution_job_id` string, uuid
      - `review` object
        - `disposition` 'automatic' | 'human_required', required
        - `recipient_count` integer, nullable, required
        - `reasons` string[], required
        - `checks` string[], required

## Other responses

- `201`: All email steps converted to managed drafts; publication reviews requested.
- `409`: Stale Journey version or Journey is active/already managed.
- `422`: Missing, duplicate, or unknown email step contract.

---

[API](https://skmtc.dev/bangermail/apis/banger-api.md) · [All operations](https://skmtc.dev/bangermail/apis/banger-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bangermail/apis/banger-api/revisions/a149909267f9?raw)
