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

# CRM | Objetos personalizados

export const ScopesList = ({scopes = [], description = "Esta API requer um dos seguintes escopos:"}) => {
  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: "Produtos suportados",
    description: "Requer um dos seguintes produtos ou superior.",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub"
    },
    tiers: {
      free: "Grátis",
      starter: "Starter",
      professional: "Professional",
      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="Produtos suportados" defaultOpen="true" icon="cubes">
    <SupportedProducts marketing={true} marketingLevel="enterprise" sales={true} salesLevel="enterprise" service={true} serviceLevel="enterprise" cms={true} cmsLevel="enterprise" />
  </Accordion>

  <Accordion title="Escopos Necessários" 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 />

Em cada conta do HubSpot, há os objetos padrão do CRM: contatos, empresas, negócios e tickets. Para representar e organizar seus dados de CRM com base nas necessidades da sua empresa, você também pode criar objetos personalizados. Você pode [criar um objeto personalizado](https://knowledge.hubspot.com/pt/object-settings/create-custom-objects) no HubSpot ou usar a API de objetos personalizados para definir objetos, propriedades e associações personalizadas a outros objetos do CRM.

Abaixo, saiba como criar e gerenciar objetos personalizados por meio da API e veja um [passo a passo sobre como criar um objeto personalizado de exemplo](#custom-object-example).

Para saber mais sobre como criar objetos personalizados, confira os seguintes posts de blog para desenvolvedores da HubSpot:

* [Como criar objetos personalizados escaláveis](https://developers.hubspot.com/blog/how-to-think-like-an-architect-by-building-scalable-custom-objects)
* [Como criar objetos personalizados usando aplicativos privados](https://developers.hubspot.com/blog/how-to-build-a-custom-object-using-private-apps)

<Warning>
  ### Observação:

  Objetos personalizados são específicos para cada conta e, dependendo da sua assinatura, há limites no número de objetos personalizados que você pode criar. Saiba mais sobre seus limites em nosso [Catálogo de produtos e serviços da HubSpot](https://legal.hubspot.com/hubspot-product-and-services-catalog).
</Warning>

## Métodos de autenticação

Você pode criar, ler e atualizar objetos personalizados usando um dos seguintes métodos de autenticação:

* [OAuth](https://developers.hubspot.com/custom-objects-schema-pilot)
* [Tokens de acesso do app privado](/docs/api-reference/auth-oauth-v1/guide)

## Criar um objeto personalizado

Para criar um objeto personalizado, primeiramente, será necessário definir o esquema do objeto. O esquema inclui o nome do objeto, propriedades e associações a outros objetos do CRM. Você pode encontrar os detalhes completos da solicitação do esquema na guia *Esquema do objeto* na parte superior deste artigo. Você também pode visualizar uma solicitação de amostra no [exemplo de passo a passo abaixo](#custom-object-example).

Para criar o esquema de objeto personalizado, faça uma solicitação `POST` para `crm/v3/schemas`. No corpo da solicitação, inclua definições para seu esquema de objeto, incluindo seu nome, propriedades e associações.

Ao nomear o objeto personalizado, saiba que:

* Depois de criar um objeto, seu nome e rótulo não poderão ser alterados.
* O nome pode conter somente letras, números e sublinhados.
* O primeiro caractere do nome deve ser uma letra.
* Os rótulos longos podem ser cortados em certas partes do produto.

Abaixo, leia sobre as definições necessárias para as propriedades e associações do objeto.

### Propriedades

As propriedades que você definir no corpo da solicitação serão usadas para armazenar informações em registros de objetos personalizados individuais.

<Warning>
  ### Observação:

  Você pode ter até 10 [propriedades de valor únicas](/docs/guides/crm/understanding-the-crm#:~:text=Creating%20your%20own%20unique%20identifiers) para cada objeto personalizado na sua conta HubSpot.
</Warning>

Você usará suas propriedades definidas para preencher os seguintes campos baseados em propriedades:

* **requiredProperties:** as propriedades que são necessárias ao criar um novo registro de objeto personalizado.
* **searchableProperties**: as propriedades que são indexadas para pesquisa no HubSpot.
* **primaryDisplayProperty:** a propriedade usada para nomear registros de objetos personalizados individuais.
* \*\*secondaryDisplayProperties: \*\*as propriedades que aparecem em registros individuais sob primaryDisplayProperty.

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

* A primeira propriedade listada em `secondaryDisplayProperties` também será adicionada como um quarto filtro na página de índice de objetos se for um dos seguintes tipos de propriedades:

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

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

* Para remover uma propriedade de exibição da UI, você precisará, primeiramente, excluir a propriedade e depois recriá-la.

Por padrão, ao criar propriedades por meio da solicitação de esquema, a propriedade `type` é definida como `string` e `fieldType` é definida como `text`. Abaixo estão os valores que você pode usar para criar diferentes tipos de propriedades.

| `type`        | Descrição                                                                                                                                                                                   | Valores `fieldType` válidos                      |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| `enumeration` | Uma sequência de caracteres que representa um conjunto de opções separadas por ponto e vírgula.                                                                                             | `booleancheckbox`, `checkbox`, `radio`, `select` |
| `date`        | Um [valor com formatação ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) que representa um dia, mês e ano específicos.                                                                    | `date`                                           |
| `dateTime`    | Um [valor com formatação ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) que representa um dia, mês, ano e horário do dia específicos. O aplicativo HubSpot não exibirá o horário do dia. | `date`                                           |
| `string`      | Uma string de texto simples, com no máximo 65.536 caracteres.                                                                                                                               | `file`, `text`, `textarea`                       |
| `number`      | Um valor numérico que contém dígitos numéricos e, na maioria das vezes, um número decimal.                                                                                                  | `number`                                         |

| `fieldType`       | Descrição                                                                                                                                                                                       |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `booleancheckbox` | Uma entrada que permite que os usuários selecionem Sim ou Não. Quando usada em um formulário, essa entrada aparece como uma única caixa de seleção.                                             |
| `checkbox`        | Uma lista de caixas de seleção que permite que um usuário selecione várias opções em um conjunto de opções válidas para a propriedade.                                                          |
| `date`            | Um valor de data, que é exibido como um seletor de data.                                                                                                                                        |
| `file`            | Permite que um arquivo seja carregado em um formulário. Armazenado e exibido como link de URL para o arquivo.                                                                                   |
| `number`          | Uma string de numerais ou números escritos em formato decimal ou em notação científica.                                                                                                         |
| `radio`           | Uma entrada que permite que os usuários selecionem um conjunto de opções válidas para a propriedade. Quando usada em um formulário, essa entrada é exibida como um conjunto de botões de opção. |
| `select`          | Uma entrada suspensa que permite que os usuários selecionem um conjunto de opções válidas para a propriedade.                                                                                   |
| `text`            | Uma string de texto simples, que é exibida em uma entrada de texto com uma única linha.                                                                                                         |
| `textarea`        | Uma string de texto simples, que é exibida como uma entrada de texto com várias linhas.                                                                                                         |

### Associações

A HubSpot associará automaticamente um objeto personalizado com os e-mails, reuniões, notas, tarefas, chamadas e objetos de conversas. Você pode associar ainda mais seu objeto personalizado a outros objetos HubSpot padrão ou outros objetos personalizados.

Ao criar associações por meio da solicitação create schema, identifique objetos padrão usando o nome e objetos personalizados usando o valor `objectTypeId`. *Por exemplo:*

```json theme={null}

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

## Recuperar objetos personalizados existentes

Para recuperar todos os objetos personalizados, faça uma solicitação `GET` para `/crm/v3/schemas`.

Para recuperar um objeto personalizado específico, faça uma solicitação `GET` para um dos seguintes pontos de extremidade:

* `/crm/v3/schemas/{fullyQualifiedName}` Você pode encontrar o

  `fullyQualifiedName` do objeto em seu esquema, que é derivado de `p{portal_id}_{object_name}`. Você pode encontrar o ID do portal da sua conta usando a [API de informações da conta. ](/docs/api-reference/account-account-info-v3/guide)

Por exemplo, para uma conta com um ID de `1234` e um objeto chamado `lender`, o URL de solicitação pode ser semelhante a qualquer um dos seguintes:

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

## Obter registros de objetos personalizados

Você também pode obter os registros de um objeto personalizado.

* Para recuperar um registro específico pelo seu valor de ID de registro, faça uma solicitação `GET` para `crm/v3/objects/{objectType}/{recordId}`.

Para este ponto de extremidade, você pode incluir os seguintes parâmetros de consulta no URL da solicitação:

| Parâmetro               | Descrição                                                                                                                                                                                                                                         |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `properties`            | Uma lista separada por vírgulas das propriedades a serem retornadas em resposta. Se o objeto personalizado solicitado não tiver um valor para uma propriedade, ele não será exibido na resposta.                                                  |
| `propertiesWithHistory` | Uma lista separada por vírgulas das propriedades atuais e do histórico a serem retornadas em resposta. Se o objeto personalizado solicitado não tiver um valor para uma propriedade, ele não será exibido na resposta.                            |
| `associations`          | Uma lista separada por vírgulas de objetos para recuperar IDs associados. Todas as associações especificadas que não existem não serão retornadas na resposta. Saiba mais sobre a [API de associações.](/docs/api-reference/crm-associations-v4/guide) |

* Para recuperar vários registros, faça uma solicitação `POST` para `crm/v3/objects/{objectType}/batch/read`. O ponto de extremidade em lote <u>não</u> pode recuperar associações. Saiba como fazer associações de leitura em lote com a [API de associações](/docs/api-reference/crm-associations-v4/guide).

Na sua solicitação, você pode recuperar os registros pelo ID do registro (`hs_object_id`) ou por uma [propriedade de identificador exclusivo](/docs/api-reference/crm-properties-v3/guide#create-unique-identifier-properties) personalizada. Por padrão, os valores de `id` na solicitação referem-se ao ID do registro; portanto, o parâmetro `idProperty` não é necessário ao recuperar pelo ID do registro. Para usar uma propriedade de valor exclusivo personalizada, você deve incluir o parâmetro `idProperty`.

Por exemplo, para recuperar um lote de registros de objetos personalizados, sua solicitação pode ser parecida com o seguinte:

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

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

Para recuperar registos de objetos personalizados com valores atuais e do histórico de uma propriedade, sua solicitação pode ser parecida com o seguinte:

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

## Atualizar os objetos personalizados existentes

Para atualizar o esquema de um objeto, faça uma solicitação `PATCH` para `https://api.hubapi.com/crm/v3/schemas/{objectTypeId}`.

Quando seu objeto personalizado for definido:

* O nome e os rótulos do objeto (singular e plural) <u>não podem</u> ser alterados.
* As propriedades `requiredProperties`, `searchableProperties`, `primaryDisplayProperty` e `secondaryDisplayProperties` podem ser alteradas atualizando o esquema do objeto. Para definir uma nova propriedade como uma propriedade obrigatória, pesquisável ou de exibição, você precisa criá-la antes de atualizar o esquema.
* Você pode criar e editar propriedades de objetos personalizados [no HubSpot](https://knowledge.hubspot.com/pt/properties/create-and-edit-properties#view-and-edit-properties) ou por meio da [API de propriedades](/docs/api-reference/crm-properties-v3/guide).

### Atualizar associações

Para adicionar outras associações de objetos ao seu objeto personalizado, faça uma solicitação `POST` para `/crm/v3/schemas/_{objectTypeId}_/associations`.

Você só pode associar seu objeto personalizado com objetos HubSpot padrão (por exemplo,\_ contato\_, *empresa*,\_ negócio\_ ou *ticket*) ou outros objetos personalizados. No campo `toObjectTypeId`, identifique objetos personalizados pelo valor `objectTypeId` e objetos padrão pelo seu nome. Por exemplo:

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

## Excluir um objeto personalizado

Você somente pode excluir um objeto personalizado depois que todas as instâncias de objeto desse tipo forem excluídas. Para excluir uma objeto personalizado, faça uma solicitação `DELETE` para `/crm/v3/schemas/{objectType}`.

Se você precisar criar um novo objeto personalizado com o mesmo nome que o objeto excluído, você deve excluir o esquema fazendo uma solicitação `DELETE` para `/crm/v3/schemas/{objectType}?archived=true`. Você só pode excluir um tipo de objeto personalizado depois que todas as instâncias de objeto desse tipo, associações e propriedades de objeto personalizado forem excluídas.

## Exemplo de objeto personalizado

Apresentamos a seguir um passo a passo para criar um exemplo de objeto personalizado. Para obter detalhes completos das solicitações mostradas, consulte a guia Definição do objeto na parte superior do artigo.

Este passo a passo abrange:

1. criação de um esquema de objeto personalizado.
2. criação de um registro de objeto personalizado.
3. associação de um registro de objeto personalizado a um contato do HubSpot.
4. criação de uma nova definição de associação entre o objeto personalizado e o ticket da HubSpot.
5. criação de uma nova definição de propriedade.
6. atualização do esquema do objeto (ou seja, `secondaryDisplayProperties`) com a nova propriedade.

   ***

**Meta:** uma concessionária de automóveis chamada CarSpot deseja armazenar seu inventário na HubSpot usando um objeto personalizado. Para controlar a propriedade e compras de veículos, eles associarão carros a registros do contato. Além disso, eles também controlarão a manutenção do veículo usando tickets da HubSpot e propriedades personalizadas.

### Crie o esquema do objeto

O CarSpot precisa criar um esquema de objeto que possa representar os seguintes atributos como propriedades:

1. **Condição (nova ou usada):** enumeração
2. **Data de chegada na concessionária:** data
3. **Ano:** número
4. **Marca:** cadeia de caracteres
5. **Modelo:** cadeia de caracteres
6. **VIN:** cadeia de caracteres (valor único)
7. **Cor:** string
8. **Quilometragem:** cadeia de caracteres
9. **Preço:** número
10. **Observações:** cadeia de caracteres

Eles também adicionarão uma descrição para fornecer contexto sobre como usar o objeto e definirão uma associação entre seu objeto personalizado e o objeto de contatos padrão para que possam conectar carros a possíveis compradores.

Com seu modelo de dados finalizado, eles criarão o esquema do objeto fazendo um `POST` solicitação para `/crm/v3/schemas` com o seguinte corpo de solicitação:

```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>
  Depois de criar o esquema do objeto, o CarSpot registra o campo `{objectTypeId}` do novo objeto, pois ele será usado para buscar e atualizar o objeto posteriormente. Eles também podem usar o valor `{fullyQualifiedName}`, se preferirem.
</Tip>

### Criar um registro de objeto personalizado

*Com o objeto personalizado criado, agora, a CarSpot pode criar registros no objeto para cada carro em seu inventário.*

*Eles criarão seu primeiro carro fazendo uma solicitação `POST` para `/crm/v3/objects/2-3465404` com o seguinte corpo de solicitação:*

```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."
  }
}
```

A resposta para esta chamada de API seria semelhante 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
}
```

Com o registro criado, eles podem usar o valor `id` para associar posteriormente o carro a um contato existente.

<Warning>
  Se quisessem recuperar mais tarde este registro junto com propriedades específicas, eles poderiam fazer uma solicitação `GET` para `https://api.hubapi.com/crm/v3/objects/2-3465404/181308?portalId=1234567&properties=year&properties=make&properties=model`
</Warning>

### Associar o registro do objeto personalizado a outro registro

Você pode usar o ID do novo registro de carro (`181308`) e o ID de outro registro para associar um registro de objeto personalizado a um registro de outro objeto.

Para criar uma associação, faça uma solicitação `PUT` para `/crm/v3/objects/{objectType}/{objectId}/associations/{toObjectType}/{toObjectId}/{associationType}`. Se a relação do objeto já estiver [definida](#defining-a-new-association), para determinar o valor de `associationType`, faça uma solicitação `GET` para `crm/v3/schemas/{objectType}`.

Por exemplo, com o \_ID de contato `51` e o tipo de associação`75`, \_o CarSpot pode associar o registro do carro a um contato. Usando os IDs acima, a URL da solicitação será construída da seguinte maneira:

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

### Definir uma nova associação

Agora, a CarSpot quer começar o rastreamento dos serviços pós-venda de seus carros. Para fazer isso, eles usarão os tickets da HubSpot para registrar qualquer manutenção realizada.

Para permitir associações entre carros e tickets, eles criarão uma nova associação fazendo uma solicitação `POST` para **`/crm/v3/schemas/2-3465404/associations`** com o seguinte corpo de solicitação:

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

A resposta para esta chamada de API seria semelhante 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>
  Ao criar uma nova associação entre dois objetos personalizados, especifique os objetos personalizados por *objectTypeId* no campo *toObjectTypeId*. Para objetos padrão, você pode identificá-los pelo nome ou usar os seguintes valores:

  * **Contato:** 0-1
  * **Empresa:** 0-2
  * **Negócio:** 0-3
  * **Ticket:** 0-5
</Info>

### Definir uma nova propriedade

À medida que continuam a controlar a manutenção, a CarSpot vê uma oportunidade para agrupar serviços de manutenção em pacotes. Para controlar esses pacotes de manutenção em registros de carros individuais, eles criarão uma nova propriedade de enumeração que contém os pacotes disponíveis.

Para definir uma nova propriedade, eles enviam uma solicitação `POST` para `/crm/v3/properties/2-3465404` com o seguinte corpo de solicitação:

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

A resposta para esta chamada de API seria semelhante 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
}
```

Agora que a propriedade foi criada, eles querem exibi-la na barra lateral de cada registro de carro para que as informações fiquem facilmente disponíveis para seus representantes de vendas e técnicos. Para fazer isso, eles adicionarão a propriedade a `secondaryDisplayProperties` fazendo uma solicitação `PATCH` para `/crm/v3/schemas/2-3465404` com o seguinte corpo de solicitação:

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

A resposta para esta chamada de API seria semelhante 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"
}
```

Agora, quando um técnico abre um registro do contato com um carro associado, a propriedade será exibida no cartão de objeto personalizado na 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="Captura de tela 06-03-2020 às 11:08:41" />
</Frame>

Como a CarSpot continua a usar a HubSpot, eles provavelmente encontrarão maneiras de refinar e expandir esse objeto personalizado e muito mais usando a API da HubSpot. Eles podem até mesmo optar por [criar páginas dinâmicas usando seus dados de objetos personalizados.](/docs/cms/start-building/features/data-driven-content/crm-data-in-cms-pages)
