Contactos

Cambiar el rol de una relación

Actualiza el rol con el que se relacionan dos contactos.

PATCH
/api/v1/contacts/{contactId}/related-contacts/{relatedContactId}

Ejemplos de petición

curl https://app.filmo.io/api/v1/contacts/cont_8f2a1c/related-contacts/rela_8f2a1c \
  --request PATCH \
  --header "Authorization: Bearer $FILMO_API_KEY" \
  --header "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
  --header 'Content-Type: application/json' \
  --data '{
  "relationRole": "Directora de producción"
}'
{
  "data": {
    "id": "contact_9f3a2b",
    "name": "Example contact",
    "contactType": "person",
    "role": "client",
    "status": "active",
    "nif": "B00000000",
    "commercialName": "Example commercial name",
    "position": "Example position",
    "contactNumber": "2026-0001",
    "emails": [
      {
        "id": "email_9f3a2b",
        "label": "Main",
        "email": "ana.garcia@example.com",
        "isPrimary": true
      }
    ],
    "billingEmail": "ana.garcia@example.com",
    "phoneNumbers": [
      {
        "id": "phone_number_9f3a2b",
        "label": "Main",
        "number": "+34 600 000 000",
        "countryCode": "+34",
        "isPrimary": true
      }
    ],
    "websites": [
      {
        "id": "website_9f3a2b",
        "label": "Main",
        "url": "https://example.com/resource"
      }
    ],
    "addresses": [
      {
        "id": "address_9f3a2b",
        "label": "Main",
        "addressLine1": "Calle de Ejemplo 12",
        "addressLine2": "Calle de Ejemplo 12",
        "city": "Madrid",
        "province": "Madrid",
        "postcode": "28001",
        "country": "ES",
        "isMain": true
      }
    ],
    "folder": "Example folder",
    "discountPercentage": 1,
    "preferredLanguage": "es-ES",
    "currency": "EUR",
    "paymentMethod": {
      "type": "bank_transfer",
      "customValue": "Example custom value"
    },
    "paymentDays": [
      1
    ],
    "expirationDays": 1,
    "subscribedToMarketing": true,
    "isAppUser": true,
    "customFields": {
      "example": "example"
    },
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-09-01T08:00:00.000Z",
    "relatedContacts": [
      {
        "id": "related_contact_9f3a2b",
        "name": "Example related contact",
        "commercialName": "Example commercial name",
        "contactType": "person",
        "role": "client",
        "status": "active",
        "relationRole": "Example relation role"
      }
    ]
  }
}

Generado a partir del esquema

El par debe darse en el orden en que se creó. relationRole es obligatorio (una cadena vacía lo borra); 404 si los contactos no están relacionados. Devuelve la relación tal como queda ahora. Devuelve el contacto completo, con relatedContacts tal como quedan ahora, la misma proyección que su GET.

Autorizaciones

Clave de API como Bearer, con el permiso de abajo. contacts:write

Cabeceras

Idempotency-Keystring

Identificador único de la petición, elegido por el cliente (sirve un UUID). Entre 1 y 255 caracteres: una cabecera vacía se rechaza con 400 validation_error, porque el cliente se creería protegido. Repetir la misma clave con el MISMO cuerpo en 24 h devuelve la respuesta guardada sin volver a ejecutar, con la cabecera Idempotent-Replay: true. Con un cuerpo DISTINTO devuelve 422. Es la forma segura de reintentar tras un tiempo de espera de red.

Límites: longitud mín. 1, longitud máx. 255

Ejemplo:"9f1c2f4e-3a5b-4f6d-8e7a-0b1c2d3e4f5a"

If-Matchstring

Bloqueo optimista: el ETag que leíste del recurso (o *). Si el recurso ha cambiado desde entonces, la escritura se rechaza con 412 precondition_failed antes de hacer nada; léelo de nuevo y reintenta. Sin la cabecera, la escritura siempre se realiza.

Ejemplo:"\"3sT3d9pBvZq4h2N0w8x1YkLmQ7c\""

Parámetros de ruta

contactIdstringObligatorio

