Skip to content

Merge two contacts

merge.merge_contacts(MergeMergeContactsParams**kwargs) -> MergeMergeContactsResponse
POST/v1/contacts/merge

Supports idempotency via the Idempotency-Key header. Use a new key for each intended merge and reuse it only when retrying the same merge.

Returns 403 when you may see either record by name only.

Merges two contacts into one. The primary contact retains its ID; the duplicate is soft-deleted.

Required scopes: contacts:update + contacts:delete

Rate limit category: Write

ParametersExpand Collapse
duplicate_id: str

ID of the duplicate record to merge into the primary and then discard.

primary_id: str

ID of the record to keep.

field_resolutions: Optional[Dict[str, FieldResolutions]]

Per-field resolution overrides keyed by attribute slug.

One of the following:
Literal["primary", "duplicate"]
One of the following:
"primary"
"duplicate"
class FieldResolutionsValue: …
value: Optional[FieldResolutionsValueValue]
One of the following:
str
float
bool
Sequence[str]
class FieldResolutionsValueValueAddress: …
city: Optional[str]

City name.

country: Optional[str]

2-letter ISO 3166-1 alpha-2 country code.

latitude: Optional[float]

Latitude coordinate.

longitude: Optional[float]

Longitude coordinate.

postal_code: Optional[str]

Postal or ZIP code.

state: Optional[str]

State or province.

street: Optional[str]

Street address line 1.

street2: Optional[str]

Street address line 2.

class FieldResolutionsValueValueFullName: …
first_name: Optional[str]

The contact’s first name.

last_name: Optional[str]

The contact’s last name.

options: Optional[Options]
multi_select_union: Optional[bool]

When true, multi-select fields are merged by union rather than primary-takes-all.

ReturnsExpand Collapse
class MergeMergeContactsResponse: …
merge: Merge
id: str

Unique identifier for the merge operation.

status: str

Current status of the merge: cleanup_pending, done, or failed.

primary: Primary
id: str

Unique identifier for the entity.

created_at: str

ISO 8601 timestamp of when the entity was created.

fields: Dict[str, PrimaryFields]

Map of field names to their typed values. System fields are prefixed with $ (e.g. $name, $email); custom attributes use their bare slug.

value: Optional[PrimaryFieldsValue]

The field value, or null if unset.

One of the following:
str
float
bool
List[str]
class PrimaryFieldsValueAddress: …
city: Optional[str]

City name.

country: Optional[str]

2-letter ISO 3166-1 alpha-2 country code.

latitude: Optional[float]

Latitude coordinate.

longitude: Optional[float]

Longitude coordinate.

postal_code: Optional[str]

Postal or ZIP code.

state: Optional[str]

State or province.

street: Optional[str]

Street address line 1.

street2: Optional[str]

Street address line 2.

class PrimaryFieldsValueFullName: …
first_name: Optional[str]

The contact’s first name.

last_name: Optional[str]

The contact’s last name.

value_type: Literal["ADDRESS", "CHECKBOX", "CURRENCY", 13 more]

The data type of the field.

One of the following:
"ADDRESS"
"CHECKBOX"
"CURRENCY"
"DATE"
"DATETIME"
"EMAIL"
"FULL_NAME"
"MARKDOWN"
"MULTI_SELECT"
"NUMBER"
"SINGLE_SELECT"
"SOCIAL_HANDLE"
"TELEPHONE"
"TEXT"
"URL"
"HTML"
relationships: Dict[str, PrimaryRelationships]

Map of relationship names to their associated entities. System relationships are prefixed with $ (e.g. $owner, $contact). A self-referential relationship keeps its merged values and includes optional directional values. List filters select the current record’s role with :asSource or :asDestination, for example ?parent:asSource[contains]=account_id.

cardinality: str

Whether the relationship is has_one or has_many.

object_type: str

The type of the related object (e.g. account, contact).

values: List[str]

IDs of the related entities.

directions: Optional[PrimaryRelationshipsDirections]

Directional values for a self-referential relationship. List filters use the relationship key with :asSource or :asDestination; writes continue to use the bare key.

as_destination: PrimaryRelationshipsDirectionsAsDestination

The current record is the destination (incoming) endpoint.

cardinality: Literal["HAS_ONE", "HAS_MANY"]

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
"HAS_ONE"
"HAS_MANY"
values: List[str]

IDs of the related entities in this direction.

as_source: PrimaryRelationshipsDirectionsAsSource

The current record is the source (outgoing) endpoint.

cardinality: Literal["HAS_ONE", "HAS_MANY"]

Whether this endpoint direction is HAS_ONE or HAS_MANY.

One of the following:
"HAS_ONE"
"HAS_MANY"
values: List[str]

IDs of the related entities in this direction.

updated_at: Optional[str]

ISO 8601 timestamp of when the entity was last updated, or null.

external_id: Optional[str]

External identifier for the entity, or null if unset.

summary: Summary
field_write_count: int

Number of attribute fields written onto the primary record.

minimum-9007199254740991
maximum9007199254740991
sync_repointed_count: int

Number of related records re-pointed from the duplicate to the primary.

minimum-9007199254740991
maximum9007199254740991
warnings: List[str]

Non-fatal warnings from the merge (e.g. skipped transfers).

Merge two contacts

from lightfield import Lightfield

client = Lightfield(
    api_key="My API Key",
)
merge_merge_contacts_response = client.merge.merge_contacts(
    duplicate_id="duplicateId",
    primary_id="primaryId",
)
print(merge_merge_contacts_response.merge)
{
  "merge": {
    "id": "id",
    "status": "status"
  },
  "primary": {
    "id": "id",
    "createdAt": "createdAt",
    "fields": {
      "foo": {
        "value": "string",
        "valueType": "ADDRESS"
      }
    },
    "httpLink": "httpLink",
    "relationships": {
      "foo": {
        "cardinality": "cardinality",
        "objectType": "objectType",
        "values": [
          "string"
        ],
        "directions": {
          "asDestination": {
            "cardinality": "HAS_ONE",
            "values": [
              "string"
            ]
          },
          "asSource": {
            "cardinality": "HAS_ONE",
            "values": [
              "string"
            ]
          }
        }
      }
    },
    "updatedAt": "updatedAt",
    "externalId": "externalId"
  },
  "summary": {
    "fieldWriteCount": -9007199254740991,
    "syncRepointedCount": -9007199254740991,
    "warnings": [
      "string"
    ]
  }
}
Returns Examples
{
  "merge": {
    "id": "id",
    "status": "status"
  },
  "primary": {
    "id": "id",
    "createdAt": "createdAt",
    "fields": {
      "foo": {
        "value": "string",
        "valueType": "ADDRESS"
      }
    },
    "httpLink": "httpLink",
    "relationships": {
      "foo": {
        "cardinality": "cardinality",
        "objectType": "objectType",
        "values": [
          "string"
        ],
        "directions": {
          "asDestination": {
            "cardinality": "HAS_ONE",
            "values": [
              "string"
            ]
          },
          "asSource": {
            "cardinality": "HAS_ONE",
            "values": [
              "string"
            ]
          }
        }
      }
    },
    "updatedAt": "updatedAt",
    "externalId": "externalId"
  },
  "summary": {
    "fieldWriteCount": -9007199254740991,
    "syncRepointedCount": -9007199254740991,
    "warnings": [
      "string"
    ]
  }
}