<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="displayvideo_v1.html">Display & Video 360 API</a> . <a href="displayvideo_v1.advertisers.html">advertisers</a> . <a href="displayvideo_v1.advertisers.creatives.html">creatives</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(advertiserId, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a new creative.</p>
<p class="toc_element">
  <code><a href="#delete">delete(advertiserId, creativeId, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a creative.</p>
<p class="toc_element">
  <code><a href="#get">get(advertiserId, creativeId, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a creative.</p>
<p class="toc_element">
  <code><a href="#list">list(advertiserId, filter=None, pageToken=None, orderBy=None, pageSize=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists creatives in an advertiser.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<p class="toc_element">
  <code><a href="#patch">patch(advertiserId, creativeId, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an existing creative.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(advertiserId, body=None, x__xgafv=None)</code>
  <pre>Creates a new creative.
Returns the newly created creative if successful.

Args:
  advertiserId: string, Output only. The unique ID of the advertiser the creative belongs to. (required)
  body: object, The request body.
    The object takes the form of:

{ # A single Creative.
  &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
    &quot;A String&quot;,
  ],
  &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
  &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
      # 
      # Accepted values are:
      # 
      # * `ENTITY_STATUS_ACTIVE`
      # * `ENTITY_STATUS_ARCHIVED`
      # * `ENTITY_STATUS_PAUSED`
  &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
      # 
      # This field is required when skippable is true.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
    &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
  },
  &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
      # 
      # Optional and only valid for third-party tag creatives.
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
  &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
      # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
      # supported.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
  &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
      # creative.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
    { # Tracking URLs from third parties to track interactions with an audio or a
        # video creative.
      &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
      &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
          #
          # Provide a URL with optional path or query string, beginning with `https:`.
          # For example, https://www.example.com/path
    },
  ],
  &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
      # 
      # Optional and only valid for third-party expandable creatives.
      # Third-party expandable creatives are creatives with following hosting
      # source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
      # An exit (also known as a click tag) is any area in your creative that
      # someone can click or tap to open an advertiser&#x27;s landing page.
      # Every creative must include at least one exit.
      # You can add an exit to your creative in any of the following ways:
      # 
      # * Use Google Web Designer&#x27;s tap area.
      # * Define a JavaScript variable called &quot;clickTag&quot;.
      # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
    { # Exit event of the creative.
      &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
          # This is required when type is:
          #
          # * `EXIT_EVENT_TYPE_DEFAULT`
          # * `EXIT_EVENT_TYPE_BACKUP`
      &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
          #
          # The name must be unique within one creative.
          #
          # Leave it empty or unset for creatives containing image assets only.
      &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
      &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
          # Leave it empty or unset for creatives containing image assets only.
    },
  ],
  &quot;additionalDimensions&quot;: [ # Additional dimensions.
      # Applicable when creative_type is one of:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_LIGHTBOX`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
      # 
      # If this field is specified, width_pixels and
      # height_pixels are both required and must be
      # greater than or equal to 0.
    { # Dimensions.
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
  ],
  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
      # the system.
  &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
      # 
      # The URLs must start with https (except on inventory that doesn&#x27;t require
      # SSL compliance).
      # If using macros in your URL, use only macros supported by Display &amp; Video
      # 360.
      # 
      # Standard URLs only, no IMG or SCRIPT tags.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
    &quot;A String&quot;,
  ],
  &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
      # To enable this for the creative, make sure the
      # Advertiser.creative_config.ias_client_id
      # has been set to your IAS client ID.
  &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
      # Must be UTF-8 encoded with a length of no more than 10,000 characters.
  &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
      # creative.
      # This field is only applicable for creatives that are synced from Campaign
      # Manager.
  &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
      # Definitions system).
      # 
      # Set this if the creative relies on mobile gestures for interactivity, such
      # as swiping or tapping.
      # 
      # Optional and only valid for third-party tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
      # 
      # You can assign existing display creatives (with image or HTML5 assets)
      # to serve surrounding the publisher&#x27;s video player. Companions display
      # around the video player while the video is playing and remain after the
      # video has completed.
      # 
      # Creatives contain additional dimensions
      # can not be companion creatives.
      # 
      # This field is only supported for following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_VIDEO`
    &quot;A String&quot;,
  ],
  &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
  &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
    &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
    &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
    &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
    &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
  },
  &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
      # Timers track the time during which a user views and interacts with a
      # specified part of a rich media creative.
      # A creative can have multiple timer events, each timed independently.
      # Leave it empty or unset for creatives containing image assets only.
    { # Timer event of the creative.
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
      &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
    },
  ],
  &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
      # Must be UTF-8 encoded with a length of no more than 20,000 characters.
  &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
  &quot;assets&quot;: [ # Required. Assets associated to this creative.
      # Assets can be associated to the creative in one of following roles:
      # 
      # * `ASSET_ROLE_UNSPECIFIED`
      # * `ASSET_ROLE_MAIN`
      # * `ASSET_ROLE_BACKUP`
      # * `ASSET_ROLE_POLITE_LOAD`
    { # Asset association for the creative.
      &quot;asset&quot;: { # A single asset. # The associated asset.
        &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
            # This ID can be passed to other API calls, e.g.
            # CreateCreative to associate
            # the asset with a creative.
        &quot;content&quot;: &quot;A String&quot;, # The asset content.
            # For uploaded assets, the content is the serving path.
      },
      &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
    },
  ],
  &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
      # Player-Ad Interface).
      # 
      # Output only and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
      # 
      # Required and only valid for third-party expandable creatives.
      # 
      # Third-party expandable creatives are creatives with following hosting
      # source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
      # 
      # Required and only valid for third-party tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
      # 
      # Must be UTF-8 encoded with a maximum size of 240 bytes.
  &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
  &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
      # Applicable when creative_type
      # is one of:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
  &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
      # 
      # Required and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
    &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
        # Summary of
        # creative_and_landing_page_review_status
        # and
        # content_and_policy_review_status.
    &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
    &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
      { # Exchange review status for the creative.
        &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
        &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
      },
    ],
    &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
    &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
      { # Publisher review status for the creative.
        &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
        &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
      },
    ],
  },
  &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
      # Counters track the number of times that a user interacts with any part of a
      # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
      # taps, data loading, keyboard entries, etc.).
      # Any event that can be captured in the creative can be recorded as a
      # counter.
      # Leave it empty or unset for creatives containing image assets only.
    { # Counter event of the creative.
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
      &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
    },
  ],
  &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
      # 
      # This field is required when skippable is true.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
    &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
  },
  &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
      # the system.
  &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
  &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
      # across all platforms.
      # 
      # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
      # the creative is created.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # platforms. This is part of the VAST 4.0 standard.
    &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
    &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
  },
  &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
      # 
      # Display &amp; Video 360 transcodes the main asset into a number of alternative
      # versions that use different file formats or have different properties
      # (resolution, audio bit rate, and video bit rate), each designed for
      # specific video players or bandwidths.
      # 
      # These transcodes give a publisher&#x27;s system more options to choose from for
      # each impression on your video and ensures that the appropriate file serves
      # based on the viewer’s connection and screen size.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_AUDIO`
    { # Represents information about the transcoded audio or video file.
      &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
      &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
      &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
      &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
      &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
          # rate for the transcoded audio, in hertz.
      &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
      &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
          # for the transcoded audio, in kilobits per second.
      &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
      &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
    },
  ],
  &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
      # 
      # Optional for the following creative_type when
      # created by an advertiser that uses both Campaign Manager and third-party ad
      # serving:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # 
      # Output only for other cases.
    &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
    &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
    &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
  },
  &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
      # 
      # Output only and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
      # 
      # Only valid when using a Campaign Manager tracking ad with a third-party ad
      # server parameter and the ${DC_DBM_TOKEN} macro.
      # 
      # Optional and only valid for third-party tag creatives or third-party VAST
      # tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
      # Applicable to all creative types. The value of
      # width_pixels and
      # height_pixels defaults to `0`
      # when creative_type is one of:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
    &quot;heightPixels&quot;: 42, # The height in pixels.
    &quot;widthPixels&quot;: 42, # The width in pixels.
  },
  &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
}

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A single Creative.
    &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
      &quot;A String&quot;,
    ],
    &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
    &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
        #
        # Accepted values are:
        #
        # * `ENTITY_STATUS_ACTIVE`
        # * `ENTITY_STATUS_ARCHIVED`
        # * `ENTITY_STATUS_PAUSED`
    &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
        #
        # Optional and only valid for third-party tag creatives.
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
    &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
        # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
        # supported.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
    &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
        # creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      { # Tracking URLs from third parties to track interactions with an audio or a
          # video creative.
        &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
        &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
            #
            # Provide a URL with optional path or query string, beginning with `https:`.
            # For example, https://www.example.com/path
      },
    ],
    &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
        #
        # Optional and only valid for third-party expandable creatives.
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
        # An exit (also known as a click tag) is any area in your creative that
        # someone can click or tap to open an advertiser&#x27;s landing page.
        # Every creative must include at least one exit.
        # You can add an exit to your creative in any of the following ways:
        #
        # * Use Google Web Designer&#x27;s tap area.
        # * Define a JavaScript variable called &quot;clickTag&quot;.
        # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
      { # Exit event of the creative.
        &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
            # This is required when type is:
            #
            # * `EXIT_EVENT_TYPE_DEFAULT`
            # * `EXIT_EVENT_TYPE_BACKUP`
        &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
            #
            # The name must be unique within one creative.
            #
            # Leave it empty or unset for creatives containing image assets only.
        &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
        &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
            # Leave it empty or unset for creatives containing image assets only.
      },
    ],
    &quot;additionalDimensions&quot;: [ # Additional dimensions.
        # Applicable when creative_type is one of:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_LIGHTBOX`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
        #
        # If this field is specified, width_pixels and
        # height_pixels are both required and must be
        # greater than or equal to 0.
      { # Dimensions.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
    ],
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
        # the system.
    &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
        #
        # The URLs must start with https (except on inventory that doesn&#x27;t require
        # SSL compliance).
        # If using macros in your URL, use only macros supported by Display &amp; Video
        # 360.
        #
        # Standard URLs only, no IMG or SCRIPT tags.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
        # To enable this for the creative, make sure the
        # Advertiser.creative_config.ias_client_id
        # has been set to your IAS client ID.
    &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
        # Must be UTF-8 encoded with a length of no more than 10,000 characters.
    &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
        # creative.
        # This field is only applicable for creatives that are synced from Campaign
        # Manager.
    &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
        # Definitions system).
        #
        # Set this if the creative relies on mobile gestures for interactivity, such
        # as swiping or tapping.
        #
        # Optional and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
        #
        # You can assign existing display creatives (with image or HTML5 assets)
        # to serve surrounding the publisher&#x27;s video player. Companions display
        # around the video player while the video is playing and remain after the
        # video has completed.
        #
        # Creatives contain additional dimensions
        # can not be companion creatives.
        #
        # This field is only supported for following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
    &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
      &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
      &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
      &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
      &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
    },
    &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
        # Timers track the time during which a user views and interacts with a
        # specified part of a rich media creative.
        # A creative can have multiple timer events, each timed independently.
        # Leave it empty or unset for creatives containing image assets only.
      { # Timer event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
      },
    ],
    &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
        # Must be UTF-8 encoded with a length of no more than 20,000 characters.
    &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
    &quot;assets&quot;: [ # Required. Assets associated to this creative.
        # Assets can be associated to the creative in one of following roles:
        #
        # * `ASSET_ROLE_UNSPECIFIED`
        # * `ASSET_ROLE_MAIN`
        # * `ASSET_ROLE_BACKUP`
        # * `ASSET_ROLE_POLITE_LOAD`
      { # Asset association for the creative.
        &quot;asset&quot;: { # A single asset. # The associated asset.
          &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
              # This ID can be passed to other API calls, e.g.
              # CreateCreative to associate
              # the asset with a creative.
          &quot;content&quot;: &quot;A String&quot;, # The asset content.
              # For uploaded assets, the content is the serving path.
        },
        &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
      },
    ],
    &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
        # Player-Ad Interface).
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
        #
        # Required and only valid for third-party expandable creatives.
        #
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
        #
        # Required and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
        #
        # Must be UTF-8 encoded with a maximum size of 240 bytes.
    &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
    &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
        # Applicable when creative_type
        # is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
    &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
        #
        # Required and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
      &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
          # Summary of
          # creative_and_landing_page_review_status
          # and
          # content_and_policy_review_status.
      &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
      &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
        { # Exchange review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
          &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
        },
      ],
      &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
      &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
        { # Publisher review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
          &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
        },
      ],
    },
    &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
        # Counters track the number of times that a user interacts with any part of a
        # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
        # taps, data loading, keyboard entries, etc.).
        # Any event that can be captured in the creative can be recorded as a
        # counter.
        # Leave it empty or unset for creatives containing image assets only.
      { # Counter event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
      },
    ],
    &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
        # the system.
    &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
    &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
        # across all platforms.
        #
        # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
        # the creative is created.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # platforms. This is part of the VAST 4.0 standard.
      &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
      &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
    },
    &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
        #
        # Display &amp; Video 360 transcodes the main asset into a number of alternative
        # versions that use different file formats or have different properties
        # (resolution, audio bit rate, and video bit rate), each designed for
        # specific video players or bandwidths.
        #
        # These transcodes give a publisher&#x27;s system more options to choose from for
        # each impression on your video and ensures that the appropriate file serves
        # based on the viewer’s connection and screen size.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
      { # Represents information about the transcoded audio or video file.
        &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
        &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
        &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
          &quot;heightPixels&quot;: 42, # The height in pixels.
          &quot;widthPixels&quot;: 42, # The width in pixels.
        },
        &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
        &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
            # rate for the transcoded audio, in hertz.
        &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
        &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
            # for the transcoded audio, in kilobits per second.
        &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
        &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
      },
    ],
    &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
        #
        # Optional for the following creative_type when
        # created by an advertiser that uses both Campaign Manager and third-party ad
        # serving:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        #
        # Output only for other cases.
      &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
      &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
      &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
    },
    &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
        #
        # Only valid when using a Campaign Manager tracking ad with a third-party ad
        # server parameter and the ${DC_DBM_TOKEN} macro.
        #
        # Optional and only valid for third-party tag creatives or third-party VAST
        # tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
        # Applicable to all creative types. The value of
        # width_pixels and
        # height_pixels defaults to `0`
        # when creative_type is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
    &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
  }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(advertiserId, creativeId, x__xgafv=None)</code>
  <pre>Deletes a creative.