Identificador del contacto principal.

Límites: longitud mín. 1

relatedContactIdstringObligatorio

Identificador del contacto relacionado.

Límites: longitud mín. 1

Cuerpo

application/json

Esquema del cuerpo: RelatedContactUpdateBody

relationRolestringObligatorio

Nuevo rol de la relación. Envía una cadena vacía para borrarlo.

Límites: longitud máx. 200

Respuesta

application/json

Respuesta correcta.

Esquema de la respuesta: ContactDetailDto

Sobre: ContactDetailResponse. meta.warnings solo aparece cuando la operación está obsoleta.

Cabeceras: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay

dataobject

El contacto completo, tal como lo devuelve la API.

Mostrar atributos hijos
data.idstring

Identificador único del contacto.

data.namestring

Nombre del contacto (persona o empresa).

data.contactTypestring

Tipo de contacto: person (particular) o company (negocio).

Opciones disponibles: person, company

data.rolestring

Rol del contacto: client, provider, lead, debtor, creditor, student, teacher o unspecified.

Opciones disponibles: client, provider, lead, debtor, creditor, student, teacher, unspecified

data.statusstring

Estado del contacto: active (operativo), inactive (desactivado) o archived (cerrado, conservado como histórico).

Opciones disponibles: active, inactive, archived

data.nifstring | null

NIF/CIF o número de identificación fiscal; null si no se ha registrado.

data.commercialNamestring | null

Nombre comercial; null si coincide con el nombre o no consta.

data.positionstring | null

Cargo o puesto de la persona de contacto; null si no está registrado.

data.contactNumberstring | null

Número de contacto asignado por la cuenta (referencia interna); null si no consta.

data.emailsobject[]

Lista de direcciones de correo electrónico del contacto.

Mostrar atributos hijos
data.emails.idstring

Identificador interno del correo electrónico dentro del contacto.

data.emails.labelstring | null

Etiqueta descriptiva del email; null si no tiene.

data.emails.emailstring

Dirección de email.

data.emails.isPrimaryboolean

Si este es el email principal del contacto.

data.billingEmailstring | null

Email de facturación dedicado; null significa que se usa el email principal.

data.phoneNumbersobject[]

Lista de teléfonos del contacto.

Mostrar atributos hijos
data.phoneNumbers.idstring

Identificador interno del teléfono dentro del contacto.

data.phoneNumbers.labelstring | null

Etiqueta descriptiva del teléfono; null si no tiene.

data.phoneNumbers.numberstring

Número de teléfono.

data.phoneNumbers.countryCodestring | null

Prefijo telefónico internacional del país (p. ej. "+34"); null si no consta.

data.phoneNumbers.isPrimaryboolean

Si este es el teléfono principal del contacto.

data.websitesobject[]

Lista de sitios web del contacto.

Mostrar atributos hijos
data.websites.idstring

Identificador interno del sitio web dentro del contacto.

data.websites.labelstring | null

Etiqueta descriptiva del sitio web; null si no tiene.

data.websites.urlstring

URL del sitio web.

data.addressesobject[]

Lista de direcciones del contacto.

Mostrar atributos hijos
data.addresses.idstring

Identificador interno de la dirección dentro del contacto.

data.addresses.labelstring | null

Etiqueta descriptiva de la dirección; null si no tiene.

data.addresses.addressLine1string | null

Primera línea de la dirección; null si no consta.

data.addresses.addressLine2string | null

Segunda línea de la dirección; null si no consta.

data.addresses.citystring | null

Ciudad; null si no consta.

data.addresses.provincestring | null

Provincia o región; null si no se ha registrado.

data.addresses.postcodestring | null

Código postal; null si no se ha registrado.

data.addresses.countrystring | null

País; null si no consta.

data.addresses.isMainboolean

Si esta es la dirección principal del contacto.

data.folderstring | null

Carpeta o agrupación organizativa; null si el contacto no está clasificado.

data.discountPercentagenumber | null

Porcentaje de descuento general del contacto (0-100); null si no hay descuento configurado.

