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

---
id: da62103e-0078-43f5-baa9-6d8bbfceaf19
---

# Define custom events

> Learn more about creating custom events using HubSpot's API.

export const PostmanCard = ({title, collectionId}) => {
  return <div className="card-condensed-cta">
      <Card title={title ? title : "Postman collection"} href={`https://app.getpostman.com/run-collection/${collectionId}`} horizontal={true} cta="Run in Postman" icon={<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>} />
    </div>;
};

export const Tag = ({children, type = 'default', className = ''}) => {
  return <span className={`tag tag-${type} ${className}`.trim()}>
      {children}
    </span>;
};

export const ScopesList = ({scopes = [], description = "This API requires one of the following scopes:"}) => {
  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 SupportedProducts = ({marketing, sales, service, cms, data, commerce, marketingLevel, salesLevel, serviceLevel, cmsLevel, dataLevel, commerceLevel}) => {
  const translations = {
    description: "Requires one of the following products or higher.",
    productNames: {
      marketing: "Marketing Hub",
      sales: "Sales Hub",
      service: "Service Hub",
      cms: "Content Hub",
      data: "Data Hub",
      commerce: "Revenue Hub"
    },
    tiers: {
      free: "Free",
      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"
  }, {
    name: data ? translations.productNames.data : '',
    level: translateTier(dataLevel),
    icon: "https://developers.hubspot.com/hubfs/Knowledge_Base_2023-24-25/subscription_key_icons/operations_icon.svg",
    alt: "Data Hub"
  }, {
    name: commerce ? translations.productNames.commerce : '',
    level: translateTier(commerceLevel),
    icon: "https://developers.hubspot.com/hubfs/Knowledge_Base/subscription_key_icons/commerce_icon.svg",
    alt: "Revenue 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>;
};

<PostmanCard collectionId="26126890-0610b81e-02a1-4254-b867-eec6cc5e092c" />

<AccordionGroup>
  <Accordion title="Supported products" defaultOpen="true" icon="cubes">
    <SupportedProducts marketing={true} sales={true} service={true} cms={true} data={true} marketingLevel="professional" salesLevel="professional" serviceLevel="professional" cmsLevel="professional" dataLevel="professional" />
  </Accordion>

  <Accordion title="Scope requirements">
    <ScopesList
      scopes={[
  'behavioral_events.event_definitions.read_write'
]}
    />
  </Accordion>
</AccordionGroup>

Use custom events to define and track events that are unique to your business. Custom events capture what occurred at a specific moment in time, so are often used to track user activity and behavior. For example, create custom events that track when users add an item to a cart, view a page on your website, or log in to your app. By tracking user activity, events can give you a better understanding of behavioral patterns and changes over time.

Before you can send event data into HubSpot, you need to define your custom event. Custom event definitions include details such as the event's name, display label, target object, and event properties. Once defined, each instance of a custom event sent to HubSpot is called a [custom event occurrence](/api-reference/legacy/events/send-event-data/guide).

Below, learn more about creating and managing event definitions using the API. If you have an *Enterprise* subscription, learn how to [define events in your HubSpot account](https://knowledge.hubspot.com/reports/create-custom-events).

<Warning>
  If you're a [technology partner](https://www.hubspot.com/partners/technology/join) looking to define events for your app in the HubSpot Marketplace, refer to [this guide about defining app events](/apps/developer-platform/add-features/app-events/create-and-manage-event-types).
</Warning>

## Define a custom event

To create a custom event schema (i.e. define a new custom event), make a `POST` request to `events/v3/event-definitions`. In the request body, include definitions for your event schema, including its label, name, CRM object associations, and custom properties.

You can include the following fields in your request body:

| Parameter                                | Type    | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ---------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `label` <Tag type="error">Required</Tag> | String  | The event's human readable label, which will display in HubSpot. The label can be up to 100 characters, but long labels may be cut off in certain parts of HubSpot's UI.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `name`                                   | String  | The unique, internal name of the event, which you'll use to reference the event through the API. The name can be up to 50 characters, must start with a letter, and can only contain lowercase letters, numbers, and underscores. If no value is provided, HubSpot will automatically generate one based on the label. Once defined, the `name` cannot be changed.                                                                                                                                                                                                                                                                                                     |
| `description`                            | String  | Text to describe the event, displayed in the HubSpot UI.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `propertyDefinitions`                    | Array   | Include this array to define up to 50 custom event properties. For each property, include the [required fields to create an event property](#define-new-properties).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `primaryObject`                          | String  | The object with which to associate event data. Event occurrences will appear on records of that object. Can be one of: `"CONTACT"` (default), `"COMPANY"`, `"DEAL"`, `"TICKET"`, or `"<CUSTOM_OBJECT_NAME>"`. This cannot be changed after the event definition is created.                                                                                                                                                                                                                                                                                                                                                                                            |
| `customMatchingId`                       | Object  | Sets a rule that automatically associates event occurrences with records of the specified object by matching the value of a property in the event data with the value of a <u>unique</u> property on the target object. Includes a nested `primaryObjectRule` object with the following required fields: <ul><li>`targetObjectPropertyName`: a string that specifies the name of the unique property on the target object to use for matching.</li><li>`eventPropertyName`: a string that specifies the name of the property in the custom event data to use for matching.</li></ul> Learn more about [setting up a custom matching ID](#set-up-a-custom-matching-id). |
| `includeDefaultProperties`               | Boolean | Specifies whether the event should include the [default event properties](#hubspot’s-default-event-properties). The default value is `true`, so only include this field to set the value as `false`. When `false`, the default event properties are not added to the event schema, which means you can only use your defined [custom properties](#define-new-properties) for event occurrences.                                                                                                                                                                                                                                                                        |

The request body below provides a basic example of an event definition, for which two custom properties are created and the default event properties are not included.

```json theme={null}
{
  "label": "My event label",
  "name": "unique_event_name",
  "description": "An event description that helps users understand what the event tracks.",
  "primaryObject": "COMPANY",
  "propertyDefinitions": [
    {
      "name": "choice_property",
      "label": "Choice property",
      "type": "enumeration",
      "options": [
        {
          "label": "Option 1",
          "value": "1"
        },
        {
          "label": "Option 2",
          "value": "2"
        }
      ]
    },
    {
      "name": "string_property",
      "label": "String property",
      "type": "string"
    }
  ],
  "includeDefaultProperties": false
}
```

### Set up a custom matching ID

To automatically [link event occurrences to records](/api-reference/legacy/events/send-event-data/guide#link-event-occurrences-to-records) of a specified object (e.g., automatically link event occurrences with companies), include the `customMatchingId` object in your [definition request](#define-a-custom-event). In this object, define a `primaryObjectRule` object with the following fields: the unique object property that you've set up beforehand as the `targetObjectPropertyName`, and one of the properties from your event definition as the `eventPropertyName`.

For example, the following request body specifies a `customMatchingId` that matches a company property `"unique_object_property"` and the event property `"string_property"`.

```json theme={null}
{
  "label": "My event label",
  "name": "unique_event_name",
  "description": "An event description that helps users understand what the event tracks.",
  "primaryObject": "COMPANY",
  "propertyDefinitions": [
    {
      "name": "string_property",
      "label": "String property",
      "type": "string"
    }
  ],
  "customMatchingId": {
    "primaryObjectRule": {
      "targetObjectPropertyName": "unique_object_property",
      "eventPropertyName": "string_property"
    }
  }
}
```

Including this rule means that you won't need to specify the target `objectId` each time you send an event occurrence, instead using the `customMatchingId` event property as the matching ID to identify the record. Learn more about [sending custom event occurrences linked to records](/api-reference/legacy/events/send-event-data/guide#link-event-occurrences-to-records).

## Manage properties in event definitions

Event properties are used to store information on individual custom event occurrences. These properties should be used when appropriate for sending event occurrences, but they are not required for an event occurrence to be valid. For each event definition, HubSpot provides a [default set of properties](#hubspot’s-default-event-properties), but you can also [create custom properties for an event](#define-new-properties).

Below, learn about HubSpot's default event properties, how to [define new properties for existing events](#define-new-properties), and how to [update existing custom event properties](#update-existing-custom-properties).

### HubSpot's default event properties

Expand the section below to view the default event properties. These properties are included for each event, unless you've set the `includeDefaultProperties` field as `false` when defining your custom event.

<Expandable title="Default event properties list">
  | Property name          | Property label    | Type        | Field Type                 |
  | ---------------------- | ----------------- | ----------- | -------------------------- |
  | `hs_browser`           | Browser           | String      | Single-line text (`text`)  |
  | `hs_city`              | City              | String      | Single-line text (`text`)  |
  | `hs_country`           | Country           | String      | Single-line text (`text`)  |
  | `hs_device_type`       | Device type       | Enumeration | Dropdown select (`select`) |
  | `hs_element_class`     | Element class     | String      | Single-line text (`text`)  |
  | `hs_element_id`        | Element ID        | String      | Single-line text (`text`)  |
  | `hs_element_text`      | Element text      | String      | Single-line text (`text`)  |
  | `hs_language`          | Language          | Enumeration | Dropdown select (`select`) |
  | `hs_link_href	`        | Link href         | String      | Single-line text (`text`)  |
  | `hs_page_content_type` | Page content type | Enumeration | Dropdown select (`select`) |
  | `hs_page_id`           | Page ID           | String      | Single-line text (`text`)  |
  | `hs_page_title`        | Page title        | String      | Single-line text (`text`)  |
  | `hs_page_url`          | Page URL          | String      | Single-line text (`text`)  |
  | `hs_region`            | Region            | String      | Single-line text (`text`)  |
  | `hs_referrer`          | Referrer          | String      | Single-line text (`text`)  |
  | `hs_user_agent`        | User agent        | String      | Single-line text (`text`)  |
  | `hs_utm_campaign`      | UTM Campaign      | String      | Single-line text (`text`)  |
  | `hs_utm_medium`        | UTM Medium        | String      | Single-line text (`text`)  |
  | `hs_utm_source`        | UTM Source        | String      | Single-line text (`text`)  |
  | `hs_utm_content`       | UTM Content       | String      | Single-line text (`text`)  |
  | `hs_utm_term`          | UTM Term          | String      | Single-line text (`text`)  |
  | `hs_operating_system`  | Operating system  | String      | Single-line text (`text`)  |
  | `hs_operating_version` | Operating version | String      | Single-line text (`text`)  |
  | `hs_screen_height`     | Screen height     | Number      | Number (`number`)          |
  | `hs_screen_width`      | Screen width      | Number      | Number (`number`)          |
  | `hs_asset_description` | Asset description | String      | Single-line text (`text`)  |
  | `hs_asset_type`        | Asset type        | String      | Single-line text (`text`)  |
  | `hs_campaign_id`       | Campaign ID       | String      | Single-line text (`text`)  |
  | `hs_device_name`       | Device name       | String      | Single-line text (`text`)  |
  | `hs_touchpoint_source` | Touchpoint source | String      | Single-line text (`text`)  |
  | `hs_tracking_name`     | Tracking name     | String      | Single-line text (`text`)  |
  | `hs_parent_module_id`  | Parent Module ID  | String      | Single-line text (`text`)  |
</Expandable>

The following tables show the valid option values for enumeration event properties. Use the option's internal name when [setting a value for the property via API](/api-reference/legacy/events/send-event-data/guide#send-event-occurrence-data).

<Expandable title="`hs_device_type` options">
  | Option internal names | Option labels     |
  | --------------------- | ----------------- |
  | `Game Console`        | Game Console      |
  | `PDA`                 | PDA               |
  | `Personal Computer`   | Personal Computer |
  | `Desktop`             | Desktop           |
  | `Smartphone`          | Smartphone        |
  | `Smart TV`            | Smart TV          |
  | `Tablet`              | Tablet            |
  | `Wearable Computer`   | Wearable Computer |
  | `Unknown`             | Unknown           |
</Expandable>

<Expandable title="`hs_page_content_type` options">
  | Option internal names | Option labels     |
  | --------------------- | ----------------- |
  | `BLOG_POST`           | Blog Post         |
  | `KNOWLEDGE_ARTICLE`   | Knowledge Article |
  | `LANDING_PAGE`        | Landing Page      |
  | `LISTING_PAGE`        | Listing Page      |
  | `STANDARD_PAGE`       | Standard Page     |
  | `WEB_INTERACTIVE`     | Web Interactive   |
</Expandable>

### Define new properties

You can create up to 50 custom properties per custom event.

* To create custom properties when defining a new custom event, include the `propertyDefinitions` array in your [definition request body](#define-a-custom-event).
* To create a new property for an existing custom event, make a `POST` request to `events/v3/event-definitions/{eventName}/property`.

Include the following fields to define each property.

| Field                                    | Description                                                                                                                                                                                                                                                                                                                                                      |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `label` <Tag type="error">Required</Tag> | The property's human-readable name. The label can be up to 50 characters, but long labels may be cut off in certain parts of the HubSpot UI.                                                                                                                                                                                                                     |
| `name`                                   | The property's unique internal name, which you'll use when sending event data through the API. The name can be up to 50 characters, must start with a letter, and can only contain lowercase letters, numbers, and underscores. If no value is provided, HubSpot will automatically generate one based on the label. Once defined, the `name` cannot be changed. |
| `type` <Tag type="error">Required</Tag>  | The type of property. Learn more about [supported property types and formatting requirements for each](#event-property-types).                                                                                                                                                                                                                                   |
| `description`                            | Text to describe the property, displayed in the HubSpot UI.                                                                                                                                                                                                                                                                                                      |

<a id="event-property-types" />

The supported properties types are listed in the table below, with the formatting requirements for defining each type. Learn more about [property types and field types](/api-reference/legacy/crm/properties/guide#property-type-and-fieldtype-values).

| Type          | Description                                                                                                                                                                                                                                                                                      | Stored field type          |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------- |
| `bool`        | Receives a boolean value. Values must be represented as `true` or `false`.                                                                                                                                                                                                                       | Radio select (`radio`)     |
| `date`        | Receives a date representing a specific day, month, and year. Values must be represented in UTC time and can be formatted as [ISO 8601 strings or UNIX-formatted timestamps at midnight in milliseconds](/api-reference/legacy/crm/properties/guide#add-values-to-date-and-datetime-properties). | Date picker (`date`)       |
| `datetime`    | Receives a [UNIX timestamp in milliseconds or ISO8601 strings representing a timestamp](/api-reference/legacy/crm/properties/guide#add-values-to-date-and-datetime-properties).                                                                                                                  | Date picker (`date`)       |
| `enumeration` | Receives values from predefined options. When creating this property type, include an `options` array to set the available values. You must provide at least one option.                                                                                                                         | Dropdown select (`select`) |
| `number`      | Receives numeric values with up to one decimal.                                                                                                                                                                                                                                                  | Number (`number`)          |
| `string`      | Receives plain text strings. If the property name contains the words `url`, `referrer`, or `link`, the property value can be up to 1,024 characters. Otherwise, property values can be up to 256 characters.                                                                                     | Single-line text (`text`)  |

For example, to define a new enumeration property for an existing custom event, your request body would look like:

```json theme={null}
{
  "name": "property_name",
  "label": "Property name",
  "type": "enumeration",
  "options": [
    {
      "label": "label",
      "value": "value"
    }
  ]
}
```

### Update existing custom properties

To update an existing property on a custom event, make a `PATCH` request to `events/v3/event-definitions/{eventName}/property`. The only fields that can be updated on a property are the `label`, `description`, and `options` for enumeration properties.

<Warning>
  To change the type of property, use the `DELETE` endpoint to delete the property and recreate it with the correct type.
</Warning>

### Delete a property

To delete an existing property on a custom event, make a `DELETE` request to `events/v3/event-definitions/{eventName}/property/{propertyName}`.

When a property is deleted, it will no longer be available for use in future event occurrences, but past occurrences will still have the property values.

## Update an event's label or description

To update an existing custom event schema, make a `PATCH` request to `events/v3/event-definitions/{eventName}`. You can only update the custom event's values for `label` and `description`.

```json theme={null}
{
  "label": "Event label",
  "description": "A description of the event"
}
```

## Delete an event definition

To delete a custom event schema, make a `DELETE` request to `events/v3/event-definitions/{eventName}`.

Deleting a custom event will remove it from any other HubSpot tools that are referencing it, such as workflows and reports.

<Warning>
  When deleting an event, note the following:

  1. All of the events for that event definition will be deleted and cannot be restored.
  2. Previously deleted `eventName`'s <u>cannot</u> be used again.
</Warning>

## Get existing event definitions

To fetch a single event definition, make a `GET` request to `events/v3/event-definitions/{eventName}`.

To search event definitions by specific criteria, make a `GET` request to `events/v3/event-definitions`. You can use the following query parameters to refine your search.

| Parameter           | Description                                                                                 |
| ------------------- | ------------------------------------------------------------------------------------------- |
| `searchString`      | Searches for events that contain the specified characters in the `name` field.              |
| `after`             | A hashed string provided in paged responses for viewing the next page of search results.    |
| `limit`             | The maximum number of results to return.                                                    |
| `includeProperties` | A boolean value that specifies whether to include event properties in the returned results. |

## Next steps

After you've defined a custom event, learn how to [send event occurrence data via the API](/api-reference/legacy/events/send-event-data/guide).