Returns error code `NOT_FOUND` if the creative does not exist.
The creative should be archived first, i.e. set
entity_status to `ENTITY_STATUS_ARCHIVED`, before
it can be deleted.

Args:
  advertiserId: string, The ID of the advertiser this creative belongs to. (required)
  creativeId: string, The ID of the creative to be deleted. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(advertiserId, creativeId, x__xgafv=None)</code>
  <pre>Gets a creative.

Args:
  advertiserId: string, Required. The ID of the advertiser this creative belongs to. (required)
  creativeId: string, Required. The ID of the creative to fetch. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A single Creative.
    &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
      &quot;A String&quot;,
    ],
    &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
    &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
        #
        # Accepted values are:
        #
        # * `ENTITY_STATUS_ACTIVE`
        # * `ENTITY_STATUS_ARCHIVED`
        # * `ENTITY_STATUS_PAUSED`
    &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
        #
        # Optional and only valid for third-party tag creatives.
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
    &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
        # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
        # supported.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
    &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
        # creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      { # Tracking URLs from third parties to track interactions with an audio or a
          # video creative.
        &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
        &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
            #
            # Provide a URL with optional path or query string, beginning with `https:`.
            # For example, https://www.example.com/path
      },
    ],
    &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
        #
        # Optional and only valid for third-party expandable creatives.
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
        # An exit (also known as a click tag) is any area in your creative that
        # someone can click or tap to open an advertiser&#x27;s landing page.
        # Every creative must include at least one exit.
        # You can add an exit to your creative in any of the following ways:
        #
        # * Use Google Web Designer&#x27;s tap area.
        # * Define a JavaScript variable called &quot;clickTag&quot;.
        # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
      { # Exit event of the creative.
        &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
            # This is required when type is:
            #
            # * `EXIT_EVENT_TYPE_DEFAULT`
            # * `EXIT_EVENT_TYPE_BACKUP`
        &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
            #
            # The name must be unique within one creative.
            #
            # Leave it empty or unset for creatives containing image assets only.
        &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
        &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
            # Leave it empty or unset for creatives containing image assets only.
      },
    ],
    &quot;additionalDimensions&quot;: [ # Additional dimensions.
        # Applicable when creative_type is one of:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_LIGHTBOX`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
        #
        # If this field is specified, width_pixels and
        # height_pixels are both required and must be
        # greater than or equal to 0.
      { # Dimensions.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
    ],
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
        # the system.
    &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
        #
        # The URLs must start with https (except on inventory that doesn&#x27;t require
        # SSL compliance).
        # If using macros in your URL, use only macros supported by Display &amp; Video
        # 360.
        #
        # Standard URLs only, no IMG or SCRIPT tags.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
        # To enable this for the creative, make sure the
        # Advertiser.creative_config.ias_client_id
        # has been set to your IAS client ID.
    &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
        # Must be UTF-8 encoded with a length of no more than 10,000 characters.
    &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
        # creative.
        # This field is only applicable for creatives that are synced from Campaign
        # Manager.
    &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
        # Definitions system).
        #
        # Set this if the creative relies on mobile gestures for interactivity, such
        # as swiping or tapping.
        #
        # Optional and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
        #
        # You can assign existing display creatives (with image or HTML5 assets)
        # to serve surrounding the publisher&#x27;s video player. Companions display
        # around the video player while the video is playing and remain after the
        # video has completed.
        #
        # Creatives contain additional dimensions
        # can not be companion creatives.
        #
        # This field is only supported for following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
    &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
      &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
      &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
      &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
      &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
    },
    &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
        # Timers track the time during which a user views and interacts with a
        # specified part of a rich media creative.
        # A creative can have multiple timer events, each timed independently.
        # Leave it empty or unset for creatives containing image assets only.
      { # Timer event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
      },
    ],
    &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
        # Must be UTF-8 encoded with a length of no more than 20,000 characters.
    &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
    &quot;assets&quot;: [ # Required. Assets associated to this creative.
        # Assets can be associated to the creative in one of following roles:
        #
        # * `ASSET_ROLE_UNSPECIFIED`
        # * `ASSET_ROLE_MAIN`
        # * `ASSET_ROLE_BACKUP`
        # * `ASSET_ROLE_POLITE_LOAD`
      { # Asset association for the creative.
        &quot;asset&quot;: { # A single asset. # The associated asset.
          &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
              # This ID can be passed to other API calls, e.g.
              # CreateCreative to associate
              # the asset with a creative.
          &quot;content&quot;: &quot;A String&quot;, # The asset content.
              # For uploaded assets, the content is the serving path.
        },
        &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
      },
    ],
    &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
        # Player-Ad Interface).
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
        #
        # Required and only valid for third-party expandable creatives.
        #
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
        #
        # Required and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
        #
        # Must be UTF-8 encoded with a maximum size of 240 bytes.
    &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
    &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
        # Applicable when creative_type
        # is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
    &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
        #
        # Required and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
      &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
          # Summary of
          # creative_and_landing_page_review_status
          # and
          # content_and_policy_review_status.
      &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
      &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
        { # Exchange review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
          &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
        },
      ],
      &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
      &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
        { # Publisher review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
          &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
        },
      ],
    },
    &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
        # Counters track the number of times that a user interacts with any part of a
        # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
        # taps, data loading, keyboard entries, etc.).
        # Any event that can be captured in the creative can be recorded as a
        # counter.
        # Leave it empty or unset for creatives containing image assets only.
      { # Counter event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
      },
    ],
    &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
        # the system.
    &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
    &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
        # across all platforms.
        #
        # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
        # the creative is created.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # platforms. This is part of the VAST 4.0 standard.
      &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
      &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
    },
    &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
        #
        # Display &amp; Video 360 transcodes the main asset into a number of alternative
        # versions that use different file formats or have different properties
        # (resolution, audio bit rate, and video bit rate), each designed for
        # specific video players or bandwidths.
        #
        # These transcodes give a publisher&#x27;s system more options to choose from for
        # each impression on your video and ensures that the appropriate file serves
        # based on the viewer’s connection and screen size.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
      { # Represents information about the transcoded audio or video file.
        &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
        &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
        &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
          &quot;heightPixels&quot;: 42, # The height in pixels.
          &quot;widthPixels&quot;: 42, # The width in pixels.
        },
        &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
        &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
            # rate for the transcoded audio, in hertz.
        &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
        &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
            # for the transcoded audio, in kilobits per second.
        &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
        &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
      },
    ],
    &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
        #
        # Optional for the following creative_type when
        # created by an advertiser that uses both Campaign Manager and third-party ad
        # serving:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        #
        # Output only for other cases.
      &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
      &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
      &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
    },
    &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
        #
        # Only valid when using a Campaign Manager tracking ad with a third-party ad
        # server parameter and the ${DC_DBM_TOKEN} macro.
        #
        # Optional and only valid for third-party tag creatives or third-party VAST
        # tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
        # Applicable to all creative types. The value of
        # width_pixels and
        # height_pixels defaults to `0`
        # when creative_type is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
    &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(advertiserId, filter=None, pageToken=None, orderBy=None, pageSize=None, x__xgafv=None)</code>
  <pre>Lists creatives in an advertiser.

