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

# Brightcove

> Integrate with Brightcove for video event collection and cohort activation

export const NoBadge = () => {
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.5rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: '#F7D0E2',
    color: '#1A1A1A',
    fontWeight: '500'
  }}>
      No
    </span>;
};

export const YesBadge = () => {
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.5rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: '#C7E8F9',
    color: '#1A1A1A',
    fontWeight: '500'
  }}>
      Yes
    </span>;
};

export const BadgeRowCenter = ({label, children}) => {
  return <div style={{
    display: 'flex',
    justifyContent: 'space-between',
    alignItems: 'center',
    marginBottom: '0.5rem'
  }}>
      <span style={{
    fontSize: '0.625rem',
    color: '#6b7280',
    textTransform: 'uppercase',
    fontWeight: '500',
    letterSpacing: '0.05em'
  }}>
        {label}
      </span>
      {children}
    </div>;
};

export const BadgeRow = ({label, children}) => {
  return <div style={{
    display: 'flex',
    justifyContent: 'space-between',
    alignItems: 'flex-start',
    marginBottom: '0.5rem'
  }}>
      <span style={{
    fontSize: '0.625rem',
    color: '#6b7280',
    textTransform: 'uppercase',
    fontWeight: '500',
    letterSpacing: '0.05em'
  }}>
        {label}
      </span>
      {children}
    </div>;
};

export const BadgeContainer = ({children}) => {
  return <div style={{
    display: 'flex',
    gap: '0.25rem',
    flexWrap: 'wrap',
    justifyContent: 'flex-end',
    minWidth: '0',
    flex: '1'
  }}>
      {children}
    </div>;
};

