> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mindosoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Actualizar contacto externo

> Actualiza datos y campos personalizados de un contacto de tu compañía

## Descripción

Este endpoint actualiza parcialmente un contacto no de prueba de la compañía asociada a tu Company API Key. Primero [obtené el contacto](/api-reference/contactos-externos/obtener-contacto) por teléfono y usá su `id` como `contact_id`.

La operación es atómica. Si un dato de perfil o campo personalizado es inválido, no se guarda ningún cambio del request.

## Header de autenticación

<ParamField header="X-API-Key" type="string" required>
  Una Company API Key activa. No se admiten API keys legacy, JWT ni keys globales.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  Debe ser `application/json`.
</ParamField>

## Path parameters

<ParamField path="contact_id" type="integer" required>
  ID del contacto a actualizar, recibido en la consulta por teléfono.
</ParamField>

## Campos del body

<ParamField body="full_name" type="string | null">
  Nombre completo del contacto.
</ParamField>

<ParamField body="email" type="string | null">
  Email del contacto. Puede ser una cadena vacía. Si se informa, debe ser válido.
</ParamField>

<ParamField body="source" type="string">
  Origen del contacto. Valores válidos: `manual`, `csv_import`, `organic`, `whatsapp_sync`, `instagram_sync`, `google_contacts`, `group`, `api` y `other`.
</ParamField>

<ParamField body="source_detail" type="string | null">
  Detalle del origen. Puede ser una cadena vacía.
</ParamField>

<ParamField body="profile_picture" type="string (URL) | null">
  URL de la foto de perfil. Puede ser una cadena vacía.
</ParamField>

<ParamField body="custom_fields" type="array">
  Campos personalizados que querés crear o actualizar.

  <Expandable title="Propiedades de cada custom field">
    <ParamField body="custom_field_id" type="integer" required>
      ID del campo personalizado. Debe pertenecer a la lista del contacto.
    </ParamField>

    <ParamField body="value" type="array" required>
      Valor del campo. Para valores únicos, enviá un solo elemento. Para `multiselector`, podés enviar varios. `[]` elimina el valor activo.
    </ParamField>

    <ParamField body="expires_at" type="string (ISO 8601) | null">
      Vencimiento opcional. Enviá `null` para quitarlo. Si lo omitís, se conserva el vencimiento actual.
    </ParamField>
  </Expandable>
</ParamField>

No podés modificar `phone`, `id`, la lista de contactos, identificadores de WhatsApp o Instagram, fechas ni flags internos. Enviar cualquiera de estos campos devuelve `400`.

Los campos personalizados validan su tipo y sus opciones. Los tipos disponibles son `string`, `text`, `textarea`, `int`, `float`, `email`, `url`, `date`, `datetime`, `time`, `selector` y `multiselector`. No repitas el mismo `custom_field_id` en un request.

<RequestExample>
  ```bash cURL theme={null}
  curl -X PATCH 'https://api.mindosoftware.com/api/v1/external/contacts/123/' \
    -H 'X-API-Key: mindo_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
    -H 'Content-Type: application/json' \
    -d '{
      "full_name": "Ana Pérez",
      "email": "ana.perez@example.com",
      "source": "api",
      "source_detail": "Sincronización ERP",
      "profile_picture": "https://cdn.example.com/ana.jpg",
      "custom_fields": [
        {
          "custom_field_id": 45,
          "value": ["calificado"]
        },
        {
          "custom_field_id": 61,
          "value": ["2026-07-20"],
          "expires_at": "2026-12-31T23:59:59-03:00"
        }
      ]
    }'
  ```
</RequestExample>

## Respuesta (200 OK)

<ResponseField name="contact" type="object">
  Contacto actualizado, con la misma estructura que la respuesta de [obtener contacto](/api-reference/contactos-externos/obtener-contacto).
</ResponseField>

<ResponseField name="versioned_custom_fields" type="array">
  Campos personalizados que generaron una versión nueva en esta llamada. Puede ser una lista vacía si no hubo cambios en los valores o vencimientos.

  <Expandable title="Propiedades de cada campo versionado">
    <ResponseField name="custom_field_id" type="integer">
      ID del campo personalizado.
    </ResponseField>

    <ResponseField name="version" type="integer">
      Número de la nueva versión.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json 200 - Contacto actualizado theme={null}
  {
    "contact": {
      "id": 123,
      "full_name": "Ana Pérez",
      "email": "ana.perez@example.com",
      "phone": "+5491112345678",
      "source": "api",
      "source_detail": "Sincronización ERP",
      "profile_picture": "https://cdn.example.com/ana.jpg",
      "custom_fields": []
    },
    "versioned_custom_fields": [
      {
        "custom_field_id": 45,
        "version": 2
      }
    ]
  }
  ```
</ResponseExample>

## Errores

| Estado | Situación                                                                                                                                             |
| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | Campo protegido o no permitido, dato inválido, campo personalizado ajeno al contacto, formato de `expires_at` inválido o `custom_fields` mal formado. |
| `401`  | Falta una Company API Key válida, activa y no vencida.                                                                                                |
| `404`  | El contacto no existe, es de prueba o pertenece a otra compañía.                                                                                      |
