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

# CRM | Objetos personalizados

export const ScopesList = ({scopes = [], description = "Esta API requiere uno de los siguientes ámbitos:"}) => {
  if (!scopes || scopes.length === 0) {
    return null;
  }
  const sortedScopes = scopes.sort((a, b) => a.localeCompare(b));
  return <div>
      <div className="text-sm mb-2">{description}</div>
      <div>
        {sortedScopes.map((scope, index) => <div key={index}>
            <code>
              <span className="text-xs">{scope}</span>
            </code>
          </div>)}
      </div>
    </div>;
};

export const postmanIcon = <svg xmlns="http://www.w3.org/2000/svg" width={25} height={25} preserveAspectRatio="xMidYMid" viewBox="0 0 256 256">
    <path fill="#FF6C37" d="M254.953 144.253c8.959-70.131-40.569-134.248-110.572-143.206C74.378-7.912 10.005 41.616 1.047 111.619c-8.959 70.003 40.569 134.248 110.572 143.334 70.131 8.959 134.248-40.569 143.334-110.7Z" />
    <path fill="#FFF" d="m174.2 82.184-54.007 54.007-15.229-15.23c53.11-53.11 58.358-48.503 69.236-38.777Z" />
    <path fill="#FF6C37" d="M120.193 137.47c-.384 0-.64-.128-.895-.384l-15.358-15.229a1.237 1.237 0 0 1 0-1.792c54.007-54.006 59.638-48.887 71.028-38.649.255.256.383.512.383.896s-.128.64-.383.896l-54.007 53.878c-.128.256-.512.384-.768.384Zm-13.437-16.509 13.437 13.438 52.087-52.087c-9.47-8.446-15.87-11.006-65.524 38.65Z" />
    <path fill="#FFF" d="m135.679 151.676-14.718-14.718 54.007-54.006c14.46 14.59-7.167 38.265-39.29 68.724Z" />
    <path fill="#FF6C37" d="M135.679 152.956c-.384 0-.64-.128-.896-.384l-14.718-14.718c-.256-.256-.256-.512-.256-.896s.128-.64.384-.895L174.2 82.056a1.237 1.237 0 0 1 1.791 0 15.58 15.58 0 0 1 4.991 11.902c-.256 14.206-16.38 32.25-44.28 58.614-.383.256-.767.384-1.023.384Zm-12.926-15.998c8.19 8.319 11.646 11.646 12.926 12.926 21.5-20.476 42.36-41.464 42.488-55.926.128-3.327-1.152-6.655-3.327-9.214l-52.087 52.214Z" />
    <path fill="#FFF" d="m105.22 121.345 10.878 10.878c.256.256.256.512 0 .768-.128.128-.128.128-.256.128l-22.524 4.863c-1.152.128-2.175-.64-2.431-1.791-.128-.64.128-1.28.512-1.664l13.053-13.054c.256-.256.64-.384.768-.128Z" />
    <path fill="#FF6C37" d="M92.934 139.262c-1.92 0-3.327-1.536-3.327-3.455 0-.896.384-1.792 1.024-2.432l13.053-13.054c.768-.64 1.792-.64 2.56 0l10.878 10.878c.768.64.768 1.792 0 2.56-.256.256-.512.384-.896.512l-22.524 4.863c-.256 0-.512.128-.768.128Zm11.902-16.51-12.542 12.543c-.256.256-.383.64-.128 1.024.128.383.512.511.896.383l21.116-4.607-9.342-9.342Z" />
    <path fill="#FFF" d="M202.739 52.238c-8.191-7.935-21.373-7.679-29.307.64-7.935 8.318-7.679 21.372.64 29.306A20.678 20.678 0 0 0 199.155 85l-14.59-14.59 18.174-18.172Z" />
    <path fill="#FF6C37" d="M188.405 89.223c-12.158 0-22.012-9.854-22.012-22.012 0-12.158 9.854-22.012 22.012-22.012 5.631 0 11.134 2.176 15.23 6.143.255.256.383.512.383.896s-.128.64-.384.895L186.357 70.41l13.566 13.566c.512.512.512 1.28 0 1.792l-.256.256c-3.327 2.047-7.295 3.199-11.262 3.199Zm0-41.337c-10.75 0-19.452 8.703-19.324 19.453 0 10.75 8.702 19.452 19.452 19.324 2.944 0 5.887-.64 8.575-2.047l-13.438-13.31c-.256-.256-.384-.512-.384-.896s.128-.64.384-.895l17.149-17.15c-3.456-2.943-7.807-4.479-12.414-4.479Z" />
    <path fill="#FFF" d="m203.122 52.622-.255-.256-18.301 18.044 14.461 14.462c1.408-.896 2.816-1.92 3.967-3.072a20.51 20.51 0 0 0 .128-29.178Z" />
    <path fill="#FF6C37" d="M199.155 86.28c-.384 0-.64-.128-.896-.384l-14.589-14.59c-.256-.256-.384-.512-.384-.896s.128-.64.384-.895l18.173-18.173a1.237 1.237 0 0 1 1.791 0l.384.256c8.575 8.574 8.575 22.396.128 31.098-1.28 1.28-2.687 2.432-4.223 3.328-.384.128-.64.256-.768.256Zm-12.798-15.87 12.926 12.926c1.024-.64 2.048-1.536 2.816-2.304 7.294-7.294 7.678-19.196.64-26.875L186.357 70.41Z" />
    <path fill="#FFF" d="M176.375 84.488a7.879 7.879 0 0 0-11.134 0l-48.247 48.247 8.063 8.063 51.062-44.792c3.328-2.816 3.584-7.807.768-11.134-.256-.128-.384-.256-.512-.384Z" />
    <path fill="#FF6C37" d="M124.929 142.077c-.384 0-.64-.128-.896-.383l-8.063-8.063a1.237 1.237 0 0 1 0-1.792l48.247-48.247a9.115 9.115 0 0 1 12.926 0 9.115 9.115 0 0 1 0 12.926l-.384.384-51.063 44.792c-.128.255-.384.383-.767.383Zm-6.143-9.342 6.27 6.271 50.167-44.024c2.816-2.304 3.072-6.527.768-9.342-2.303-2.816-6.526-3.072-9.342-.768-.128.128-.256.256-.512.384l-47.351 47.48Z" />
    <path fill="#FFF" d="M80.009 187.637c-.512.256-.768.768-.64 1.28l2.175 9.214c.512 1.28-.256 2.816-1.663 3.2-1.024.384-2.176 0-2.816-.768l-14.077-13.95 45.943-45.943 15.87.256 10.75 10.75c-2.56 2.175-18.045 17.149-55.542 35.961Z" />
    <path fill="#FF6C37" d="M78.985 202.61c-1.024 0-2.048-.383-2.688-1.151l-13.95-13.95c-.255-.256-.383-.512-.383-.896 0-.383.128-.64.384-.895l45.944-45.944c.256-.256.64-.384.895-.384l15.87.256c.383 0 .64.128.895.384l10.75 10.75c.256.256.384.64.384 1.024s-.128.64-.512.896l-.895.767c-13.566 11.902-31.995 23.804-54.902 35.194l2.175 9.086c.384 1.664-.384 3.456-1.92 4.352-.767.384-1.407.512-2.047.512Zm-14.078-15.997 13.182 13.054c.384.64 1.152.896 1.792.512.64-.384.896-1.152.512-1.792l-2.176-9.214c-.256-1.152.256-2.176 1.28-2.688 22.652-11.39 40.952-23.163 54.39-34.81l-9.47-9.47-14.718-.256-44.792 44.664Z" />
    <path fill="#FFF" d="m52.11 197.62 11.006-11.007 16.38 16.381-26.107-1.791c-1.151-.128-1.92-1.152-1.791-2.304 0-.512.128-1.024.512-1.28Z" />
    <path fill="#FF6C37" d="m79.497 204.146-26.236-1.791c-1.92-.128-3.199-1.792-3.071-3.712.128-.768.384-1.535 1.024-2.047L62.22 185.59a1.237 1.237 0 0 1 1.792 0l16.38 16.38c.385.385.512.897.257 1.408-.256.512-.64.768-1.152.768Zm-16.381-15.74-10.11 10.11c-.384.255-.384.895 0 1.151.127.128.255.256.511.256l22.652 1.536-13.053-13.054ZM104.452 146.557c-.768 0-1.28-.64-1.28-1.28 0-.384.128-.64.384-.896l12.414-12.414a1.237 1.237 0 0 1 1.792 0l8.062 8.063c.384.384.512.768.384 1.28-.128.384-.512.767-1.023.895l-20.477 4.352h-.256Zm12.414-11.902-8.446 8.446 13.821-2.943-5.375-5.503Z" />
    <path fill="#FFF" d="m124.8 140.926-14.077 3.071c-1.024.256-2.048-.384-2.303-1.408-.128-.64 0-1.28.511-1.791l7.807-7.807 8.063 7.935Z" />
    <path fill="#FF6C37" d="M110.467 145.277a3.168 3.168 0 0 1-3.2-3.2c0-.895.385-1.663.897-2.303l7.806-7.807a1.237 1.237 0 0 1 1.792 0l8.062 8.063c.384.384.512.768.384 1.28-.128.384-.512.767-1.023.895l-14.078 3.072h-.64Zm6.399-10.622-6.91 6.91c-.257.257-.257.512-.129.768s.384.384.768.384l11.774-2.56-5.503-5.502ZM203.25 64.907c-.256-.767-1.151-1.151-1.92-.895-.767.255-1.151 1.151-.895 1.92 0 .127.128.255.128.383.768 1.536.512 3.455-.512 4.863-.512.64-.384 1.536.128 2.048.64.512 1.536.384 2.048-.256 1.92-2.432 2.303-5.503 1.023-8.063Z" />
  </svg>;

