## Merge two contacts

`client.Merge.MergeContacts(ctx, body) (*MergeMergeContactsResponse, error)`

**post** `/v1/contacts/merge`

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

**[Required scopes](/using-the-api/scopes/):** `contacts:update` + `contacts:delete`

**[Rate limit category](/using-the-api/rate-limits/):** Write

### Parameters

- `body MergeMergeContactsParams`

  - `DuplicateID param.Field[string]`

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

  - `PrimaryID param.Field[string]`

    ID of the record to keep.

  - `FieldResolutions param.Field[map[string, MergeMergeContactsParamsFieldResolutionUnion]]`

    Per-field resolution overrides keyed by attribute slug.

    - `type MergeMergeContactsParamsFieldResolutionString string`

      - `const MergeMergeContactsParamsFieldResolutionStringPrimary MergeMergeContactsParamsFieldResolutionString = "primary"`

      - `const MergeMergeContactsParamsFieldResolutionStringDuplicate MergeMergeContactsParamsFieldResolutionString = "duplicate"`

    - `type MergeMergeContactsParamsFieldResolutionValue struct{…}`

      - `Value MergeMergeContactsParamsFieldResolutionValueValueUnion`

        - `string`

        - `float64`

        - `bool`

        - `type MergeMergeContactsParamsFieldResolutionValueValueArray []string`

        - `type MergeMergeContactsParamsFieldResolutionValueValueAddress struct{…}`

          - `City string`

            City name.

          - `Country string`

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

          - `Latitude float64`

            Latitude coordinate.

          - `Longitude float64`

            Longitude coordinate.

          - `PostalCode string`

            Postal or ZIP code.

          - `State string`

            State or province.

          - `Street string`

            Street address line 1.

          - `Street2 string`

            Street address line 2.

        - `type MergeMergeContactsParamsFieldResolutionValueValueFullName struct{…}`

          - `FirstName string`

            The contact's first name.

          - `LastName string`

            The contact's last name.

  - `Options param.Field[MergeMergeContactsParamsOptions]`

    - `MultiSelectUnion bool`

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

### Returns

