# Merge contacts

> Merge a source contact into this contact. All channels from the source contact will be moved to the target contact, and the source contact will be marked as merged.

`POST https://api.zavu.dev/v1/contacts/{contactId}/merge`

Merge a source contact into this contact. All channels from the source contact will be moved to the target contact, and the source contact will be marked as merged.

## Parameters

- `contactId` (path, string, required)

## Body

- `sourceContactId` (string, required): ID of the contact to merge into the target contact. The source contact will be marked as merged.

## Responses

### 200

Contacts merged. Returns the updated target contact.

- `id` (string, required)
- `displayName` (string): Display name for the contact.
- `phoneNumber` (string): DEPRECATED: Use primaryPhone instead. Primary phone number in E.164 format.
- `primaryPhone` (string): Primary phone number in E.164 format.
- `primaryEmail` (string<email>): Primary email address.
- `countryCode` (string)
- `profileName` (string, nullable): Contact's WhatsApp profile name. Only available for WhatsApp contacts.
- `whatsapp` (object): WhatsApp identity. Present when Zavu has a business-scoped user ID (BSUID) for the contact, and absent otherwise. A contact with a username can be reached under its BSUID, its phone number, or both; they are the same contact. Look one up by BSUID with the `bsuid` query parameter of the list endpoint.
  - `bsuid` (string, required): Business-scoped user ID. Can be used as `to` when sending.
  - `username` (string): The WhatsApp username, when Meta reported one.
- `availableChannels` (string[], required): List of available messaging channels for this contact.
- `defaultChannel` (string): Preferred channel for this contact. One of: `sms`, `whatsapp`, `telegram`, `email`, `instagram`, `messenger`, `voice`.
- `verified` (boolean, required): Whether this contact has been verified.
- `channels` (object[]): All communication channels for this contact.
  - `id` (string, required)
  - `channel` (string, required): Channel type. One of: `sms`, `whatsapp`, `email`, `telegram`, `instagram`, `messenger`, `voice`.
  - `identifier` (string, required): Channel identifier (phone number or email address).
  - `countryCode` (string): ISO country code for phone numbers.
  - `label` (string): Optional label for the channel.
  - `isPrimary` (boolean, required): Whether this is the primary channel for its type.
  - `verified` (boolean, required): Whether this channel has been verified.
  - `metrics` (object): Delivery metrics for this channel.
    - `successCount` (integer)
    - `failureCount` (integer)
    - `totalAttempts` (integer)
    - `avgDeliveryTimeMs` (number)
    - `lastSuccessAt` (string<date-time>)
  - `lastInboundAt` (string<date-time>): Last time a message was received on this channel.
  - `metadata` (object)
    - `{key}` (string)
  - `createdAt` (string<date-time>, required)
  - `updatedAt` (string<date-time>)
- `metadata` (object, required)
  - `{key}` (string)
- `createdAt` (string<date-time>, required)
- `updatedAt` (string<date-time>)

### 400

Invalid request (e.g., cannot merge contact with itself).

- `code` (string, required)
- `message` (string, required)
- `details` (object)

### 401

Unauthorized.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

### 404

Target or source contact not found.

- `code` (string, required)
- `message` (string, required)
- `details` (object)

## Example

```bash
curl -X POST "https://api.zavu.dev/v1/contacts/contact_abc123/merge" \
  -H "Authorization: Bearer $ZAVUDEV_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "sourceContactId": "jx7xyz789"
}'
```

```typescript
import Zavudev from "@zavudev/sdk";

const zavu = new Zavudev({ apiKey: process.env.ZAVUDEV_API_KEY });

const result = await zavu.contacts.merge("contact_abc123", {
  sourceContactId: "jx7xyz789",
});

console.log(result);
```
