Brand Message is the KakaoTalk channel for **marketing and promotional messages**. Unlike Alimtalk, which is informational only, it can carry advertising — and unlike Friendtalk, it can reach **people who are not channel friends**.

> **v2 only.** This endpoint does not exist on v1.

## Prerequisites

- A Kakao sender profile key (`kakaoSenderKey`) → [Registering a sending number](/en/cookbook/sender-number)
- A **`friendTemplateUuid`** from a Brand Message template registered in the console
- For promotional sends, `adFlag: "Y"` and compliance with the [advertising rules](/en/cookbook/ad-message-rules)

## `targeting` decides the path

| `targeting` | Audience | Mode | `contacts` |
| --- | --- | --- | --- |
| `M` | Channel friends | Single (`BRAND_BASIC`) | required |
| `N` | **Not** channel friends | Single (`BRAND_BASIC`) | required |
| `I` | Specified audience | Single (`BRAND_BASIC`) | required |
| `F` | **All** consenting channel friends | Broadcast (`BRAND_GROUP`) | not used |

`F` names no recipients, so the response carries **acceptance only**, not a send count. Check results through the campaign lookup.

## Message types

Send the **Friendtalk code**; the server converts it.

| You send | Becomes | Content |
| --- | --- | --- |
| `FT` | `BT` | Text |
| `FI` | `BI` | Image |
| `FW` | `BW` | Wide image |
| `FL` | `BL` | List |
| `FC` | `BC` | Commerce |
| `FM` | `BM` | Composite |
| `FP` | `BP` | Premium video |
| `FA` | `BA` | Carousel |

**The important exception**: sending `FT`/`FI`/`FW` with `M`/`N`/`I` returns `NOT_A_BRAND_MESSAGE` here. Free-form bodies to individual recipients still go through `/api/v2/friends/send`. See [Friendtalk shut down](/en/cookbook/friendtalk-sunset).

## Examples by language

### Node.js / TypeScript

```typescript
// Single send — channel friends
await sendgo.brandMessage.send({
  targeting: 'M',
  messageType: 'FL',
  friendTemplateUuid: '9cd5460b-6458-4edc-9b11-c26d3013c340',
  adFlag: 'Y',
  contacts: [{ contact: '01012345678', var1: '29,000원' }],
});

// Single send — people who are not channel friends
await sendgo.brandMessage.send({
  targeting: 'N',
  messageType: 'FM',
  friendTemplateUuid: '9cd5460b-6458-4edc-9b11-c26d3013c340',
  adFlag: 'Y',
  contacts: [{ contact: '01012345678' }],
});

// Broadcast — every consenting channel friend, no contacts
await sendgo.brandMessage.broadcast({
  messageType: 'FW',
  friendTemplateUuid: '9cd5460b-6458-4edc-9b11-c26d3013c340',
  adFlag: 'Y',
});

// Campaign results
const list = await sendgo.brandMessage.campaigns({ count: 10 });
const one  = await sendgo.brandMessage.campaign(campaignId);
```

### Python

```python
client.brand_message.send(
    targeting="M",
    message_type="FL",
    friend_template_uuid="9cd5460b-6458-4edc-9b11-c26d3013c340",
    ad_flag="Y",
    contacts=[{"contact": "01012345678", "var1": "29,000원"}],
)
```

### PHP · Laravel

```php
<?php

$sendgo->brandMessage->send([
    'targeting'          => 'M',
    'messageType'        => 'FL',
    'friendTemplateUuid' => '9cd5460b-6458-4edc-9b11-c26d3013c340',
    'adFlag'             => 'Y',
    'contacts'           => [['contact' => '01012345678', 'var1' => '29,000원']],
]);
```

### REST

```bash
curl -X POST https://sendgo.io/api/v2/brand-messages/send \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "kakaoSenderKey": "your_kakao_sender_key",
    "targeting": "F",
    "messageType": "FW",
    "friendTemplateUuid": "9cd5460b-6458-4edc-9b11-c26d3013c340",
    "adFlag": "Y",
    "scheduleType": "DIRECTLY"
  }'
```

## SMS fallback

Brand Message supports `replaceSms: "Y"` too. Supply `smsSubject`, `smsContent` and `senderKey` alongside it.

```typescript
await sendgo.brandMessage.send({
  targeting: 'M',
  messageType: 'FL',
  friendTemplateUuid: '...',
  replaceSms: 'Y',
  smsSubject: '[Summer sale]',
  smsContent: 'Check out our summer offers.',
  contacts: [{ contact: '01012345678' }],
});
```

## Campaign lookup

Broadcasts only confirm acceptance, so results come from a separate call.

```bash
# List, defaults to the last 90 days
curl "https://sendgo.io/api/v2/brand-messages?count=30" -H "Authorization: Bearer $TOKEN"

# Detail — use campaignId from the send response
curl "https://sendgo.io/api/v2/brand-messages/$CAMPAIGN_ID" -H "Authorization: Bearer $TOKEN"
```

This returns Brand Message campaigns (`BRAND_GROUP`, `BRAND_BASIC`) only. Friendtalk campaigns live at `/api/v2/friends`.

## Next

- [Kakao Friendtalk shut down — migrating](/en/cookbook/friendtalk-sunset)
- [Advertising message rules](/en/cookbook/ad-message-rules)