---
title: "Bulk-update contacts (v2)"
method: POST
path: "/v2/contacts/batch-update"
tags: ["contacts"]
---

# Bulk-update contacts (v2)

`POST /v2/contacts/batch-update`

Update multiple contacts in a single request. Per-row results are settled (some can succeed, others fail). **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids } }` where `ids` lists the contact IDs that were successfully updated.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `updates` object[], required
    - `contactId` string, uuid, required
    - `data` object, required
      - `full_name` string
      - `first_name` string
      - `last_name` string
      - `description` string
      - `job_title` string
      - `legacy_location` string
      - `company` string
      - `education` string
      - `starred` boolean
      - `source` 'linkedin_sync' | 'facebook_import' | 'cal_ingest' | 'email_ingest' | 'web_import' | 'csv_import' | 'whatsapp_sync' | 'imessage_sync' | 'phone_calls_sync' | 'mobile' | 'mobile_import' | 'instagram_sync' | 'oauth_interaction'
      - `coordinates` object
        - `operation` 'set' | 'delete', required
        - `data` object
          - `latitude` number
          - `longitude` number
      - `priority_tier` integer
      - `image_url` string, uri
      - `image_source` string, uri
      - `business_card_url` string, uri
      - `website` unknown
      - `birthday` string, date
      - `birthday_year` number
      - `frequency` string
      - `last_seen_at` unknown
      - `first_met_at` unknown
      - `never_keep_in_touch` boolean
      - `next_reminder_at` unknown
      - `linkedin` string
      - `twitter` string
      - `facebook` string
      - `instagram` string
      - `telegram` string
      - `tiktok` string
      - `youtube` string
      - `whatsapp_message_link` string
      - `whatsapp_message_snippet` string
      - `whatsapp_last_message_at` unknown
      - `imessage_message_link` string
      - `imessage_message_snippet` string
      - `imessage_last_message_at` unknown
      - `linkedin_message_link` string
      - `linkedin_last_message_snippet` string
      - `linkedin_last_message_at` unknown
      - `linkedin_data` object
      - `instagram_message_link` string
      - `instagram_message_snippet` string
      - `instagram_last_message_at` unknown
      - `gmail_last_interaction_at` unknown
      - `gmail_last_interaction_provider_id` string
      - `gmail_last_interaction_subject` string
      - `gmail_last_interaction_provider` 'GOOGLE' | 'OFFICE365'
      - `gcal_last_interaction_at` unknown
      - `gcal_last_interaction_provider_id` string
      - `gcal_last_interaction_title` string
      - `gcal_last_interaction_provider` 'GOOGLE' | 'OFFICE365'
      - `phone_call_last_interaction_at` unknown
      - `phone_call_interaction_snippet` string
      - `web_search_summary` object
      - `legacy_contact_addresses` object[]
        - `formatted` string
      - `contact_emails` object[]
        - `email` string, required
        - `label` string
        - `ranking` number
      - `contact_phone_numbers` object[]
        - `phone_number` string, required
        - `country_code` string
        - `phone_number_sanitized` string
        - `label` string
        - `ranking` number
      - `groups_contacts` object[]
        - `group_id` string, uuid, required
      - `tags_contacts` union
        - object
          - `append` object[]
            - `tag_id` string, uuid, required
          - `remove` object[]
            - `tag_id` string, uuid, required
            - `contact_id` string, uuid, required
          - `replace` unknown
        - object
          - `append` unknown
          - `remove` unknown
          - `replace` object[]
            - `tag_id` string, uuid, required
      - `custom_fields` union[]
        - union
          - object
            - `id` string, uuid, required
            - `type` 'input', required
            - `text_value` string, required
            - `custom_field` unknown
          - object
            - `id` string, uuid, required
            - `type` 'autocomplete', required
            - `text_value` string, required
            - `custom_field` unknown
          - object
            - `id` string, uuid, required
            - `type` 'datepicker', required
            - `text_value` string
            - `date_value` unknown
            - `custom_field` unknown
      - `contact_birthdays` object
        - `contact_id` string, uuid
        - `last_dismissal_year` number
      - `is_archived` boolean
      - `ignore_merge` boolean
      - `related_contacts` union
        - object
          - `append` object[]
            - `destination` string, uuid, required
            - `source_contact` unknown
            - `destination_contact` unknown
          - `remove` union[]
            - union
              - …
          - `replace` unknown
        - object
          - `append` unknown
          - `remove` unknown
          - `replace` object[]
            - `destination` string, uuid, required
            - `source_contact` unknown
            - `destination_contact` unknown

## Response `200`

Successful response

- object
  - `data` object, required
    - `affected` integer, required
    - `ids` string[]
    - `failed` object[]
      - `id` 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)