export const SupportedProducts = ({marketing, sales, service, cms, marketingLevel, salesLevel, serviceLevel, cmsLevel}) => {
  const translations = {
    header: "Productos compatibles",
    description: "Se requiere uno de los siguientes productos o productos de ediciones superiores.",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub"
    },
    tiers: {
      free: "Gratuito",
      starter: "Starter",
      professional: "Pro",
      enterprise: "Enterprise"
    }
  };
  const translateTier = tier => {
    if (!tier) return '';
    const lowerTier = tier.toLowerCase();
    return translations.tiers[lowerTier] || tier;
  };
  const products = [{
    name: marketing ? translations.productNames.marketing : '',
    level: translateTier(marketingLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/marketing-bolt.svg",
    alt: "Marketing Hub"
  }, {
    name: sales ? translations.productNames.sales : '',
    level: translateTier(salesLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/sales-star.svg",
    alt: "Sales Hub"
  }, {
    name: service ? translations.productNames.service : '',
    level: translateTier(serviceLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/service-heart.svg",
    alt: "Service Hub"
  }, {
    name: cms ? translations.productNames.cms : '',
    level: translateTier(cmsLevel),
    icon: "https://mintlify-assets.b-cdn.net/Icons/content-play.svg",
    alt: "Content Hub"
  }].filter(product => product.name && product.level);
  if (products.length === 0) return null;
  return <div>
      <div className="text-sm mb-2">{translations.description}</div>
      <div className={`grid ${products.length === 1 ? 'grid-cols-1' : 'grid-cols-2'} gap-1.5`}>
        {products.map((product, index) => <div key={index} style={{
    display: 'flex',
    alignItems: 'center'
  }}>
            <img src={product.icon} alt={product.alt} className="w-3.5 h-3.5 mr-1.5 mt-2.5 mb-2.5 flex-shrink-0 align-middle" />
            <span className="font-medium mr-1 text-sm">{product.name} -</span>
            <span className="text-sm">{product.level}</span>
          </div>)}
      </div>
    </div>;
};

<AccordionGroup>
  <Accordion title="Productos compatibles" defaultOpen="true" icon="cubes">
    <SupportedProducts marketing={true} marketingLevel="enterprise" sales={true} salesLevel="enterprise" service={true} serviceLevel="enterprise" cms={true} cmsLevel="enterprise" />
  </Accordion>

  <Accordion title="Ámbitos Requeridos" icon="key">
    <ScopesList
      scopes={[
  '/crm/v3/schemas/{objectTypeId}',
  '/crm/v3/schemas/p_{object_name}',
  'https://api.hubapi.com/crm/v3/schemas/2-3465404',
  'https://api.hubapi.com/crm/v3/schemas/p_lender'
]}
    />
  </Accordion>
</AccordionGroup>

<Card title="Run in Postman" href="https://app.getpostman.com/run-collection/40a2452fc88665fbe786" icon={postmanIcon} horizontal={true} />

<RelatedApiLink />

Cada cuenta de HubSpot, tiene los objetos estándar del CRM: contactos, empresas, negocios y tickets. Para representar y organizar los datos del CRM en función de las necesidades de tu empresa, también puedes crear objetos personalizados. Puedes [crear un objeto personalizado](https://knowledge.hubspot.com/es/object-settings/create-custom-objects) en HubSpot o usar la API de objetos personalizados para definir objetos personalizados, propiedades y asociaciones a otros objetos del CRM.

A continuación, aprende a crear y administrar objetos personalizados a través de la API, y ve un [tutorial de cómo crear un objeto personalizado de ejemplo](#custom-object-example).

Para obtener más información sobre la creación de objetos personalizados, consulta las siguientes publicaciones en el blog para desarrolladores de HubSpot:

* [Cómo crear objetos personalizados ampliables](https://developers.hubspot.com/blog/how-to-think-like-an-architect-by-building-scalable-custom-objects)
* [Cómo crear objetos personalizados usando aplicaciones privadas](https://developers.hubspot.com/blog/how-to-build-a-custom-object-using-private-apps)

<Warning>
  ### Nota:

  Los objetos personalizados son específicos de cada cuenta y, dependiendo de tu suscripción, hay límites en el número de objetos personalizados que puedes crear. En el [Catálogo de productos y servicios de HubSpot](https://legal.hubspot.com/hubspot-product-and-services-catalog) encontrarás más información sobre los límites.
</Warning>

## Métodos de autenticación

Puedes crear, leer y modificar objetos personalizados utilizando uno de los siguientes métodos de autenticación:

* [OAuth](https://developers.hubspot.com/custom-objects-schema-pilot)
* [Tokens de acceso de aplicaciones privadas](/api-reference/auth-oauth-v1/guide)

## Crear objetos personalizados

Para crear objetos personalizados, primero deberás definir el esquema del objeto. El esquema incluye el nombre del objeto, las propiedades y las asociaciones con otros objetos del CRM. Puedes encontrar los detalles completos de la solicitud del esquema en la pestaña *Esquema del objeto* en la parte superior de este artículo. También puedes ver un ejemplo de solicitud en el [tutorial a continuación](#custom-object-example).

Para crear el esquema de objeto personalizado, haz una solicitud `POST` a `crm/v3/schemas`. En el cuerpo de la solicitud, incluye las definiciones para el esquema del objeto, lo que incluye el nombre, las propiedades y las asociaciones.

Al asignarle un nombre al objeto personalizado, ten en cuenta lo siguiente:

* Una vez creado un objeto, no puedes cambiar el nombre y la etiqueta.
* El nombre solo puede contener letras, números y guiones bajos.
* El primer carácter del nombre debe ser una letra.
* Las etiquetas largas pueden aparecer cortadas en ciertas partes del producto.

A continuación, lee acerca de las definiciones requeridas para las propiedades y asociaciones del objeto.

### Propiedades

Las propiedades que definas en el cuerpo de la solicitud se utilizarán para almacenar información en los registros de cada objeto personalizado.

<Warning>
  ### Nota:

  Puedes tener hasta 10 [propiedades con un único valor](/guides/crm/understanding-the-crm#:~:text=Creating%20your%20own%20unique%20identifiers) por cada objeto personalizado en tu cuenta de HubSpot.
</Warning>

Las propiedades definidas se usarán para rellenar los siguientes campos basados en propiedades:

* **requiredProperties:** las propiedades que se requieren al crear un nuevo registro de un objeto personalizado.
* **searchableProperties:** las propiedades que se indexan para las búsquedas en HubSpot.
* **primaryDisplayProperty:** la propiedad utilizada para asignar un nombre a cada registro de un objeto personalizado.
* **secondaryDisplayProperties:** las propiedades que aparecen en cada registro bajo el campo primaryDisplayProperty.

<Frame>
  <img src="https://www.hubspot.es/hubfs/Knowledge_Base_2021/Developer/custom-object-secondary-display-properties0.png" alt="custom-object-secondary-display-properties0" />
</Frame>

* La primera propiedad que se indica en el campo `secondaryDisplayProperties` también se agregará como un cuarto filtro en la página de índice del objeto si es uno de los siguientes tipos de propiedad:

  * `string`
  * `number`
  * `enumeration`
  * `boolean`
  * `datetime`

<Frame>
  <img src="https://www.hubspot.es/hubfs/Knowledge_Base_2021/Developer/custom-object-dashboard-filter0.png" alt="custom-object-dashboard-filter0" />
</Frame>

* Para evitar que se muestre una propiedad en la interfaz de usuario, primero deberás eliminar la propiedad y luego volver a crearla.

Por defecto, cuando se crean propiedades a través de la solicitud de esquema, el atributo `type` (tipo) de la propiedad se establece en `string` (cadena) y el atributo `fieldType` se establece en `text` (texto). A continuación se muestran los valores que puedes usar para crear diferentes tipos de propiedades.

| `type`        | Descripción                                                                                                                                                                  | Valores válidos de `fieldType`                   |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| `enumeration` | Una cadena que representa un conjunto de opciones separadas por un punto y coma.                                                                                             | `booleancheckbox`, `checkbox`, `radio`, `select` |
| `date`        | Un [valor con formato ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) que representa un día, mes y año específicos.                                                        | `date`                                           |
| `dateTime`    | Un [valor con formato ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) que representa un día, mes y hora específicos. La aplicación de HubSpot no mostrará la hora del día. | `date`                                           |
| `string`      | Una cadena de texto sin formato, limitada a 65.536 caracteres.                                                                                                               | `file`, `text`, `textarea`                       |
| `number`      | Un valor numérico que contiene dígitos y, como máximo, un decimal.                                                                                                           | `number`                                         |

| `fieldType`       | Descripción                                                                                                                                                                                              |
| ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `booleancheckbox` | Una entrada que permitirá a los usuarios seleccionar "Sí" o "No". Cuando se usa en un formulario, se mostrará como una única casilla de verificación.                                                    |
| `checkbox`        | Una lista de casillas de verificación que permitirán al usuario seleccionar varias opciones de un conjunto de opciones permitidas para la propiedad.                                                     |
| `date`            | Un valor de fecha, que se muestra como un selector de fechas.                                                                                                                                            |
| `file`            | Permite subir un archivo a un formulario. Se almacena y se muestra como una URL que enlaza al archivo.                                                                                                   |
| `number`          | Una cadena de numerales o números escritos en notación decimal o científica.                                                                                                                             |
| `radio`           | Input que permitirá a los usuarios seleccionar una opción de un conjunto de opciones permitidas para la propiedad. Si se utiliza en un formulario, se mostrará como un conjunto de botones de selección. |
| `select`          | Input en forma de desplegable que permiten a los usuarios seleccionar una opción de un conjunto de opciones permitidas para la propiedad.                                                                |
| `text`            | Una cadena de texto sin formato que se muestra como un input de texto de una sola línea.                                                                                                                 |
| `textarea`        | Una cadena de texto sin formato, que se muestra como un input de texto de varias líneas.                                                                                                                 |

### Asociaciones

HubSpot asociará automáticamente un objeto personalizado con los correos electrónicos, reuniones, notas, tareas, llamadas y objetos de conversaciones. También puedes asociar el objeto personalizado con otros objetos estándar de HubSpot u otros objetos personalizados.

Al crear asociaciones a través de la solicitud de creación de esquema, identifica los objetos estándar usando el nombre y los objetos personalizados usando el valor `objectTypeId`. *Por ejemplo:*

```json theme={null}

"associatedObjects": [
  "CONTACT",
  "COMPANY",
  "TICKET",
  "DEAL",
  "2-3453932"
]
```

## Recuperar objetos personalizados existentes

Para recuperar todos los objetos personalizados, haz una solicitud `GET` a `/crm/v3/schemas`.

Para recuperar un objeto personalizado específico, realiza una solicitud `GET` a uno de los siguientes endpoints:

* `/crm/v3/schemas/{fullyQualifiedName}`. Puedes encontrar un objeto

  `fullyQualifiedName` en su esquema, que se deriva de `p{portal_id}_{object_name}`. Puedes encontrar el ID del portal de tu cuenta utilizando la [API de información de la cuenta.](/api-reference/account-account-info-v3/guide)

Por ejemplo, para una cuenta con el ID `1234` y un objeto llamado `lender`, la URL de solicitud podría parecerse a cualquiera de los siguientes elementos:

* [`https://api.hubapi.com/crm/v3/schemas/p1234_lende`](https://api.hubapi.com/crm/v3/schemas/p1234_lender)

## Recuperar los registros de los objetos personalizados

También puedes recuperar los registros de un objeto personalizado.

* Para recuperar un registro específico usando el valor del ID del registro, haz una solicitud `GET` a `crm/v3/objects/{objectType}/{recordId}`.

En este endpoint, puedes incluir los siguientes parámetros de consulta en la URL de la solicitud:

| Parámetro               | Descripción                                                                                                                                                                                                                                                                     |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `properties`            | Una lista separada con comas de las propiedades que se devolverán en la respuesta. Si el registro de objeto personalizado solicitado no tiene un valor para una propiedad, no aparecerá en la respuesta.                                                                        |
| `propertiesWithHistory` | Una lista separada con comas de las propiedades actuales y anteriores que se devolverán en la respuesta. Si el registro de objeto personalizado solicitado no tiene un valor para una propiedad, no aparecerá en la respuesta.                                                  |
| `associations`          | Una lista separada con comas de los objetos para los que se deben obtener los ID asociados. No se devolverán en la respuesta las asociaciones especificadas que no existan. Encuentra más información sobre la [API de asociaciones.](/api-reference/crm-associations-v4/guide) |

* Para obtener varios registros, haz una solicitud `POST` a `crm/v3/objects/{objectType}/batch/read`. El endpoint en bloques <u>no puede</u> obtener asociaciones. Encuentra más información sobre cómo leer asociaciones en bloques con la [API de asociaciones](/api-reference/crm-associations-v4/guide).

En tu solicitud, puedes obtener registros por su ID de registro (`hs_object_id`) o por una [propiedad de identificador único personalizada](/api-reference/crm-properties-v3/guide#create-unique-identifier-properties). Por defecto, los valores `id` de la solicitud se refieren al ID del registro, por lo que no se requiere el parámetro `idProperty` al obtener datos por el ID del registro. Para usar una propiedad de valor único personalizada, debes incluir el parámetro `idProperty`.

Por ejemplo, para recuperar un grupo de registros de objetos personalizados, tu solicitud podría tener una de estas dos estructuras:

```json theme={null}
{
  "properties": ["petname"],
  "inputs": [
    {
      "id": "12345"
    },
    {
      "id": "67891"
    }
  ]
}
```

```json theme={null}
{
  "properties": ["petname"],
  "idProperty": "uniquepropertyexample",
  "inputs": [
    {
      "id": "abc"
    },
    {
      "id": "def"
    }
  ]
}
```

Para obtener registros de objetos personalizados con valores actuales y anteriores para una propiedad, tu solicitud podría ser como la siguiente:

```json theme={null}
{
  "propertiesWithHistory": ["pet_owner"],
  "inputs": [
    {
      "id": "12345"
    },
    {
      "id": "67891"
    }
  ]
}
```

## Modificar objetos personalizados existentes

Para modificar el esquema de un objeto, haz una solicitud `PATCH` a `https://api.hubapi.com/crm/v3/schemas/{objectTypeId}`.

Una vez que tu objeto personalizado esté definido:

* El nombre y las etiquetas del objeto (singular y plural) <u>no se pueden</u> cambiar.
* Los parámetros `requiredProperties`, `searchableProperties`, `primaryDisplayProperty` y `secondaryDisplayProperties` se pueden cambiar actualizando el esquema del objeto. Para establecer una nueva propiedad como obligatoria, de búsqueda o de visualización, debes crear la propiedad antes de modificar el esquema.
* Puedes crear y editar propiedades de objetos personalizados [en HubSpot](https://knowledge.hubspot.com/es/properties/create-and-edit-properties#view-and-edit-properties) o a través de la [API de propiedades](/api-reference/crm-properties-v3/guide).

### Actualizar asociaciones

Para agregar otras asociaciones de objetos a tu objeto personalizado, haz una solicitud `POST` a `/crm/v3/schemas/_{objectTypeId}_/associations`.

Solo puedes asociar tu objeto personalizado con objetos de HubSpot estándar (por ejemplo, *contacto*, *empresa*, *negocio*, o *ticket*) u otros objetos personalizados. En el campo `toObjectTypeId`, identifica los objetos personalizados por el valor `objectTypeId` y los objetos estándar por su nombre. Por ejemplo:

```json theme={null}
{
  "fromObjectTypeId": "2-3444025",
  "toObjectTypeId": "ticket",
  "name": "cat_to_ticket"
}
```

## Eliminar un objeto personalizado

Solo puedes eliminar un objeto personalizado después de eliminar todas las instancias de objetos de ese tipo. Para eliminar un objeto personalizado, haz una solicitud `DELETE` a `/crm/v3/schemas/{objectType}`.

Si necesitas crear un nuevo objeto personalizado con el mismo nombre que el objeto eliminado, debes eliminar el esquema haciendo una solicitud `DELETE` a `/crm/v3/schemas/{objectType}?archived=true`. Solo puedes eliminar un tipo de objeto personalizado después de eliminar todas las instancias de objeto de ese tipo, las asociaciones y las propiedades personalizadas.

## Ejemplo de objeto personalizado

Lo siguiente es un tutorial para crear un objeto personalizado. Para obtener detalles completos de las solicitudes que se muestran, consulta la pestaña Definición de objeto en la parte superior del artículo.

Esta explicación cubre:

1. La creación de un esquema de objeto personalizado.
2. La creación de un registro de objeto personalizado.
3. La asociación de un registro de objeto personalizado con un contacto de HubSpot.
4. La creación de una nueva definición de asociación entre el objeto personalizado y el ticket de HubSpot.
5. La creación de una nueva definición de propiedad.
6. La actualización del esquema de objetos (es decir, `secondaryDisplayProperties`) con la nueva propiedad.

   ***

**Meta:** Un concesionario de automóviles llamado CarSpot quiere almacenar su inventario en HubSpot usando un objeto personalizado. Para hacer seguimiento de la propiedad del vehículo y las compras, asociarán los autos con los registros de contacto. Posteriormente, también harán seguimiento del mantenimiento del vehículo utilizando tickets de HubSpot y propiedades personalizadas.

### Creación del esquema de objeto

CarSpot necesita crear un esquema de objeto que pueda representar los siguientes atributos como propiedades:

1. **Condición (nueva o usada):** enumeración
2. **Fecha de recepción en el concesionario:** fecha
3. **Año:** número
4. **Marca:** cadena
5. **Modelo:** cadena
6. **Número de chasis:** cadena (valor único)
7. **Color:** cadena
8. **Kilometraje:** número
9. **Precio:** número
10. **Notas:** cadena

También agregarán una descripción para proporcionar contexto sobre cómo utilizar el objeto y definirán una asociación entre el objeto personalizado y el objeto de contactos estándar para que puedan conectar los autos a los compradores potenciales.

Con el modelo de datos finalizado, crearán el esquema de objeto haciendo una solicitud `POST` a `/crm/v3/schemas` con la siguiente solicitud:

```json theme={null}
{
  "name": "cars",
  "description": "Cars keeps track of cars currently or previously held in our inventory.",
  "labels": {
    "singular": "Car",
    "plural": "Cars"
  },
  "primaryDisplayProperty": "model",
  "secondaryDisplayProperties": ["make"],
  "searchableProperties": ["year", "make", "vin", "model"],
  "requiredProperties": ["year", "make", "vin", "model"],
  "properties": [
    {
      "name": "condition",
      "label": "Condition",
      "type": "enumeration",
      "fieldType": "select",
      "options": [
        {
          "label": "New",
          "value": "new"
        },
        {
          "label": "Used",
          "value": "used"
        }
      ]
    },
    {
      "name": "date_received",
      "label": "Date received",
      "type": "date",
      "fieldType": "date"
    },
    {
      "name": "year",
      "label": "Year",
      "type": "number",
      "fieldType": "number"
    },
    {
      "name": "make",
      "label": "Make",
      "type": "string",
      "fieldType": "text"
    },
    {
      "name": "model",
      "label": "Model",
      "type": "string",
      "fieldType": "text"
    },
    {
      "name": "vin",
      "label": "VIN",
      "type": "string",
      "hasUniqueValue": true,
      "fieldType": "text"
    },
    {
      "name": "color",
      "label": "Color",
      "type": "string",
      "fieldType": "text"
    },
    {
      "name": "mileage",
      "label": "Mileage",
      "type": "number",
      "fieldType": "number"
    },
    {
      "name": "price",
      "label": "Price",
      "type": "number",
      "fieldType": "number"
    },
    {
      "name": "notes",
      "label": "Notes",
      "type": "string",
      "fieldType": "text"
    }
  ],
  "associatedObjects": ["CONTACT"]
}
```

<Tip>
  Después de crear el esquema del objeto, CarSpot se asegura de anotar el campo `{objectTypeId}` del nuevo objeto, ya que lo utilizarán para extraer y modificar el objeto más adelante. También pueden utilizar el valor `{fullyQualifiedName}` si lo prefieren.
</Tip>

### Crear un registro de objeto personalizado

*Con el objeto personalizado creado, CarSpot ahora puede crear registros en el objeto para cada auto en su inventario.*

*Crearán el primer registro para un auto haciendo una solicitud `POST` a `/crm/v3/objects/2-3465404` con la siguiente solicitud:*

```json theme={null}
{
  "properties": {
    "condition": "used",
    "date_received": "1582416000000",
    "year": "2014",
    "make": "Nissan",
    "model": "Frontier",
    "vin": "4Y1SL65848Z411439",
    "color": "White",
    "mileage": "80000",
    "price": "12000",
    "notes": "Excellent condition. No accidents."
  }
}
```

La respuesta para esta llamada a la API se vería similar a:

```json theme={null}
{
  "id": "181308",
  "properties": {
    "color": "White",
    "condition": "used",
    "make": "Nissan",
    "mileage": "80000",
    "model": "Frontier",
    "vin": "4Y1SL65848Z411439",
    "notes": "Excellent condition. No accidents.",
    "price": "12000",
    "year": "2014",
    "date_received": "1582416000000"
  },
  "createdAt": "2020-02-23T01:44:11.035Z",
  "updatedAt": "2020-02-23T01:44:11.035Z",
  "archived": false
}
```

Con el registro creado, pueden utilizar el valor de `id` para asociar más tarde cada auto con un contacto existente.

<Warning>
  Si luego quisieran recuperar este registro junto con propiedades específicas, podrían hacer una solicitud `GET` a `https://api.hubapi.com/crm/v3/objects/2-3465404/181308?portalId=1234567&properties=year&properties=make&properties=model`
</Warning>

### Asociar el registro de objeto personalizado a otro registro

Puedes usar el ID del nuevo registro de automóvil (`181308`) y el ID de otro registro para asociar un registro de objeto personalizado con un registro de otro objeto.

Para crear una asociación, haz una solicitud `PUT` a `/crm/v3/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId}/{associationType}`. Si la relación del objeto ya está [definida](#defining-a-new-association), para determinar el valor `associationType`, haz una solicitud `GET` a `crm/v3/schemas/{objectType}`.

Por ejemplo, con el *ID `51` del contacto y el tipo de asociación `75`,* CarSpot puede asociar el registro del automóvil con un contacto. Usando los ID anteriores, la URL de la solicitud se creará de la siguiente manera:

`https://api.hubspot.com/crm/v3/objects/2-3465404/181308/associations/contacts/51/75`

### Definir una nueva asociación

CarSpot ahora quiere comenzar a hacer seguimiento de los servicios postventa para sus automóviles. Para ello, usarán los tickets de HubSpot a fin de registrar todo mantenimiento realizado.

Para permitir las asociaciones entre automóviles y tickets, crearán una nueva asociación haciendo una solicitud `POST` a **`/crm/v3/schemas/2-3465404/associations`** con la siguiente solicitud:

```json theme={null}
{
  "fromObjectTypeId": "2-3465404",
  "toObjectTypeId": "ticket",
  "name": "car_to_ticket"
}
```

La respuesta para esta llamada a la API se vería similar a:

```json theme={null}
{
  "id": "121",
  "createdAt": "2020-02-23T01:52:12.893826Z",
  "updatedAt": "2020-02-23T01:52:12.893826Z",
  "fromObjectTypeId": "2-3465404",
  "toObjectTypeId": "0-5",
  "name": "car_to_ticket"
}
```

<Info>
  Al crear una nueva asociación entre dos objetos personalizados, especifica los objetos personalizados por el valor *objectTypeId* en el campo *toObjectTypeId*. En el caso de los objetos estándar, puedes identificarlos por su nombre o utilizar los siguientes valores:

  * **Contacto:** 0-1
  * **Empresa:** 0-2
  * **Negocio:** 0-3
  * **Ticket:** 0-5
</Info>

### Definir una nueva propiedad

A medida que continúan haciendo seguimiento al mantenimiento, CarSpot ve una oportunidad para agrupar estos servicios en paquetes. Para hacer seguimiento de estos paquetes de mantenimiento en los registros de cada vehículo, crearán una nueva propiedad de enumeración que contenga los paquetes disponibles.

Para definir una nueva propiedad, realizarán una solicitud `POST` a `/crm/v3/properties/2-3465404` con la siguiente solicitud:

```json theme={null}
{
  "groupName": "car_information",
  "name": "maintenance_package",
  "label": "Maintenance Package",
  "type": "enumeration",
  "fieldType": "select",
  "options": [
    {
      "label": "Basic",
      "value": "basic"
    },
    {
      "label": "Oil change only",
      "value": "oil_change_only"
    },
    {
      "label": "Scheduled",
      "value": "scheduled"
    }
  ]
}
```

La respuesta para esta llamada a la API se vería similar a:

```json theme={null}
{
  "updatedAt": "2020-02-23T02:08:20.055Z",
  "createdAt": "2020-02-23T02:08:20.055Z",
  "name": "maintenance_package",
  "label": "Maintenance Package",
  "type": "enumeration",
  "fieldType": "select",
  "groupName": "car_information",
  "options": [
    {
      "label": "Basic",
      "value": "basic",
      "displayOrder": -1,
      "hidden": false
    },
    {
      "label": "Oil change only",
      "value": "oil_change_only",
      "displayOrder": -1,
      "hidden": false
    },
    {
      "label": "Scheduled",
      "value": "scheduled",
      "displayOrder": -1,
      "hidden": false
    }
  ],
  "displayOrder": -1,
  "calculated": false,
  "externalOptions": false,
  "archived": false,
  "hasUniqueValue": false,
  "hidden": false,
  "modificationMetadata": {
    "archivable": true,
    "readOnlyDefinition": false,
    "readOnlyValue": false
  },
  "formField": false
}
```

Ahora que se creó la propiedad, quieren que aparezca en la barra lateral de cada registro de automóvil para que la información esté fácilmente disponible para sus representantes de ventas y técnicos. Para ello, agregarán la propiedad a `secondaryDisplayProperties` haciendo una solicitud `PATCH` a `/crm/v3/schemas/2-3465404` con la siguiente solicitud:

```json theme={null}
{
  "secondaryDisplayProperties": ["maintenance_package"]
}
```

La respuesta para esta llamada a la API se vería similar a:

```json theme={null}
{
  "id": "3465404",
  "createdAt": "2020-02-23T01:24:54.537Z",
  "updatedAt": "2020-02-23T02:12:24.175874Z",
  "labels": {
    "singular": "Car",
    "plural": "Cars"
  },
  "requiredProperties": ["year", "model", "vin", "make"],
  "searchableProperties": ["year", "model", "vin", "make"],
  "primaryDisplayProperty": "model",
  "secondaryDisplayProperties": ["maintenance_package"],
  "portalId": 1234567,
  "name": "car"
}
```

Ahora, cuando los técnicos abren un registro de contacto que tiene un automóvil asociado, la propiedad se mostrará en la tarjeta de objeto personalizada en la barra lateral:

<Frame>
  <img src="https://developers.hubspot.com/hs-fs/hubfs/Screen%20Shot%202020-03-06%20at%2011.08.41%20AM.png?width=386&name=Screen%20Shot%202020-03-06%20at%2011.08.41%20AM.png" alt="Screen Shot 2020-03-06 at 11.08.41 AM" />
</Frame>

A medida que CarSpot continúa usando HubSpot, es probable que encuentren formas de mejorar y expandir este objeto personalizado, entre otras cosas, usando la API de HubSpot. Incluso podrían decidir [crear páginas dinámicas usando los datos de los objetos personalizados](/cms/start-building/features/data-driven-content/crm-data-in-cms-pages).
