# MessageRecipient

Type: object

Choose how Flownally should find the customer thread: an existing conversation,
a known contact, or a channel recipient for first-message sends.

## Properties

## Discriminator

Use `type` with one of `conversation`, `contact`, `channel`.

## Variants

### ConversationRecipient

Discriminator value: `conversation`

Continue a known conversation.

Required fields: `type`, `conversationId`

- `type` (const, required)
- `conversationId` (string, required)

```json
{
  "type": "conversation",
  "conversationId": "cnv_01HV8Z2JH0Q7K4M9N6P2A1B3C5"
}
```

### ContactRecipient

Discriminator value: `contact`

Send to a contact identity. Pass channel when the contact has more than one route.

Required fields: `type`, `contactId`

- `type` (const, required)
- `contactId` (string, required)
- `channel` (MessageRecipientChannel, optional)

```json
{
  "type": "contact",
  "contactId": "ctc_01HV8Z2JH0Q7K4M9N6P2A1B3C5",
  "channel": "whatsapp"
}
```

### ChannelRecipient

Discriminator value: `channel`

Start a conversation with a channel-specific recipient identifier.

Required fields: `type`, `externalId`, `channel`

- `type` (const, required)
- `externalId` (string, required) - Channel-specific recipient identifier. For WhatsApp this may be an E.164 phone number; channel adapters normalize provider-specific formats.
- `channel` (MessageRecipientChannel, required)

```json
{
  "type": "channel",
  "externalId": "string",
  "channel": "whatsapp"
}
```