The order is defined by the order_by
parameter.
If a filter by
entity_status is not specified, creatives with
`ENTITY_STATUS_ARCHIVED` will not be included in the results.

Args:
  advertiserId: string, Required. The ID of the advertiser to list creatives for. (required)
  filter: string, Allows filtering by creative properties.

Supported syntax:

* Filter expressions are made up of one or more restrictions.
* Restriction for the same field must be combined by `OR`.
* Restriction for different fields must be combined by `AND`.
* Between `(` and `)` there can only be restrictions combined by `OR`
for the same field.
* A restriction has the form of `{field} {operator} {value}`.
* The operator must be `EQUALS (=)` for the following fields:
    - `entityStatus`
    - `creativeType`.
    - `dimensions`
    - `minDuration`
    - `maxDuration`
    - `approvalStatus`
    - `exchangeReviewStatus`
    - `dynamic`
* The operator must be `HAS (:)` for the following fields:
    - `lineItemIds`
* For `entityStatus`, `minDuration`, `maxDuration`, and `dynamic` there may
be at most one restriction.
* For `dimensions`, the value is in the form of `&quot;{width}x{height}&quot;`.
* For `exchangeReviewStatus`, the value is in the form of
`{exchange}-{reviewStatus}`.
* For `minDuration` and `maxDuration`, the value is in the form of
`&quot;{duration}s&quot;`. Only seconds are supported with millisecond granularity.
* There may be multiple `lineItemIds` restrictions in order to search
against multiple possible line item IDs.

