---
title: "Merge duplicate contacts (v2)"
method: POST
path: "/v2/contacts/merge"
tags: ["contacts"]
---

# Merge duplicate contacts (v2)

`POST /v2/contacts/merge`

Merge one or more groups of duplicate contacts. The request body is `{ contactIds: string[][] }` — each inner array is a group of ≥2 contact IDs to merge into a single surviving contact. Returns `{ data: { merged: Contact[], failed: [...] } }`: `merged` holds the surviving contacts, `failed` lists any groups that could not be merged. `Idempotency-Key` is REQUIRED.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `contactIds` array[], required
    - string[]

## Response `200`

Successful response

- object
  - `data` object, required
    - `merged` object[], required
      - `id` string, uuid, required
      - `user_id` string
      - `first_name` string, nullable
      - `last_name` string, nullable
      - `full_name` string, nullable
      - `description` string, nullable
      - `job_title` string, nullable
      - `company` string, nullable
      - `education` string, nullable
      - `legacy_location` string, nullable
      - `image_url` string, nullable
      - `business_card_url` string, nullable
      - `website` string, nullable
      - `image_source` string, nullable
      - `birthday` union
        - string, date-time
        - unknown
      - `birthday_year` integer, nullable
      - `linkedin` string, nullable
      - `twitter` string, nullable
      - `facebook` string, nullable
      - `instagram` string, nullable
      - `telegram` string, nullable
      - `tiktok` string, nullable
      - `youtube` string, nullable
      - `starred` boolean
      - `is_archived` boolean
      - `ignore_merge` boolean
      - `never_keep_in_touch` boolean
      - `source` string
      - `priority_tier` integer, nullable
      - `frequency` string, nullable
      - `frequency_text` string, nullable
      - `last_seen_at` union
        - string, date-time
        - unknown
      - `last_reminder_at` union
        - string, date-time
        - unknown
      - `next_reminder_at` union
        - string, date-time
        - unknown
      - `first_met_at` union
        - string, date-time
        - unknown
      - `linkedin_companies` string, nullable
      - `linkedin_education` string, nullable
      - `linkedin_enhance_date` union
        - string, date-time
        - unknown
      - `linkedin_last_message_at` union
        - string, date-time
        - unknown
      - `linkedin_last_message_snippet` string, nullable
      - `linkedin_message_link` string, nullable
      - `whatsapp_message_link` string, nullable
      - `whatsapp_message_snippet` string, nullable
      - `whatsapp_last_message_at` union
        - string, date-time
        - unknown
      - `imessage_message_link` string, nullable
      - `imessage_message_snippet` string, nullable
      - `imessage_last_message_at` union
        - string, date-time
        - unknown
      - `instagram_message_link` string, nullable
      - `instagram_message_snippet` string, nullable
      - `instagram_last_message_at` union
        - string, date-time
        - unknown
      - `gmail_last_interaction_at` union
        - string, date-time
        - unknown
      - `gmail_last_interaction_provider` 'GOOGLE' | 'OFFICE365', nullable
      - `gmail_last_interaction_provider_id` string, nullable
      - `gmail_last_interaction_subject` string, nullable
      - `gcal_last_interaction_at` union
        - string, date-time
        - unknown
      - `gcal_last_interaction_provider` 'GOOGLE' | 'OFFICE365', nullable
      - `gcal_last_interaction_provider_id` string, nullable
      - `gcal_last_interaction_title` string, nullable
      - `phone_call_interaction_snippet` string, nullable
      - `phone_call_last_interaction_at` union
        - string, date-time
        - unknown
      - `web_search_summary` unknown
      - `created_at` union
        - string, date-time
        - unknown
      - `updated_at` union
        - string, date-time
        - unknown
      - `geocode_attempts` integer
      - `geocode_failed_at` union
        - string, date-time
        - unknown
      - `_count` object
        - `groups_contacts` integer, required
      - `frequency_interval` unknown
      - `linkedin_data` object, nullable
      - `latitude` number, nullable
      - `longitude` number, nullable
      - `contact_emails` object[]
      - `contact_phone_numbers` object[]
      - `contact_birthdays` object, nullable
      - `contact_locations` object[]
      - `contacts_custom_fields` object[]
      - `legacy_contact_addresses` object[]
      - `groups_contacts` object[]
      - `tags_contacts` object[]
      - `timeline_items_contacts` object[]
      - `reminders_contacts` object[]
      - `contact_relations_contact_relations_sourceTocontacts` object[]
      - `contact_relations_contact_relations_destinationTocontacts` object[]
      - `feed_items` object[]
      - `keep_in_touch_reminders` object, nullable
    - `failed` object[], required
      - `contactIds` string[], required
      - `error` object, required
        - `code` string, required
        - `message` string, required

## Other responses

- `400` — Request body failed validation.
- `401` — Missing or invalid API key.
- `403` — Valid key, insufficient permission.
- `404` — Resource does not exist.
- `409` — Request body failed validation.
- `429` — Rate limit exceeded.
- `500` — Unexpected server error.

---

[API](https://skmtc.net/getdex/apis/dex-public-api.md) · [All operations](https://skmtc.net/getdex/apis/dex-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/getdex/dex-public-api/versions/6f01cd52ac12/schema)
