# Point reference

Every [point](/developer/api-reference/customer-journey-api/journey-object/#point) carries a `point_data` object with exactly one nested key, matching the point's `point_type` (see the [point-type → key mapping](/developer/api-reference/customer-journey-api/journey-object/#point-types-and-point_data)). This page documents the structure under each key.

<Aside type="note">
Entry, timing, splitting, action, and conversion points are documented in full below.

For messaging points (`send_*`, `inapp`), this page covers only the structural fields: which preset or content to reference and which channel settings to pass. 
The message content itself is defined in the preset and documented in the [Presets API](/developer/api-reference/presets-api/) and per-channel docs. 
Some fields reference nested objects that mirror the controls in the Customer Journey builder.
</Aside>
## Entry points

A journey needs at least one entry point. All entry points have a single `default` output.

### start_by_segment

Enters users who match a segment. `POINT_TYPE_START_BY_SEGMENT`.

| Field | Type | Description |
|---|---|---|
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `filter_code` | string | [Segment/filter code](/developer/api-reference/api-identifiers/#segment--filter-code) that defines the audience. |
| `repeat` | `SegmentRepeat` | Optional recurring-entry schedule (see [SegmentRepeat](#segmentrepeat)). |
| `start_at` | timestamp | Do not process before this time (ISO 8601). |
| `is_deactivated` | bool | Whether this entry point is turned off. |

### message_bus (event entry)

Enters users when they trigger an event. `POINT_TYPE_EVENT`.

| Field | Type | Description |
|---|---|---|
| `event_name` | string | [Event name](/developer/api-reference/api-identifiers/#event-name) to listen for. |
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `event_conditions` | `PointEventCondition[]` | Conditions matched against the event's attributes. |
| `active_period` | `Period` | Time window during which the trigger is active. |
| `multi_entry` | `MultiEntry` | How a user may enter more than once (see [MultiEntry](#multientry)). |
| `attribute_entry` | `AttributeEntry` | Enroll the user IDs carried in an event attribute instead of the user who triggered the event (see [AttributeEntry](#attributeentry)). |
| `allow_reenter` | bool | Whether users may re-enter the journey. |

##### AttributeEntry

Enrolls the [User IDs](/developer/api-reference/api-identifiers/#user-id) carried in an event attribute, instead of the user who triggered the event. Mirrors [Users from an event attribute](/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#users-from-an-event-attribute) in the Customer Journey builder.

| Field | Type | Description |
|---|---|---|
| `enabled` | bool | Whether to enroll users named in an event attribute rather than the user who triggered the event. |
| `attribute_name` | string | Name of the event attribute that holds the User ID (or list of User IDs) to enroll. |

### start_by_api

Entry point fed by the [Start by API](/developer/api-reference/customer-journey-api/start-by-api/) call. `POINT_TYPE_START_BY_API`.

| Field | Type | Description |
|---|---|---|
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `attributes` | string[] | Names of the custom attributes that can be passed in the `attribute_values` of a [Start by API](/developer/api-reference/customer-journey-api/start-by-api/#request-body) request. |
| `is_deactivated` | bool | Whether this entry point is turned off. |

## Timing points

### delay (wait)

Pauses each user for a fixed or computed interval. `POINT_TYPE_WAIT`. The `point_data.delay` object sets exactly one of the following interval keys:

| Interval key | Type | Description |
|---|---|---|
| `sec` | uint64 | Wait a fixed number of seconds. |
| `exact_time` | [`ExactTime`](#time-objects) | Wait until a time of day (`hour`, `minute`). |
| `exact_date_time` | [`ExactDateTime`](#time-objects) | Wait until an absolute date and time. |
| `exact_week_days_time` | `ExactWeekDaysTime` | Wait until specific times on specific weekdays (map of day `0`=Monday … `6`=Sunday → `ExactTime`). |
| `dynamic_time` | [`DynamicTime`](#dynamictime) | Wait relative to a value from a tag or event. |

A `dynamic_time` with `split_branches: true` adds an `output1` branch (see [output keys](/developer/api-reference/customer-journey-api/journey-object/#output-keys)).

#### DynamicTime

| Field | Type | Description |
|---|---|---|
| `from` | enum `DynamicTimeFrom` | Whether the base time comes from a tag or an event. |
| `direction` | enum `DynamicTimeDirection` | Offset before or after the base time. |
| `duration` | uint64 | Size of the offset. |
| `unit` | enum `DynamicTimeUnit` | Unit of `duration` (minutes, hours, days, …). |
| `split_branches` | bool | Split users into separate branches when their computed times differ. |
| `tag_name` | string | Tag holding the base time (when `from` is a tag). |
| `event_name` / `event_attribute` / `point_id` | string | Event source of the base time (when `from` is an event). |

### wait_event

Waits until users trigger an event (or a timeout). `POINT_TYPE_WAIT_EVENT`. The `default` output is the **not-triggered** path. The triggered path is `output1` or, with a script, one branch per condition.

| Field | Type | Description |
|---|---|---|
| `events` | `PointWaitEventInfo[]` | Events to wait for. |
| `conditions_script` | string | Optional script for complex multi-event logic. Its parsed condition names become the output keys. |
| `multi_entry` | `MultiEntry` | Re-entry behavior. |

## Splitting and filtering points

### boolean_splitter

Routes users down branches based on a condition. `POINT_TYPE_BOOLEAN_SPLITTER`.

| Field | Type | Description |
|---|---|---|
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `split_strategy` | enum | `SPLIT_FILTER` (by segment), `SPLIT_TAGS` (by tag conditions), or `SPLIT_EVENTS` (by event conditions). |
| `load_policy` | enum | `ALL` (any of the user's devices may match) or `FILTER` (only the current device). |
| `filter_code` | string | Segment code, when `split_strategy` is `SPLIT_FILTER`. |
| `filter_expressions` | `FilterExpression[]` | Tag conditions, when `split_strategy` is `SPLIT_TAGS`: one extra `output` branch per expression. |
| `event` | `BooleanSplitterEventInfo` | Event conditions, when `split_strategy` is `SPLIT_EVENTS`: one extra `output` branch per condition. |

### ab_splitter

Randomly splits users into weighted variants. `POINT_TYPE_AB_SPLITTER`. Output keys are `output0`, `output1`, … (one per entry in `split`, indexed from 0. There is no `default`).

| Field | Type | Description |
|---|---|---|
| `split` | uint32[] | Percentage for each branch. Must sum to 100. Index `i` maps to output key `output{i}`. |
| `auto_select_winner` | bool | Whether to automatically pick a winning branch. |
| `winner_strategy` | enum | `ANY_GOAL` or `SPECIFIC_GOAL`. |
| `goal_uuid` | string | Goal used to determine the winner (with `SPECIFIC_GOAL`). |
| `winner_split` | uint32 | Winning branch number (1-based, `0` = no winner yet). |

### filter

Lets only matching users continue (`default`), routing the rest to `output1`. `POINT_TYPE_FILTER`.

| Field | Type | Description |
|---|---|---|
| `filter` | enum `Filter` | A predefined check: `EMAIL_EXISTS`, `PUSH_TOKEN_EXISTS`, `SMS_TOKEN_EXISTS`, `WHATSAPP_TOKEN_EXISTS`, `LINE_TOKEN_EXISTS`, or `CUSTOM`. |
| `filter_raw` | string | Custom filter expression, when `filter` is `CUSTOM`. |

## Action points

### set_tags

Updates tags on the user. `POINT_TYPE_SET_TAGS`.

| Field | Type | Description |
|---|---|---|
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `tags` | [`Tag`](#tag)[] | Tags to write. |

#### Tag

| Field | Type | Description |
|---|---|---|
| `name` | string | Tag name. |
| `type` | enum `TagType` | Data type and operation: `TYPE_STRING`, `TYPE_INTEGER`, `TYPE_DATE`, `TYPE_BOOLEAN`, `TYPE_LIST`, `TYPE_LIST_APPEND`, `TYPE_LIST_REMOVE`, `TYPE_DYNAMIC`, … |
| _value_ | oneof | Exactly one value key matching `type`: `str`, `int`, `bool`, `date`, `price`, `version`, `timezone`, `list`, or `dynamic`. |

### web_hook

Sends an outbound HTTP request. `POINT_TYPE_WEBHOOK`. Single `default` output.

| Field | Type | Description |
|---|---|---|
| `method` | string | HTTP method (`GET`, `POST`, `PUT`, …). |
| `url` | string | Target URL. |
| `request_template` | string | Request body template. Supports [Liquid](/developer/api-reference/messaging-api-v2/payload-reference/) templating. |
| `headers` | map&lt;string, string&gt; | HTTP headers. |
| `disabled` | bool | Read-only. `true` when Pushwoosh auto-disabled the webhook after repeated errors. |
| `reactivate` | bool | Write-only. Set `true` to re-enable a disabled webhook. |

## Conversion points

### goal_event

Tracks a conversion goal. `POINT_TYPE_GOAL_EVENT`. Has no outputs.

| Field | Type | Description |
|---|---|---|
| `event_name` | string | Goal event name. |
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `event_conditions` | `PointEventCondition[]` | Conditions matched against the goal event's attributes. |
| `is_throw_out` | bool | Whether to remove the user from the journey once the goal is reached. |
| `is_cancel_event` | bool | Whether this is a negative (cancellation) goal. |

## Exit points

### terminator

Ends the journey for the user. `POINT_TYPE_EXIT`. Empty object (`{}`) and no outputs.

```json
{ "point_type": "POINT_TYPE_EXIT", "point_data": { "terminator": {} }, "outputs": [] }
```

## Messaging points

All messaging points send through a channel and share a common envelope. Each has a single `default` output unless a splitter is enabled (see [output keys](/developer/api-reference/customer-journey-api/journey-object/#output-keys)).

Common fields:

| Field | Type | Description |
|---|---|---|
| `application_code` | string | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `preset_code` | string | [Preset](/developer/api-reference/presets-api/) (template) to send. `inapp` uses `richmedia_code` instead. |
| `content` / `title` | string | Inline message content, when not using a preset (channel-dependent). |
| `campaign_code` | string | [Campaign code](/developer/api-reference/api-identifiers/#campaign-code) for tracking. Created automatically if omitted. |
| `split_params` | [`BehaviorSplitter`](#behaviorsplitter) | Optional: wait for an interaction and branch on it. |
| `message_type` | enum | [Marketing vs transactional](/product/messaging-channels/marketing-vs-transactional/) message type (controls control-group handling). |

Point types and their notable extra fields:

| Point type | `point_data` key | Notes |
|---|---|---|
| `POINT_TYPE_SEND_PUSH` | `send_push` | `split_params` (behavior) plus a delivery splitter can produce up to three outputs. `send_by_user_id`, `wait_optimal_time`. |
| `POINT_TYPE_SEND_EMAIL` | `send_email` | `liquid_template_params`, `personalise`. See the [Email API](/developer/api-reference/email-api/). |
| `POINT_TYPE_SEND_SMS` | `send_sms` | See [SMS](/developer/api-reference/sms/). |
| `POINT_TYPE_SEND_WHATSAPP` | `send_whatsapp` | A quick-reply preset adds one output per reply (key = reply value). See [WhatsApp](/developer/api-reference/whatsapp/). |
| `POINT_TYPE_SEND_TELEGRAM` | `send_telegram` | Telegram channel. |
| `POINT_TYPE_SEND_KAKAO` | `send_kakao` | See [Kakao](/developer/api-reference/kakao/). |
| `POINT_TYPE_SEND_LINE` | `send_line` | See [LINE API](/developer/api-reference/line-api/). |
| `POINT_TYPE_SEND_DATA` | `send_data` | Silent data message (no UI). |
| `POINT_TYPE_INAPP` | `inapp` | Uses `richmedia_code`, `expire_in_days`, `capping`. |

## Shared types

### SegmentRepeat

| Field | Type | Description |
|---|---|---|
| `enabled` | bool | Whether recurring entry is on. |
| `frequency` | string | `daily`, `weekly`, `monthly`, or `dates`. |
| `every` | uint32 | Repeat every N periods. |
| `dates` | string[] | Specific dates, when `frequency` is `dates`. |
| `time` | `SegmentRepeatTime` | Time-of-day configuration. |

### Time objects

- `ExactTime`: `{ "hour": 0–23, "minute": 0–59 }`.
- `ExactDateTime`: `{ "year", "month": 1–12, "day": 1–31, "hour": 0–23, "minute": 0–59 }`.

### BehaviorSplitter

| Field | Type | Description |
|---|---|---|
| `enabled` | bool | Whether to wait for an interaction and branch on it. |
| `interval` | uint64 | Seconds to wait for the interaction. |

### MultiEntry

Controls how many active sessions a user can have in the journey at the same time. Mirrors [Control how many sessions a user can have at the same time](/product/customer-journey/journey-elements/entry-elements/trigger-based-entry/#control-how-many-sessions-a-user-can-have-at-the-same-time) in the Customer Journey builder. Used by the [event entry point](#message_bus-event-entry) and [wait_event](#wait_event).

| Field | Type | Description |
|---|---|---|
| `enabled` | bool | Whether a user can have multiple active sessions at the same time. `false`: one active session per user. `true`: multiple active sessions per user. |
| `attribute_name` | string | Optional. Event attribute that scopes each session. When set, a user can have one active session per distinct value of this attribute (for example, one per `order_id`). Events with the same value share one session. Leave empty to scope all of the user's entries together. |

## Related

<CardGrid>
  <LinkCard title="Journey object" href="/developer/api-reference/customer-journey-api/journey-object/" />
  <LinkCard title="Create and update" href="/developer/api-reference/customer-journey-api/create-update/" />
  <LinkCard title="Presets API" href="/developer/api-reference/presets-api/" />
</CardGrid>