> ## 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: a374b4eb-7434-4288-adfe-77e5cfa4ac80
---

# Marketing events API guide

> An overview of the Marketing Events object in HubSpot.

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 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>;
};

<PostmanCard collectionId="26126890-66991673-f7f9-4430-8c49-ddd3b01141b9" />

<Accordion title="Scope requirements">
  <ScopesList
    scopes={[
  'crm.objects.marketing_events.read',
  'crm.objects.marketing_events.write'
]}
  />
</Accordion>

A marketing event is a CRM object, similar to contacts and companies, that enables you to track marketing events, such as a webinar, along with the contacts who registered and attended the event. Below, learn more about working with the marketing event API to integrate marketing events into an app.

## In this article

* [Scope requirements](#scope-requirements)
* [Differences between internal ID and external ID endpoints](#differences-between-internal-id-and-external-id-endpoints)
* [Event management endpoints](#create-and-update-events)
* [Event attendance endpoints](#event-attendance-endpoints)
* [Participant state endpoints](#participant-state-endpoints)
* [List association endpoints](#list-association-endpoints)
* [Configure app settings](#configure-app-settings)
  * [Step 1: Create an API in your app](#step-1-create-an-api-in-your-app)
  * [Step 2: Provide HubSpot with the URL path to your API](#step-2-provide-hubspot-with-the-url-path-to-your-api)

## Scope requirements

To make an API request to one of the marketing event endpoints, the following [scopes](/apps/developer-platform/build-apps/authentication/scopes) are required:

* `crm.objects.marketing_events.read`: grants permission to retrieve marketing event and attendance data.
* `crm.objects.marketing_events.write`: grants permission to create, delete, or make changes to marketing event information.

When authenticating calls made by your app, you can either use a [static auth token](/apps/developer-platform/build-apps/authentication/overview#static-auth) or [OAuth](/api-reference/legacy/authentication/manage-oauth-tokens).

## Differences between internal ID and external ID endpoints

Many endpoints below provide two different ways to identify an event you want to fetch or update. Though the end result for similar endpoints might be the same, they differ mainly in the associated IDs you provide:

* **Endpoints using external IDs:** endpoints that require `externalEventId` and `externalAccountId` parameters will only work in the same app that originally created the event. For example, if you created two public apps, called *App A* and *App B*, and you created a marketing event via the authentication and IDs associated with *App A*, only *App A* can read, update, or add new participants to the event. If you attempt to access the same event with *App B* using the same externalEventId and externalAccountId, a 404 error will result.
* **Endpoints using an objectId:** endpoints that require an `objectId` can be used to access an event by any app with the associated scopes listed in the section above, regardless of the app that originally created the event. If *App A* created a marketing event, *App B* can still read, update, or add participants through `objectId`-based endpoints.

## Event management endpoints

The following sections provide context on common event properties, and detail how to use the various event management endpoints to create, read, update, and archive events.

### Event properties

The following properties are available to fetch and update when using the event management endpoints:

| Parameter          | Type    | Description                                                                                        |
| ------------------ | ------- | -------------------------------------------------------------------------------------------------- |
| `eventName`        | String  | The title of your event.                                                                           |
| `eventType`        | String  | The type of the event (e.g., webinar, tradeshow, etc.).                                            |
| `eventOrganizer`   | String  | The individual or organization that's hosting the event.                                           |
| `eventDescription` | String  | A description for your event.                                                                      |
| `eventUrl`         | String  | A URL that users can navigate to where they can learn more details and/or register for your event. |
| `eventCancelled`   | Boolean | Whether or not the event is cancelled.                                                             |
| `eventStartTime`   | String  | An ISO 8601 formatted timestamp of the event's start time.                                         |
| `eventEndTime`     | String  | An ISO 8601 formatted timestamp of the event's end time.                                           |

### Create an event

To create a marketing event you can make a `POST` request to `/marketing/v3/marketing-events/events` and provide the `eventName`, `externalEventId`, `externalAccountId`, and `eventOrganizer` in the body of your request. You can optionally provide any additional properties listed in the [table above](#event-properties) in your request.

For example, if the `externalAccountId` of your app is `"12345"`, and the `externalEventId` of your event in your app is `"67890"`, you could create a new event called `"Winter webinar"` with a request that would resemble the following:

```json theme={null}
{
  "externalAccountId": "12345",
  "externalEventId": "67890",
  "eventName": "Winter webinar",
  "eventOrganizer": "Snowman Fellowship",
  "eventCancelled": false,
  "eventUrl": "https://example.com/holiday-jam",
  "eventDescription": "Let's get together to plan for the holidays",
  "eventCompleted": false,
  "startDateTime": "2024-08-07T12:36:59.286Z",
  "endDateTime": "2024-08-07T12:36:59.286Z",
  "customProperties": [
    {
      "name": "eventSeason",
      "value": "winter"
    }
  ]
}
```

### Update event properties using external IDs

You can update marketing events by making a `POST` request to `/marketing/v3/marketing-events/events/upsert` endpoint. You can include any `customProperties` along with any other details of your event (including its name, start time, and description).

If a marketing event already exists with the specified ID in your request, it will be updated. Otherwise, a new event will be created.

For example, the following request would create an event with an ID of `4` named "Virtual cooking class":

```json theme={null}
{
  "inputs": [
    {
      "customProperties": [
        {
          "name": "property1",
          "value": "1234"
        }
      ],
      "eventName": "Virtual cooking class",
      "startDateTime": "2023-11-30T17:46:20.461Z",
      "eventOrganizer": "Chef Joe",
      "eventDescription": "Join us for a virtual cooking class! Yum.",
      "eventCancelled": false,
      "externalAccountId": "CookingCo",
      "externalEventId": "4"
    }
  ]
}
```

### Update event properties using its objectId

Once an event is created, you can update its properties by making a `PATCH` request to `/marketing/v3/marketing-events/{objectId}`.

* To get the `objectId` for a specific marketing event, follow the instructions in [this knowledge base article](https://knowledge.hubspot.com/integrations/use-marketing-events#view-and-analyze-marketing-events) to view the details for an event in your HubSpot account, then locate the ID under the *Record ID* field. The `objectId` will also be returned in the response when you successfully create an event.
* You can also make a `GET` request to the `/marketing/v3/marketing-events` endpoint described in the next section.
* If you have the `externalEventId` of an event, you can include it as a path when making a `GET` request to `/marketing/v3/marketing-events/{externalEventId}/identifiers`. The response will include all marketing events along with the relevant identifiers for each event (i.e., the event's `objectId`, its `appInfo`, the `marketingEventName`, and the `externalAccountId`).

### Get event details

To get a list of all marketing events along with their properties, make a `GET` request to `/marketing/v3/marketing-events`.

If you need to retrieve the details for a specific marketing event by its *Record ID* in HubSpot, you can provide the ID as the objectId in a `GET` request to `/marketing/v3/marketing-events/{objectId}`.

```json theme={null}
{
  "eventName": "Test Marketing Event",
  "eventType": "test-type",
  "startDateTime": "2024-05-22T12:29:50.734Z",
  "endDateTime": "2024-05-25T12:29:50.734Z",
  "eventOrganizer": "testEventOrganizer",
  "eventDescription": "testDescription",
  "eventUrl": "testURL",
  "eventCancelled": true,
  "eventCompleted": false,
  "customProperties": [
    {
      "name": "test_custom_prop",
      "value": "1"
    },
    {
      "name": "test_prop",
      "value": "2"
    }
  ],
  "objectId": "58237132332",
  "externalEventId": null,
  "eventStatus": "CANCELLED",
  "appInfo": {
    "id": "111",
    "name": "Zoom"
  },
  "registrants": 1,
  "attendees": 1,
  "cancellations": 2,
  "noShows": 0,
  "createdAt": "2024-08-07T12:58:40.635Z",
  "updatedAt": "2024-10-15T13:35:03.353Z"
}
```

### Delete an event

To delete a marketing event, make a `DELETE` request to `/marketing/v3/marketing-events/{objectId}` with the event's associated `objectId`.

If successful, you'll receive a `204 No Content` response.

### Update multiple events in bulk

To update multiple marketing events in bulk, you can make a `POST` request to `/marketing-events/v3/marketing-events/batch/update` and provide the properties you want to update for each event within the inputs array of the request body.

For example, if you wanted to update several properties of two marketing events with object IDs of 58237132332 and 54073507364 in a single request, the body of your request would resemble the following:

```json theme={null}
{
  "inputs": [
    {
      "objectId": "58237132332",
      "eventCancelled": true,
      "eventOrganizer": "testEventOrganizer",
      "eventUrl": "testURL",
      "eventDescription": "testDescription",
      "eventName": "Test Marketing Event Update",
      "eventType": "test-type"
    },
    {
      "objectId": "54073507364",
      "eventCancelled": true,
      "eventOrganizer": "testEventOrganizer",
      "eventUrl": "testURL",
      "eventDescription": "testDescription",
      "eventName": "Test Marketing Event Update 2",
      "eventType": "test-type"
    }
  ]
}
```

## Event attendance endpoints

The event attendance state endpoints allow you to record registration activities for a contact, such as whether they registered, attended, or cancelled their registration for your event. For example, you can use this endpoint to record that a HubSpot contact has registered for a marketing event.

### Update attendance using the event objectId

If you want to use the `objectId` of a marketing event, you can either use the contact ID of the contact you want to record participation state for, or you can use their email address.

* To use a contact's ID, make a POST request to `/marketing/v3/marketing-events/{objectId}/attendance/{subscribeState}/create` then provide the ID of the contact using the `vid` field within the `inputs` array of your request body. For example, the request body below provides an example of updating the attendance data for a contact with an ID of `47733471576` and specifying when the attendee joined and left the event via the `joinedAt` and `leftAt` properties:

```json theme={null}
{
  "inputs": [
    {
      "vid": 47733471576,
      "properties": {
        "joinedAt": "2024-05-22T13:38:16.500Z",
        "leftAt": "2024-05-22T15:40:16.500Z"
      },
      "interactionDateTime": 1716382579000
    }
  ]
}
```

* To use a contact's email, make a POST request to `/marketing/v3/marketing-events/{objectId}/attendance/{subscribeState}/email-create` then provide the email of the contact using the `email` field within the `inputs` array of your request body.
  * If you're creating a new contact, you can include the `contactProperties` field within the `inputs` array of your request body to set any associated properties on the newly created contact. Otherwise, if the contact already exists, `contactProperties` provided in the request will <u>not</u> be updated.
  * For example, the request body below provides an example of updating the attendance data for a contact with an email address of `john@example.com` and specifying when the attendee joined and left the event via the `joinedAt` and `leftAt` fields within the `properties` object of your `inputs` array:

```json theme={null}
{
  "inputs": [
    {
      "contactProperties": {
        "additionalProp1": "string",
        "additionalProp2": "string"
      },
      "properties": {
        "joinedAt": "2024-05-22T13:38:16.500Z",
        "leftAt": "2024-05-22T15:40:16.500Z"
      },
      "email": "john@example.com",
      "interactionDateTime": 1716382579000
    }
  ]
}
```

For either of the approaches above, provide the following values for the corresponding path parameters:

* `objectId`: the *Record ID* of the marketing event in your HubSpot account. Check out the [section above](#differences-between-internal-id-and-external-id-endpoints) for more details on using the objectId of an event versus using its external IDs.
* `subscriberState`: an enumeration that matches the new attendance status of the contact:
* `REGISTERED`: indicates that the HubSpot contact has registered for the event.
* `ATTENDED`: indicates that the HubSpot contact has attended the event. If you're updating a contact's status to ATTENDED, you can also include the `joinedAt` and `leftAt` timestamps as parameters in the request body, specified in the ISO8601 Instant format.
* `CANCELLED`: indicates that the HubSpot contact, who had previously registered for the event, has cancelled their registration.

### Update attendance using the external IDs of the event

<Warning>
  **Please note:** if you were previously using the `/upsert` or `/email-upsert` endpoints to update an attendee's status, you can instead use the alternate endpoints listed below. However, compared to the event attendance endpoints above, using these endpoints will <u>not</u> provide support for the following:

  * Creating a new contact if it doesn't already exist.
  * Showing timeline events on the contact record page.
  * Specifying the `joinedAt` or `leftAt` properties.
  * Providing a detailed response upon success.
</Warning>

If you do use the endpoints that require the `externalEventId` from your app, you can either use the contact IDs or email address of existing contacts:

* If you want to use the contact IDs of existing contacts:
  * Make a `POST` request to `/marketing/v3/marketing-events/attendance/{externalEventId}/{subscriberState}/create`, using the ID of the event from your external application as the `externalEventId`.
  * In the request body, provide an `inputs` object that includes the following fields:
    * `interactionDateTime`: the date and time at which the contact subscribed to the event.
    * `vid`: the contact ID of an existing contact.
* If you want to use the email address of one of the event's attendees:
  * Make a `POST` request to `/marketing/v3/marketing-events/attendance/{externalEventId}/{subscriberState}/email-create`.
  * In the request body, provide an `inputs` object that includes the following fields:
    * `interactionDateTime`: the date and time at which the contact subscribed to the event.
    * `email`: the email address of the attendee as the value of the email field within an inputs
  * If the email address you include don't match the address of an existing contact, a new contact will be created.

For both of the endpoints above, provide the following values for the corresponding path parameters:

* `externalEventId`: the ID of the [marketing event](https://knowledge.hubspot.com/integrations/use-marketing-events#view-edit-and-analyze-marketing-events). Check out the [section above](#differences-between-internal-id-and-external-id-endpoints) for more details on using the objectId of an event versus using its external IDs.
* `subscriberState`: an enumeration that matches the new attendance status of the contact:
  * `REGISTERED`: indicates that the HubSpot contact has registered for the event.
  * `ATTENDED`: indicates that the HubSpot contact has attended the event. If you're updating a contact's status to ATTENDED, you can also include the `joinedAt` and `leftAt` timestamps as parameters in the request body, specified in the ISO8601 Instant format.
  * `CANCELLED`: indicates that the HubSpot contact, who had previously registered for the event, has cancelled their registration.

<Warning>
  These APIs are idempotent so long as the ID of the contact and the `interactionDateTime` value in the event has not changed. This enables you to safely set attendance state multiple times without HubSpot creating duplicate events in the marketing events properties.
</Warning>

## Participant state endpoints

You can use the participation endpoints to retrieve event participant data for your marketing events. You can query data such as aggregate metrics for a specific event, as well as participant data for a specific contact or event.

<Warning>
  The activity counts in the [marketing events page](https://knowledge.hubspot.com/integrations/use-marketing-events) in your HubSpot account may differ from the corresponding aggregate metrics from the participation counters API endpoint.

  For example, if a participant registered for an event, then cancelled, then re-registered for the same event, each of those activities will be included in the totals you see in the marketing events UI in your account. If you're using the participant state endpoints below, only the current state of a participant is included in the associated counter for that metric (e.g., `attended`, `registered`, `cancelled`, or `noShows`).
</Warning>

### Read participation data for a specific contact

To get event participation data for a specific contact, make a `GET` request to `/marketing/v3/marketing-events/participations/contacts/{contactIdentifier}/breakdown`, using's the contact's ID or email address as the `contactIdentifier` path parameter.

The response will include a summary of the contact's event participation in the `properties` field:

```json theme={null}
{
  "results": [
    {
      "associations": {
        "marketingEvent": {
          "externalAccountId": "4",
          "marketingEventId": "123",
          "externalEventId": "456",
          "name": "Virtual baking workshop"
        },
        "contact": {
          "firstname": "Jane",
          "contactId": "156792341",
          "email": "jdoe@example.com",
          "lastname": "Doe"
        }
      },
      "createdAt": "2024-05-21T18:35:04.838Z",
      "id": "string",
      "properties": {
        "occurredAt": "2024-05-22T10:35:04.838Z",
        "attendancePercentage": "string",
        "attendanceState": "REGISTERED",
        "attendanceDurationSeconds": 3600
      }
    }
  ]
}
```

### Read participation breakdown data

To get a breakdown of participation data for a specific event, use your `externalAccountId` and the `externalEventId` of your event to make a `GET` request to `/marketing/v3/marketing-events/participations/{externalAccountId}/{externalEventId}/breakdown`.

### Read participation counters

To get an aggregate participation summary for an event, use your `externalAccountId` and the `externalEventId` of your event to make a `GET` request to `/marketing/v3/marketing-events/participations/{externalAccountId}/{externalEventId}`.

The response will include the total attendance counts:

```json theme={null}
{
  "attended": 152,
  "registered": 200,
  "cancelled": 3,
  "noShows": 8
}
```

### Filtering participation breakdown data

When fetching breakdown data or event participation data for a specific contact, you can filter the resulting data using the contactIdentifier, state, limit, or after fields as query parameters in your request.

| Query parameter     | Type        | Description                                                                                                                                                                                                                                                                                                                                                     |
| ------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `contactIdentifier` | string      | The email address or ID of a specific contact                                                                                                                                                                                                                                                                                                                   |
| `state`             | Enumeration | The participation state for the event. The possible participation states are:<ul><li>`REGISTERED`: The contact has registered for the event</li><li>`CANCELLED`: The contact's registration has been cancelled.</li><li>`ATTENDED`: The contact attended the event.</li><li>`NO_SHOW`: The contact registered but did not end up attending the event.</li></ul> |
| `limit`             | Number      | Limit the results returned. By default, the limit is set to 10. The valid range is 1-100.                                                                                                                                                                                                                                                                       |
| `after`             | Number      | Used for paging between results in the response. Consult the provided offset in the previous page of response data to determine the next index of results to return.                                                                                                                                                                                            |

## List association endpoints

You can use the endpoints described in the sections below to manage associations between lists and your marketing events.

Many of these endpoints require a `listId` as a path parameter, which you can find on the list details page in your HubSpot account:

* In your HubSpot account, navigate to **CRM** > **Lists**.
* Click the **name** of a list.
* In the top right, click **Details**.
* In the right panel, the list ID will appear under *List IDs for API integrations*. You can click **Copy list ID** to copy the ID to the clipboard.

![list-details-panel-list-associations-api](https://www.hubspot.com/hubfs/Knowledge_Base_2023_2024/list-details-panel-list-associations-api.png)

As you associate lists with your marketing events, they'll appear on the details page for a marketing event in your HubSpot account:

* In your HubSpot account, navigate to **CRM** > **Contacts**.
* In the upper left, click **Contacts** and in the dropdown menu, select **Marketing events**.
* Click the **name** of a marketing event.
* On the *Performance* tab, click **Lists** to expand the section, then click the **Lists added through associations** tab.

![review-list-associations-for-marketing-events-api](https://www.hubspot.com/hubfs/Knowledge_Base_2023_2024/review-list-associations-for-marketing-events-api.png)

### Create list association with a marketing event ID

To create a new association between a marketing event and an existing list, make a `PUT` request to `/marketing/v3/marketing-events/associations/{marketingEventId}/lists/{listId}`.

If successful, you'll receive a `204 No content` response.

### Create list association with external event and account IDs

To create a new association between a marketing event and an existing list using the external account ID and the external event ID, make a `PUT` request to `/marketing/v3/marketing-events/associations/{externalAccountId}/{externalEventId}/lists/{listId}`.

If successful, you'll receive a `204 No content` response.

### Get lists associated with a marketing event using a marketing event ID

To get all lists associated with a marketing event, make a `GET` request to `/marketing/v3/marketing-events/associations/{marketingEventId}/lists`.

The response will resemble the following:

```json theme={null}
{
  "total": 1,
  "results": [
    {
      "listId": "string",
      "listVersion": 0,
      "createdAt": "2024-05-10T08:58:35.769Z",
      "updatedAt": "2024-05-10T08:58:35.769Z",
      "filtersUpdatedAt": "2024-05-10T08:58:35.769Z",
      "processingStatus": "string",
      "createdById": "string",
      "updatedById": "string",
      "processingType": "string",
      "objectTypeId": "string",
      "name": "string",
      "size": 0
    }
  ]
}
```

### Get lists associated with a event using external event and account IDs

You can also get lists associated with a marketing event using an external account ID and the external event ID, make a `GET` request to `/marketing/v3/marketing-events/associations/{externalAccountId}/{externalEventId}/lists`.

### Delete list association using a marketing event ID

To delete a list association for a marketing event using a marketing event ID, make a `DELETE` request to `/marketing/v3/marketing-events/associations/{marketingEventId}/lists/{listId}`.

If successful, you'll receive a `204 No content` response.

### Delete list association using external event and account IDs

To delete a list association for a marketing event using the external account ID and an external event ID, make a `DELETE` request to `/marketing/v3/marketing-events/associations/{externalAccountId}/{externalEventId}/lists/{listId}`.

If successful, you'll receive a `204 No content` response.

## Configure app settings

There's some setup required to allow marketing events to sync properly with HubSpot.

If you send HubSpot an attendance state change (e.g., a registration or cancellation), HubSpot will first check to see if a Marketing Event exists for the specified event ID. If it doesn't, HubSpot will call the configured endpoint for your app to retrieve the details of the marketing event, then create the event in HubSpot and then publish the attendance state change.

This is provided for convenience; however, it's still recommended that you create the Marketing Events yourself via the CRUD methods provided in the reference documentation (e.g., this `POST` endpoint [reference](/api-reference/legacy/marketing/marketing-events/create-event)), and don't rely on this functionality to create your marketing events in HubSpot.

### Step 1: Create an API in your app

In order to support this, HubSpot requires each app that uses Marketing Events to define an API to fetch information about a specific marketing event.

Requirements:

* Accepts:
  * `externalAccountId`: a query parameter that specifies the accountId of the customer in the external app.
  * `appId`: a query parameter that specifies the ID of the HubSpot application that is requesting the event details. This will be the ID of your app.
  * `externalEventId`: a path parameter in the URL of the request that specifies the ID of the event in the external app that HubSpot requires details about.
* Returns:
  * A JSON object that provides details for the marketing event, that includes the following fields detailed in the table below:

| Field Name         | Required | Type                | Field Description                                                                      |
| ------------------ | -------- | ------------------- | -------------------------------------------------------------------------------------- |
| `eventName`        | true     | string              | The name of the marketing event                                                        |
| `eventOrganizer`   | true     | string              | The name of the organizer of the marketing event.                                      |
| `eventType`        | false    | string              | Describes what type of event this is. For example: `WEBINAR`, `CONFERENCE`, `WORKSHOP` |
| `startDateTime`    | false    | string(\$date-time) | The start date and time of the marketing event.                                        |
| `endDateTime`      | false    | string(\$date-time) | The end date and time of the marketing event.                                          |
| `eventDescription` | false    | string              | The description of the marketing event.                                                |
| `eventUrl`         | false    | string              | A URL in the external event application where the marketing event.                     |
| `eventCancelled`   | false    | bool                | Indicates if the marketing event has been cancelled. Defaults to `false`               |

HubSpot will also send a `X-HubSpot-Signature-v3` header that you can use to verify that the request came from HubSpot. Read more about [request signatures](/apps/developer-platform/build-apps/authentication/request-validation) for additional details on the signature and how to validate it.

### Step 2: Provide HubSpot with the URL path to your API

Now that you've created the API in your app that will return an object that provides the details of a specific marketing event, you will need to provide HubSpot with the URL path to your API by making a `POST` request to `/marketing/v3/marketing-events/{appId}/settings`. This will allow HubSpot to determine how to make requests to your app to get the details of a marketing event.

In the body of your `POST` request, specify your URL using the `eventDetailsURL` field. The `eventDetailsURL` must adhere to the following two requirements:

* Contain a `%s` character sequence, which HubSpot will use to substitute in the ID of the event (`externalEventId`) as a path parameter.
* It must be the full path to the API resource, including the `https://` prefix and the domain name (e.g., `my.event.app`).

For example, if you configure an `eventDetailsURL` of `https://my.event.app/events/%s`, and you need to make a request to fetch details of an event with id `1234-event-XYZ`, for the HubSpot app with id `app-101` and account with id `ABC-account-789`, HubSpot will make a `GET` request to:

`https://my.event.app/events/1234-event-XYZ?appId=app-101&externalAccountId=ABC-account-789`
