---
title: "Create a journey"
method: POST
path: "/journeys"
tags: ["Journeys"]
---

# Create a journey

`POST /journeys`

Create a journey. Defaults to `DRAFT` state; pass `state: "PUBLISHED"` to publish on create. Send nodes are not allowed on `POST`. The standard flow is: create the journey shell here, add notification templates with `POST /journeys/{templateId}/templates`, then wire them into the journey with `PUT /journeys/{templateId}`. Call `POST /journeys/{templateId}/publish` to publish a draft after the fact.

## Request body

- CreateJourneyRequest — Request body for creating a journey.
  - `name` string, required
  - `nodes` JourneyNode[], required
    - union — A single node in a journey DAG. Discriminated by `type`, with a secondary discriminator on some variants (`trigger_type` for trigger, `mode` for delay, `method` for fetch, `scope` for throttle).
      - JourneyApiInvokeTriggerNode — Trigger fired when the journey is invoked via the API. The optional `schema` field is a JSON Schema that validates the invocation payload.
        - `id` string
        - `type` 'trigger', required
        - `trigger_type` 'api-invoke', required
        - `schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneySegmentTriggerNode — Trigger fired by a segment event (`identify`, `group`, or `track`).
        - `id` string
        - `type` 'trigger', required
        - `trigger_type` 'segment', required
        - `request_type` 'identify' | 'group' | 'track', required
        - `event_id` string
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneySendNode — Send a notification template to the recipient. Optionally override the recipient address, delay the send, or attach `data`.
        - `id` string
        - `type` 'send', required
        - `message` object, required
          - `template` string, required
          - `to` object
            - `email_override` string
            - `phone_number_override` string
            - `user_id_override` string
          - `delay` object
            - `until` string, required
            - `timezone` string
          - `data` object
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyDelayDurationNode — Pause the journey run for a fixed `duration`.
        - `id` string
        - `type` 'delay', required
        - `mode` 'duration', required
        - `duration` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyDelayUntilNode — Pause the journey run `until` a specific time.
        - `id` string
        - `type` 'delay', required
        - `mode` 'until', required
        - `until` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyFetchGetDeleteNode — Issue an HTTP GET or DELETE request and merge the response into the journey state per `merge_strategy`.
        - `id` string
        - `type` 'fetch', required
        - `method` 'get' | 'delete', required
        - `url` string, required
        - `merge_strategy` 'overwrite' | 'soft-merge' | 'replace' | 'none', required — Strategy for merging a fetch response into the journey run state.
        - `headers` object
        - `query_params` object
        - `response_schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyFetchPostPutNode — Issue an HTTP POST or PUT request with a `body` and merge the response into the journey state per `merge_strategy`.
        - `id` string
        - `type` 'fetch', required
        - `method` 'post' | 'put', required
        - `url` string, required
        - `merge_strategy` 'overwrite' | 'soft-merge' | 'replace' | 'none', required — Strategy for merging a fetch response into the journey run state.
        - `headers` object
        - `query_params` object
        - `response_schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `body` string
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyAINode — Invoke an AI step with `user_prompt` and optional `web_search`. Returns a structured response conforming to `output_schema`.
        - `id` string
        - `type` 'ai', required
        - `model` string
        - `user_prompt` string
        - `web_search` boolean
        - `output_schema` object, required — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyThrottleStaticNode — Throttle the journey by a static `scope` (`user` or `global`), allowing at most `max_allowed` invocations per `period`.
        - `id` string
        - `type` 'throttle', required
        - `scope` 'user' | 'global', required
        - `max_allowed` integer, required
        - `period` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyThrottleDynamicNode — Throttle the journey by a dynamic `throttle_key`, allowing at most `max_allowed` invocations per `period`.
        - `id` string
        - `type` 'throttle', required
        - `scope` 'dynamic', required
        - `max_allowed` integer, required
        - `period` string, required
        - `throttle_key` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyExitNode — Terminate the journey run.
        - `id` string
        - `type` 'exit', required
      - object — Branch node. Routes to the first entry in `paths[]` whose `conditions` match, else falls through to `default.nodes`.
        - `id` string
        - `type` 'branch', required
        - `paths` object[], required
          - `label` string
          - `conditions` union, required — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
            - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
            - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
              - …
            - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
              - …
          - `nodes` JourneyNode[], required
        - `default` object, required
          - `label` string
          - `nodes` JourneyNode[], required
  - `enabled` boolean
  - `state` 'DRAFT' | 'PUBLISHED' — Lifecycle state of a journey.

## Response `201`

Journey created

- JourneyResponse — A journey, with its current draft or published nodes and metadata.
  - `id` string, required
  - `name` string, required
  - `state` 'DRAFT' | 'PUBLISHED', required — Lifecycle state of a journey.
  - `enabled` boolean, required
  - `nodes` JourneyNode[], required
    - union — A single node in a journey DAG. Discriminated by `type`, with a secondary discriminator on some variants (`trigger_type` for trigger, `mode` for delay, `method` for fetch, `scope` for throttle).
      - JourneyApiInvokeTriggerNode — Trigger fired when the journey is invoked via the API. The optional `schema` field is a JSON Schema that validates the invocation payload.
        - `id` string
        - `type` 'trigger', required
        - `trigger_type` 'api-invoke', required
        - `schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneySegmentTriggerNode — Trigger fired by a segment event (`identify`, `group`, or `track`).
        - `id` string
        - `type` 'trigger', required
        - `trigger_type` 'segment', required
        - `request_type` 'identify' | 'group' | 'track', required
        - `event_id` string
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneySendNode — Send a notification template to the recipient. Optionally override the recipient address, delay the send, or attach `data`.
        - `id` string
        - `type` 'send', required
        - `message` object, required
          - `template` string, required
          - `to` object
            - `email_override` string
            - `phone_number_override` string
            - `user_id_override` string
          - `delay` object
            - `until` string, required
            - `timezone` string
          - `data` object
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyDelayDurationNode — Pause the journey run for a fixed `duration`.
        - `id` string
        - `type` 'delay', required
        - `mode` 'duration', required
        - `duration` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyDelayUntilNode — Pause the journey run `until` a specific time.
        - `id` string
        - `type` 'delay', required
        - `mode` 'until', required
        - `until` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyFetchGetDeleteNode — Issue an HTTP GET or DELETE request and merge the response into the journey state per `merge_strategy`.
        - `id` string
        - `type` 'fetch', required
        - `method` 'get' | 'delete', required
        - `url` string, required
        - `merge_strategy` 'overwrite' | 'soft-merge' | 'replace' | 'none', required — Strategy for merging a fetch response into the journey run state.
        - `headers` object
        - `query_params` object
        - `response_schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyFetchPostPutNode — Issue an HTTP POST or PUT request with a `body` and merge the response into the journey state per `merge_strategy`.
        - `id` string
        - `type` 'fetch', required
        - `method` 'post' | 'put', required
        - `url` string, required
        - `merge_strategy` 'overwrite' | 'soft-merge' | 'replace' | 'none', required — Strategy for merging a fetch response into the journey run state.
        - `headers` object
        - `query_params` object
        - `response_schema` object — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `body` string
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyAINode — Invoke an AI step with `user_prompt` and optional `web_search`. Returns a structured response conforming to `output_schema`.
        - `id` string
        - `type` 'ai', required
        - `model` string
        - `user_prompt` string
        - `web_search` boolean
        - `output_schema` object, required — A JSONSchema object (Draft-07-compatible). Validated at runtime by Ajv.
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyThrottleStaticNode — Throttle the journey by a static `scope` (`user` or `global`), allowing at most `max_allowed` invocations per `period`.
        - `id` string
        - `type` 'throttle', required
        - `scope` 'user' | 'global', required
        - `max_allowed` integer, required
        - `period` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyThrottleDynamicNode — Throttle the journey by a dynamic `throttle_key`, allowing at most `max_allowed` invocations per `period`.
        - `id` string
        - `type` 'throttle', required
        - `scope` 'dynamic', required
        - `max_allowed` integer, required
        - `period` string, required
        - `throttle_key` string, required
        - `conditions` union — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
          - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
          - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
            - `AND` JourneyConditionAtom[]
              - …
            - `OR` JourneyConditionAtom[]
              - …
          - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
            - `AND` JourneyConditionGroup[]
              - …
            - `OR` JourneyConditionGroup[]
              - …
      - JourneyExitNode — Terminate the journey run.
        - `id` string
        - `type` 'exit', required
      - object — Branch node. Routes to the first entry in `paths[]` whose `conditions` match, else falls through to `default.nodes`.
        - `id` string
        - `type` 'branch', required
        - `paths` object[], required
          - `label` string
          - `conditions` union, required — Condition spec for a journey node. Accepts a single condition atom, an AND/OR group, or an AND/OR nested group. Omit the `conditions` property entirely to express "no conditions".
            - string[] — A single condition expressed as a positional tuple of strings. - Binary form (3 elements): `[path, operator, value]` where `operator` is one of `is equal`, `is not equal`, `contains`, `does not contain`, `starts with`, `ends with`, `greater than`, `greater than or equal`, `less than`, `less than or equal`. Example: `["user.tier", "is equal", "gold"]`. - Unary form (2 elements): `[path, operator]` where `operator` is one of `exists`, `does not exist`. Example: `["user.email", "exists"]`. The first element is a non-empty dot-path. The second element is the operator (must come from one of the two operator sets above). For the binary form, the third element is the comparison value (string). Runtime validation of the operator value and arity is performed by the backend; SDKs surface this as a string list.
            - JourneyConditionGroup — A leaf condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionAtom` tuples.
              - …
            - JourneyConditionNestedGroup — A nested condition group. Exactly one of `AND` or `OR` must be present at runtime; each is a list of `JourneyConditionGroup` items.
              - …
          - `nodes` JourneyNode[], required
        - `default` object, required
          - `label` string
          - `nodes` JourneyNode[], required
  - `created` integer, nullable, required
  - `creator` string, nullable, required
  - `updated` integer, nullable, required
  - `updater` string, nullable, required
  - `published` integer, nullable, required

## Other responses

- `400` — Bad request
- `404` — Not found
- `422` — Unprocessable entity

## Changes

- **2026-05-19** `ecf876c6cda3` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/trycourier/apis/courier/changes/journeys/post.md)

---

[API](https://skmtc.dev/trycourier/apis/courier.md) · [All operations](https://skmtc.dev/trycourier/apis/courier/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/trycourier/courier/revisions/ecf876c6cda3/schema)