Examples:

* All native creatives: `creativeType=&quot;CREATIVE_TYPE_NATIVE&quot;`
* All active creatives with 300x400 or 50x100 dimensions:
`entityStatus=&quot;ENTITY_STATUS_ACTIVE&quot; AND (dimensions=&quot;300x400&quot;
OR dimensions=&quot;50x100&quot;)`
* All dynamic creatives that are approved by AdX or
AppNexus, with a minimum duration of 5 seconds and 200ms.
`dynamic=&quot;true&quot; AND minDuration=&quot;5.2s&quot; AND
(exchangeReviewStatus=&quot;EXCHANGE_GOOGLE_AD_MANAGER-REVIEW_STATUS_APPROVED&quot;
OR exchangeReviewStatus=&quot;EXCHANGE_APPNEXUS-REVIEW_STATUS_APPROVED&quot;)`
* All video creatives that are associated with line item ID 1 or 2:
creativeType=&quot;CREATIVE_TYPE_VIDEO&quot; AND (lineItemIds:1 OR lineItemIds:2)

The length of this field should be no more than 500 characters.
  pageToken: string, A token identifying a page of results the server should return.
Typically, this is the value of
next_page_token
returned from the previous call to `ListCreatives` method.
If not specified, the first page of results will be returned.
  orderBy: string, Field by which to sort the list.
Acceptable values are:

* `creativeId` (default)
* `createTime`
* `mediaDuration`
* `dimensions` (sorts by width first, then by height)

The default sorting order is ascending. To specify descending order for
a field, a suffix &quot;desc&quot; should be added to the field name.
Example: `createTime desc`.
  pageSize: integer, Requested page size. Must be between `1` and `100`. If unspecified will
