Kakao Friendtalk **ended on 2025-12-31**. Brand Message is the successor channel.

First thing to know: **existing code does not break.** The endpoint remains and calls still succeed. But what goes out is a Brand Message that Kakao substituted, so it is worth understanding what changed.

## What is happening now

| | Before 2025-12-31 | From 2026-01-01 |
| --- | --- | --- |
| Calling `/api/v2/friends/send` | Sends a Friendtalk | Succeeds, delivered as a **free-form Brand Message** |
| Endpoint removal | — | Not removed |
| New development | Friendtalk | **Brand Message** |

## When to migrate

### Migrate now if you need

- **Template-based rich types** — `FL` (list), `FC` (commerce), `FM` (composite), `FP` (premium video), `FA` (carousel)
- **Non-friend recipients** — `targeting: N` or `I`
- **A broadcast to all consenting channel friends** — `targeting: F`, no recipient list

None of these were possible with Friendtalk. Migrating is less about the shutdown than about gaining capability.

### You can stay put if

- You send **free-form types (`FT`/`FI`/`FW`) to individual recipients**

That combination should in fact **keep using the Friendtalk endpoint**. The brand-message endpoint answers `NOT_A_BRAND_MESSAGE` for it.

```typescript
// Leave this alone — moving it to brandMessage returns NOT_A_BRAND_MESSAGE.
await sendgo.friendtalk.send({
  messageType: 'FT',
  content: 'Hello! Here is this week\'s update.',
  contacts: [{ contact: '01012345678' }],
});
```

### If you do not want the substitution

If having Friendtalk requests silently become Brand Messages is not acceptable, do not call Friendtalk at all — send [SMS](/en/cookbook/send-sms) instead.

## Message type mapping

**Send the Friendtalk code.** The server converts.

| Friendtalk | Brand Message | 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 |

Do not rewrite `FT` to `BT` in your code. Keep sending `FT`.

## Migrating

### Before — Friendtalk to individual recipients

```typescript
await sendgo.friendtalk.send({
  messageType: 'FI',
  content: 'Check out this week\'s deals!',
  imageUrl: 'https://cdn.example.com/banner.jpg',
  adFlag: 'Y',
  contacts: [{ contact: '01012345678' }],
});
```

### After — Brand Message with a template

Brand Message references a template registered in the console, so you need a `friendTemplateUuid`.

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

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

The big shift: **the body no longer travels in the request.** Friendtalk carried `content` per call; Brand Message rich types reference a registered template and you fill its variables.

## Campaign lookups split too

```bash
# Brand Message campaigns (BRAND_GROUP, BRAND_BASIC)
GET /api/v2/brand-messages

# Friendtalk campaigns
GET /api/v2/friends
```

The brand-message list does not return Friendtalk campaigns. Reporting code that spans both channels has to query both.

## Checklist

- [ ] Found every Friendtalk call site (`friendtalk`, `friends/send`)
- [ ] Classified each: `FT`/`FI`/`FW` to individuals → **leave as is**
- [ ] Identified the ones needing rich types, non-friend targeting or broadcast → migrate
- [ ] Registered Brand Message templates and captured their `friendTemplateUuid`
- [ ] Set `adFlag: 'Y'` on promotional sends and checked the advertising rules
- [ ] Reporting queries both endpoints
- [ ] SDK upgraded to 1.2.1 or later (the release that reflects the shutdown)

## Next

- [Send a Kakao Alimtalk](/en/cookbook/send-alimtalk)
- [Error codes and retry strategy](/en/cookbook/error-handling)