data.preferredLanguagestring | null

Idioma preferido del contacto; null si no se ha registrado.

data.currencystring | null

Moneda por defecto del contacto como código ISO 4217; null si no consta.

data.paymentMethodobject | null

Método de pago preferido del contacto; null si no está configurado.

Mostrar atributos hijos
data.paymentMethod.typestring

Tipo de método de pago: bank_transfer, card, cash, sepa_direct_debit u other.

Opciones disponibles: bank_transfer, card, cash, other, sepa_direct_debit

data.paymentMethod.customValuestring | null

Detalle en texto libre cuando el tipo es "other" (por ejemplo, un método registrado antes de configurarse); null en caso contrario.

data.paymentDaysinteger[] | null

Días del mes en que el contacto hace pagos; null si no está configurado.

data.expirationDaysinteger | null

Días de vencimiento por defecto de las facturas del contacto; null si no está configurado.

data.subscribedToMarketingboolean

Si el contacto está suscrito a comunicaciones de marketing.

data.isAppUserboolean

Si el contacto tiene acceso a la app.

data.customFieldsobject<string, any>

Valores de los campos personalizados por identificador de campo personalizado; las definiciones están en /api/v1/custom-fields.

data.createdAtstring<date-time>

Fecha de creación en ISO 8601 con desplazamiento.

data.updatedAtstring<date-time>

Fecha de la última actualización en ISO 8601 con desplazamiento.

data.relatedContactsobject[]

Contactos relacionados con este contacto (p. ej. las personas de una empresa).

Mostrar atributos hijos
data.relatedContacts.idstring

Identificador único del contacto relacionado.

data.relatedContacts.namestring

Nombre del contacto relacionado.

data.relatedContacts.commercialNamestring | null

Nombre comercial del contacto relacionado; null si no consta.

data.relatedContacts.contactTypestring

Tipo del contacto relacionado: person o company.

Opciones disponibles: person, company

data.relatedContacts.rolestring

Rol del contacto relacionado.

Opciones disponibles: client, provider, lead, debtor, creditor, student, teacher, unspecified

data.relatedContacts.statusstring

Estado del contacto relacionado: active, inactive o archived.

Opciones disponibles: active, inactive, archived

data.relatedContacts.relationRolestring | null

Rol de la relación entre los dos contactos (p. ej. "empleado de"); null si no consta.

metaobject

Información adicional sobre la respuesta.

Mostrar atributos hijos
meta.warningsobject[]

Avisos del ciclo de vida; solo aparecen cuando la operación está obsoleta.

Mostrar atributos hijos
meta.warnings.codestring

Código de aviso estable.

Opciones disponibles: deprecated

meta.warnings.messagestring

Para personas: qué está obsoleto, hasta cuándo y qué usar.

meta.warnings.sunsetstring

Día (YYYY-MM-DD) en que la operación deja de estar disponible.

meta.warnings.replacementstring | null

operationId de la operación que hay que usar en su lugar, o null si no hay ninguna.

Errores

EstadoCódigosSignificado
400validation_errorConsulta o cuerpo mal formados. errors[] enumera cada campo erróneo con su código estable.
404not_foundNo existe o queda fuera del alcance de la clave de API.
409conflictEl estado actual del recurso impide la operación, ya hay en curso una petición con esa Idempotency-Key, u otra escritura condicional (If-Match) retuvo el recurso durante más de cinco segundos. errors[0].code indica cuál: in_progress y lock_timeout se resuelven reintentando; invalid_state no, porque el estado del recurso prohíbe la operación.
412precondition_failedLa etiqueta de entidad If-Match no coincide con la representación actual. Vuelve a leer el recurso y reintenta.
422idempotency_key_reusedLa misma clave se usó antes con un cuerpo distinto. Cambia la clave.

401, 403, 429, 500 los puede devolver cualquier operación. Errores

Obsolescencia

Esta operación no está obsoleta. Las obsolescencias se anuncian con la cabecera Deprecation y una fecha de retirada. Política de versiones

  • CRM

    Contacto

    El contacto, tal como lo devuelve la API.