- `type MergeMergeContactsResponse struct{…}`

  - `Merge MergeMergeContactsResponseMerge`

    - `ID string`

      Unique identifier for the merge operation.

    - `Status string`

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

  - `Primary MergeMergeContactsResponsePrimary`

    - `ID string`

      Unique identifier for the entity.

    - `CreatedAt string`

      ISO 8601 timestamp of when the entity was created.

    - `Fields map[string, MergeMergeContactsResponsePrimaryField]`

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

      - `Value MergeMergeContactsResponsePrimaryFieldValueUnion`

        The field value, or null if unset.

        - `string`

        - `float64`

        - `bool`

        - `type MergeMergeContactsResponsePrimaryFieldValueArray []string`

        - `type MergeMergeContactsResponsePrimaryFieldValueAddress struct{…}`

          - `City string`

            City name.

          - `Country string`

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

          - `Latitude float64`

            Latitude coordinate.

          - `Longitude float64`

            Longitude coordinate.

          - `PostalCode string`

            Postal or ZIP code.

          - `State string`

            State or province.

          - `Street string`

            Street address line 1.

          - `Street2 string`

            Street address line 2.

        - `type MergeMergeContactsResponsePrimaryFieldValueFullName struct{…}`

          - `FirstName string`

            The contact's first name.

          - `LastName string`

            The contact's last name.

      - `ValueType string`

        The data type of the field.

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeAddress MergeMergeContactsResponsePrimaryFieldValueType = "ADDRESS"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeCheckbox MergeMergeContactsResponsePrimaryFieldValueType = "CHECKBOX"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeCurrency MergeMergeContactsResponsePrimaryFieldValueType = "CURRENCY"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeDatetime MergeMergeContactsResponsePrimaryFieldValueType = "DATETIME"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeEmail MergeMergeContactsResponsePrimaryFieldValueType = "EMAIL"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeFullName MergeMergeContactsResponsePrimaryFieldValueType = "FULL_NAME"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeMarkdown MergeMergeContactsResponsePrimaryFieldValueType = "MARKDOWN"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeMultiSelect MergeMergeContactsResponsePrimaryFieldValueType = "MULTI_SELECT"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeNumber MergeMergeContactsResponsePrimaryFieldValueType = "NUMBER"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeSingleSelect MergeMergeContactsResponsePrimaryFieldValueType = "SINGLE_SELECT"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeSocialHandle MergeMergeContactsResponsePrimaryFieldValueType = "SOCIAL_HANDLE"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeTelephone MergeMergeContactsResponsePrimaryFieldValueType = "TELEPHONE"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeText MergeMergeContactsResponsePrimaryFieldValueType = "TEXT"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeURL MergeMergeContactsResponsePrimaryFieldValueType = "URL"`

        - `const MergeMergeContactsResponsePrimaryFieldValueTypeHTML MergeMergeContactsResponsePrimaryFieldValueType = "HTML"`

    - `HTTPLink string`

      URL to view the entity in the Lightfield web app, or null.

    - `Relationships map[string, MergeMergeContactsResponsePrimaryRelationship]`

      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 string`

        Whether the relationship is `has_one` or `has_many`.

      - `ObjectType string`

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

      - `Values []string`

        IDs of the related entities.

      - `Directions MergeMergeContactsResponsePrimaryRelationshipDirections`

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

        - `AsDestination MergeMergeContactsResponsePrimaryRelationshipDirectionsAsDestination`

          The current record is the destination (incoming) endpoint.

          - `Cardinality string`

            Whether this endpoint direction is `HAS_ONE` or `HAS_MANY`.

            - `const MergeMergeContactsResponsePrimaryRelationshipDirectionsAsDestinationCardinalityHasOne MergeMergeContactsResponsePrimaryRelationshipDirectionsAsDestinationCardinality = "HAS_ONE"`

            - `const MergeMergeContactsResponsePrimaryRelationshipDirectionsAsDestinationCardinalityHasMany MergeMergeContactsResponsePrimaryRelationshipDirectionsAsDestinationCardinality = "HAS_MANY"`

          - `Values []string`

            IDs of the related entities in this direction.

        - `AsSource MergeMergeContactsResponsePrimaryRelationshipDirectionsAsSource`

          The current record is the source (outgoing) endpoint.

          - `Cardinality string`

            Whether this endpoint direction is `HAS_ONE` or `HAS_MANY`.

            - `const MergeMergeContactsResponsePrimaryRelationshipDirectionsAsSourceCardinalityHasOne MergeMergeContactsResponsePrimaryRelationshipDirectionsAsSourceCardinality = "HAS_ONE"`

            - `const MergeMergeContactsResponsePrimaryRelationshipDirectionsAsSourceCardinalityHasMany MergeMergeContactsResponsePrimaryRelationshipDirectionsAsSourceCardinality = "HAS_MANY"`

          - `Values []string`

            IDs of the related entities in this direction.

    - `UpdatedAt string`

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

    - `ExternalID string`

      External identifier for the entity, or null if unset.

  - `Summary MergeMergeContactsResponseSummary`

    - `FieldWriteCount int64`

      Number of attribute fields written onto the primary record.

    - `SyncRepointedCount int64`

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

    - `Warnings []string`

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

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/Lightfld/lightfield-go"
  "github.com/Lightfld/lightfield-go/option"
)

func main() {
  client := githubcomlightfldlightfieldgo.NewClient(
    option.WithAPIKey("My API Key"),
  )
  mergeMergeContactsResponse, err := client.Merge.MergeContacts(context.TODO(), githubcomlightfldlightfieldgo.MergeMergeContactsParams{
    DuplicateID: "duplicateId",
    PrimaryID: "primaryId",
  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", mergeMergeContactsResponse.Merge)
}
```

#### Response

```json
{
  "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"
    ]
  }
}
```