export const ProductRequiredBadge = ({product}) => {
  const getBadgeStyle = product => {
    switch (product) {
      case 'Core Platform':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      case 'Routing':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      case 'Contextual':
        return {
          background: '#CB88FC',
          color: '#1A1A1A'
        };
        --purple;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(product);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {product}
    </span>;
};

export const SdkRequiredBadge = ({required}) => {
  const getBadgeStyle = required => {
    switch (required) {
      case 'Yes':
        return {
          background: '#C7E8F9',
          color: '#1A1A1A'
        };
        --blue;
      case 'No':
        return {
          background: '#F7D0E2',
          color: '#1A1A1A'
        };
        --pink;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(required);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {required}
    </span>;
};

export const CapabilityBadge = ({capability}) => {
  const getBadgeStyle = capability => {
    switch (capability) {
      case 'Event Collection':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Cohort Activation':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Campaign Optimization':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Identity Signal':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Contextual Signal':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Connectivity':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Routing':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      case 'Data Collaboration':
        return {
          background: '#EFDFC8',
          color: '#1A1A1A'
        };
        --clay;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(capability);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
      {capability}
    </span>;
};

export const EnvironmentBadge = ({environment}) => {
  const getBadgeStyle = environment => {
    switch (environment) {
      case 'Web':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'iOS':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'Android':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'CTV':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      case 'API Direct':
        return {
          background: '#F9C1A8',
          color: '#1A1A1A'
        };
        --peach;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(environment);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500',
    whiteSpace: 'nowrap'
  }}>
      {environment}
    </span>;
};

export const DirectionBadge = ({direction}) => {
  const getBadgeStyle = direction => {
    switch (direction) {
      case 'Bidirectional':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      case 'Destination':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      case 'Source':
        return {
          background: '#FA8784',
          color: '#1A1A1A'
        };
        --tomato;
      default:
        return {
          background: '#A7B3D9',
          color: '#1A1A1A'
        };
        --haze;
    }
  };
  const style = getBadgeStyle(direction);
  return <span style={{
    display: 'inline-block',
    padding: '0.125rem 0.375rem',
    borderRadius: '0.25rem',
    fontSize: '0.625rem',
    background: style.background,
    color: style.color,
    fontWeight: '500'
  }}>
      {direction}
    </span>;
};

<Card title="">
  <div style={{ display: 'flex', alignItems: 'center', marginBottom: '1rem' }}>
    <div style={{ width: '32px', height: '32px', marginRight: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>
      <img src="https://mintcdn.com/permutive/pNhz39ducTVcQczh/images/integrations/logos/brightcove.svg?fit=max&auto=format&n=pNhz39ducTVcQczh&q=85&s=0160adde0721252f319653130f316eb0" alt="Brightcove" style={{ maxWidth: '32px', maxHeight: '32px', display: 'block', backgroundColor: '#f3f4f6', borderRadius: '4px', padding: '2px' }} width="200" height="200" data-path="images/integrations/logos/brightcove.svg" />
    </div>

    <h3 style={{ margin: 0, fontSize: '1.125rem', fontWeight: '600' }}>Brightcove</h3>
  </div>

  <div style={{ marginBottom: '1rem' }}>
    <BadgeRowCenter label="Direction">
      <DirectionBadge direction="Bidirectional" />
    </BadgeRowCenter>

    <BadgeRowCenter label="Environment">
      <BadgeContainer>
        <EnvironmentBadge environment="Web" />
      </BadgeContainer>
    </BadgeRowCenter>

    <BadgeRowCenter label="Capability">
      <BadgeContainer>
        <CapabilityBadge capability="Event Collection" />

        <CapabilityBadge capability="Cohort Activation" />
      </BadgeContainer>
    </BadgeRowCenter>

    <BadgeRowCenter label="SDK Required">
      <SdkRequiredBadge required="Yes" />
    </BadgeRowCenter>

    <BadgeRowCenter label="Product(s) Required">
      <ProductRequiredBadge product="Core Platform" />
    </BadgeRowCenter>
  </div>

  <p style={{ margin: 0, fontSize: '0.875rem', color: '#6b7280', lineHeight: '1.5' }}>
    Brightcove allows publishers to manage and monetize video content with robust ad insertion and analytics tools.
  </p>
</Card>

<CardGroup cols={2}>
  <Card title="Setup" href="#setup" icon="gear" />

  <Card title="Troubleshooting" href="#troubleshooting" icon="wrench" />
</CardGroup>

## Overview

Brightcove is a high-performance, cross-platform HTML5-first video player that loads quickly, delivers high-quality video across desktop and mobile platforms. Our integration with Brightcove enables video event collection and targeting.

This integration is both a Source and Destination:

* **Source:** Permutive is able to track video events from the Brightcove player.
* **Destination:** Permutive is able to activate your cohorts for video ads served in the player.

Use cases include:

* Track video events in Permutive, for insights, advanced segmentation or modeling.
* Add Permutive cohorts to your Google Ad Manager (GAM) ad requests so that they can be used for decisioning and targeting in realtime.

## Environment Compatibility

| Environment    | Supported    | Notes                                           |
| -------------- | ------------ | ----------------------------------------------- |
| **Web**        | <YesBadge /> | Targeting supported for ads served via GAM only |
| **iOS**        | <NoBadge />  | Not supported                                   |
| **Android**    | <NoBadge />  | Not supported                                   |
| **CTV**        | <NoBadge />  | Not supported                                   |
| **API Direct** | <NoBadge />  | Not supported                                   |

## Prerequisites

* **Public API key**: This can be found in the Permutive dashboard, in your [project settings](https://dash.permutive.com/settings/keys/). We recommend provisioning a new one, by clicking *Add Key* and choosing *Public*.
* **Brightcove Video Player**: You should already have a Brightcove video player installed on your site. You must also have access to the Brightcove Cloud Studio dashboard, where you can configure your player.

## Setup

<Tabs>
  <Tab title="Primary Setup Steps">
    <Steps>
      <Step title="Enable in Permutive Dashboard">
        You must enable the Brightcove Video Player integration in the Permutive Dashboard, if this has not already be done.
        In the Permutive dashboard, navigate to your workspace's integrations page. Click *Add Integration* and select *Brightcove Video Player*.
        There is nothing to configure in the Permutive Dashboard for this integration.
      </Step>

      <Step title="Install the Player Plugin">
        The Permutive plugin for Brightcove can be installed into your player using the Brightcove Cloud Studio dashboard. The following steps must be performed for every player where you want Permutive enabled:

        <Expandable title="detailed steps">
          1. Open the player in Brightcove Cloud Studio.
          2. Scroll down to *Plugins* and press *Edit*.
          3. Click on *JavaScript* and paste our plugin URL:\
             `https://cdn.permutive.com/integrations/videojs-permutive-1.4.2.js`
          4. Select the '+' to the right.
          5. Click on *Name*, *Options (JSON)* and paste in the following configuration:

          ```javascript theme={"dark"}
          {
                "apiKey": "<PUBLIC_API_KEY>",
                "platform": "<PLATFORM>"
          }
          ```

          * Replace `<PUBLIC_API_KEY>` with your Permutive public API key.
          * Replace `<PLATFORM>` with either `web`, `amp` or `fia`, based on whether your player is to be deployed on Web, AMP or Instant Articles.

          6. Click *Save*.
        </Expandable>
      </Step>

      <Step title="Configure Video Ad Targeting">
        You can now configure the player to make Permutive cohorts available for targeting video ads served in your the player via the GAM ad server.

        <Expandable title="detailed steps">
          1. Open the player in Brightcove Cloud Studio
          2. Go to *Advertising*
          3. Modify the URL in the *Ad Tag* section to include `&cust_params=permutive%3D{permutive}` in its query part

          <Warning>
            Be aware that `cust_params` may already be part of the URL, if you are already appending custom targeting data to ad requests. In this case just prepend the `cust_params` value with `permutive%3D{permutive}%26`.
          </Warning>
        </Expandable>

        <Info>Targeting for pre-roll ads is only supported when using the "on play" Brightcove *Request Ads* setting. If "on load" is used, Permutive cohorts will not be included on the ad request.</Info>
      </Step>

      <Step title="Verify Setup">
        In the Permutive Dashboard, navigate to your events page. Having completed the above steps, plugin installation is now complete. You should start seeing video event data appear in the Permutive Dashboard.

        For your cohorts with a GAM activation configured, you should now see these cohorts available for targeting on video ad requests from the player.
      </Step>
    </Steps>
  </Tab>
</Tabs>

## Data Types

With your Brightcove integration setup, you'll see the following additional event types collected in Permutive:

<AccordionGroup>
  <Accordion title="VideoPlay">
    Tracks each time a video is played.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="auto_start" type="boolean">
      Indicates whether the player auto started.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoProgress">
    Tracks progress of a video play, as a percentage watched.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="progress" type="decimal">
      Percentage of the video content watched so far.
    </ResponseField>

    <ResponseField name="seeked" type="boolean">
      Indicates whether the user has seeked through the video content.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoEvent">
    Tracks additional events emitted by the player, such as when a user enters full screen mode or presses pause.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="event" type="string">
      Name of the additional event that was fired by the player (e.g. `PressedPause`, `ResumedPlay`)
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoLoad">
    Tracks the first time a video loads on the page.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="auto_start" type="boolean">
      Indicates whether the player auto started.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoAdPlay">
    Tracks when a video ad is played, includes all ad information available from IMA.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="ad.ad_id" type="string">
      The ID of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.ad_system" type="string">
      The source ad server of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.creative_id" type="string">
      The ID of the selected creative for the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.deal_id" type="string">
      Returns the first deal ID present in the wrapper chain for the current ad, starting from the top. Returns the empty string if unavailable.
    </ResponseField>

    <ResponseField name="ad.advertiser_name" type="string">
      The advertiser name, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id_registry" type="string">
      The registry associated with cataloging the UniversalAdId of the selected creative for the ad.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id" type="string">
      The UniversalAdId of the selected creative for the ad, or "unknown" if unavailable.
    </ResponseField>

    <ResponseField name="ad.title" type="string">
      Returns the title of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.description" type="string">
      Returns the description of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.duration" type="string">
      Returns the duration of the selected creative, or -1 for non-linear creatives.
    </ResponseField>

    <ResponseField name="ad.min_suggested_duration" type="string">
      Returns the minimum suggested duration in seconds that the nonlinear creative should be displayed. Returns -2 if the minimum suggested duration is unknown. For linear creative it returns the entire duration of the ad.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoAdProgress">
    Tracks progress of a video ad play, as a percentage watched.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="progress" type="decimal">
      Percentage of the video ad content watched so far.
    </ResponseField>

    <ResponseField name="ad.ad_id" type="string">
      The ID of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.ad_system" type="string">
      The source ad server of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.creative_id" type="string">
      The ID of the selected creative for the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.deal_id" type="string">
      Returns the first deal ID present in the wrapper chain for the current ad, starting from the top. Returns the empty string if unavailable.
    </ResponseField>

    <ResponseField name="ad.advertiser_name" type="string">
      The advertiser name, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id_registry" type="string">
      The registry associated with cataloging the UniversalAdId of the selected creative for the ad.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id" type="string">
      The UniversalAdId of the selected creative for the ad, or "unknown" if unavailable.
    </ResponseField>

    <ResponseField name="ad.title" type="string">
      Returns the title of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.description" type="string">
      Returns the description of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.duration" type="string">
      Returns the duration of the selected creative, or -1 for non-linear creatives.
    </ResponseField>

    <ResponseField name="ad.min_suggested_duration" type="string">
      Returns the minimum suggested duration in seconds that the nonlinear creative should be displayed. Returns -2 if the minimum suggested duration is unknown. For linear creative it returns the entire duration of the ad.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoAdEvent">
    Tracks additional events emitted by the player whilst an ad is being watched, such as when a user enters full screen mode, pressed pause or resumed play.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="event" type="string">
      Name of the additional event that was fired by the player (e.g. `PressedPause`, `ResumedPlay`)
    </ResponseField>

    <ResponseField name="ad.ad_id" type="string">
      The ID of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.ad_system" type="string">
      The source ad server of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.creative_id" type="string">
      The ID of the selected creative for the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.deal_id" type="string">
      Returns the first deal ID present in the wrapper chain for the current ad, starting from the top. Returns the empty string if unavailable.
    </ResponseField>

    <ResponseField name="ad.advertiser_name" type="string">
      The advertiser name, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id_registry" type="string">
      The registry associated with cataloging the UniversalAdId of the selected creative for the ad.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id" type="string">
      The UniversalAdId of the selected creative for the ad, or "unknown" if unavailable.
    </ResponseField>

    <ResponseField name="ad.title" type="string">
      Returns the title of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.description" type="string">
      Returns the description of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.duration" type="string">
      Returns the duration of the selected creative, or -1 for non-linear creatives.
    </ResponseField>

    <ResponseField name="ad.min_suggested_duration" type="string">
      Returns the minimum suggested duration in seconds that the nonlinear creative should be displayed. Returns -2 if the minimum suggested duration is unknown. For linear creative it returns the entire duration of the ad.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>

  <Accordion title="VideoAdClick">
    Tracks when a user clicks on a video ad.

    <ResponseField name="play_id" type="UUID">
      Unique ID representing this video engagement.
    </ResponseField>

    <ResponseField name="ad.ad_id" type="string">
      The ID of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.ad_system" type="string">
      The source ad server of the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.creative_id" type="string">
      The ID of the selected creative for the ad, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.deal_id" type="string">
      Returns the first deal ID present in the wrapper chain for the current ad, starting from the top. Returns the empty string if unavailable.
    </ResponseField>

    <ResponseField name="ad.advertiser_name" type="string">
      The advertiser name, or the empty string if this information is unavailable.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id_registry" type="string">
      The registry associated with cataloging the UniversalAdId of the selected creative for the ad.
    </ResponseField>

    <ResponseField name="ad.universal_ad_id" type="string">
      The UniversalAdId of the selected creative for the ad, or "unknown" if unavailable.
    </ResponseField>

    <ResponseField name="ad.title" type="string">
      Returns the title of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.description" type="string">
      Returns the description of this ad from the VAST response.
    </ResponseField>

    <ResponseField name="ad.duration" type="string">
      Returns the duration of the selected creative, or -1 for non-linear creatives.
    </ResponseField>

    <ResponseField name="ad.min_suggested_duration" type="string">
      Returns the minimum suggested duration in seconds that the nonlinear creative should be displayed. Returns -2 if the minimum suggested duration is unknown. For linear creative it returns the entire duration of the ad.
    </ResponseField>

    <ResponseField name="video.video_id" type="string">
      Unique ID for this item of video content.
    </ResponseField>

    <ResponseField name="video.name" type="string">
      Name (title) of the video.
    </ResponseField>

    <ResponseField name="video.description" type="string">
      More detailed description of the video.
    </ResponseField>

    <ResponseField name="video.tags" type="list[string]">
      List of video tags (categories).
    </ResponseField>

    <ResponseField name="video.duration" type="number">
      The video duration, in seconds.
    </ResponseField>

    <ResponseField name="slot.watch_count" type="string">
      Number of times the user has watched this video.
    </ResponseField>

    <ResponseField name="video.published_date" type="datetime">
      Datetime for when the video content was first published.
    </ResponseField>
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Targeting for pre-roll video ads not working as expected">
    Targeting for pre-roll ads is only supported when using the "on play" Brightcove Request Ads setting. If "on load" is used, Permutive targeting will not be included on the ad request. Check your settings in Brightcove Cloud Studio.
  </Accordion>
</AccordionGroup>

## Changelog

### November 2019

* Improved tracking of `VideoPlay`, to include details of video duration and whether auto start was used.

<Info>
  For detailed changelog information, visit our [Changelog](https://changelog.permutive.com/).
</Info>