default to `100`. Returns error code `INVALID_ARGUMENT` if an invalid value
is specified.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    {
    &quot;creatives&quot;: [ # The list of creatives.
        #
        # This list will be absent if empty.
      { # A single Creative.
        &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
          &quot;A String&quot;,
        ],
        &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
        &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
            #
            # Accepted values are:
            #
            # * `ENTITY_STATUS_ACTIVE`
            # * `ENTITY_STATUS_ARCHIVED`
            # * `ENTITY_STATUS_PAUSED`
        &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
            #
            # This field is required when skippable is true.
            #
            # This field is only supported for the following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
          &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
          &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
        },
        &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
            #
            # Optional and only valid for third-party tag creatives.
            # Third-party tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_STANDARD`
            # * `CREATIVE_TYPE_EXPANDABLE`
        &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
        &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
            #
            # This field is only supported for the following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
        &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
            # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
            # supported.
            #
            # This field is only supported in following
            # creative_type:
            #
            # * `CREATIVE_TYPE_NATIVE`
            # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
        &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
            # creative.
            #
            # This field is only supported for the following
            # creative_type:
            #
            # * `CREATIVE_TYPE_AUDIO`
            # * `CREATIVE_TYPE_VIDEO`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
          { # Tracking URLs from third parties to track interactions with an audio or a
              # video creative.
            &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
            &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
                #
                # Provide a URL with optional path or query string, beginning with `https:`.
                # For example, https://www.example.com/path
          },
        ],
        &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
            #
            # Optional and only valid for third-party expandable creatives.
            # Third-party expandable creatives are creatives with following hosting
            # source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_EXPANDABLE`
        &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
            # An exit (also known as a click tag) is any area in your creative that
            # someone can click or tap to open an advertiser&#x27;s landing page.
            # Every creative must include at least one exit.
            # You can add an exit to your creative in any of the following ways:
            #
            # * Use Google Web Designer&#x27;s tap area.
            # * Define a JavaScript variable called &quot;clickTag&quot;.
            # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
          { # Exit event of the creative.
            &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
                # This is required when type is:
                #
                # * `EXIT_EVENT_TYPE_DEFAULT`
                # * `EXIT_EVENT_TYPE_BACKUP`
            &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
                #
                # The name must be unique within one creative.
                #
                # Leave it empty or unset for creatives containing image assets only.
            &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
            &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
                # Leave it empty or unset for creatives containing image assets only.
          },
        ],
        &quot;additionalDimensions&quot;: [ # Additional dimensions.
            # Applicable when creative_type is one of:
            #
            # * `CREATIVE_TYPE_STANDARD`
            # * `CREATIVE_TYPE_EXPANDABLE`
            # * `CREATIVE_TYPE_NATIVE`
            # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
            # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
            # * `CREATIVE_TYPE_LIGHTBOX`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
            # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
            #
            # If this field is specified, width_pixels and
            # height_pixels are both required and must be
            # greater than or equal to 0.
          { # Dimensions.
            &quot;heightPixels&quot;: 42, # The height in pixels.
            &quot;widthPixels&quot;: 42, # The width in pixels.
          },
        ],
        &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
            # the system.
        &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
            #
            # The URLs must start with https (except on inventory that doesn&#x27;t require
            # SSL compliance).
            # If using macros in your URL, use only macros supported by Display &amp; Video
            # 360.
            #
            # Standard URLs only, no IMG or SCRIPT tags.
            #
            # This field is only supported in following
            # creative_type:
            #
            # * `CREATIVE_TYPE_NATIVE`
            # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
          &quot;A String&quot;,
        ],
        &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
            # To enable this for the creative, make sure the
            # Advertiser.creative_config.ias_client_id
            # has been set to your IAS client ID.
        &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
            # Must be UTF-8 encoded with a length of no more than 10,000 characters.
        &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
            # creative.
            # This field is only applicable for creatives that are synced from Campaign
            # Manager.
        &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
            # Definitions system).
            #
            # Set this if the creative relies on mobile gestures for interactivity, such
            # as swiping or tapping.
            #
            # Optional and only valid for third-party tag creatives.
            #
            # Third-party tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_STANDARD`
            # * `CREATIVE_TYPE_EXPANDABLE`
        &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
            #
            # You can assign existing display creatives (with image or HTML5 assets)
            # to serve surrounding the publisher&#x27;s video player. Companions display
            # around the video player while the video is playing and remain after the
            # video has completed.
            #
            # Creatives contain additional dimensions
            # can not be companion creatives.
            #
            # This field is only supported for following
            # creative_type:
            #
            # * `CREATIVE_TYPE_AUDIO`
            # * `CREATIVE_TYPE_VIDEO`
          &quot;A String&quot;,
        ],
        &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
        &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
            #
            # This field is only supported in following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
          &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
            &quot;heightPixels&quot;: 42, # The height in pixels.
            &quot;widthPixels&quot;: 42, # The width in pixels.
          },
          &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
          &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
              #
              # Only URLs of the following domains are allowed:
              #
              # * https://info.evidon.com
              # * https://l.betrad.com
          &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
              #
              # Only URLs of the following domains are allowed:
              #
              # * https://info.evidon.com
              # * https://l.betrad.com
          &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
          &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
          &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
              #
              # Only URLs of the following domains are allowed:
              #
              # * https://info.evidon.com
              # * https://l.betrad.com
          &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
        },
        &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
            # Timers track the time during which a user views and interacts with a
            # specified part of a rich media creative.
            # A creative can have multiple timer events, each timed independently.
            # Leave it empty or unset for creatives containing image assets only.
          { # Timer event of the creative.
            &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
            &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
          },
        ],
        &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
            # Must be UTF-8 encoded with a length of no more than 20,000 characters.
        &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
        &quot;assets&quot;: [ # Required. Assets associated to this creative.
            # Assets can be associated to the creative in one of following roles:
            #
            # * `ASSET_ROLE_UNSPECIFIED`
            # * `ASSET_ROLE_MAIN`
            # * `ASSET_ROLE_BACKUP`
            # * `ASSET_ROLE_POLITE_LOAD`
          { # Asset association for the creative.
            &quot;asset&quot;: { # A single asset. # The associated asset.
              &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
                  # This ID can be passed to other API calls, e.g.
                  # CreateCreative to associate
                  # the asset with a creative.
              &quot;content&quot;: &quot;A String&quot;, # The asset content.
                  # For uploaded assets, the content is the serving path.
            },
            &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
          },
        ],
        &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
            # Player-Ad Interface).
            #
            # Output only and only valid for third-party VAST tag creatives.
            #
            # Third-party VAST tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
        &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
            #
            # Required and only valid for third-party expandable creatives.
            #
            # Third-party expandable creatives are creatives with following hosting
            # source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_EXPANDABLE`
        &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
            #
            # Required and only valid for third-party tag creatives.
            #
            # Third-party tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_STANDARD`
            # * `CREATIVE_TYPE_EXPANDABLE`
        &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
            #
            # Must be UTF-8 encoded with a maximum size of 240 bytes.
        &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
        &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
            # Applicable when creative_type
            # is one of:
            #
            # * `CREATIVE_TYPE_VIDEO`
            # * `CREATIVE_TYPE_AUDIO`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
            # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
        &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
            #
            # Required and only valid for third-party VAST tag creatives.
            #
            # Third-party VAST tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
        &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
          &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
              # Summary of
              # creative_and_landing_page_review_status
              # and
              # content_and_policy_review_status.
          &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
          &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
            { # Exchange review status for the creative.
              &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
              &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
            },
          ],
          &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
          &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
            { # Publisher review status for the creative.
              &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
              &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
            },
          ],
        },
        &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
            # Counters track the number of times that a user interacts with any part of a
            # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
            # taps, data loading, keyboard entries, etc.).
            # Any event that can be captured in the creative can be recorded as a
            # counter.
            # Leave it empty or unset for creatives containing image assets only.
          { # Counter event of the creative.
            &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
            &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
          },
        ],
        &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
            #
            # This field is required when skippable is true.
            #
            # This field is only supported for the following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
          &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
          &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
        },
        &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
            # the system.
        &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
        &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
            # across all platforms.
            #
            # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
            # the creative is created.
            #
            # This field is only supported for the following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
            # platforms. This is part of the VAST 4.0 standard.
          &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
          &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
        },
        &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
            #
            # Display &amp; Video 360 transcodes the main asset into a number of alternative
            # versions that use different file formats or have different properties
            # (resolution, audio bit rate, and video bit rate), each designed for
            # specific video players or bandwidths.
            #
            # These transcodes give a publisher&#x27;s system more options to choose from for
            # each impression on your video and ensures that the appropriate file serves
            # based on the viewer’s connection and screen size.
            #
            # This field is only supported in following
            # creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
            # * `CREATIVE_TYPE_AUDIO`
          { # Represents information about the transcoded audio or video file.
            &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
            &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
            &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
              &quot;heightPixels&quot;: 42, # The height in pixels.
              &quot;widthPixels&quot;: 42, # The width in pixels.
            },
            &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
            &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
                # rate for the transcoded audio, in hertz.
            &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
            &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
                # for the transcoded audio, in kilobits per second.
            &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
            &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
          },
        ],
        &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
            #
            # Optional for the following creative_type when
            # created by an advertiser that uses both Campaign Manager and third-party ad
            # serving:
            #
            # * `CREATIVE_TYPE_NATIVE`
            # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
            # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
            #
            # Output only for other cases.
          &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
          &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
          &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
        },
        &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
            #
            # Output only and only valid for third-party VAST tag creatives.
            #
            # Third-party VAST tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
        &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
            #
            # Only valid when using a Campaign Manager tracking ad with a third-party ad
            # server parameter and the ${DC_DBM_TOKEN} macro.
            #
            # Optional and only valid for third-party tag creatives or third-party VAST
            # tag creatives.
            #
            # Third-party tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_STANDARD`
            # * `CREATIVE_TYPE_EXPANDABLE`
            #
            # Third-party VAST tag creatives are creatives with following
            # hosting_source:
            #
            # * `HOSTING_SOURCE_THIRD_PARTY`
            #
            # combined with following creative_type:
            #
            # * `CREATIVE_TYPE_VIDEO`
        &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
            # Applicable to all creative types. The value of
            # width_pixels and
            # height_pixels defaults to `0`
            # when creative_type is one of:
            #
            # * `CREATIVE_TYPE_VIDEO`
            # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
            # * `CREATIVE_TYPE_AUDIO`
            # * `CREATIVE_TYPE_NATIVE_VIDEO`
            # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
          &quot;heightPixels&quot;: 42, # The height in pixels.
          &quot;widthPixels&quot;: 42, # The width in pixels.
        },
        &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
      },
    ],
    &quot;nextPageToken&quot;: &quot;A String&quot;, # A token to retrieve the next page of results.
        # Pass this value in the page_token field
        # in the subsequent call to `ListCreativesRequest` method to retrieve the
        # next page of results.
        # If this field is null, it means this is the last page.
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(advertiserId, creativeId, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates an existing creative.
Returns the updated creative if successful.

Args:
  advertiserId: string, Output only. The unique ID of the advertiser the creative belongs to. (required)
  creativeId: string, Output only. The unique ID of the creative. Assigned by the system. (required)
  body: object, The request body.
    The object takes the form of:

{ # A single Creative.
  &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
    &quot;A String&quot;,
  ],
  &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
  &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
      # 
      # Accepted values are:
      # 
      # * `ENTITY_STATUS_ACTIVE`
      # * `ENTITY_STATUS_ARCHIVED`
      # * `ENTITY_STATUS_PAUSED`
  &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
      # 
      # This field is required when skippable is true.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
    &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
  },
  &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
      # 
      # Optional and only valid for third-party tag creatives.
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
  &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
      # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
      # supported.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
  &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
      # creative.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
    { # Tracking URLs from third parties to track interactions with an audio or a
        # video creative.
      &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
      &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
          #
          # Provide a URL with optional path or query string, beginning with `https:`.
          # For example, https://www.example.com/path
    },
  ],
  &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
      # 
      # Optional and only valid for third-party expandable creatives.
      # Third-party expandable creatives are creatives with following hosting
      # source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
      # An exit (also known as a click tag) is any area in your creative that
      # someone can click or tap to open an advertiser&#x27;s landing page.
      # Every creative must include at least one exit.
      # You can add an exit to your creative in any of the following ways:
      # 
      # * Use Google Web Designer&#x27;s tap area.
      # * Define a JavaScript variable called &quot;clickTag&quot;.
      # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
    { # Exit event of the creative.
      &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
          # This is required when type is:
          #
          # * `EXIT_EVENT_TYPE_DEFAULT`
          # * `EXIT_EVENT_TYPE_BACKUP`
      &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
          #
          # The name must be unique within one creative.
          #
          # Leave it empty or unset for creatives containing image assets only.
      &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
      &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
          # Leave it empty or unset for creatives containing image assets only.
    },
  ],
  &quot;additionalDimensions&quot;: [ # Additional dimensions.
      # Applicable when creative_type is one of:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_LIGHTBOX`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
      # 
      # If this field is specified, width_pixels and
      # height_pixels are both required and must be
      # greater than or equal to 0.
    { # Dimensions.
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
  ],
  &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
      # the system.
  &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
      # 
      # The URLs must start with https (except on inventory that doesn&#x27;t require
      # SSL compliance).
      # If using macros in your URL, use only macros supported by Display &amp; Video
      # 360.
      # 
      # Standard URLs only, no IMG or SCRIPT tags.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
    &quot;A String&quot;,
  ],
  &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
      # To enable this for the creative, make sure the
      # Advertiser.creative_config.ias_client_id
      # has been set to your IAS client ID.
  &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
      # Must be UTF-8 encoded with a length of no more than 10,000 characters.
  &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
      # creative.
      # This field is only applicable for creatives that are synced from Campaign
      # Manager.
  &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
      # Definitions system).
      # 
      # Set this if the creative relies on mobile gestures for interactivity, such
      # as swiping or tapping.
      # 
      # Optional and only valid for third-party tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
      # 
      # You can assign existing display creatives (with image or HTML5 assets)
      # to serve surrounding the publisher&#x27;s video player. Companions display
      # around the video player while the video is playing and remain after the
      # video has completed.
      # 
      # Creatives contain additional dimensions
      # can not be companion creatives.
      # 
      # This field is only supported for following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_VIDEO`
    &quot;A String&quot;,
  ],
  &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
  &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
    &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
    &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
    &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
    &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
        #
        # Only URLs of the following domains are allowed:
        #
        # * https://info.evidon.com
        # * https://l.betrad.com
    &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
  },
  &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
      # Timers track the time during which a user views and interacts with a
      # specified part of a rich media creative.
      # A creative can have multiple timer events, each timed independently.
      # Leave it empty or unset for creatives containing image assets only.
    { # Timer event of the creative.
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
      &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
    },
  ],
  &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
      # Must be UTF-8 encoded with a length of no more than 20,000 characters.
  &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
  &quot;assets&quot;: [ # Required. Assets associated to this creative.
      # Assets can be associated to the creative in one of following roles:
      # 
      # * `ASSET_ROLE_UNSPECIFIED`
      # * `ASSET_ROLE_MAIN`
      # * `ASSET_ROLE_BACKUP`
      # * `ASSET_ROLE_POLITE_LOAD`
    { # Asset association for the creative.
      &quot;asset&quot;: { # A single asset. # The associated asset.
        &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
            # This ID can be passed to other API calls, e.g.
            # CreateCreative to associate
            # the asset with a creative.
        &quot;content&quot;: &quot;A String&quot;, # The asset content.
            # For uploaded assets, the content is the serving path.
      },
      &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
    },
  ],
  &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
      # Player-Ad Interface).
      # 
      # Output only and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
      # 
      # Required and only valid for third-party expandable creatives.
      # 
      # Third-party expandable creatives are creatives with following hosting
      # source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
      # 
      # Required and only valid for third-party tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
  &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
      # 
      # Must be UTF-8 encoded with a maximum size of 240 bytes.
  &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
  &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
      # Applicable when creative_type
      # is one of:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
  &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
      # 
      # Required and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
    &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
        # Summary of
        # creative_and_landing_page_review_status
        # and
        # content_and_policy_review_status.
    &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
    &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
      { # Exchange review status for the creative.
        &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
        &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
      },
    ],
    &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
    &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
      { # Publisher review status for the creative.
        &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
        &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
      },
    ],
  },
  &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
      # Counters track the number of times that a user interacts with any part of a
      # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
      # taps, data loading, keyboard entries, etc.).
      # Any event that can be captured in the creative can be recorded as a
      # counter.
      # Leave it empty or unset for creatives containing image assets only.
    { # Counter event of the creative.
      &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
      &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
    },
  ],
  &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
      # 
      # This field is required when skippable is true.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
    &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
    &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
  },
  &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
      # the system.
  &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
  &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
      # across all platforms.
      # 
      # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
      # the creative is created.
      # 
      # This field is only supported for the following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # platforms. This is part of the VAST 4.0 standard.
    &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
    &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
  },
  &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
      # 
      # Display &amp; Video 360 transcodes the main asset into a number of alternative
      # versions that use different file formats or have different properties
      # (resolution, audio bit rate, and video bit rate), each designed for
      # specific video players or bandwidths.
      # 
      # These transcodes give a publisher&#x27;s system more options to choose from for
      # each impression on your video and ensures that the appropriate file serves
      # based on the viewer’s connection and screen size.
      # 
      # This field is only supported in following
      # creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_AUDIO`
    { # Represents information about the transcoded audio or video file.
      &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
      &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
      &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
      &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
      &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
          # rate for the transcoded audio, in hertz.
      &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
      &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
          # for the transcoded audio, in kilobits per second.
      &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
      &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
    },
  ],
  &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
      # 
      # Optional for the following creative_type when
      # created by an advertiser that uses both Campaign Manager and third-party ad
      # serving:
      # 
      # * `CREATIVE_TYPE_NATIVE`
      # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
      # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
      # 
      # Output only for other cases.
    &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
    &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
    &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
  },
  &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
      # 
      # Output only and only valid for third-party VAST tag creatives.
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
      # 
      # Only valid when using a Campaign Manager tracking ad with a third-party ad
      # server parameter and the ${DC_DBM_TOKEN} macro.
      # 
      # Optional and only valid for third-party tag creatives or third-party VAST
      # tag creatives.
      # 
      # Third-party tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_STANDARD`
      # * `CREATIVE_TYPE_EXPANDABLE`
      # 
      # Third-party VAST tag creatives are creatives with following
      # hosting_source:
      # 
      # * `HOSTING_SOURCE_THIRD_PARTY`
      # 
      # combined with following creative_type:
      # 
      # * `CREATIVE_TYPE_VIDEO`
  &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
      # Applicable to all creative types. The value of
      # width_pixels and
      # height_pixels defaults to `0`
      # when creative_type is one of:
      # 
      # * `CREATIVE_TYPE_VIDEO`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
      # * `CREATIVE_TYPE_AUDIO`
      # * `CREATIVE_TYPE_NATIVE_VIDEO`
      # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
    &quot;heightPixels&quot;: 42, # The height in pixels.
    &quot;widthPixels&quot;: 42, # The width in pixels.
  },
  &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
}

  updateMask: string, Required. The mask to control which fields to update.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A single Creative.
    &quot;creativeAttributes&quot;: [ # Output only. A list of attributes of the creative that is generated by the system.
      &quot;A String&quot;,
    ],
    &quot;creativeId&quot;: &quot;A String&quot;, # Output only. The unique ID of the creative. Assigned by the system.
    &quot;entityStatus&quot;: &quot;A String&quot;, # Required. Controls whether or not the creative can serve.
        #
        # Accepted values are:
        #
        # * `ENTITY_STATUS_ACTIVE`
        # * `ENTITY_STATUS_ARCHIVED`
        # * `ENTITY_STATUS_PAUSED`
    &quot;skipOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before the skip button appears.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;requireHtml5&quot;: True or False, # Optional. Indicates that the creative relies on HTML5 to render properly.
        #
        # Optional and only valid for third-party tag creatives.
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;name&quot;: &quot;A String&quot;, # Output only. The resource name of the creative.
    &quot;skippable&quot;: True or False, # Whether the user can choose to skip a video creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;jsTrackerUrl&quot;: &quot;A String&quot;, # JavaScript measurement URL from supported third-party verification
        # providers (ComScore, DoubleVerify, IAS, Moat). HTML script tags are not
        # supported.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
    &quot;thirdPartyUrls&quot;: [ # Tracking URLs from third parties to track interactions with a video
        # creative.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      { # Tracking URLs from third parties to track interactions with an audio or a
          # video creative.
        &quot;type&quot;: &quot;A String&quot;, # The type of interaction needs to be tracked by the tracking URL
        &quot;url&quot;: &quot;A String&quot;, # Tracking URL used to track the interaction.
            #
            # Provide a URL with optional path or query string, beginning with `https:`.
            # For example, https://www.example.com/path
      },
    ],
    &quot;expandOnHover&quot;: True or False, # Optional. Indicates the creative will automatically expand on hover.
        #
        # Optional and only valid for third-party expandable creatives.
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;exitEvents&quot;: [ # Required. Exit events for this creative.
        # An exit (also known as a click tag) is any area in your creative that
        # someone can click or tap to open an advertiser&#x27;s landing page.
        # Every creative must include at least one exit.
        # You can add an exit to your creative in any of the following ways:
        #
        # * Use Google Web Designer&#x27;s tap area.
        # * Define a JavaScript variable called &quot;clickTag&quot;.
        # * Use the Enabler (Enabler.exit()) to track exits in rich media formats.
      { # Exit event of the creative.
        &quot;url&quot;: &quot;A String&quot;, # Required. The click through URL of the exit event.
            # This is required when type is:
            #
            # * `EXIT_EVENT_TYPE_DEFAULT`
            # * `EXIT_EVENT_TYPE_BACKUP`
        &quot;name&quot;: &quot;A String&quot;, # The name of the click tag of the exit event.
            #
            # The name must be unique within one creative.
            #
            # Leave it empty or unset for creatives containing image assets only.
        &quot;type&quot;: &quot;A String&quot;, # Required. The type of the exit event.
        &quot;reportingName&quot;: &quot;A String&quot;, # The name used to identify this event in reports.
            # Leave it empty or unset for creatives containing image assets only.
      },
    ],
    &quot;additionalDimensions&quot;: [ # Additional dimensions.
        # Applicable when creative_type is one of:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_LIGHTBOX`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
        #
        # If this field is specified, width_pixels and
        # height_pixels are both required and must be
        # greater than or equal to 0.
      { # Dimensions.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
    ],
    &quot;createTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was created. Assigned by
        # the system.
    &quot;trackerUrls&quot;: [ # Tracking URLs for analytics providers or third-party ad technology vendors.
        #
        # The URLs must start with https (except on inventory that doesn&#x27;t require
        # SSL compliance).
        # If using macros in your URL, use only macros supported by Display &amp; Video
        # 360.
        #
        # Standard URLs only, no IMG or SCRIPT tags.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;iasCampaignMonitoring&quot;: True or False, # Indicates whether Integral Ad Science (IAS) campaign monitoring is enabled.
        # To enable this for the creative, make sure the
        # Advertiser.creative_config.ias_client_id
        # has been set to your IAS client ID.
    &quot;integrationCode&quot;: &quot;A String&quot;, # ID information used to link this creative to an external system.
        # Must be UTF-8 encoded with a length of no more than 10,000 characters.
    &quot;cmPlacementId&quot;: &quot;A String&quot;, # Output only. The unique ID of the Campaign Manager placement associated with the
        # creative.
        # This field is only applicable for creatives that are synced from Campaign
        # Manager.
    &quot;requireMraid&quot;: True or False, # Optional. Indicates that the creative requires MRAID (Mobile Rich Media Ad Interface
        # Definitions system).
        #
        # Set this if the creative relies on mobile gestures for interactivity, such
        # as swiping or tapping.
        #
        # Optional and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;companionCreativeIds&quot;: [ # The IDs of companion creatives for a video creative.
        #
        # You can assign existing display creatives (with image or HTML5 assets)
        # to serve surrounding the publisher&#x27;s video player. Companions display
        # around the video player while the video is playing and remain after the
        # video has completed.
        #
        # Creatives contain additional dimensions
        # can not be companion creatives.
        #
        # This field is only supported for following
        # creative_type:
        #
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_VIDEO`
      &quot;A String&quot;,
    ],
    &quot;creativeType&quot;: &quot;A String&quot;, # Required. Immutable. The type of the creative.
    &quot;obaIcon&quot;: { # OBA Icon for a Creative # Specifies the OBA icon for a video creative.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;dimensions&quot;: { # Dimensions. # The dimensions of the OBA icon.
        &quot;heightPixels&quot;: 42, # The height in pixels.
        &quot;widthPixels&quot;: 42, # The width in pixels.
      },
      &quot;resourceMimeType&quot;: &quot;A String&quot;, # The MIME type of the OBA icon resource.
      &quot;viewTrackingUrl&quot;: &quot;A String&quot;, # Required. The view tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;clickTrackingUrl&quot;: &quot;A String&quot;, # Required. The click tracking URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;position&quot;: &quot;A String&quot;, # The position of the OBA icon on the creative.
      &quot;resourceUrl&quot;: &quot;A String&quot;, # The URL of the OBA icon resource.
      &quot;landingPageUrl&quot;: &quot;A String&quot;, # Required. The landing page URL of the OBA icon.
          #
          # Only URLs of the following domains are allowed:
          #
          # * https://info.evidon.com
          # * https://l.betrad.com
      &quot;program&quot;: &quot;A String&quot;, # The program of the OBA icon. For example: “AdChoices”.
    },
    &quot;timerEvents&quot;: [ # Timer custom events for a rich media creative.
        # Timers track the time during which a user views and interacts with a
        # specified part of a rich media creative.
        # A creative can have multiple timer events, each timed independently.
        # Leave it empty or unset for creatives containing image assets only.
      { # Timer event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the timer event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this timer event in reports.
      },
    ],
    &quot;notes&quot;: &quot;A String&quot;, # User notes for this creative.
        # Must be UTF-8 encoded with a length of no more than 20,000 characters.
    &quot;dynamic&quot;: True or False, # Output only. Indicates whether the creative is dynamic.
    &quot;assets&quot;: [ # Required. Assets associated to this creative.
        # Assets can be associated to the creative in one of following roles:
        #
        # * `ASSET_ROLE_UNSPECIFIED`
        # * `ASSET_ROLE_MAIN`
        # * `ASSET_ROLE_BACKUP`
        # * `ASSET_ROLE_POLITE_LOAD`
      { # Asset association for the creative.
        &quot;asset&quot;: { # A single asset. # The associated asset.
          &quot;mediaId&quot;: &quot;A String&quot;, # Media ID of the uploaded asset. This is a unique identifier for the asset.
              # This ID can be passed to other API calls, e.g.
              # CreateCreative to associate
              # the asset with a creative.
          &quot;content&quot;: &quot;A String&quot;, # The asset content.
              # For uploaded assets, the content is the serving path.
        },
        &quot;role&quot;: &quot;A String&quot;, # The role of this asset for the creative.
      },
    ],
    &quot;vpaid&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires VPAID (Digital Video
        # Player-Ad Interface).
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;expandingDirection&quot;: &quot;A String&quot;, # Optional. Specifies the expanding direction of the creative.
        #
        # Required and only valid for third-party expandable creatives.
        #
        # Third-party expandable creatives are creatives with following hosting
        # source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;thirdPartyTag&quot;: &quot;A String&quot;, # Optional. The original third-party tag used for the creative.
        #
        # Required and only valid for third-party tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
    &quot;displayName&quot;: &quot;A String&quot;, # Required. The display name of the creative.
        #
        # Must be UTF-8 encoded with a maximum size of 240 bytes.
    &quot;hostingSource&quot;: &quot;A String&quot;, # Required. Indicates where the creative is hosted.
    &quot;mediaDuration&quot;: &quot;A String&quot;, # Output only. Media duration of the creative.
        # Applicable when creative_type
        # is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_PUBLISHER_HOSTED`
    &quot;vastTagUrl&quot;: &quot;A String&quot;, # Optional. The URL of the VAST tag for a third-party VAST tag creative.
        #
        # Required and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;reviewStatus&quot;: { # Review statuses for the creative. # Output only. The current status of the creative review process.
      &quot;approvalStatus&quot;: &quot;A String&quot;, # Represents the basic approval needed for a creative to begin serving.
          # Summary of
          # creative_and_landing_page_review_status
          # and
          # content_and_policy_review_status.
      &quot;creativeAndLandingPageReviewStatus&quot;: &quot;A String&quot;, # Creative and landing page review status for the creative.
      &quot;exchangeReviewStatuses&quot;: [ # Exchange review statuses for the creative.
        { # Exchange review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the exchange review.
          &quot;exchange&quot;: &quot;A String&quot;, # The exchange reviewing the creative.
        },
      ],
      &quot;contentAndPolicyReviewStatus&quot;: &quot;A String&quot;, # Content and policy review status for the creative.
      &quot;publisherReviewStatuses&quot;: [ # Publisher review statuses for the creative.
        { # Publisher review status for the creative.
          &quot;status&quot;: &quot;A String&quot;, # Status of the publisher review.
          &quot;publisherName&quot;: &quot;A String&quot;, # The publisher reviewing the creative.
        },
      ],
    },
    &quot;counterEvents&quot;: [ # Counter events for a rich media creative.
        # Counters track the number of times that a user interacts with any part of a
        # rich media creative in a specified way (mouse-overs, mouse-outs, clicks,
        # taps, data loading, keyboard entries, etc.).
        # Any event that can be captured in the creative can be recorded as a
        # counter.
        # Leave it empty or unset for creatives containing image assets only.
      { # Counter event of the creative.
        &quot;name&quot;: &quot;A String&quot;, # Required. The name of the counter event.
        &quot;reportingName&quot;: &quot;A String&quot;, # Required. The name used to identify this counter event in reports.
      },
    ],
    &quot;progressOffset&quot;: { # The length an audio or a video has been played. # Amount of time to play the video before counting a view.
        #
        # This field is required when skippable is true.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
      &quot;percentage&quot;: &quot;A String&quot;, # The offset in percentage of the audio or video duration.
      &quot;seconds&quot;: &quot;A String&quot;, # The offset in seconds from the start of the audio or video.
    },
    &quot;updateTime&quot;: &quot;A String&quot;, # Output only. The timestamp when the creative was last updated. Assigned by
        # the system.
    &quot;advertiserId&quot;: &quot;A String&quot;, # Output only. The unique ID of the advertiser the creative belongs to.
    &quot;universalAdId&quot;: { # A creative identifier provided by a registry that is unique across all # Optional. An optional creative identifier provided by a registry that is unique
        # across all platforms.
        #
        # Universal Ad ID is part of the VAST 4.0 standard. It can be modified after
        # the creative is created.
        #
        # This field is only supported for the following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # platforms. This is part of the VAST 4.0 standard.
      &quot;id&quot;: &quot;A String&quot;, # The unique creative identifier.
      &quot;registry&quot;: &quot;A String&quot;, # The registry provides unique creative identifiers.
    },
    &quot;transcodes&quot;: [ # Output only. Audio/Video transcodes.
        #
        # Display &amp; Video 360 transcodes the main asset into a number of alternative
        # versions that use different file formats or have different properties
        # (resolution, audio bit rate, and video bit rate), each designed for
        # specific video players or bandwidths.
        #
        # These transcodes give a publisher&#x27;s system more options to choose from for
        # each impression on your video and ensures that the appropriate file serves
        # based on the viewer’s connection and screen size.
        #
        # This field is only supported in following
        # creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_AUDIO`
      { # Represents information about the transcoded audio or video file.
        &quot;mimeType&quot;: &quot;A String&quot;, # The MIME type of the transcoded file.
        &quot;bitRateKbps&quot;: &quot;A String&quot;, # The transcoding bit rate of the transcoded video, in kilobits per second.
        &quot;dimensions&quot;: { # Dimensions. # The dimensions of the transcoded video.
          &quot;heightPixels&quot;: 42, # The height in pixels.
          &quot;widthPixels&quot;: 42, # The width in pixels.
        },
        &quot;frameRate&quot;: 3.14, # The frame rate of the transcoded video, in frames per second.
        &quot;audioSampleRateHz&quot;: &quot;A String&quot;, # The sample rate for the audio stream of the transcoded video, or the sample
            # rate for the transcoded audio, in hertz.
        &quot;transcoded&quot;: True or False, # Indicates if the transcoding was successful.
        &quot;audioBitRateKbps&quot;: &quot;A String&quot;, # The bit rate for the audio stream of the transcoded video, or the bit rate
            # for the transcoded audio, in kilobits per second.
        &quot;fileSizeBytes&quot;: &quot;A String&quot;, # The size of the transcoded file, in bytes.
        &quot;name&quot;: &quot;A String&quot;, # The name of the transcoded file.
      },
    ],
    &quot;cmTrackingAd&quot;: { # A Campaign Manager tracking ad. # The Campaign Manager tracking ad associated with the creative.
        #
        # Optional for the following creative_type when
        # created by an advertiser that uses both Campaign Manager and third-party ad
        # serving:
        #
        # * `CREATIVE_TYPE_NATIVE`
        # * `CREATIVE_TYPE_NATIVE_SITE_SQUARE`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL`
        # * `CREATIVE_TYPE_NATIVE_APP_INSTALL_SQUARE`
        #
        # Output only for other cases.
      &quot;cmCreativeId&quot;: &quot;A String&quot;, # The creative ID of the campaign manager tracking Ad.
      &quot;cmAdId&quot;: &quot;A String&quot;, # The ad ID of the campaign manager tracking Ad.
      &quot;cmPlacementId&quot;: &quot;A String&quot;, # The placement ID of the campaign manager tracking Ad.
    },
    &quot;html5Video&quot;: True or False, # Output only. Indicates the third-party VAST tag creative requires HTML5 Video support.
        #
        # Output only and only valid for third-party VAST tag creatives.
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;requirePingForAttribution&quot;: True or False, # Optional. Indicates that the creative will wait for a return ping for attribution.
        #
        # Only valid when using a Campaign Manager tracking ad with a third-party ad
        # server parameter and the ${DC_DBM_TOKEN} macro.
        #
        # Optional and only valid for third-party tag creatives or third-party VAST
        # tag creatives.
        #
        # Third-party tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_STANDARD`
        # * `CREATIVE_TYPE_EXPANDABLE`
        #
        # Third-party VAST tag creatives are creatives with following
        # hosting_source:
        #
        # * `HOSTING_SOURCE_THIRD_PARTY`
        #
        # combined with following creative_type:
        #
        # * `CREATIVE_TYPE_VIDEO`
    &quot;dimensions&quot;: { # Dimensions. # Required. Primary dimensions of the creative.
        # Applicable to all creative types. The value of
        # width_pixels and
        # height_pixels defaults to `0`
        # when creative_type is one of:
        #
        # * `CREATIVE_TYPE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_INTERSTITIAL`
        # * `CREATIVE_TYPE_AUDIO`
        # * `CREATIVE_TYPE_NATIVE_VIDEO`
        # * `CREATIVE_TYPE_TEMPLATED_APP_INSTALL_VIDEO`
      &quot;heightPixels&quot;: 42, # The height in pixels.
      &quot;widthPixels&quot;: 42, # The width in pixels.
    },
    &quot;appendedTag&quot;: &quot;A String&quot;, # Third-party HTML tracking tag to be appended to the creative tag.
  }</pre>
</div>

</body></html>